* Makefile.am (ALL_EMULATIONS): Add ecrisaout.o, ecriself.o,
[binutils.git] / binutils / readelf.c
blob50d3b4c53a66835c0b06117bc57da264692ebfa5
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 99, 2000 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.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
22 02111-1307, USA. */
25 #include <assert.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <stdio.h>
29 #include <time.h>
31 #if __GNUC__ >= 2
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 belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
36 #define BFD64
37 #endif
39 #include "bfd.h"
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/i386.h"
53 #include "elf/v850.h"
54 #include "elf/ppc.h"
55 #include "elf/mips.h"
56 #include "elf/alpha.h"
57 #include "elf/arm.h"
58 #include "elf/m68k.h"
59 #include "elf/sparc.h"
60 #include "elf/m32r.h"
61 #include "elf/d10v.h"
62 #include "elf/d30v.h"
63 #include "elf/sh.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
66 #include "elf/hppa.h"
67 #include "elf/arc.h"
68 #include "elf/fr30.h"
69 #include "elf/mcore.h"
70 #include "elf/i960.h"
71 #include "elf/pj.h"
72 #include "elf/avr.h"
73 #include "elf/ia64.h"
75 #include "bucomm.h"
76 #include "getopt.h"
78 char * program_name = "readelf";
79 unsigned int dynamic_addr;
80 bfd_size_type dynamic_size;
81 unsigned int rela_addr;
82 unsigned int rela_size;
83 char * dynamic_strings;
84 char * string_table;
85 unsigned long num_dynamic_syms;
86 Elf_Internal_Sym * dynamic_symbols;
87 Elf_Internal_Syminfo * dynamic_syminfo;
88 unsigned long dynamic_syminfo_offset;
89 unsigned int dynamic_syminfo_nent;
90 char program_interpreter [64];
91 int dynamic_info[DT_JMPREL + 1];
92 int version_info[16];
93 int loadaddr = 0;
94 Elf_Internal_Ehdr elf_header;
95 Elf_Internal_Shdr * section_headers;
96 Elf_Internal_Dyn * dynamic_segment;
97 int show_name;
98 int do_dynamic;
99 int do_syms;
100 int do_reloc;
101 int do_sections;
102 int do_segments;
103 int do_using_dynamic;
104 int do_header;
105 int do_dump;
106 int do_version;
107 int do_histogram;
108 int do_debugging;
109 int do_debug_info;
110 int do_debug_abbrevs;
111 int do_debug_lines;
112 int do_debug_pubnames;
113 int do_debug_aranges;
114 int do_arch;
115 int do_notes;
116 int is_32bit_elf;
118 /* A dynamic array of flags indicating which sections require dumping. */
119 char * dump_sects = NULL;
120 unsigned int num_dump_sects = 0;
122 #define HEX_DUMP (1 << 0)
123 #define DISASS_DUMP (1 << 1)
124 #define DEBUG_DUMP (1 << 2)
126 /* How to rpint a vma value. */
127 typedef enum print_mode
129 HEX,
130 DEC,
131 DEC_5,
132 UNSIGNED,
133 PREFIX_HEX,
134 FULL_HEX,
135 LONG_HEX
137 print_mode;
139 /* Forward declarations for dumb compilers. */
140 static void print_vma PARAMS ((bfd_vma, print_mode));
141 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
142 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
143 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
144 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
145 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
146 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
147 static const char * get_dynamic_type PARAMS ((unsigned long));
148 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
149 static char * get_file_type PARAMS ((unsigned));
150 static char * get_machine_name PARAMS ((unsigned));
151 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
152 static char * get_machine_flags PARAMS ((unsigned, unsigned));
153 static const char * get_mips_segment_type PARAMS ((unsigned long));
154 static const char * get_parisc_segment_type PARAMS ((unsigned long));
155 static const char * get_segment_type PARAMS ((unsigned long));
156 static const char * get_mips_section_type_name PARAMS ((unsigned int));
157 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
158 static const char * get_section_type_name PARAMS ((unsigned int));
159 static const char * get_symbol_binding PARAMS ((unsigned int));
160 static const char * get_symbol_type PARAMS ((unsigned int));
161 static const char * get_symbol_visibility PARAMS ((unsigned int));
162 static const char * get_symbol_index_type PARAMS ((unsigned int));
163 static const char * get_dynamic_flags PARAMS ((bfd_vma));
164 static void usage PARAMS ((void));
165 static void parse_args PARAMS ((int, char **));
166 static int process_file_header PARAMS ((void));
167 static int process_program_headers PARAMS ((FILE *));
168 static int process_section_headers PARAMS ((FILE *));
169 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
170 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
171 static int process_dynamic_segment PARAMS ((FILE *));
172 static int process_symbol_table PARAMS ((FILE *));
173 static int process_section_contents PARAMS ((FILE *));
174 static void process_file PARAMS ((char *));
175 static int process_relocs PARAMS ((FILE *));
176 static int process_version_sections PARAMS ((FILE *));
177 static char * get_ver_flags PARAMS ((unsigned int));
178 static int get_32bit_section_headers PARAMS ((FILE *));
179 static int get_64bit_section_headers PARAMS ((FILE *));
180 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
181 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
182 static int get_file_header PARAMS ((FILE *));
183 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
184 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
185 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
186 static int get_32bit_dynamic_segment PARAMS ((FILE *));
187 static int get_64bit_dynamic_segment PARAMS ((FILE *));
188 #ifdef SUPPORT_DISASSEMBLY
189 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
190 #endif
191 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
192 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
193 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
194 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
195 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
196 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
199 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
200 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
201 static void reset_state_machine PARAMS ((int));
202 static char * get_TAG_name PARAMS ((unsigned long));
203 static char * get_AT_name PARAMS ((unsigned long));
204 static char * get_FORM_name PARAMS ((unsigned long));
205 static void free_abbrevs PARAMS ((void));
206 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
207 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
208 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
209 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
210 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
211 static void request_dump PARAMS ((unsigned int, char));
212 static const char * get_elf_class PARAMS ((unsigned char));
213 static const char * get_data_encoding PARAMS ((unsigned char));
214 static const char * get_osabi_name PARAMS ((unsigned char));
215 static int guess_is_rela PARAMS ((unsigned long));
216 static char * get_note_type PARAMS ((unsigned int));
217 static int process_note PARAMS ((Elf32_Internal_Note *));
218 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
219 static int process_corefile_note_segments PARAMS ((FILE *));
220 static int process_corefile_contents PARAMS ((FILE *));
222 typedef int Elf32_Word;
224 #ifndef TRUE
225 #define TRUE 1
226 #define FALSE 0
227 #endif
228 #define UNKNOWN -1
230 #define SECTION_NAME(X) (string_table + (X)->sh_name)
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extact all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
244 #ifdef BFD64
245 #define BYTE_GET8(field) byte_get (field, -8)
246 #else
247 #define BYTE_GET8(field) byte_get (field, 8)
248 #endif
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
252 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
253 if (fseek (file, offset, SEEK_SET)) \
255 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
256 return 0; \
259 var = (type) malloc (size); \
261 if (var == NULL) \
263 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
264 return 0; \
267 if (fread (var, size, 1, file) != 1) \
269 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
270 free (var); \
271 var = NULL; \
272 return 0; \
276 #define GET_DATA(offset, var, reason) \
277 if (fseek (file, offset, SEEK_SET)) \
279 error (_("Unable to seek to %x for %s\n"), offset, reason); \
280 return 0; \
282 else if (fread (& var, sizeof (var), 1, file) != 1) \
284 error (_("Unable to read data at %x for %s\n"), offset, reason); \
285 return 0; \
288 #define GET_ELF_SYMBOLS(file, offset, size) \
289 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
290 : get_64bit_elf_symbols (file, offset, size))
293 #ifdef ANSI_PROTOTYPES
294 static void
295 error (const char * message, ...)
297 va_list args;
299 fprintf (stderr, _("%s: Error: "), program_name);
300 va_start (args, message);
301 vfprintf (stderr, message, args);
302 va_end (args);
303 return;
306 static void
307 warn (const char * message, ...)
309 va_list args;
311 fprintf (stderr, _("%s: Warning: "), program_name);
312 va_start (args, message);
313 vfprintf (stderr, message, args);
314 va_end (args);
315 return;
317 #else
318 static void
319 error (va_alist)
320 va_dcl
322 char * message;
323 va_list args;
325 fprintf (stderr, _("%s: Error: "), program_name);
326 va_start (args);
327 message = va_arg (args, char *);
328 vfprintf (stderr, message, args);
329 va_end (args);
330 return;
333 static void
334 warn (va_alist)
335 va_dcl
337 char * message;
338 va_list args;
340 fprintf (stderr, _("%s: Warning: "), program_name);
341 va_start (args);
342 message = va_arg (args, char *);
343 vfprintf (stderr, message, args);
344 va_end (args);
345 return;
347 #endif
349 static bfd_vma
350 byte_get_little_endian (field, size)
351 unsigned char * field;
352 int size;
354 switch (size)
356 case 1:
357 return * field;
359 case 2:
360 return ((unsigned int) (field [0]))
361 | (((unsigned int) (field [1])) << 8);
363 case 8:
364 /* We want to extract data from an 8 byte wide field and
365 place it into a 4 byte wide field. Since this is a little
366 endian source we can juts use the 4 byte extraction code. */
367 /* Fall through. */
368 case 4:
369 return ((unsigned long) (field [0]))
370 | (((unsigned long) (field [1])) << 8)
371 | (((unsigned long) (field [2])) << 16)
372 | (((unsigned long) (field [3])) << 24);
374 #ifdef BFD64
375 case -8:
376 /* This is a special case, generated by the BYTE_GET8 macro.
377 It means that we are loading an 8 byte value from a field
378 in an external structure into an 8 byte value in a field
379 in an internal strcuture. */
380 return ((bfd_vma) (field [0]))
381 | (((bfd_vma) (field [1])) << 8)
382 | (((bfd_vma) (field [2])) << 16)
383 | (((bfd_vma) (field [3])) << 24)
384 | (((bfd_vma) (field [4])) << 32)
385 | (((bfd_vma) (field [5])) << 40)
386 | (((bfd_vma) (field [6])) << 48)
387 | (((bfd_vma) (field [7])) << 56);
388 #endif
389 default:
390 error (_("Unhandled data length: %d\n"), size);
391 abort ();
395 /* Print a VMA value. */
396 static void
397 print_vma (vma, mode)
398 bfd_vma vma;
399 print_mode mode;
401 #ifdef BFD64
402 if (is_32bit_elf)
403 #endif
405 switch (mode)
407 case FULL_HEX: printf ("0x"); /* drop through */
408 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
409 case PREFIX_HEX: printf ("0x"); /* drop through */
410 case HEX: printf ("%lx", (unsigned long) vma); break;
411 case DEC: printf ("%ld", (unsigned long) vma); break;
412 case DEC_5: printf ("%5ld", (long) vma); break;
413 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
416 #ifdef BFD64
417 else
419 switch (mode)
421 case FULL_HEX:
422 printf ("0x");
423 /* drop through */
425 case LONG_HEX:
426 printf_vma (vma);
427 break;
429 case PREFIX_HEX:
430 printf ("0x");
431 /* drop through */
433 case HEX:
434 #if BFD_HOST_64BIT_LONG
435 printf ("%lx", vma);
436 #else
437 if (_bfd_int64_high (vma))
438 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
439 else
440 printf ("%lx", _bfd_int64_low (vma));
441 #endif
442 break;
444 case DEC:
445 #if BFD_HOST_64BIT_LONG
446 printf ("%ld", vma);
447 #else
448 if (_bfd_int64_high (vma))
449 /* ugg */
450 printf ("++%ld", _bfd_int64_low (vma));
451 else
452 printf ("%ld", _bfd_int64_low (vma));
453 #endif
454 break;
456 case DEC_5:
457 #if BFD_HOST_64BIT_LONG
458 printf ("%5ld", vma);
459 #else
460 if (_bfd_int64_high (vma))
461 /* ugg */
462 printf ("++%ld", _bfd_int64_low (vma));
463 else
464 printf ("%5ld", _bfd_int64_low (vma));
465 #endif
466 break;
468 case UNSIGNED:
469 #if BFD_HOST_64BIT_LONG
470 printf ("%lu", vma);
471 #else
472 if (_bfd_int64_high (vma))
473 /* ugg */
474 printf ("++%lu", _bfd_int64_low (vma));
475 else
476 printf ("%lu", _bfd_int64_low (vma));
477 #endif
478 break;
481 #endif
484 static bfd_vma
485 byte_get_big_endian (field, size)
486 unsigned char * field;
487 int size;
489 switch (size)
491 case 1:
492 return * field;
494 case 2:
495 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
497 case 4:
498 return ((unsigned long) (field [3]))
499 | (((unsigned long) (field [2])) << 8)
500 | (((unsigned long) (field [1])) << 16)
501 | (((unsigned long) (field [0])) << 24);
503 case 8:
504 /* Although we are extracing data from an 8 byte wide field, we
505 are returning only 4 bytes of data. */
506 return ((unsigned long) (field [7]))
507 | (((unsigned long) (field [6])) << 8)
508 | (((unsigned long) (field [5])) << 16)
509 | (((unsigned long) (field [4])) << 24);
511 #ifdef BFD64
512 case -8:
513 /* This is a special case, generated by the BYTE_GET8 macro.
514 It means that we are loading an 8 byte value from a field
515 in an external structure into an 8 byte value in a field
516 in an internal strcuture. */
517 return ((bfd_vma) (field [7]))
518 | (((bfd_vma) (field [6])) << 8)
519 | (((bfd_vma) (field [5])) << 16)
520 | (((bfd_vma) (field [4])) << 24)
521 | (((bfd_vma) (field [3])) << 32)
522 | (((bfd_vma) (field [2])) << 40)
523 | (((bfd_vma) (field [1])) << 48)
524 | (((bfd_vma) (field [0])) << 56);
525 #endif
527 default:
528 error (_("Unhandled data length: %d\n"), size);
529 abort ();
534 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
535 static int
536 guess_is_rela (e_machine)
537 unsigned long e_machine;
539 switch (e_machine)
541 /* Targets that use REL relocations. */
542 case EM_ARM:
543 case EM_386:
544 case EM_486:
545 case EM_960:
546 case EM_CYGNUS_M32R:
547 case EM_CYGNUS_D10V:
548 case EM_MIPS:
549 case EM_MIPS_RS4_BE:
550 return FALSE;
552 /* Targets that use RELA relocations. */
553 case EM_68K:
554 case EM_SPARC32PLUS:
555 case EM_SPARCV9:
556 case EM_SPARC:
557 case EM_PPC:
558 case EM_CYGNUS_V850:
559 case EM_CYGNUS_D30V:
560 case EM_CYGNUS_MN10200:
561 case EM_CYGNUS_MN10300:
562 case EM_CYGNUS_FR30:
563 case EM_SH:
564 case EM_ALPHA:
565 case EM_MCORE:
566 case EM_IA_64:
567 case EM_AVR:
568 return TRUE;
570 case EM_MMA:
571 case EM_PCP:
572 case EM_NCPU:
573 case EM_NDR1:
574 case EM_STARCORE:
575 case EM_ME16:
576 case EM_ST100:
577 case EM_TINYJ:
578 case EM_FX66:
579 case EM_ST9PLUS:
580 case EM_ST7:
581 case EM_68HC16:
582 case EM_68HC11:
583 case EM_68HC08:
584 case EM_68HC05:
585 case EM_SVX:
586 case EM_ST19:
587 case EM_VAX:
588 default:
589 warn (_("Don't know about relocations on this machine architecture\n"));
590 return FALSE;
594 /* Display the contents of the relocation data found at the specified offset. */
595 static int
596 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
597 FILE * file;
598 unsigned long rel_offset;
599 unsigned long rel_size;
600 Elf_Internal_Sym * symtab;
601 unsigned long nsyms;
602 char * strtab;
603 int is_rela;
605 unsigned int i;
606 Elf_Internal_Rel * rels;
607 Elf_Internal_Rela * relas;
610 if (is_rela == UNKNOWN)
611 is_rela = guess_is_rela (elf_header.e_machine);
613 if (is_rela)
615 if (is_32bit_elf)
617 Elf32_External_Rela * erelas;
619 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
620 Elf32_External_Rela *, "relocs");
622 rel_size = rel_size / sizeof (Elf32_External_Rela);
624 relas = (Elf_Internal_Rela *)
625 malloc (rel_size * sizeof (Elf_Internal_Rela));
627 if (relas == NULL)
629 error(_("out of memory parsing relocs"));
630 return 0;
633 for (i = 0; i < rel_size; i++)
635 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
636 relas[i].r_info = BYTE_GET (erelas[i].r_info);
637 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
640 free (erelas);
642 rels = (Elf_Internal_Rel *) relas;
644 else
646 Elf64_External_Rela * erelas;
648 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
649 Elf64_External_Rela *, "relocs");
651 rel_size = rel_size / sizeof (Elf64_External_Rela);
653 relas = (Elf_Internal_Rela *)
654 malloc (rel_size * sizeof (Elf_Internal_Rela));
656 if (relas == NULL)
658 error(_("out of memory parsing relocs"));
659 return 0;
662 for (i = 0; i < rel_size; i++)
664 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
665 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
666 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
669 free (erelas);
671 rels = (Elf_Internal_Rel *) relas;
674 else
676 if (is_32bit_elf)
678 Elf32_External_Rel * erels;
680 GET_DATA_ALLOC (rel_offset, rel_size, erels,
681 Elf32_External_Rel *, "relocs");
683 rel_size = rel_size / sizeof (Elf32_External_Rel);
685 rels = (Elf_Internal_Rel *)
686 malloc (rel_size * sizeof (Elf_Internal_Rel));
688 if (rels == NULL)
690 error(_("out of memory parsing relocs"));
691 return 0;
694 for (i = 0; i < rel_size; i++)
696 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
697 rels[i].r_info = BYTE_GET (erels[i].r_info);
700 free (erels);
702 relas = (Elf_Internal_Rela *) rels;
704 else
706 Elf64_External_Rel * erels;
708 GET_DATA_ALLOC (rel_offset, rel_size, erels,
709 Elf64_External_Rel *, "relocs");
711 rel_size = rel_size / sizeof (Elf64_External_Rel);
713 rels = (Elf_Internal_Rel *)
714 malloc (rel_size * sizeof (Elf_Internal_Rel));
716 if (rels == NULL)
718 error(_("out of memory parsing relocs"));
719 return 0;
722 for (i = 0; i < rel_size; i++)
724 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
725 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
728 free (erels);
730 relas = (Elf_Internal_Rela *) rels;
734 if (is_rela)
735 printf
736 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
737 else
738 printf
739 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
741 for (i = 0; i < rel_size; i++)
743 const char * rtype;
744 bfd_vma offset;
745 bfd_vma info;
746 bfd_vma symtab_index;
747 bfd_vma type;
749 if (is_rela)
751 offset = relas [i].r_offset;
752 info = relas [i].r_info;
754 else
756 offset = rels [i].r_offset;
757 info = rels [i].r_info;
760 if (is_32bit_elf)
762 type = ELF32_R_TYPE (info);
763 symtab_index = ELF32_R_SYM (info);
765 else
767 if (elf_header.e_machine == EM_SPARCV9)
768 type = ELF64_R_TYPE_ID (info);
769 else
770 type = ELF64_R_TYPE (info);
771 /* The #ifdef BFD64 below is to prevent a compile time warning.
772 We know that if we do not have a 64 bit data type that we
773 will never execute this code anyway. */
774 #ifdef BFD64
775 symtab_index = ELF64_R_SYM (info);
776 #endif
779 #ifdef _bfd_int64_low
780 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
781 #else
782 printf (" %8.8lx %5.5lx ", offset, info);
783 #endif
785 switch (elf_header.e_machine)
787 default:
788 rtype = NULL;
789 break;
791 case EM_CYGNUS_M32R:
792 rtype = elf_m32r_reloc_type (type);
793 break;
795 case EM_386:
796 case EM_486:
797 rtype = elf_i386_reloc_type (type);
798 break;
800 case EM_68K:
801 rtype = elf_m68k_reloc_type (type);
802 break;
804 case EM_960:
805 rtype = elf_i960_reloc_type (type);
806 break;
808 case EM_AVR:
809 rtype = elf_avr_reloc_type (type);
810 break;
812 case EM_OLD_SPARCV9:
813 case EM_SPARC32PLUS:
814 case EM_SPARCV9:
815 case EM_SPARC:
816 rtype = elf_sparc_reloc_type (type);
817 break;
819 case EM_CYGNUS_V850:
820 rtype = v850_reloc_type (type);
821 break;
823 case EM_CYGNUS_D10V:
824 rtype = elf_d10v_reloc_type (type);
825 break;
827 case EM_CYGNUS_D30V:
828 rtype = elf_d30v_reloc_type (type);
829 break;
831 case EM_SH:
832 rtype = elf_sh_reloc_type (type);
833 break;
835 case EM_CYGNUS_MN10300:
836 rtype = elf_mn10300_reloc_type (type);
837 break;
839 case EM_CYGNUS_MN10200:
840 rtype = elf_mn10200_reloc_type (type);
841 break;
843 case EM_CYGNUS_FR30:
844 rtype = elf_fr30_reloc_type (type);
845 break;
847 case EM_MCORE:
848 rtype = elf_mcore_reloc_type (type);
849 break;
851 case EM_PPC:
852 rtype = elf_ppc_reloc_type (type);
853 break;
855 case EM_MIPS:
856 case EM_MIPS_RS4_BE:
857 rtype = elf_mips_reloc_type (type);
858 break;
860 case EM_ALPHA:
861 rtype = elf_alpha_reloc_type (type);
862 break;
864 case EM_ARM:
865 rtype = elf_arm_reloc_type (type);
866 break;
868 case EM_CYGNUS_ARC:
869 rtype = elf_arc_reloc_type (type);
870 break;
872 case EM_PARISC:
873 rtype = elf_hppa_reloc_type (type);
874 break;
876 case EM_PJ:
877 rtype = elf_pj_reloc_type (type);
878 break;
879 case EM_IA_64:
880 rtype = elf_ia64_reloc_type (type);
881 break;
884 if (rtype == NULL)
885 #ifdef _bfd_int64_low
886 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
887 #else
888 printf (_("unrecognised: %-7lx"), type);
889 #endif
890 else
891 printf ("%-21.21s", rtype);
893 if (symtab_index)
895 if (symtab != NULL)
897 if (symtab_index >= nsyms)
898 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
899 else
901 Elf_Internal_Sym * psym;
903 psym = symtab + symtab_index;
905 printf (" ");
906 print_vma (psym->st_value, LONG_HEX);
907 printf (" ");
909 if (psym->st_name == 0)
910 printf ("%-25.25s",
911 SECTION_NAME (section_headers + psym->st_shndx));
912 else if (strtab == NULL)
913 printf (_("<string table index %3ld>"), psym->st_name);
914 else
915 printf ("%-25.25s", strtab + psym->st_name);
917 if (is_rela)
918 printf (" + %lx", (unsigned long) relas [i].r_addend);
922 else if (is_rela)
924 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
925 print_vma (relas[i].r_addend, LONG_HEX);
928 if (elf_header.e_machine == EM_SPARCV9
929 && !strcmp (rtype, "R_SPARC_OLO10"))
930 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
932 putchar ('\n');
935 free (relas);
937 return 1;
940 static const char *
941 get_mips_dynamic_type (type)
942 unsigned long type;
944 switch (type)
946 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
947 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
948 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
949 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
950 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
951 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
952 case DT_MIPS_MSYM: return "MIPS_MSYM";
953 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
954 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
955 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
956 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
957 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
958 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
959 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
960 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
961 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
962 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
963 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
964 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
965 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
966 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
967 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
968 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
969 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
970 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
971 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
972 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
973 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
974 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
975 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
976 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
977 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
978 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
979 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
980 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
981 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
982 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
983 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
984 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
985 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
986 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
987 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
988 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
989 default:
990 return NULL;
994 static const char *
995 get_sparc64_dynamic_type (type)
996 unsigned long type;
998 switch (type)
1000 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1001 default:
1002 return NULL;
1006 static const char *
1007 get_parisc_dynamic_type (type)
1008 unsigned long type;
1010 switch (type)
1012 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1013 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1014 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1015 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1016 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1017 case DT_HP_PREINIT: return "HP_PREINIT";
1018 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1019 case DT_HP_NEEDED: return "HP_NEEDED";
1020 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1021 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1022 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1023 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1024 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1025 default:
1026 return NULL;
1030 static const char *
1031 get_dynamic_type (type)
1032 unsigned long type;
1034 static char buff [32];
1036 switch (type)
1038 case DT_NULL: return "NULL";
1039 case DT_NEEDED: return "NEEDED";
1040 case DT_PLTRELSZ: return "PLTRELSZ";
1041 case DT_PLTGOT: return "PLTGOT";
1042 case DT_HASH: return "HASH";
1043 case DT_STRTAB: return "STRTAB";
1044 case DT_SYMTAB: return "SYMTAB";
1045 case DT_RELA: return "RELA";
1046 case DT_RELASZ: return "RELASZ";
1047 case DT_RELAENT: return "RELAENT";
1048 case DT_STRSZ: return "STRSZ";
1049 case DT_SYMENT: return "SYMENT";
1050 case DT_INIT: return "INIT";
1051 case DT_FINI: return "FINI";
1052 case DT_SONAME: return "SONAME";
1053 case DT_RPATH: return "RPATH";
1054 case DT_SYMBOLIC: return "SYMBOLIC";
1055 case DT_REL: return "REL";
1056 case DT_RELSZ: return "RELSZ";
1057 case DT_RELENT: return "RELENT";
1058 case DT_PLTREL: return "PLTREL";
1059 case DT_DEBUG: return "DEBUG";
1060 case DT_TEXTREL: return "TEXTREL";
1061 case DT_JMPREL: return "JMPREL";
1062 case DT_BIND_NOW: return "BIND_NOW";
1063 case DT_INIT_ARRAY: return "INIT_ARRAY";
1064 case DT_FINI_ARRAY: return "FINI_ARRAY";
1065 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1066 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1067 case DT_RUNPATH: return "RUNPATH";
1068 case DT_FLAGS: return "FLAGS";
1070 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1071 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1073 case DT_CHECKSUM: return "CHECKSUM";
1074 case DT_PLTPADSZ: return "PLTPADSZ";
1075 case DT_MOVEENT: return "MOVEENT";
1076 case DT_MOVESZ: return "MOVESZ";
1077 case DT_FEATURE: return "FEATURE";
1078 case DT_POSFLAG_1: return "POSFLAG_1";
1079 case DT_SYMINSZ: return "SYMINSZ";
1080 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1082 case DT_ADDRRNGLO: return "ADDRRNGLO";
1083 case DT_CONFIG: return "CONFIG";
1084 case DT_DEPAUDIT: return "DEPAUDIT";
1085 case DT_AUDIT: return "AUDIT";
1086 case DT_PLTPAD: return "PLTPAD";
1087 case DT_MOVETAB: return "MOVETAB";
1088 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1090 case DT_VERSYM: return "VERSYM";
1092 case DT_RELACOUNT: return "RELACOUNT";
1093 case DT_RELCOUNT: return "RELCOUNT";
1094 case DT_FLAGS_1: return "FLAGS_1";
1095 case DT_VERDEF: return "VERDEF";
1096 case DT_VERDEFNUM: return "VERDEFNUM";
1097 case DT_VERNEED: return "VERNEED";
1098 case DT_VERNEEDNUM: return "VERNEEDNUM";
1100 case DT_AUXILIARY: return "AUXILIARY";
1101 case DT_USED: return "USED";
1102 case DT_FILTER: return "FILTER";
1104 default:
1105 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1107 const char * result;
1109 switch (elf_header.e_machine)
1111 case EM_MIPS:
1112 case EM_MIPS_RS4_BE:
1113 result = get_mips_dynamic_type (type);
1114 break;
1115 case EM_SPARCV9:
1116 result = get_sparc64_dynamic_type (type);
1117 break;
1118 default:
1119 result = NULL;
1120 break;
1123 if (result != NULL)
1124 return result;
1126 sprintf (buff, _("Processor Specific: %lx"), type);
1128 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1130 const char * result;
1132 switch (elf_header.e_machine)
1134 case EM_PARISC:
1135 result = get_parisc_dynamic_type (type);
1136 break;
1137 default:
1138 result = NULL;
1139 break;
1142 if (result != NULL)
1143 return result;
1145 sprintf (buff, _("Operating System specific: %lx"), type);
1147 else
1148 sprintf (buff, _("<unknown>: %lx"), type);
1150 return buff;
1154 static char *
1155 get_file_type (e_type)
1156 unsigned e_type;
1158 static char buff [32];
1160 switch (e_type)
1162 case ET_NONE: return _("NONE (None)");
1163 case ET_REL: return _("REL (Relocatable file)");
1164 case ET_EXEC: return _("EXEC (Executable file)");
1165 case ET_DYN: return _("DYN (Shared object file)");
1166 case ET_CORE: return _("CORE (Core file)");
1168 default:
1169 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1170 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1171 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1172 sprintf (buff, _("OS Specific: (%x)"), e_type);
1173 else
1174 sprintf (buff, _("<unknown>: %x"), e_type);
1175 return buff;
1179 static char *
1180 get_machine_name (e_machine)
1181 unsigned e_machine;
1183 static char buff [64]; /* XXX */
1185 switch (e_machine)
1187 case EM_NONE: return _("None");
1188 case EM_M32: return "WE32100";
1189 case EM_SPARC: return "Sparc";
1190 case EM_386: return "Intel 80386";
1191 case EM_68K: return "MC68000";
1192 case EM_88K: return "MC88000";
1193 case EM_486: return "Intel 80486";
1194 case EM_860: return "Intel 80860";
1195 case EM_MIPS: return "MIPS R3000";
1196 case EM_S370: return "IBM System/370";
1197 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1198 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1199 case EM_PARISC: return "HPPA";
1200 case EM_PPC_OLD: return "Power PC (old)";
1201 case EM_SPARC32PLUS: return "Sparc v8+" ;
1202 case EM_960: return "Intel 90860";
1203 case EM_PPC: return "PowerPC";
1204 case EM_V800: return "NEC V800";
1205 case EM_FR20: return "Fujitsu FR20";
1206 case EM_RH32: return "TRW RH32";
1207 case EM_MCORE: return "MCORE";
1208 case EM_ARM: return "ARM";
1209 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1210 case EM_SH: return "Hitachi SH";
1211 case EM_SPARCV9: return "Sparc v9";
1212 case EM_TRICORE: return "Siemens Tricore";
1213 case EM_ARC: return "Argonaut RISC Core";
1214 case EM_H8_300: return "Hitachi H8/300";
1215 case EM_H8_300H: return "Hitachi H8/300H";
1216 case EM_H8S: return "Hitachi H8S";
1217 case EM_H8_500: return "Hitachi H8/500";
1218 case EM_IA_64: return "Intel IA-64";
1219 case EM_MIPS_X: return "Stanford MIPS-X";
1220 case EM_COLDFIRE: return "Motorola Coldfire";
1221 case EM_68HC12: return "Motorola M68HC12";
1222 case EM_ALPHA: return "Alpha";
1223 case EM_CYGNUS_D10V: return "d10v";
1224 case EM_CYGNUS_D30V: return "d30v";
1225 case EM_CYGNUS_ARC: return "Arc";
1226 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1227 case EM_CYGNUS_V850: return "NEC v850";
1228 case EM_CYGNUS_MN10300: return "mn10300";
1229 case EM_CYGNUS_MN10200: return "mn10200";
1230 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1231 case EM_PJ: return "picoJava";
1232 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1233 case EM_PCP: return "Siemens PCP";
1234 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1235 case EM_NDR1: return "Denso NDR1 microprocesspr";
1236 case EM_STARCORE: return "Motorola Star*Core processor";
1237 case EM_ME16: return "Toyota ME16 processor";
1238 case EM_ST100: return "STMicroelectronics ST100 processor";
1239 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1240 case EM_FX66: return "Siemens FX66 microcontroller";
1241 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1242 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1243 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1244 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1245 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1246 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1247 case EM_SVX: return "Silicon Graphics SVx";
1248 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1249 case EM_VAX: return "Digital VAX";
1250 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1251 default:
1252 sprintf (buff, _("<unknown>: %x"), e_machine);
1253 return buff;
1257 static void
1258 decode_ARM_machine_flags (e_flags, buf)
1259 unsigned e_flags;
1260 char buf[];
1262 unsigned eabi;
1263 int unknown = 0;
1265 eabi = EF_ARM_EABI_VERSION (e_flags);
1266 e_flags &= ~ EF_ARM_EABIMASK;
1268 /* Handle "generic" ARM flags. */
1269 if (e_flags & EF_ARM_RELEXEC)
1271 strcat (buf, ", relocatable executable");
1272 e_flags &= ~ EF_ARM_RELEXEC;
1275 if (e_flags & EF_ARM_HASENTRY)
1277 strcat (buf, ", has entry point");
1278 e_flags &= ~ EF_ARM_HASENTRY;
1281 /* Now handle EABI specific flags. */
1282 switch (eabi)
1284 default:
1285 strcat (buf, ", <unknown EABI>");
1286 if (e_flags)
1287 unknown = 1;
1288 break;
1290 case EF_ARM_EABI_VER1:
1291 while (e_flags)
1293 unsigned flag;
1295 /* Process flags one bit at a time. */
1296 flag = e_flags & - e_flags;
1297 e_flags &= ~ flag;
1299 switch (flag)
1301 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1302 strcat (buf, ", sorted symbol tables");
1303 break;
1305 default:
1306 unknown = 1;
1307 break;
1310 break;
1312 case EF_ARM_EABI_UNKNOWN:
1313 while (e_flags)
1315 unsigned flag;
1317 /* Process flags one bit at a time. */
1318 flag = e_flags & - e_flags;
1319 e_flags &= ~ flag;
1321 switch (flag)
1323 case EF_INTERWORK:
1324 strcat (buf, ", interworking enabled");
1325 break;
1327 case EF_APCS_26:
1328 strcat (buf, ", uses APCS/26");
1329 break;
1331 case EF_APCS_FLOAT:
1332 strcat (buf, ", uses APCS/float");
1333 break;
1335 case EF_PIC:
1336 strcat (buf, ", position independent");
1337 break;
1339 case EF_ALIGN8:
1340 strcat (buf, ", 8 bit structure alignment");
1341 break;
1343 case EF_NEW_ABI:
1344 strcat (buf, ", uses new ABI");
1345 break;
1347 case EF_OLD_ABI:
1348 strcat (buf, ", uses old ABI");
1349 break;
1351 case EF_SOFT_FLOAT:
1352 strcat (buf, ", software FP");
1353 break;
1355 default:
1356 unknown = 1;
1357 break;
1362 if (unknown)
1363 strcat (buf,", <unknown>");
1366 static char *
1367 get_machine_flags (e_flags, e_machine)
1368 unsigned e_flags;
1369 unsigned e_machine;
1371 static char buf [1024];
1373 buf[0] = '\0';
1375 if (e_flags)
1377 switch (e_machine)
1379 default:
1380 break;
1382 case EM_ARM:
1383 decode_ARM_machine_flags (e_flags, buf);
1384 break;
1386 case EM_68K:
1387 if (e_flags & EF_CPU32)
1388 strcat (buf, ", cpu32");
1389 break;
1391 case EM_PPC:
1392 if (e_flags & EF_PPC_EMB)
1393 strcat (buf, ", emb");
1395 if (e_flags & EF_PPC_RELOCATABLE)
1396 strcat (buf, ", relocatable");
1398 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1399 strcat (buf, ", relocatable-lib");
1400 break;
1402 case EM_CYGNUS_V850:
1403 switch (e_flags & EF_V850_ARCH)
1405 case E_V850E_ARCH:
1406 strcat (buf, ", v850e");
1407 break;
1408 case E_V850EA_ARCH:
1409 strcat (buf, ", v850ea");
1410 break;
1411 case E_V850_ARCH:
1412 strcat (buf, ", v850");
1413 break;
1414 default:
1415 strcat (buf, ", unknown v850 architecture variant");
1416 break;
1418 break;
1420 case EM_CYGNUS_M32R:
1421 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1422 strcat (buf, ", m32r");
1424 break;
1426 case EM_MIPS:
1427 case EM_MIPS_RS4_BE:
1428 if (e_flags & EF_MIPS_NOREORDER)
1429 strcat (buf, ", noreorder");
1431 if (e_flags & EF_MIPS_PIC)
1432 strcat (buf, ", pic");
1434 if (e_flags & EF_MIPS_CPIC)
1435 strcat (buf, ", cpic");
1437 if (e_flags & EF_MIPS_ABI2)
1438 strcat (buf, ", abi2");
1440 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1441 strcat (buf, ", mips1");
1443 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1444 strcat (buf, ", mips2");
1446 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1447 strcat (buf, ", mips3");
1449 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1450 strcat (buf, ", mips4");
1451 break;
1453 case EM_SPARCV9:
1454 if (e_flags & EF_SPARC_32PLUS)
1455 strcat (buf, ", v8+");
1457 if (e_flags & EF_SPARC_SUN_US1)
1458 strcat (buf, ", ultrasparcI");
1460 if (e_flags & EF_SPARC_SUN_US3)
1461 strcat (buf, ", ultrasparcIII");
1463 if (e_flags & EF_SPARC_HAL_R1)
1464 strcat (buf, ", halr1");
1466 if (e_flags & EF_SPARC_LEDATA)
1467 strcat (buf, ", ledata");
1469 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1470 strcat (buf, ", tso");
1472 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1473 strcat (buf, ", pso");
1475 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1476 strcat (buf, ", rmo");
1477 break;
1479 case EM_PARISC:
1480 switch (e_flags & EF_PARISC_ARCH)
1482 case EFA_PARISC_1_0:
1483 strcpy (buf, ", PA-RISC 1.0");
1484 break;
1485 case EFA_PARISC_1_1:
1486 strcpy (buf, ", PA-RISC 1.1");
1487 break;
1488 case EFA_PARISC_2_0:
1489 strcpy (buf, ", PA-RISC 2.0");
1490 break;
1491 default:
1492 break;
1494 if (e_flags & EF_PARISC_TRAPNIL)
1495 strcat (buf, ", trapnil");
1496 if (e_flags & EF_PARISC_EXT)
1497 strcat (buf, ", ext");
1498 if (e_flags & EF_PARISC_LSB)
1499 strcat (buf, ", lsb");
1500 if (e_flags & EF_PARISC_WIDE)
1501 strcat (buf, ", wide");
1502 if (e_flags & EF_PARISC_NO_KABP)
1503 strcat (buf, ", no kabp");
1504 if (e_flags & EF_PARISC_LAZYSWAP)
1505 strcat (buf, ", lazyswap");
1506 break;
1508 case EM_PJ:
1509 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1510 strcat (buf, ", new calling convention");
1512 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1513 strcat (buf, ", gnu calling convention");
1514 break;
1518 return buf;
1521 static const char *
1522 get_mips_segment_type (type)
1523 unsigned long type;
1525 switch (type)
1527 case PT_MIPS_REGINFO:
1528 return "REGINFO";
1529 case PT_MIPS_RTPROC:
1530 return "RTPROC";
1531 case PT_MIPS_OPTIONS:
1532 return "OPTIONS";
1533 default:
1534 break;
1537 return NULL;
1540 static const char *
1541 get_parisc_segment_type (type)
1542 unsigned long type;
1544 switch (type)
1546 case PT_HP_TLS: return "HP_TLS";
1547 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1548 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1549 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1550 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1551 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1552 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1553 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1554 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1555 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1556 case PT_HP_PARALLEL: return "HP_PARALLEL";
1557 case PT_HP_FASTBIND: return "HP_FASTBIND";
1558 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1559 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1560 default:
1561 break;
1564 return NULL;
1567 static const char *
1568 get_segment_type (p_type)
1569 unsigned long p_type;
1571 static char buff [32];
1573 switch (p_type)
1575 case PT_NULL: return "NULL";
1576 case PT_LOAD: return "LOAD";
1577 case PT_DYNAMIC: return "DYNAMIC";
1578 case PT_INTERP: return "INTERP";
1579 case PT_NOTE: return "NOTE";
1580 case PT_SHLIB: return "SHLIB";
1581 case PT_PHDR: return "PHDR";
1583 default:
1584 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1586 const char * result;
1588 switch (elf_header.e_machine)
1590 case EM_MIPS:
1591 case EM_MIPS_RS4_BE:
1592 result = get_mips_segment_type (p_type);
1593 break;
1594 case EM_PARISC:
1595 result = get_parisc_segment_type (p_type);
1596 break;
1597 default:
1598 result = NULL;
1599 break;
1602 if (result != NULL)
1603 return result;
1605 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1607 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1609 const char * result;
1611 switch (elf_header.e_machine)
1613 case EM_PARISC:
1614 result = get_parisc_segment_type (p_type);
1615 break;
1616 default:
1617 result = NULL;
1618 break;
1621 if (result != NULL)
1622 return result;
1624 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1626 else
1627 sprintf (buff, _("<unknown>: %lx"), p_type);
1629 return buff;
1633 static const char *
1634 get_mips_section_type_name (sh_type)
1635 unsigned int sh_type;
1637 switch (sh_type)
1639 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1640 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1641 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1642 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1643 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1644 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1645 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1646 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1647 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1648 case SHT_MIPS_RELD: return "MIPS_RELD";
1649 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1650 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1651 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1652 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1653 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1654 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1655 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1656 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1657 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1658 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1659 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1660 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1661 case SHT_MIPS_LINE: return "MIPS_LINE";
1662 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1663 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1664 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1665 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1666 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1667 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1668 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1669 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1670 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1671 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1672 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1673 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1674 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1675 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1676 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1677 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1678 default:
1679 break;
1681 return NULL;
1684 static const char *
1685 get_parisc_section_type_name (sh_type)
1686 unsigned int sh_type;
1688 switch (sh_type)
1690 case SHT_PARISC_EXT: return "PARISC_EXT";
1691 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1692 case SHT_PARISC_DOC: return "PARISC_DOC";
1693 default:
1694 break;
1696 return NULL;
1699 static const char *
1700 get_section_type_name (sh_type)
1701 unsigned int sh_type;
1703 static char buff [32];
1705 switch (sh_type)
1707 case SHT_NULL: return "NULL";
1708 case SHT_PROGBITS: return "PROGBITS";
1709 case SHT_SYMTAB: return "SYMTAB";
1710 case SHT_STRTAB: return "STRTAB";
1711 case SHT_RELA: return "RELA";
1712 case SHT_HASH: return "HASH";
1713 case SHT_DYNAMIC: return "DYNAMIC";
1714 case SHT_NOTE: return "NOTE";
1715 case SHT_NOBITS: return "NOBITS";
1716 case SHT_REL: return "REL";
1717 case SHT_SHLIB: return "SHLIB";
1718 case SHT_DYNSYM: return "DYNSYM";
1719 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1720 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1721 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1722 case SHT_GNU_verdef: return "VERDEF";
1723 case SHT_GNU_verneed: return "VERNEED";
1724 case SHT_GNU_versym: return "VERSYM";
1725 case 0x6ffffff0: return "VERSYM";
1726 case 0x6ffffffc: return "VERDEF";
1727 case 0x7ffffffd: return "AUXILIARY";
1728 case 0x7fffffff: return "FILTER";
1730 default:
1731 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1733 const char * result;
1735 switch (elf_header.e_machine)
1737 case EM_MIPS:
1738 case EM_MIPS_RS4_BE:
1739 result = get_mips_section_type_name (sh_type);
1740 break;
1741 case EM_PARISC:
1742 result = get_parisc_section_type_name (sh_type);
1743 break;
1744 default:
1745 result = NULL;
1746 break;
1749 if (result != NULL)
1750 return result;
1752 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1754 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1755 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1756 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1757 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1758 else
1759 sprintf (buff, _("<unknown>: %x"), sh_type);
1761 return buff;
1765 struct option options [] =
1767 {"all", no_argument, 0, 'a'},
1768 {"file-header", no_argument, 0, 'h'},
1769 {"program-headers", no_argument, 0, 'l'},
1770 {"headers", no_argument, 0, 'e'},
1771 {"histogram", no_argument, 0, 'I'},
1772 {"segments", no_argument, 0, 'l'},
1773 {"sections", no_argument, 0, 'S'},
1774 {"section-headers", no_argument, 0, 'S'},
1775 {"symbols", no_argument, 0, 's'},
1776 {"syms", no_argument, 0, 's'},
1777 {"relocs", no_argument, 0, 'r'},
1778 {"notes", no_argument, 0, 'n'},
1779 {"dynamic", no_argument, 0, 'd'},
1780 {"arch-specific", no_argument, 0, 'A'},
1781 {"version-info", no_argument, 0, 'V'},
1782 {"use-dynamic", no_argument, 0, 'D'},
1783 {"hex-dump", required_argument, 0, 'x'},
1784 {"debug-dump", optional_argument, 0, 'w'},
1785 #ifdef SUPPORT_DISASSEMBLY
1786 {"instruction-dump", required_argument, 0, 'i'},
1787 #endif
1789 {"version", no_argument, 0, 'v'},
1790 {"help", no_argument, 0, 'H'},
1791 {0, no_argument, 0, 0}
1794 static void
1795 usage ()
1797 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1798 fprintf (stdout, _(" Options are:\n"));
1799 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1800 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1801 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1802 fprintf (stdout, _(" Display the program headers\n"));
1803 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1804 fprintf (stdout, _(" Display the sections' header\n"));
1805 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1806 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1807 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1808 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1809 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1810 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1811 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1812 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1813 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1814 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1815 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1816 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1817 #ifdef SUPPORT_DISASSEMBLY
1818 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1819 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1820 #endif
1821 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1822 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1823 fprintf (stdout, _(" -H or --help Display this information\n"));
1824 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1826 exit (0);
1829 static void
1830 request_dump (section, type)
1831 unsigned int section;
1832 char type;
1834 if (section >= num_dump_sects)
1836 char * new_dump_sects;
1838 new_dump_sects = (char *) calloc (section + 1, 1);
1840 if (new_dump_sects == NULL)
1841 error (_("Out of memory allocating dump request table."));
1842 else
1844 /* Copy current flag settings. */
1845 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1847 free (dump_sects);
1849 dump_sects = new_dump_sects;
1850 num_dump_sects = section + 1;
1854 if (dump_sects)
1855 dump_sects [section] |= type;
1857 return;
1860 static void
1861 parse_args (argc, argv)
1862 int argc;
1863 char ** argv;
1865 int c;
1867 if (argc < 2)
1868 usage ();
1870 while ((c = getopt_long
1871 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1873 char * cp;
1874 int section;
1876 switch (c)
1878 case 0:
1879 /* Long options. */
1880 break;
1881 case 'H':
1882 usage ();
1883 break;
1885 case 'a':
1886 do_syms ++;
1887 do_reloc ++;
1888 do_dynamic ++;
1889 do_header ++;
1890 do_sections ++;
1891 do_segments ++;
1892 do_version ++;
1893 do_histogram ++;
1894 do_arch ++;
1895 do_notes ++;
1896 break;
1897 case 'e':
1898 do_header ++;
1899 do_sections ++;
1900 do_segments ++;
1901 break;
1902 case 'A':
1903 do_arch ++;
1904 break;
1905 case 'D':
1906 do_using_dynamic ++;
1907 break;
1908 case 'r':
1909 do_reloc ++;
1910 break;
1911 case 'h':
1912 do_header ++;
1913 break;
1914 case 'l':
1915 do_segments ++;
1916 break;
1917 case 's':
1918 do_syms ++;
1919 break;
1920 case 'S':
1921 do_sections ++;
1922 break;
1923 case 'd':
1924 do_dynamic ++;
1925 break;
1926 case 'I':
1927 do_histogram ++;
1928 break;
1929 case 'n':
1930 do_notes ++;
1931 break;
1932 case 'x':
1933 do_dump ++;
1934 section = strtoul (optarg, & cp, 0);
1935 if (! * cp && section >= 0)
1937 request_dump (section, HEX_DUMP);
1938 break;
1940 goto oops;
1941 case 'w':
1942 do_dump ++;
1943 if (optarg == 0)
1944 do_debugging = 1;
1945 else
1947 do_debugging = 0;
1948 switch (optarg[0])
1950 case 'i':
1951 case 'I':
1952 do_debug_info = 1;
1953 break;
1955 case 'a':
1956 case 'A':
1957 do_debug_abbrevs = 1;
1958 break;
1960 case 'l':
1961 case 'L':
1962 do_debug_lines = 1;
1963 break;
1965 case 'p':
1966 case 'P':
1967 do_debug_pubnames = 1;
1968 break;
1970 case 'r':
1971 case 'R':
1972 do_debug_aranges = 1;
1973 break;
1975 default:
1976 warn (_("Unrecognised debug option '%s'\n"), optarg);
1977 break;
1980 break;
1981 #ifdef SUPPORT_DISASSEMBLY
1982 case 'i':
1983 do_dump ++;
1984 section = strtoul (optarg, & cp, 0);
1985 if (! * cp && section >= 0)
1987 request_dump (section, DISASS_DUMP);
1988 break;
1990 goto oops;
1991 #endif
1992 case 'v':
1993 print_version (program_name);
1994 break;
1995 case 'V':
1996 do_version ++;
1997 break;
1998 default:
1999 oops:
2000 /* xgettext:c-format */
2001 error (_("Invalid option '-%c'\n"), c);
2002 /* Drop through. */
2003 case '?':
2004 usage ();
2008 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
2009 && !do_segments && !do_header && !do_dump && !do_version
2010 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2011 usage ();
2012 else if (argc < 3)
2014 warn (_("Nothing to do.\n"));
2015 usage();
2019 static const char *
2020 get_elf_class (elf_class)
2021 unsigned char elf_class;
2023 static char buff [32];
2025 switch (elf_class)
2027 case ELFCLASSNONE: return _("none");
2028 case ELFCLASS32: return _("ELF32");
2029 case ELFCLASS64: return _("ELF64");
2030 default:
2031 sprintf (buff, _("<unknown: %x>"), elf_class);
2032 return buff;
2036 static const char *
2037 get_data_encoding (encoding)
2038 unsigned char encoding;
2040 static char buff [32];
2042 switch (encoding)
2044 case ELFDATANONE: return _("none");
2045 case ELFDATA2LSB: return _("2's complement, little endian");
2046 case ELFDATA2MSB: return _("2's complement, big endian");
2047 default:
2048 sprintf (buff, _("<unknown: %x>"), encoding);
2049 return buff;
2053 static const char *
2054 get_osabi_name (osabi)
2055 unsigned char osabi;
2057 static char buff [32];
2059 switch (osabi)
2061 case ELFOSABI_NONE: return _("UNIX - System V");
2062 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2063 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2064 case ELFOSABI_LINUX: return _("UNIX - Linux");
2065 case ELFOSABI_HURD: return _("GNU/Hurd");
2066 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2067 case ELFOSABI_MONTEREY: return _("UNIX - Monterey");
2068 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2069 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2070 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2071 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2072 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2073 case ELFOSABI_STANDALONE: return _("Standalone App");
2074 case ELFOSABI_ARM: return _("ARM");
2075 default:
2076 sprintf (buff, _("<unknown: %x>"), osabi);
2077 return buff;
2081 /* Decode the data held in 'elf_header'. */
2082 static int
2083 process_file_header ()
2085 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2086 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2087 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2088 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2090 error
2091 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2092 return 0;
2095 if (do_header)
2097 int i;
2099 printf (_("ELF Header:\n"));
2100 printf (_(" Magic: "));
2101 for (i = 0; i < EI_NIDENT; i ++)
2102 printf ("%2.2x ", elf_header.e_ident [i]);
2103 printf ("\n");
2104 printf (_(" Class: %s\n"),
2105 get_elf_class (elf_header.e_ident [EI_CLASS]));
2106 printf (_(" Data: %s\n"),
2107 get_data_encoding (elf_header.e_ident [EI_DATA]));
2108 printf (_(" Version: %d %s\n"),
2109 elf_header.e_ident [EI_VERSION],
2110 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2111 ? "(current)"
2112 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2113 ? "<unknown: %lx>"
2114 : "")));
2115 printf (_(" OS/ABI: %s\n"),
2116 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2117 printf (_(" ABI Version: %d\n"),
2118 elf_header.e_ident [EI_ABIVERSION]);
2119 printf (_(" Type: %s\n"),
2120 get_file_type (elf_header.e_type));
2121 printf (_(" Machine: %s\n"),
2122 get_machine_name (elf_header.e_machine));
2123 printf (_(" Version: 0x%lx\n"),
2124 (unsigned long) elf_header.e_version);
2126 printf (_(" Entry point address: "));
2127 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2128 printf (_("\n Start of program headers: "));
2129 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2130 printf (_(" (bytes into file)\n Start of section headers: "));
2131 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2132 printf (_(" (bytes into file)\n"));
2134 printf (_(" Flags: 0x%lx%s\n"),
2135 (unsigned long) elf_header.e_flags,
2136 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2137 printf (_(" Size of this header: %ld (bytes)\n"),
2138 (long) elf_header.e_ehsize);
2139 printf (_(" Size of program headers: %ld (bytes)\n"),
2140 (long) elf_header.e_phentsize);
2141 printf (_(" Number of program headers: %ld\n"),
2142 (long) elf_header.e_phnum);
2143 printf (_(" Size of section headers: %ld (bytes)\n"),
2144 (long) elf_header.e_shentsize);
2145 printf (_(" Number of section headers: %ld\n"),
2146 (long) elf_header.e_shnum);
2147 printf (_(" Section header string table index: %ld\n"),
2148 (long) elf_header.e_shstrndx);
2151 return 1;
2155 static int
2156 get_32bit_program_headers (file, program_headers)
2157 FILE * file;
2158 Elf_Internal_Phdr * program_headers;
2160 Elf32_External_Phdr * phdrs;
2161 Elf32_External_Phdr * external;
2162 Elf32_Internal_Phdr * internal;
2163 unsigned int i;
2165 GET_DATA_ALLOC (elf_header.e_phoff,
2166 elf_header.e_phentsize * elf_header.e_phnum,
2167 phdrs, Elf32_External_Phdr *, "program headers");
2169 for (i = 0, internal = program_headers, external = phdrs;
2170 i < elf_header.e_phnum;
2171 i ++, internal ++, external ++)
2173 internal->p_type = BYTE_GET (external->p_type);
2174 internal->p_offset = BYTE_GET (external->p_offset);
2175 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2176 internal->p_paddr = BYTE_GET (external->p_paddr);
2177 internal->p_filesz = BYTE_GET (external->p_filesz);
2178 internal->p_memsz = BYTE_GET (external->p_memsz);
2179 internal->p_flags = BYTE_GET (external->p_flags);
2180 internal->p_align = BYTE_GET (external->p_align);
2183 free (phdrs);
2185 return 1;
2188 static int
2189 get_64bit_program_headers (file, program_headers)
2190 FILE * file;
2191 Elf_Internal_Phdr * program_headers;
2193 Elf64_External_Phdr * phdrs;
2194 Elf64_External_Phdr * external;
2195 Elf64_Internal_Phdr * internal;
2196 unsigned int i;
2198 GET_DATA_ALLOC (elf_header.e_phoff,
2199 elf_header.e_phentsize * elf_header.e_phnum,
2200 phdrs, Elf64_External_Phdr *, "program headers");
2202 for (i = 0, internal = program_headers, external = phdrs;
2203 i < elf_header.e_phnum;
2204 i ++, internal ++, external ++)
2206 internal->p_type = BYTE_GET (external->p_type);
2207 internal->p_flags = BYTE_GET (external->p_flags);
2208 internal->p_offset = BYTE_GET8 (external->p_offset);
2209 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2210 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2211 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2212 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2213 internal->p_align = BYTE_GET8 (external->p_align);
2216 free (phdrs);
2218 return 1;
2221 static int
2222 process_program_headers (file)
2223 FILE * file;
2225 Elf_Internal_Phdr * program_headers;
2226 Elf_Internal_Phdr * segment;
2227 unsigned int i;
2229 if (elf_header.e_phnum == 0)
2231 if (do_segments)
2232 printf (_("\nThere are no program headers in this file.\n"));
2233 return 1;
2236 if (do_segments && !do_header)
2238 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2239 printf (_("Entry point "));
2240 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2241 printf (_("\nThere are %d program headers, starting at offset "),
2242 elf_header.e_phnum);
2243 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2244 printf ("\n");
2247 program_headers = (Elf_Internal_Phdr *) malloc
2248 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2250 if (program_headers == NULL)
2252 error (_("Out of memory\n"));
2253 return 0;
2256 if (is_32bit_elf)
2257 i = get_32bit_program_headers (file, program_headers);
2258 else
2259 i = get_64bit_program_headers (file, program_headers);
2261 if (i == 0)
2263 free (program_headers);
2264 return 0;
2267 if (do_segments)
2269 printf
2270 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2272 if (is_32bit_elf)
2273 printf
2274 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2275 else
2277 printf
2278 (_(" Type Offset VirtAddr PhysAddr\n"));
2279 printf
2280 (_(" FileSiz MemSiz Flags Align\n"));
2284 loadaddr = -1;
2285 dynamic_addr = 0;
2286 dynamic_size = 0;
2288 for (i = 0, segment = program_headers;
2289 i < elf_header.e_phnum;
2290 i ++, segment ++)
2292 if (do_segments)
2294 printf (" %-14.14s ", get_segment_type (segment->p_type));
2296 if (is_32bit_elf)
2298 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2299 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2300 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2301 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2302 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2303 printf ("%c%c%c ",
2304 (segment->p_flags & PF_R ? 'R' : ' '),
2305 (segment->p_flags & PF_W ? 'W' : ' '),
2306 (segment->p_flags & PF_X ? 'E' : ' '));
2307 printf ("%#lx", (unsigned long) segment->p_align);
2309 else
2311 print_vma (segment->p_offset, FULL_HEX);
2312 putchar (' ');
2313 print_vma (segment->p_vaddr, FULL_HEX);
2314 putchar (' ');
2315 print_vma (segment->p_paddr, FULL_HEX);
2316 printf ("\n ");
2317 print_vma (segment->p_filesz, FULL_HEX);
2318 putchar (' ');
2319 print_vma (segment->p_memsz, FULL_HEX);
2320 printf (" %c%c%c ",
2321 (segment->p_flags & PF_R ? 'R' : ' '),
2322 (segment->p_flags & PF_W ? 'W' : ' '),
2323 (segment->p_flags & PF_X ? 'E' : ' '));
2324 print_vma (segment->p_align, HEX);
2328 switch (segment->p_type)
2330 case PT_LOAD:
2331 if (loadaddr == -1)
2332 loadaddr = (segment->p_vaddr & 0xfffff000)
2333 - (segment->p_offset & 0xfffff000);
2334 break;
2336 case PT_DYNAMIC:
2337 if (dynamic_addr)
2338 error (_("more than one dynamic segment\n"));
2340 dynamic_addr = segment->p_offset;
2341 dynamic_size = segment->p_filesz;
2342 break;
2344 case PT_INTERP:
2345 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2346 error (_("Unable to find program interpreter name\n"));
2347 else
2349 program_interpreter[0] = 0;
2350 fscanf (file, "%63s", program_interpreter);
2352 if (do_segments)
2353 printf (_("\n [Requesting program interpreter: %s]"),
2354 program_interpreter);
2356 break;
2359 if (do_segments)
2360 putc ('\n', stdout);
2363 if (loadaddr == -1)
2365 /* Very strange. */
2366 loadaddr = 0;
2369 if (do_segments && section_headers != NULL)
2371 printf (_("\n Section to Segment mapping:\n"));
2372 printf (_(" Segment Sections...\n"));
2374 assert (string_table != NULL);
2376 for (i = 0; i < elf_header.e_phnum; i++)
2378 int j;
2379 Elf_Internal_Shdr * section;
2381 segment = program_headers + i;
2382 section = section_headers;
2384 printf (" %2.2d ", i);
2386 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2388 if (section->sh_size > 0
2389 /* Compare allocated sections by VMA, unallocated
2390 sections by file offset. */
2391 && (section->sh_flags & SHF_ALLOC
2392 ? (section->sh_addr >= segment->p_vaddr
2393 && section->sh_addr + section->sh_size
2394 <= segment->p_vaddr + segment->p_memsz)
2395 : ((bfd_vma) section->sh_offset >= segment->p_offset
2396 && (section->sh_offset + section->sh_size
2397 <= segment->p_offset + segment->p_filesz))))
2398 printf ("%s ", SECTION_NAME (section));
2401 putc ('\n',stdout);
2405 free (program_headers);
2407 return 1;
2411 static int
2412 get_32bit_section_headers (file)
2413 FILE * file;
2415 Elf32_External_Shdr * shdrs;
2416 Elf32_Internal_Shdr * internal;
2417 unsigned int i;
2419 GET_DATA_ALLOC (elf_header.e_shoff,
2420 elf_header.e_shentsize * elf_header.e_shnum,
2421 shdrs, Elf32_External_Shdr *, "section headers");
2423 section_headers = (Elf_Internal_Shdr *) malloc
2424 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2426 if (section_headers == NULL)
2428 error (_("Out of memory\n"));
2429 return 0;
2432 for (i = 0, internal = section_headers;
2433 i < elf_header.e_shnum;
2434 i ++, internal ++)
2436 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2437 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2438 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2439 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2440 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2441 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2442 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2443 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2444 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2445 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2448 free (shdrs);
2450 return 1;
2453 static int
2454 get_64bit_section_headers (file)
2455 FILE * file;
2457 Elf64_External_Shdr * shdrs;
2458 Elf64_Internal_Shdr * internal;
2459 unsigned int i;
2461 GET_DATA_ALLOC (elf_header.e_shoff,
2462 elf_header.e_shentsize * elf_header.e_shnum,
2463 shdrs, Elf64_External_Shdr *, "section headers");
2465 section_headers = (Elf_Internal_Shdr *) malloc
2466 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2468 if (section_headers == NULL)
2470 error (_("Out of memory\n"));
2471 return 0;
2474 for (i = 0, internal = section_headers;
2475 i < elf_header.e_shnum;
2476 i ++, internal ++)
2478 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2479 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2480 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2481 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2482 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2483 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2484 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2485 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2486 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2487 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2490 free (shdrs);
2492 return 1;
2495 static Elf_Internal_Sym *
2496 get_32bit_elf_symbols (file, offset, number)
2497 FILE * file;
2498 unsigned long offset;
2499 unsigned long number;
2501 Elf32_External_Sym * esyms;
2502 Elf_Internal_Sym * isyms;
2503 Elf_Internal_Sym * psym;
2504 unsigned int j;
2506 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2507 esyms, Elf32_External_Sym *, "symbols");
2509 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2511 if (isyms == NULL)
2513 error (_("Out of memory\n"));
2514 free (esyms);
2516 return NULL;
2519 for (j = 0, psym = isyms;
2520 j < number;
2521 j ++, psym ++)
2523 psym->st_name = BYTE_GET (esyms[j].st_name);
2524 psym->st_value = BYTE_GET (esyms[j].st_value);
2525 psym->st_size = BYTE_GET (esyms[j].st_size);
2526 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2527 psym->st_info = BYTE_GET (esyms[j].st_info);
2528 psym->st_other = BYTE_GET (esyms[j].st_other);
2531 free (esyms);
2533 return isyms;
2536 static Elf_Internal_Sym *
2537 get_64bit_elf_symbols (file, offset, number)
2538 FILE * file;
2539 unsigned long offset;
2540 unsigned long number;
2542 Elf64_External_Sym * esyms;
2543 Elf_Internal_Sym * isyms;
2544 Elf_Internal_Sym * psym;
2545 unsigned int j;
2547 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2548 esyms, Elf64_External_Sym *, "symbols");
2550 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2552 if (isyms == NULL)
2554 error (_("Out of memory\n"));
2555 free (esyms);
2557 return NULL;
2560 for (j = 0, psym = isyms;
2561 j < number;
2562 j ++, psym ++)
2564 psym->st_name = BYTE_GET (esyms[j].st_name);
2565 psym->st_info = BYTE_GET (esyms[j].st_info);
2566 psym->st_other = BYTE_GET (esyms[j].st_other);
2567 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2568 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2569 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2572 free (esyms);
2574 return isyms;
2577 static const char *
2578 get_elf_section_flags (sh_flags)
2579 bfd_vma sh_flags;
2581 static char buff [32];
2583 * buff = 0;
2585 while (sh_flags)
2587 bfd_vma flag;
2589 flag = sh_flags & - sh_flags;
2590 sh_flags &= ~ flag;
2592 switch (flag)
2594 case SHF_WRITE: strcat (buff, "W"); break;
2595 case SHF_ALLOC: strcat (buff, "A"); break;
2596 case SHF_EXECINSTR: strcat (buff, "X"); break;
2597 case SHF_MERGE: strcat (buff, "M"); break;
2598 case SHF_STRINGS: strcat (buff, "S"); break;
2599 case SHF_INFO_LINK: strcat (buff, "I"); break;
2600 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2601 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2603 default:
2604 if (flag & SHF_MASKOS)
2606 strcat (buff, "o");
2607 sh_flags &= ~ SHF_MASKOS;
2609 else if (flag & SHF_MASKPROC)
2611 strcat (buff, "p");
2612 sh_flags &= ~ SHF_MASKPROC;
2614 else
2615 strcat (buff, "x");
2616 break;
2620 return buff;
2623 static int
2624 process_section_headers (file)
2625 FILE * file;
2627 Elf_Internal_Shdr * section;
2628 int i;
2630 section_headers = NULL;
2632 if (elf_header.e_shnum == 0)
2634 if (do_sections)
2635 printf (_("\nThere are no sections in this file.\n"));
2637 return 1;
2640 if (do_sections && !do_header)
2641 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2642 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2644 if (is_32bit_elf)
2646 if (! get_32bit_section_headers (file))
2647 return 0;
2649 else if (! get_64bit_section_headers (file))
2650 return 0;
2652 /* Read in the string table, so that we have names to display. */
2653 section = section_headers + elf_header.e_shstrndx;
2655 if (section->sh_size != 0)
2657 unsigned long string_table_offset;
2659 string_table_offset = section->sh_offset;
2661 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2662 string_table, char *, "string table");
2665 /* Scan the sections for the dynamic symbol table
2666 and dynamic string table and debug sections. */
2667 dynamic_symbols = NULL;
2668 dynamic_strings = NULL;
2669 dynamic_syminfo = NULL;
2671 for (i = 0, section = section_headers;
2672 i < elf_header.e_shnum;
2673 i ++, section ++)
2675 char * name = SECTION_NAME (section);
2677 if (section->sh_type == SHT_DYNSYM)
2679 if (dynamic_symbols != NULL)
2681 error (_("File contains multiple dynamic symbol tables\n"));
2682 continue;
2685 num_dynamic_syms = section->sh_size / section->sh_entsize;
2686 dynamic_symbols =
2687 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2689 else if (section->sh_type == SHT_STRTAB
2690 && strcmp (name, ".dynstr") == 0)
2692 if (dynamic_strings != NULL)
2694 error (_("File contains multiple dynamic string tables\n"));
2695 continue;
2698 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2699 dynamic_strings, char *, "dynamic strings");
2701 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2702 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2703 && strncmp (name, ".debug_", 7) == 0)
2705 name += 7;
2707 if (do_debugging
2708 || (do_debug_info && (strcmp (name, "info") == 0))
2709 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2710 || (do_debug_lines && (strcmp (name, "line") == 0))
2711 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2712 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2714 request_dump (i, DEBUG_DUMP);
2718 if (! do_sections)
2719 return 1;
2721 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2723 if (is_32bit_elf)
2724 printf
2725 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2726 else
2728 printf (_(" [Nr] Name Type Address Offset\n"));
2729 printf (_(" Size EntSize Flags Link Info Align\n"));
2732 for (i = 0, section = section_headers;
2733 i < elf_header.e_shnum;
2734 i ++, section ++)
2736 printf (" [%2d] %-17.17s %-15.15s ",
2738 SECTION_NAME (section),
2739 get_section_type_name (section->sh_type));
2741 if (is_32bit_elf)
2743 print_vma (section->sh_addr, LONG_HEX);
2745 printf ( " %6.6lx %6.6lx %2.2lx",
2746 (unsigned long) section->sh_offset,
2747 (unsigned long) section->sh_size,
2748 (unsigned long) section->sh_entsize);
2750 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2752 printf (" %2ld %3lx %ld\n",
2753 (unsigned long) section->sh_link,
2754 (unsigned long) section->sh_info,
2755 (unsigned long) section->sh_addralign);
2757 else
2759 putchar (' ');
2760 print_vma (section->sh_addr, LONG_HEX);
2761 printf (" %8.8lx", section->sh_offset);
2762 printf ("\n ");
2763 print_vma (section->sh_size, LONG_HEX);
2764 printf (" ");
2765 print_vma (section->sh_entsize, LONG_HEX);
2767 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2769 printf (" %2ld %3lx %ld\n",
2770 (unsigned long) section->sh_link,
2771 (unsigned long) section->sh_info,
2772 (unsigned long) section->sh_addralign);
2776 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2777 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2778 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2780 return 1;
2783 /* Process the reloc section. */
2784 static int
2785 process_relocs (file)
2786 FILE * file;
2788 unsigned long rel_size;
2789 unsigned long rel_offset;
2792 if (!do_reloc)
2793 return 1;
2795 if (do_using_dynamic)
2797 int is_rela = FALSE;
2799 rel_size = 0;
2800 rel_offset = 0;
2802 if (dynamic_info[DT_REL])
2804 rel_offset = dynamic_info[DT_REL];
2805 rel_size = dynamic_info[DT_RELSZ];
2806 is_rela = FALSE;
2808 else if (dynamic_info [DT_RELA])
2810 rel_offset = dynamic_info[DT_RELA];
2811 rel_size = dynamic_info[DT_RELASZ];
2812 is_rela = TRUE;
2814 else if (dynamic_info[DT_JMPREL])
2816 rel_offset = dynamic_info[DT_JMPREL];
2817 rel_size = dynamic_info[DT_PLTRELSZ];
2819 switch (dynamic_info[DT_PLTREL])
2821 case DT_REL:
2822 is_rela = FALSE;
2823 break;
2824 case DT_RELA:
2825 is_rela = TRUE;
2826 break;
2827 default:
2828 is_rela = UNKNOWN;
2829 break;
2833 if (rel_size)
2835 printf
2836 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2837 rel_offset, rel_size);
2839 dump_relocations (file, rel_offset - loadaddr, rel_size,
2840 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2842 else
2843 printf (_("\nThere are no dynamic relocations in this file.\n"));
2845 else
2847 Elf32_Internal_Shdr * section;
2848 unsigned long i;
2849 int found = 0;
2851 for (i = 0, section = section_headers;
2852 i < elf_header.e_shnum;
2853 i++, section ++)
2855 if ( section->sh_type != SHT_RELA
2856 && section->sh_type != SHT_REL)
2857 continue;
2859 rel_offset = section->sh_offset;
2860 rel_size = section->sh_size;
2862 if (rel_size)
2864 Elf32_Internal_Shdr * strsec;
2865 Elf32_Internal_Shdr * symsec;
2866 Elf_Internal_Sym * symtab;
2867 char * strtab;
2868 int is_rela;
2869 unsigned long nsyms;
2871 printf (_("\nRelocation section "));
2873 if (string_table == NULL)
2874 printf ("%d", section->sh_name);
2875 else
2876 printf ("'%s'", SECTION_NAME (section));
2878 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2879 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2881 symsec = section_headers + section->sh_link;
2883 nsyms = symsec->sh_size / symsec->sh_entsize;
2884 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2886 if (symtab == NULL)
2887 continue;
2889 strsec = section_headers + symsec->sh_link;
2891 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2892 char *, "string table");
2894 is_rela = section->sh_type == SHT_RELA;
2896 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2898 free (strtab);
2899 free (symtab);
2901 found = 1;
2905 if (! found)
2906 printf (_("\nThere are no relocations in this file.\n"));
2909 return 1;
2913 static void
2914 dynamic_segment_mips_val (entry)
2915 Elf_Internal_Dyn * entry;
2917 switch (entry->d_tag)
2919 case DT_MIPS_FLAGS:
2920 if (entry->d_un.d_val == 0)
2921 printf ("NONE\n");
2922 else
2924 static const char * opts[] =
2926 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2927 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2928 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2929 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2930 "RLD_ORDER_SAFE"
2932 unsigned int cnt;
2933 int first = 1;
2934 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2935 if (entry->d_un.d_val & (1 << cnt))
2937 printf ("%s%s", first ? "" : " ", opts[cnt]);
2938 first = 0;
2940 puts ("");
2942 break;
2944 case DT_MIPS_IVERSION:
2945 if (dynamic_strings != NULL)
2946 printf ("Interface Version: %s\n",
2947 dynamic_strings + entry->d_un.d_val);
2948 else
2949 printf ("%ld\n", (long) entry->d_un.d_ptr);
2950 break;
2952 case DT_MIPS_TIME_STAMP:
2954 char timebuf[20];
2955 struct tm * tmp;
2957 time_t time = entry->d_un.d_val;
2958 tmp = gmtime (&time);
2959 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
2960 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
2961 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2962 printf ("Time Stamp: %s\n", timebuf);
2964 break;
2966 case DT_MIPS_RLD_VERSION:
2967 case DT_MIPS_LOCAL_GOTNO:
2968 case DT_MIPS_CONFLICTNO:
2969 case DT_MIPS_LIBLISTNO:
2970 case DT_MIPS_SYMTABNO:
2971 case DT_MIPS_UNREFEXTNO:
2972 case DT_MIPS_HIPAGENO:
2973 case DT_MIPS_DELTA_CLASS_NO:
2974 case DT_MIPS_DELTA_INSTANCE_NO:
2975 case DT_MIPS_DELTA_RELOC_NO:
2976 case DT_MIPS_DELTA_SYM_NO:
2977 case DT_MIPS_DELTA_CLASSSYM_NO:
2978 case DT_MIPS_COMPACT_SIZE:
2979 printf ("%ld\n", (long) entry->d_un.d_ptr);
2980 break;
2982 default:
2983 printf ("%#lx\n", (long) entry->d_un.d_ptr);
2988 static void
2989 dynamic_segment_parisc_val (entry)
2990 Elf_Internal_Dyn * entry;
2992 switch (entry->d_tag)
2994 case DT_HP_DLD_FLAGS:
2996 static struct
2998 long int bit;
2999 const char * str;
3001 flags[] =
3003 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3004 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3005 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3006 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3007 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3008 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3009 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3010 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3011 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3012 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3013 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3015 int first = 1;
3016 size_t cnt;
3017 bfd_vma val = entry->d_un.d_val;
3019 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3020 if (val & flags[cnt].bit)
3022 if (! first)
3023 putchar (' ');
3024 fputs (flags[cnt].str, stdout);
3025 first = 0;
3026 val ^= flags[cnt].bit;
3029 if (val != 0 || first)
3031 if (! first)
3032 putchar (' ');
3033 print_vma (val, HEX);
3036 break;
3038 default:
3039 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3040 break;
3044 static int
3045 get_32bit_dynamic_segment (file)
3046 FILE * file;
3048 Elf32_External_Dyn * edyn;
3049 Elf_Internal_Dyn * entry;
3050 bfd_size_type i;
3052 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3053 edyn, Elf32_External_Dyn *, "dynamic segment");
3055 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3056 how large this .dynamic is now. We can do this even before the byte
3057 swapping since the DT_NULL tag is recognizable. */
3058 dynamic_size = 0;
3059 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3062 dynamic_segment = (Elf_Internal_Dyn *)
3063 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3065 if (dynamic_segment == NULL)
3067 error (_("Out of memory\n"));
3068 free (edyn);
3069 return 0;
3072 for (i = 0, entry = dynamic_segment;
3073 i < dynamic_size;
3074 i ++, entry ++)
3076 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3077 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3080 free (edyn);
3082 return 1;
3085 static int
3086 get_64bit_dynamic_segment (file)
3087 FILE * file;
3089 Elf64_External_Dyn * edyn;
3090 Elf_Internal_Dyn * entry;
3091 bfd_size_type i;
3093 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3094 edyn, Elf64_External_Dyn *, "dynamic segment");
3096 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3097 how large this .dynamic is now. We can do this even before the byte
3098 swapping since the DT_NULL tag is recognizable. */
3099 dynamic_size = 0;
3100 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3103 dynamic_segment = (Elf_Internal_Dyn *)
3104 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3106 if (dynamic_segment == NULL)
3108 error (_("Out of memory\n"));
3109 free (edyn);
3110 return 0;
3113 for (i = 0, entry = dynamic_segment;
3114 i < dynamic_size;
3115 i ++, entry ++)
3117 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3118 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3121 free (edyn);
3123 return 1;
3126 static const char *
3127 get_dynamic_flags (flags)
3128 bfd_vma flags;
3130 static char buff [64];
3131 while (flags)
3133 bfd_vma flag;
3135 flag = flags & - flags;
3136 flags &= ~ flag;
3138 switch (flag)
3140 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3141 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3142 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3143 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3144 default: strcat (buff, "unknown "); break;
3147 return buff;
3150 /* Parse and display the contents of the dynamic segment. */
3151 static int
3152 process_dynamic_segment (file)
3153 FILE * file;
3155 Elf_Internal_Dyn * entry;
3156 bfd_size_type i;
3158 if (dynamic_size == 0)
3160 if (do_dynamic)
3161 printf (_("\nThere is no dynamic segment in this file.\n"));
3163 return 1;
3166 if (is_32bit_elf)
3168 if (! get_32bit_dynamic_segment (file))
3169 return 0;
3171 else if (! get_64bit_dynamic_segment (file))
3172 return 0;
3174 /* Find the appropriate symbol table. */
3175 if (dynamic_symbols == NULL)
3177 for (i = 0, entry = dynamic_segment;
3178 i < dynamic_size;
3179 ++i, ++ entry)
3181 unsigned long offset;
3183 if (entry->d_tag != DT_SYMTAB)
3184 continue;
3186 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3188 /* Since we do not know how big the symbol table is,
3189 we default to reading in the entire file (!) and
3190 processing that. This is overkill, I know, but it
3191 should work. */
3192 offset = entry->d_un.d_val - loadaddr;
3194 if (fseek (file, 0, SEEK_END))
3195 error (_("Unable to seek to end of file!"));
3197 if (is_32bit_elf)
3198 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3199 else
3200 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3202 if (num_dynamic_syms < 1)
3204 error (_("Unable to determine the number of symbols to load\n"));
3205 continue;
3208 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3212 /* Similarly find a string table. */
3213 if (dynamic_strings == NULL)
3215 for (i = 0, entry = dynamic_segment;
3216 i < dynamic_size;
3217 ++i, ++ entry)
3219 unsigned long offset;
3220 long str_tab_len;
3222 if (entry->d_tag != DT_STRTAB)
3223 continue;
3225 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3227 /* Since we do not know how big the string table is,
3228 we default to reading in the entire file (!) and
3229 processing that. This is overkill, I know, but it
3230 should work. */
3232 offset = entry->d_un.d_val - loadaddr;
3233 if (fseek (file, 0, SEEK_END))
3234 error (_("Unable to seek to end of file\n"));
3235 str_tab_len = ftell (file) - offset;
3237 if (str_tab_len < 1)
3239 error
3240 (_("Unable to determine the length of the dynamic string table\n"));
3241 continue;
3244 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3245 "dynamic string table");
3247 break;
3251 /* And find the syminfo section if available. */
3252 if (dynamic_syminfo == NULL)
3254 unsigned int syminsz = 0;
3256 for (i = 0, entry = dynamic_segment;
3257 i < dynamic_size;
3258 ++i, ++ entry)
3260 if (entry->d_tag == DT_SYMINENT)
3262 /* Note: these braces are necessary to avoid a syntax
3263 error from the SunOS4 C compiler. */
3264 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3266 else if (entry->d_tag == DT_SYMINSZ)
3267 syminsz = entry->d_un.d_val;
3268 else if (entry->d_tag == DT_SYMINFO)
3269 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3272 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3274 Elf_External_Syminfo * extsyminfo;
3275 Elf_Internal_Syminfo * syminfo;
3277 /* There is a syminfo section. Read the data. */
3278 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3279 Elf_External_Syminfo *, "symbol information");
3281 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3282 if (dynamic_syminfo == NULL)
3284 error (_("Out of memory\n"));
3285 return 0;
3288 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3289 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3290 ++i, ++syminfo)
3292 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3293 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3296 free (extsyminfo);
3300 if (do_dynamic && dynamic_addr)
3301 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3302 dynamic_addr, (long) dynamic_size);
3303 if (do_dynamic)
3304 printf (_(" Tag Type Name/Value\n"));
3306 for (i = 0, entry = dynamic_segment;
3307 i < dynamic_size;
3308 i++, entry ++)
3310 if (do_dynamic)
3312 const char * dtype;
3314 putchar (' ');
3315 print_vma (entry->d_tag, FULL_HEX);
3316 dtype = get_dynamic_type (entry->d_tag);
3317 printf (" (%s)%*s", dtype,
3318 ((is_32bit_elf ? 27 : 19)
3319 - (int) strlen (dtype)),
3320 " ");
3323 switch (entry->d_tag)
3325 case DT_FLAGS:
3326 if (do_dynamic)
3327 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3328 break;
3330 case DT_AUXILIARY:
3331 case DT_FILTER:
3332 case DT_CONFIG:
3333 case DT_DEPAUDIT:
3334 case DT_AUDIT:
3335 if (do_dynamic)
3337 switch (entry->d_tag)
3339 case DT_AUXILIARY:
3340 printf (_("Auxiliary library"));
3341 break;
3343 case DT_FILTER:
3344 printf (_("Filter library"));
3345 break;
3347 case DT_CONFIG:
3348 printf (_("Configuration file"));
3349 break;
3351 case DT_DEPAUDIT:
3352 printf (_("Dependency audit library"));
3353 break;
3355 case DT_AUDIT:
3356 printf (_("Audit library"));
3357 break;
3360 if (dynamic_strings)
3361 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3362 else
3364 printf (": ");
3365 print_vma (entry->d_un.d_val, PREFIX_HEX);
3366 putchar ('\n');
3369 break;
3371 case DT_FEATURE:
3372 if (do_dynamic)
3374 printf (_("Flags:"));
3375 if (entry->d_un.d_val == 0)
3376 printf (_(" None\n"));
3377 else
3379 unsigned long int val = entry->d_un.d_val;
3380 if (val & DTF_1_PARINIT)
3382 printf (" PARINIT");
3383 val ^= DTF_1_PARINIT;
3385 if (val & DTF_1_CONFEXP)
3387 printf (" CONFEXP");
3388 val ^= DTF_1_CONFEXP;
3390 if (val != 0)
3391 printf (" %lx", val);
3392 puts ("");
3395 break;
3397 case DT_POSFLAG_1:
3398 if (do_dynamic)
3400 printf (_("Flags:"));
3401 if (entry->d_un.d_val == 0)
3402 printf (_(" None\n"));
3403 else
3405 unsigned long int val = entry->d_un.d_val;
3406 if (val & DF_P1_LAZYLOAD)
3408 printf (" LAZYLOAD");
3409 val ^= DF_P1_LAZYLOAD;
3411 if (val & DF_P1_GROUPPERM)
3413 printf (" GROUPPERM");
3414 val ^= DF_P1_GROUPPERM;
3416 if (val != 0)
3417 printf (" %lx", val);
3418 puts ("");
3421 break;
3423 case DT_FLAGS_1:
3424 if (do_dynamic)
3426 printf (_("Flags:"));
3427 if (entry->d_un.d_val == 0)
3428 printf (_(" None\n"));
3429 else
3431 unsigned long int val = entry->d_un.d_val;
3432 if (val & DF_1_NOW)
3434 printf (" NOW");
3435 val ^= DF_1_NOW;
3437 if (val & DF_1_GLOBAL)
3439 printf (" GLOBAL");
3440 val ^= DF_1_GLOBAL;
3442 if (val & DF_1_GROUP)
3444 printf (" GROUP");
3445 val ^= DF_1_GROUP;
3447 if (val & DF_1_NODELETE)
3449 printf (" NODELETE");
3450 val ^= DF_1_NODELETE;
3452 if (val & DF_1_LOADFLTR)
3454 printf (" LOADFLTR");
3455 val ^= DF_1_LOADFLTR;
3457 if (val & DF_1_INITFIRST)
3459 printf (" INITFIRST");
3460 val ^= DF_1_INITFIRST;
3462 if (val & DF_1_NOOPEN)
3464 printf (" NOOPEN");
3465 val ^= DF_1_NOOPEN;
3467 if (val & DF_1_ORIGIN)
3469 printf (" ORIGIN");
3470 val ^= DF_1_ORIGIN;
3472 if (val & DF_1_DIRECT)
3474 printf (" DIRECT");
3475 val ^= DF_1_DIRECT;
3477 if (val & DF_1_TRANS)
3479 printf (" TRANS");
3480 val ^= DF_1_TRANS;
3482 if (val & DF_1_INTERPOSE)
3484 printf (" INTERPOSE");
3485 val ^= DF_1_INTERPOSE;
3487 if (val & DF_1_NODEFLIB)
3489 printf (" NODEFLIB");
3490 val ^= DF_1_NODEFLIB;
3492 if (val & DF_1_NODUMP)
3494 printf (" NODUMP");
3495 val ^= DF_1_NODUMP;
3497 if (val & DF_1_CONLFAT)
3499 printf (" CONLFAT");
3500 val ^= DF_1_CONLFAT;
3502 if (val != 0)
3503 printf (" %lx", val);
3504 puts ("");
3507 break;
3509 case DT_PLTREL:
3510 if (do_dynamic)
3511 puts (get_dynamic_type (entry->d_un.d_val));
3512 break;
3514 case DT_NULL :
3515 case DT_NEEDED :
3516 case DT_PLTGOT :
3517 case DT_HASH :
3518 case DT_STRTAB :
3519 case DT_SYMTAB :
3520 case DT_RELA :
3521 case DT_INIT :
3522 case DT_FINI :
3523 case DT_SONAME :
3524 case DT_RPATH :
3525 case DT_SYMBOLIC:
3526 case DT_REL :
3527 case DT_DEBUG :
3528 case DT_TEXTREL :
3529 case DT_JMPREL :
3530 case DT_RUNPATH :
3531 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3533 if (do_dynamic)
3535 char * name;
3537 if (dynamic_strings == NULL)
3538 name = NULL;
3539 else
3540 name = dynamic_strings + entry->d_un.d_val;
3542 if (name)
3544 switch (entry->d_tag)
3546 case DT_NEEDED:
3547 printf (_("Shared library: [%s]"), name);
3549 if (strcmp (name, program_interpreter) == 0)
3550 printf (_(" program interpreter"));
3551 break;
3553 case DT_SONAME:
3554 printf (_("Library soname: [%s]"), name);
3555 break;
3557 case DT_RPATH:
3558 printf (_("Library rpath: [%s]"), name);
3559 break;
3561 case DT_RUNPATH:
3562 printf (_("Library runpath: [%s]"), name);
3563 break;
3565 default:
3566 print_vma (entry->d_un.d_val, PREFIX_HEX);
3567 break;
3570 else
3571 print_vma (entry->d_un.d_val, PREFIX_HEX);
3573 putchar ('\n');
3575 break;
3577 case DT_PLTRELSZ:
3578 case DT_RELASZ :
3579 case DT_STRSZ :
3580 case DT_RELSZ :
3581 case DT_RELAENT :
3582 case DT_SYMENT :
3583 case DT_RELENT :
3584 case DT_PLTPADSZ:
3585 case DT_MOVEENT :
3586 case DT_MOVESZ :
3587 case DT_INIT_ARRAYSZ:
3588 case DT_FINI_ARRAYSZ:
3589 if (do_dynamic)
3591 print_vma (entry->d_un.d_val, UNSIGNED);
3592 printf (" (bytes)\n");
3594 break;
3596 case DT_VERDEFNUM:
3597 case DT_VERNEEDNUM:
3598 case DT_RELACOUNT:
3599 case DT_RELCOUNT:
3600 if (do_dynamic)
3602 print_vma (entry->d_un.d_val, UNSIGNED);
3603 putchar ('\n');
3605 break;
3607 case DT_SYMINSZ:
3608 case DT_SYMINENT:
3609 case DT_SYMINFO:
3610 case DT_USED:
3611 case DT_INIT_ARRAY:
3612 case DT_FINI_ARRAY:
3613 if (do_dynamic)
3615 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3617 char * name;
3619 name = dynamic_strings + entry->d_un.d_val;
3621 if (* name)
3623 printf (_("Not needed object: [%s]\n"), name);
3624 break;
3628 print_vma (entry->d_un.d_val, PREFIX_HEX);
3629 putchar ('\n');
3631 break;
3633 case DT_BIND_NOW:
3634 /* The value of this entry is ignored. */
3635 break;
3637 default:
3638 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3639 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3640 entry->d_un.d_val;
3642 if (do_dynamic)
3644 switch (elf_header.e_machine)
3646 case EM_MIPS:
3647 case EM_MIPS_RS4_BE:
3648 dynamic_segment_mips_val (entry);
3649 break;
3650 case EM_PARISC:
3651 dynamic_segment_parisc_val (entry);
3652 break;
3653 default:
3654 print_vma (entry->d_un.d_val, PREFIX_HEX);
3655 putchar ('\n');
3658 break;
3662 return 1;
3665 static char *
3666 get_ver_flags (flags)
3667 unsigned int flags;
3669 static char buff [32];
3671 buff[0] = 0;
3673 if (flags == 0)
3674 return _("none");
3676 if (flags & VER_FLG_BASE)
3677 strcat (buff, "BASE ");
3679 if (flags & VER_FLG_WEAK)
3681 if (flags & VER_FLG_BASE)
3682 strcat (buff, "| ");
3684 strcat (buff, "WEAK ");
3687 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3688 strcat (buff, "| <unknown>");
3690 return buff;
3693 /* Display the contents of the version sections. */
3694 static int
3695 process_version_sections (file)
3696 FILE * file;
3698 Elf32_Internal_Shdr * section;
3699 unsigned i;
3700 int found = 0;
3702 if (! do_version)
3703 return 1;
3705 for (i = 0, section = section_headers;
3706 i < elf_header.e_shnum;
3707 i++, section ++)
3709 switch (section->sh_type)
3711 case SHT_GNU_verdef:
3713 Elf_External_Verdef * edefs;
3714 unsigned int idx;
3715 unsigned int cnt;
3717 found = 1;
3719 printf
3720 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3721 SECTION_NAME (section), section->sh_info);
3723 printf (_(" Addr: 0x"));
3724 printf_vma (section->sh_addr);
3725 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3726 (unsigned long) section->sh_offset, section->sh_link,
3727 SECTION_NAME (section_headers + section->sh_link));
3729 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3730 edefs, Elf_External_Verdef *,
3731 "version definition section");
3733 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3735 char * vstart;
3736 Elf_External_Verdef * edef;
3737 Elf_Internal_Verdef ent;
3738 Elf_External_Verdaux * eaux;
3739 Elf_Internal_Verdaux aux;
3740 int j;
3741 int isum;
3743 vstart = ((char *) edefs) + idx;
3745 edef = (Elf_External_Verdef *) vstart;
3747 ent.vd_version = BYTE_GET (edef->vd_version);
3748 ent.vd_flags = BYTE_GET (edef->vd_flags);
3749 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3750 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3751 ent.vd_hash = BYTE_GET (edef->vd_hash);
3752 ent.vd_aux = BYTE_GET (edef->vd_aux);
3753 ent.vd_next = BYTE_GET (edef->vd_next);
3755 printf (_(" %#06x: Rev: %d Flags: %s"),
3756 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3758 printf (_(" Index: %d Cnt: %d "),
3759 ent.vd_ndx, ent.vd_cnt);
3761 vstart += ent.vd_aux;
3763 eaux = (Elf_External_Verdaux *) vstart;
3765 aux.vda_name = BYTE_GET (eaux->vda_name);
3766 aux.vda_next = BYTE_GET (eaux->vda_next);
3768 if (dynamic_strings)
3769 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3770 else
3771 printf (_("Name index: %ld\n"), aux.vda_name);
3773 isum = idx + ent.vd_aux;
3775 for (j = 1; j < ent.vd_cnt; j ++)
3777 isum += aux.vda_next;
3778 vstart += aux.vda_next;
3780 eaux = (Elf_External_Verdaux *) vstart;
3782 aux.vda_name = BYTE_GET (eaux->vda_name);
3783 aux.vda_next = BYTE_GET (eaux->vda_next);
3785 if (dynamic_strings)
3786 printf (_(" %#06x: Parent %d: %s\n"),
3787 isum, j, dynamic_strings + aux.vda_name);
3788 else
3789 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3790 isum, j, aux.vda_name);
3793 idx += ent.vd_next;
3796 free (edefs);
3798 break;
3800 case SHT_GNU_verneed:
3802 Elf_External_Verneed * eneed;
3803 unsigned int idx;
3804 unsigned int cnt;
3806 found = 1;
3808 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3809 SECTION_NAME (section), section->sh_info);
3811 printf (_(" Addr: 0x"));
3812 printf_vma (section->sh_addr);
3813 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3814 (unsigned long) section->sh_offset, section->sh_link,
3815 SECTION_NAME (section_headers + section->sh_link));
3817 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3818 eneed, Elf_External_Verneed *,
3819 "version need section");
3821 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3823 Elf_External_Verneed * entry;
3824 Elf_Internal_Verneed ent;
3825 int j;
3826 int isum;
3827 char * vstart;
3829 vstart = ((char *) eneed) + idx;
3831 entry = (Elf_External_Verneed *) vstart;
3833 ent.vn_version = BYTE_GET (entry->vn_version);
3834 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3835 ent.vn_file = BYTE_GET (entry->vn_file);
3836 ent.vn_aux = BYTE_GET (entry->vn_aux);
3837 ent.vn_next = BYTE_GET (entry->vn_next);
3839 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3841 if (dynamic_strings)
3842 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3843 else
3844 printf (_(" File: %lx"), ent.vn_file);
3846 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3848 vstart += ent.vn_aux;
3850 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3852 Elf_External_Vernaux * eaux;
3853 Elf_Internal_Vernaux aux;
3855 eaux = (Elf_External_Vernaux *) vstart;
3857 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3858 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3859 aux.vna_other = BYTE_GET (eaux->vna_other);
3860 aux.vna_name = BYTE_GET (eaux->vna_name);
3861 aux.vna_next = BYTE_GET (eaux->vna_next);
3863 if (dynamic_strings)
3864 printf (_(" %#06x: Name: %s"),
3865 isum, dynamic_strings + aux.vna_name);
3866 else
3867 printf (_(" %#06x: Name index: %lx"),
3868 isum, aux.vna_name);
3870 printf (_(" Flags: %s Version: %d\n"),
3871 get_ver_flags (aux.vna_flags), aux.vna_other);
3873 isum += aux.vna_next;
3874 vstart += aux.vna_next;
3877 idx += ent.vn_next;
3880 free (eneed);
3882 break;
3884 case SHT_GNU_versym:
3886 Elf32_Internal_Shdr * link_section;
3887 int total;
3888 int cnt;
3889 unsigned char * edata;
3890 unsigned short * data;
3891 char * strtab;
3892 Elf_Internal_Sym * symbols;
3893 Elf32_Internal_Shdr * string_sec;
3895 link_section = section_headers + section->sh_link;
3896 total = section->sh_size / section->sh_entsize;
3898 found = 1;
3900 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3901 link_section->sh_size / link_section->sh_entsize);
3903 string_sec = section_headers + link_section->sh_link;
3905 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3906 strtab, char *, "version string table");
3908 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3909 SECTION_NAME (section), total);
3911 printf (_(" Addr: "));
3912 printf_vma (section->sh_addr);
3913 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3914 (unsigned long) section->sh_offset, section->sh_link,
3915 SECTION_NAME (link_section));
3917 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3918 - loadaddr,
3919 total * sizeof (short), edata,
3920 unsigned char *, "version symbol data");
3922 data = (unsigned short *) malloc (total * sizeof (short));
3924 for (cnt = total; cnt --;)
3925 data [cnt] = byte_get (edata + cnt * sizeof (short),
3926 sizeof (short));
3928 free (edata);
3930 for (cnt = 0; cnt < total; cnt += 4)
3932 int j, nn;
3933 char * name;
3935 printf (" %03x:", cnt);
3937 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3938 switch (data [cnt + j])
3940 case 0:
3941 fputs (_(" 0 (*local*) "), stdout);
3942 break;
3944 case 1:
3945 fputs (_(" 1 (*global*) "), stdout);
3946 break;
3948 default:
3949 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3950 data [cnt + j] & 0x8000 ? 'h' : ' ');
3952 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3953 && section_headers[symbols [cnt + j].st_shndx].sh_type
3954 == SHT_NOBITS)
3956 /* We must test both. */
3957 Elf_Internal_Verneed ivn;
3958 unsigned long offset;
3960 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3961 - loadaddr;
3965 Elf_External_Verneed evn;
3966 Elf_External_Vernaux evna;
3967 Elf_Internal_Vernaux ivna;
3968 unsigned long vna_off;
3970 GET_DATA (offset, evn, "version need");
3972 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3973 ivn.vn_next = BYTE_GET (evn.vn_next);
3975 vna_off = offset + ivn.vn_aux;
3979 GET_DATA (vna_off, evna,
3980 "version need aux (1)");
3982 ivna.vna_next = BYTE_GET (evna.vna_next);
3983 ivna.vna_other = BYTE_GET (evna.vna_other);
3985 vna_off += ivna.vna_next;
3987 while (ivna.vna_other != data [cnt + j]
3988 && ivna.vna_next != 0);
3990 if (ivna.vna_other == data [cnt + j])
3992 ivna.vna_name = BYTE_GET (evna.vna_name);
3994 name = strtab + ivna.vna_name;
3995 nn += printf ("(%s%-*s",
3996 name,
3997 12 - (int) strlen (name),
3998 ")");
3999 break;
4001 else if (ivn.vn_next == 0)
4003 if (data [cnt + j] != 0x8001)
4005 Elf_Internal_Verdef ivd;
4006 Elf_External_Verdef evd;
4008 offset = version_info
4009 [DT_VERSIONTAGIDX (DT_VERDEF)]
4010 - loadaddr;
4014 GET_DATA (offset, evd,
4015 "version definition");
4017 ivd.vd_next = BYTE_GET (evd.vd_next);
4018 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4020 offset += ivd.vd_next;
4022 while (ivd.vd_ndx
4023 != (data [cnt + j] & 0x7fff)
4024 && ivd.vd_next != 0);
4026 if (ivd.vd_ndx
4027 == (data [cnt + j] & 0x7fff))
4029 Elf_External_Verdaux evda;
4030 Elf_Internal_Verdaux ivda;
4032 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4034 GET_DATA (offset + ivd.vd_aux, evda,
4035 "version definition aux");
4037 ivda.vda_name =
4038 BYTE_GET (evda.vda_name);
4040 name = strtab + ivda.vda_name;
4041 nn +=
4042 printf ("(%s%-*s",
4043 name,
4044 12 - (int) strlen (name),
4045 ")");
4049 break;
4051 else
4052 offset += ivn.vn_next;
4054 while (ivn.vn_next);
4056 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4058 Elf_Internal_Verneed ivn;
4059 unsigned long offset;
4061 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4062 - loadaddr;
4066 Elf_Internal_Vernaux ivna;
4067 Elf_External_Verneed evn;
4068 Elf_External_Vernaux evna;
4069 unsigned long a_off;
4071 GET_DATA (offset, evn, "version need");
4073 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4074 ivn.vn_next = BYTE_GET (evn.vn_next);
4076 a_off = offset + ivn.vn_aux;
4080 GET_DATA (a_off, evna,
4081 "version need aux (2)");
4083 ivna.vna_next = BYTE_GET (evna.vna_next);
4084 ivna.vna_other = BYTE_GET (evna.vna_other);
4086 a_off += ivna.vna_next;
4088 while (ivna.vna_other != data [cnt + j]
4089 && ivna.vna_next != 0);
4091 if (ivna.vna_other == data [cnt + j])
4093 ivna.vna_name = BYTE_GET (evna.vna_name);
4095 name = strtab + ivna.vna_name;
4096 nn += printf ("(%s%-*s",
4097 name,
4098 12 - (int) strlen (name),
4099 ")");
4100 break;
4103 offset += ivn.vn_next;
4105 while (ivn.vn_next);
4107 else if (data [cnt + j] != 0x8001)
4109 Elf_Internal_Verdef ivd;
4110 Elf_External_Verdef evd;
4111 unsigned long offset;
4113 offset = version_info
4114 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4118 GET_DATA (offset, evd, "version def");
4120 ivd.vd_next = BYTE_GET (evd.vd_next);
4121 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4123 offset += ivd.vd_next;
4125 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4126 && ivd.vd_next != 0);
4128 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4130 Elf_External_Verdaux evda;
4131 Elf_Internal_Verdaux ivda;
4133 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4135 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4136 evda, "version def aux");
4138 ivda.vda_name = BYTE_GET (evda.vda_name);
4140 name = strtab + ivda.vda_name;
4141 nn += printf ("(%s%-*s",
4142 name,
4143 12 - (int) strlen (name),
4144 ")");
4148 if (nn < 18)
4149 printf ("%*c", 18 - nn, ' ');
4152 putchar ('\n');
4155 free (data);
4156 free (strtab);
4157 free (symbols);
4159 break;
4161 default:
4162 break;
4166 if (! found)
4167 printf (_("\nNo version information found in this file.\n"));
4169 return 1;
4172 static const char *
4173 get_symbol_binding (binding)
4174 unsigned int binding;
4176 static char buff [32];
4178 switch (binding)
4180 case STB_LOCAL: return "LOCAL";
4181 case STB_GLOBAL: return "GLOBAL";
4182 case STB_WEAK: return "WEAK";
4183 default:
4184 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4185 sprintf (buff, _("<processor specific>: %d"), binding);
4186 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4187 sprintf (buff, _("<OS specific>: %d"), binding);
4188 else
4189 sprintf (buff, _("<unknown>: %d"), binding);
4190 return buff;
4194 static const char *
4195 get_symbol_type (type)
4196 unsigned int type;
4198 static char buff [32];
4200 switch (type)
4202 case STT_NOTYPE: return "NOTYPE";
4203 case STT_OBJECT: return "OBJECT";
4204 case STT_FUNC: return "FUNC";
4205 case STT_SECTION: return "SECTION";
4206 case STT_FILE: return "FILE";
4207 case STT_COMMON: return "COMMON";
4208 default:
4209 if (type >= STT_LOPROC && type <= STT_HIPROC)
4211 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4212 return "THUMB_FUNC";
4214 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4215 return "REGISTER";
4217 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4218 return "PARISC_MILLI";
4220 sprintf (buff, _("<processor specific>: %d"), type);
4222 else if (type >= STT_LOOS && type <= STT_HIOS)
4224 if (elf_header.e_machine == EM_PARISC)
4226 if (type == STT_HP_OPAQUE)
4227 return "HP_OPAQUE";
4228 if (type == STT_HP_STUB)
4229 return "HP_STUB";
4232 sprintf (buff, _("<OS specific>: %d"), type);
4234 else
4235 sprintf (buff, _("<unknown>: %d"), type);
4236 return buff;
4240 static const char *
4241 get_symbol_visibility (visibility)
4242 unsigned int visibility;
4244 switch (visibility)
4246 case STV_DEFAULT: return "DEFAULT";
4247 case STV_INTERNAL: return "INTERNAL";
4248 case STV_HIDDEN: return "HIDDEN";
4249 case STV_PROTECTED: return "PROTECTED";
4250 default: abort ();
4254 static const char *
4255 get_symbol_index_type (type)
4256 unsigned int type;
4258 switch (type)
4260 case SHN_UNDEF: return "UND";
4261 case SHN_ABS: return "ABS";
4262 case SHN_COMMON: return "COM";
4263 default:
4264 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4265 return "PRC";
4266 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4267 return "RSV";
4268 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4269 return "OS ";
4270 else
4272 static char buff [32];
4274 sprintf (buff, "%3d", type);
4275 return buff;
4280 static int *
4281 get_dynamic_data (file, number)
4282 FILE * file;
4283 unsigned int number;
4285 unsigned char * e_data;
4286 int * i_data;
4288 e_data = (unsigned char *) malloc (number * 4);
4290 if (e_data == NULL)
4292 error (_("Out of memory\n"));
4293 return NULL;
4296 if (fread (e_data, 4, number, file) != number)
4298 error (_("Unable to read in dynamic data\n"));
4299 return NULL;
4302 i_data = (int *) malloc (number * sizeof (* i_data));
4304 if (i_data == NULL)
4306 error (_("Out of memory\n"));
4307 free (e_data);
4308 return NULL;
4311 while (number--)
4312 i_data [number] = byte_get (e_data + number * 4, 4);
4314 free (e_data);
4316 return i_data;
4319 /* Dump the symbol table */
4320 static int
4321 process_symbol_table (file)
4322 FILE * file;
4324 Elf32_Internal_Shdr * section;
4325 unsigned char nb [4];
4326 unsigned char nc [4];
4327 int nbuckets = 0;
4328 int nchains = 0;
4329 int * buckets = NULL;
4330 int * chains = NULL;
4332 if (! do_syms && !do_histogram)
4333 return 1;
4335 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4336 || do_histogram))
4338 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4340 error (_("Unable to seek to start of dynamic information"));
4341 return 0;
4344 if (fread (nb, sizeof (nb), 1, file) != 1)
4346 error (_("Failed to read in number of buckets\n"));
4347 return 0;
4350 if (fread (nc, sizeof (nc), 1, file) != 1)
4352 error (_("Failed to read in number of chains\n"));
4353 return 0;
4356 nbuckets = byte_get (nb, 4);
4357 nchains = byte_get (nc, 4);
4359 buckets = get_dynamic_data (file, nbuckets);
4360 chains = get_dynamic_data (file, nchains);
4362 if (buckets == NULL || chains == NULL)
4363 return 0;
4366 if (do_syms
4367 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4369 int hn;
4370 int si;
4372 printf (_("\nSymbol table for image:\n"));
4373 if (is_32bit_elf)
4374 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4375 else
4376 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4378 for (hn = 0; hn < nbuckets; hn++)
4380 if (! buckets [hn])
4381 continue;
4383 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4385 Elf_Internal_Sym * psym;
4387 psym = dynamic_symbols + si;
4389 printf (" %3d %3d: ", si, hn);
4390 print_vma (psym->st_value, LONG_HEX);
4391 putchar (' ' );
4392 print_vma (psym->st_size, DEC_5);
4394 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4395 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4396 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4397 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4398 printf (" %s\n", dynamic_strings + psym->st_name);
4402 else if (do_syms && !do_using_dynamic)
4404 unsigned int i;
4406 for (i = 0, section = section_headers;
4407 i < elf_header.e_shnum;
4408 i++, section++)
4410 unsigned int si;
4411 char * strtab;
4412 Elf_Internal_Sym * symtab;
4413 Elf_Internal_Sym * psym;
4416 if ( section->sh_type != SHT_SYMTAB
4417 && section->sh_type != SHT_DYNSYM)
4418 continue;
4420 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4421 SECTION_NAME (section),
4422 (unsigned long) (section->sh_size / section->sh_entsize));
4423 if (is_32bit_elf)
4424 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4425 else
4426 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4428 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4429 section->sh_size / section->sh_entsize);
4430 if (symtab == NULL)
4431 continue;
4433 if (section->sh_link == elf_header.e_shstrndx)
4434 strtab = string_table;
4435 else
4437 Elf32_Internal_Shdr * string_sec;
4439 string_sec = section_headers + section->sh_link;
4441 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4442 strtab, char *, "string table");
4445 for (si = 0, psym = symtab;
4446 si < section->sh_size / section->sh_entsize;
4447 si ++, psym ++)
4449 printf ("%6d: ", si);
4450 print_vma (psym->st_value, LONG_HEX);
4451 putchar (' ');
4452 print_vma (psym->st_size, DEC_5);
4453 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4454 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4455 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4456 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4457 printf (" %s", strtab + psym->st_name);
4459 if (section->sh_type == SHT_DYNSYM &&
4460 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4462 unsigned char data[2];
4463 unsigned short vers_data;
4464 unsigned long offset;
4465 int is_nobits;
4466 int check_def;
4468 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4469 - loadaddr;
4471 GET_DATA (offset + si * sizeof (vers_data), data,
4472 "version data");
4474 vers_data = byte_get (data, 2);
4476 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4477 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4478 : 0;
4480 check_def = (psym->st_shndx != SHN_UNDEF);
4482 if ((vers_data & 0x8000) || vers_data > 1)
4484 if (is_nobits || ! check_def)
4486 Elf_External_Verneed evn;
4487 Elf_Internal_Verneed ivn;
4488 Elf_Internal_Vernaux ivna;
4490 /* We must test both. */
4491 offset = version_info
4492 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4496 unsigned long vna_off;
4498 GET_DATA (offset, evn, "version need");
4500 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4501 ivn.vn_next = BYTE_GET (evn.vn_next);
4503 vna_off = offset + ivn.vn_aux;
4507 Elf_External_Vernaux evna;
4509 GET_DATA (vna_off, evna,
4510 "version need aux (3)");
4512 ivna.vna_other = BYTE_GET (evna.vna_other);
4513 ivna.vna_next = BYTE_GET (evna.vna_next);
4514 ivna.vna_name = BYTE_GET (evna.vna_name);
4516 vna_off += ivna.vna_next;
4518 while (ivna.vna_other != vers_data
4519 && ivna.vna_next != 0);
4521 if (ivna.vna_other == vers_data)
4522 break;
4524 offset += ivn.vn_next;
4526 while (ivn.vn_next != 0);
4528 if (ivna.vna_other == vers_data)
4530 printf ("@%s (%d)",
4531 strtab + ivna.vna_name, ivna.vna_other);
4532 check_def = 0;
4534 else if (! is_nobits)
4535 error (_("bad dynamic symbol"));
4536 else
4537 check_def = 1;
4540 if (check_def)
4542 if (vers_data != 0x8001)
4544 Elf_Internal_Verdef ivd;
4545 Elf_Internal_Verdaux ivda;
4546 Elf_External_Verdaux evda;
4547 unsigned long offset;
4549 offset =
4550 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4551 - loadaddr;
4555 Elf_External_Verdef evd;
4557 GET_DATA (offset, evd, "version def");
4559 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4560 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4561 ivd.vd_next = BYTE_GET (evd.vd_next);
4563 offset += ivd.vd_next;
4565 while (ivd.vd_ndx != (vers_data & 0x7fff)
4566 && ivd.vd_next != 0);
4568 offset -= ivd.vd_next;
4569 offset += ivd.vd_aux;
4571 GET_DATA (offset, evda, "version def aux");
4573 ivda.vda_name = BYTE_GET (evda.vda_name);
4575 if (psym->st_name != ivda.vda_name)
4576 printf ((vers_data & 0x8000)
4577 ? "@%s" : "@@%s",
4578 strtab + ivda.vda_name);
4584 putchar ('\n');
4587 free (symtab);
4588 if (strtab != string_table)
4589 free (strtab);
4592 else if (do_syms)
4593 printf
4594 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4596 if (do_histogram && buckets != NULL)
4598 int *lengths;
4599 int *counts;
4600 int hn;
4601 int si;
4602 int maxlength = 0;
4603 int nzero_counts = 0;
4604 int nsyms = 0;
4606 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4607 nbuckets);
4608 printf (_(" Length Number %% of total Coverage\n"));
4610 lengths = (int *) calloc (nbuckets, sizeof (int));
4611 if (lengths == NULL)
4613 error (_("Out of memory"));
4614 return 0;
4616 for (hn = 0; hn < nbuckets; ++hn)
4618 if (! buckets [hn])
4619 continue;
4621 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4623 ++ nsyms;
4624 if (maxlength < ++lengths[hn])
4625 ++ maxlength;
4629 counts = (int *) calloc (maxlength + 1, sizeof (int));
4630 if (counts == NULL)
4632 error (_("Out of memory"));
4633 return 0;
4636 for (hn = 0; hn < nbuckets; ++hn)
4637 ++ counts [lengths [hn]];
4639 if (nbuckets > 0)
4641 printf (" 0 %-10d (%5.1f%%)\n",
4642 counts[0], (counts[0] * 100.0) / nbuckets);
4643 for (si = 1; si <= maxlength; ++si)
4645 nzero_counts += counts[si] * si;
4646 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4647 si, counts[si], (counts[si] * 100.0) / nbuckets,
4648 (nzero_counts * 100.0) / nsyms);
4652 free (counts);
4653 free (lengths);
4656 if (buckets != NULL)
4658 free (buckets);
4659 free (chains);
4662 return 1;
4665 static int
4666 process_syminfo (file)
4667 FILE * file ATTRIBUTE_UNUSED;
4669 unsigned int i;
4671 if (dynamic_syminfo == NULL
4672 || !do_dynamic)
4673 /* No syminfo, this is ok. */
4674 return 1;
4676 /* There better should be a dynamic symbol section. */
4677 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4678 return 0;
4680 if (dynamic_addr)
4681 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4682 dynamic_syminfo_offset, dynamic_syminfo_nent);
4684 printf (_(" Num: Name BoundTo Flags\n"));
4685 for (i = 0; i < dynamic_syminfo_nent; ++i)
4687 unsigned short int flags = dynamic_syminfo[i].si_flags;
4689 printf ("%4d: %-30s ", i,
4690 dynamic_strings + dynamic_symbols[i].st_name);
4692 switch (dynamic_syminfo[i].si_boundto)
4694 case SYMINFO_BT_SELF:
4695 fputs ("SELF ", stdout);
4696 break;
4697 case SYMINFO_BT_PARENT:
4698 fputs ("PARENT ", stdout);
4699 break;
4700 default:
4701 if (dynamic_syminfo[i].si_boundto > 0
4702 && dynamic_syminfo[i].si_boundto < dynamic_size)
4703 printf ("%-10s ",
4704 dynamic_strings
4705 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4706 else
4707 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4708 break;
4711 if (flags & SYMINFO_FLG_DIRECT)
4712 printf (" DIRECT");
4713 if (flags & SYMINFO_FLG_PASSTHRU)
4714 printf (" PASSTHRU");
4715 if (flags & SYMINFO_FLG_COPY)
4716 printf (" COPY");
4717 if (flags & SYMINFO_FLG_LAZYLOAD)
4718 printf (" LAZYLOAD");
4720 puts ("");
4723 return 1;
4726 #ifdef SUPPORT_DISASSEMBLY
4727 static void
4728 disassemble_section (section, file)
4729 Elf32_Internal_Shdr * section;
4730 FILE * file;
4732 printf (_("\nAssembly dump of section %s\n"),
4733 SECTION_NAME (section));
4735 /* XXX -- to be done --- XXX */
4737 return 1;
4739 #endif
4741 static int
4742 dump_section (section, file)
4743 Elf32_Internal_Shdr * section;
4744 FILE * file;
4746 bfd_size_type bytes;
4747 bfd_vma addr;
4748 unsigned char * data;
4749 unsigned char * start;
4751 bytes = section->sh_size;
4753 if (bytes == 0)
4755 printf (_("\nSection '%s' has no data to dump.\n"),
4756 SECTION_NAME (section));
4757 return 0;
4759 else
4760 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4762 addr = section->sh_addr;
4764 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4765 "section data");
4767 data = start;
4769 while (bytes)
4771 int j;
4772 int k;
4773 int lbytes;
4775 lbytes = (bytes > 16 ? 16 : bytes);
4777 printf (" 0x%8.8lx ", (unsigned long) addr);
4779 switch (elf_header.e_ident [EI_DATA])
4781 default:
4782 case ELFDATA2LSB:
4783 for (j = 15; j >= 0; j --)
4785 if (j < lbytes)
4786 printf ("%2.2x", data [j]);
4787 else
4788 printf (" ");
4790 if (!(j & 0x3))
4791 printf (" ");
4793 break;
4795 case ELFDATA2MSB:
4796 for (j = 0; j < 16; j++)
4798 if (j < lbytes)
4799 printf ("%2.2x", data [j]);
4800 else
4801 printf (" ");
4803 if ((j & 3) == 3)
4804 printf (" ");
4806 break;
4809 for (j = 0; j < lbytes; j++)
4811 k = data [j];
4812 if (k >= ' ' && k < 0x80)
4813 printf ("%c", k);
4814 else
4815 printf (".");
4818 putchar ('\n');
4820 data += lbytes;
4821 addr += lbytes;
4822 bytes -= lbytes;
4825 free (start);
4827 return 1;
4831 static unsigned long int
4832 read_leb128 (data, length_return, sign)
4833 unsigned char * data;
4834 int * length_return;
4835 int sign;
4837 unsigned long int result = 0;
4838 unsigned int num_read = 0;
4839 int shift = 0;
4840 unsigned char byte;
4844 byte = * data ++;
4845 num_read ++;
4847 result |= (byte & 0x7f) << shift;
4849 shift += 7;
4852 while (byte & 0x80);
4854 if (length_return != NULL)
4855 * length_return = num_read;
4857 if (sign && (shift < 32) && (byte & 0x40))
4858 result |= -1 << shift;
4860 return result;
4863 typedef struct State_Machine_Registers
4865 unsigned long address;
4866 unsigned int file;
4867 unsigned int line;
4868 unsigned int column;
4869 int is_stmt;
4870 int basic_block;
4871 int end_sequence;
4872 /* This variable hold the number of the last entry seen
4873 in the File Table. */
4874 unsigned int last_file_entry;
4875 } SMR;
4877 static SMR state_machine_regs;
4879 static void
4880 reset_state_machine (is_stmt)
4881 int is_stmt;
4883 state_machine_regs.address = 0;
4884 state_machine_regs.file = 1;
4885 state_machine_regs.line = 1;
4886 state_machine_regs.column = 0;
4887 state_machine_regs.is_stmt = is_stmt;
4888 state_machine_regs.basic_block = 0;
4889 state_machine_regs.end_sequence = 0;
4890 state_machine_regs.last_file_entry = 0;
4893 /* Handled an extend line op. Returns true if this is the end
4894 of sequence. */
4895 static int
4896 process_extended_line_op (data, is_stmt, pointer_size)
4897 unsigned char * data;
4898 int is_stmt;
4899 int pointer_size;
4901 unsigned char op_code;
4902 int bytes_read;
4903 unsigned int len;
4904 unsigned char * name;
4905 unsigned long adr;
4907 len = read_leb128 (data, & bytes_read, 0);
4908 data += bytes_read;
4910 if (len == 0)
4912 warn (_("badly formed extended line op encountered!"));
4913 return bytes_read;
4916 len += bytes_read;
4917 op_code = * data ++;
4919 printf (_(" Extended opcode %d: "), op_code);
4921 switch (op_code)
4923 case DW_LNE_end_sequence:
4924 printf (_("End of Sequence\n\n"));
4925 reset_state_machine (is_stmt);
4926 break;
4928 case DW_LNE_set_address:
4929 adr = byte_get (data, pointer_size);
4930 printf (_("set Address to 0x%lx\n"), adr);
4931 state_machine_regs.address = adr;
4932 break;
4934 case DW_LNE_define_file:
4935 printf (_(" define new File Table entry\n"));
4936 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4938 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4939 name = data;
4940 data += strlen ((char *) data) + 1;
4941 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4942 data += bytes_read;
4943 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4944 data += bytes_read;
4945 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4946 printf (_("%s\n\n"), name);
4947 break;
4949 default:
4950 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4951 break;
4954 return len;
4957 /* Size of pointers in the .debug_line section. This information is not
4958 really present in that section. It's obtained before dumping the debug
4959 sections by doing some pre-scan of the .debug_info section. */
4960 static int debug_line_pointer_size = 4;
4962 static int
4963 display_debug_lines (section, start, file)
4964 Elf32_Internal_Shdr * section;
4965 unsigned char * start;
4966 FILE * file ATTRIBUTE_UNUSED;
4968 DWARF2_External_LineInfo * external;
4969 DWARF2_Internal_LineInfo info;
4970 unsigned char * standard_opcodes;
4971 unsigned char * data = start;
4972 unsigned char * end = start + section->sh_size;
4973 unsigned char * end_of_sequence;
4974 int i;
4976 printf (_("\nDump of debug contents of section %s:\n\n"),
4977 SECTION_NAME (section));
4979 while (data < end)
4981 external = (DWARF2_External_LineInfo *) data;
4983 /* Check the length of the block. */
4984 info.li_length = BYTE_GET (external->li_length);
4985 if (info.li_length > section->sh_size)
4987 warn
4988 (_("The line info appears to be corrupt - the section is too small\n"));
4989 return 0;
4992 /* Check its version number. */
4993 info.li_version = BYTE_GET (external->li_version);
4994 if (info.li_version != 2)
4996 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4997 return 0;
5000 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5001 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5002 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5003 info.li_line_base = BYTE_GET (external->li_line_base);
5004 info.li_line_range = BYTE_GET (external->li_line_range);
5005 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5007 /* Sign extend the line base field. */
5008 info.li_line_base <<= 24;
5009 info.li_line_base >>= 24;
5011 printf (_(" Length: %ld\n"), info.li_length);
5012 printf (_(" DWARF Version: %d\n"), info.li_version);
5013 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
5014 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5015 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5016 printf (_(" Line Base: %d\n"), info.li_line_base);
5017 printf (_(" Line Range: %d\n"), info.li_line_range);
5018 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5020 end_of_sequence = data + info.li_length + sizeof (info.li_length);
5022 reset_state_machine (info.li_default_is_stmt);
5024 /* Display the contents of the Opcodes table. */
5025 standard_opcodes = data + sizeof (* external);
5027 printf (_("\n Opcodes:\n"));
5029 for (i = 1; i < info.li_opcode_base; i++)
5030 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5032 /* Display the contents of the Directory table. */
5033 data = standard_opcodes + info.li_opcode_base - 1;
5035 if (* data == 0)
5036 printf (_("\n The Directory Table is empty.\n"));
5037 else
5039 printf (_("\n The Directory Table:\n"));
5041 while (* data != 0)
5043 printf (_(" %s\n"), data);
5045 data += strlen ((char *) data) + 1;
5049 /* Skip the NUL at the end of the table. */
5050 data ++;
5052 /* Display the contents of the File Name table. */
5053 if (* data == 0)
5054 printf (_("\n The File Name Table is empty.\n"));
5055 else
5057 printf (_("\n The File Name Table:\n"));
5058 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5060 while (* data != 0)
5062 unsigned char * name;
5063 int bytes_read;
5065 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5066 name = data;
5068 data += strlen ((char *) data) + 1;
5070 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5071 data += bytes_read;
5072 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5073 data += bytes_read;
5074 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5075 data += bytes_read;
5076 printf (_("%s\n"), name);
5080 /* Skip the NUL at the end of the table. */
5081 data ++;
5083 /* Now display the statements. */
5084 printf (_("\n Line Number Statements:\n"));
5087 while (data < end_of_sequence)
5089 unsigned char op_code;
5090 int adv;
5091 int bytes_read;
5093 op_code = * data ++;
5095 switch (op_code)
5097 case DW_LNS_extended_op:
5098 data += process_extended_line_op (data, info.li_default_is_stmt,
5099 debug_line_pointer_size);
5100 break;
5102 case DW_LNS_copy:
5103 printf (_(" Copy\n"));
5104 break;
5106 case DW_LNS_advance_pc:
5107 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5108 data += bytes_read;
5109 state_machine_regs.address += adv;
5110 printf (_(" Advance PC by %d to %lx\n"), adv,
5111 state_machine_regs.address);
5112 break;
5114 case DW_LNS_advance_line:
5115 adv = read_leb128 (data, & bytes_read, 1);
5116 data += bytes_read;
5117 state_machine_regs.line += adv;
5118 printf (_(" Advance Line by %d to %d\n"), adv,
5119 state_machine_regs.line);
5120 break;
5122 case DW_LNS_set_file:
5123 adv = read_leb128 (data, & bytes_read, 0);
5124 data += bytes_read;
5125 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5126 adv);
5127 state_machine_regs.file = adv;
5128 break;
5130 case DW_LNS_set_column:
5131 adv = read_leb128 (data, & bytes_read, 0);
5132 data += bytes_read;
5133 printf (_(" Set column to %d\n"), adv);
5134 state_machine_regs.column = adv;
5135 break;
5137 case DW_LNS_negate_stmt:
5138 adv = state_machine_regs.is_stmt;
5139 adv = ! adv;
5140 printf (_(" Set is_stmt to %d\n"), adv);
5141 state_machine_regs.is_stmt = adv;
5142 break;
5144 case DW_LNS_set_basic_block:
5145 printf (_(" Set basic block\n"));
5146 state_machine_regs.basic_block = 1;
5147 break;
5149 case DW_LNS_const_add_pc:
5150 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5151 * info.li_min_insn_length);
5152 state_machine_regs.address += adv;
5153 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5154 state_machine_regs.address);
5155 break;
5157 case DW_LNS_fixed_advance_pc:
5158 adv = byte_get (data, 2);
5159 data += 2;
5160 state_machine_regs.address += adv;
5161 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5162 adv, state_machine_regs.address);
5163 break;
5165 default:
5166 op_code -= info.li_opcode_base;
5167 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5168 state_machine_regs.address += adv;
5169 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5170 op_code, adv, state_machine_regs.address);
5171 adv = (op_code % info.li_line_range) + info.li_line_base;
5172 state_machine_regs.line += adv;
5173 printf (_(" and Line by %d to %d\n"),
5174 adv, state_machine_regs.line);
5175 break;
5178 printf ("\n");
5181 return 1;
5184 static int
5185 display_debug_pubnames (section, start, file)
5186 Elf32_Internal_Shdr * section;
5187 unsigned char * start;
5188 FILE * file ATTRIBUTE_UNUSED;
5190 DWARF2_External_PubNames * external;
5191 DWARF2_Internal_PubNames pubnames;
5192 unsigned char * end;
5194 end = start + section->sh_size;
5196 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5198 while (start < end)
5200 unsigned char * data;
5201 unsigned long offset;
5203 external = (DWARF2_External_PubNames *) start;
5205 pubnames.pn_length = BYTE_GET (external->pn_length);
5206 pubnames.pn_version = BYTE_GET (external->pn_version);
5207 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5208 pubnames.pn_size = BYTE_GET (external->pn_size);
5210 data = start + sizeof (* external);
5211 start += pubnames.pn_length + sizeof (external->pn_length);
5213 if (pubnames.pn_version != 2)
5215 warn (_("Only DWARF 2 pubnames are currently supported"));
5216 continue;
5219 printf (_(" Length: %ld\n"),
5220 pubnames.pn_length);
5221 printf (_(" Version: %d\n"),
5222 pubnames.pn_version);
5223 printf (_(" Offset into .debug_info section: %ld\n"),
5224 pubnames.pn_offset);
5225 printf (_(" Size of area in .debug_info section: %ld\n"),
5226 pubnames.pn_size);
5228 printf (_("\n Offset\tName\n"));
5232 offset = byte_get (data, 4);
5234 if (offset != 0)
5236 data += 4;
5237 printf (" %ld\t\t%s\n", offset, data);
5238 data += strlen ((char *) data) + 1;
5241 while (offset != 0);
5244 printf ("\n");
5245 return 1;
5248 static char *
5249 get_TAG_name (tag)
5250 unsigned long tag;
5252 switch (tag)
5254 case DW_TAG_padding: return "DW_TAG_padding";
5255 case DW_TAG_array_type: return "DW_TAG_array_type";
5256 case DW_TAG_class_type: return "DW_TAG_class_type";
5257 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5258 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5259 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5260 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5261 case DW_TAG_label: return "DW_TAG_label";
5262 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5263 case DW_TAG_member: return "DW_TAG_member";
5264 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5265 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5266 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5267 case DW_TAG_string_type: return "DW_TAG_string_type";
5268 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5269 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5270 case DW_TAG_typedef: return "DW_TAG_typedef";
5271 case DW_TAG_union_type: return "DW_TAG_union_type";
5272 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5273 case DW_TAG_variant: return "DW_TAG_variant";
5274 case DW_TAG_common_block: return "DW_TAG_common_block";
5275 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5276 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5277 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5278 case DW_TAG_module: return "DW_TAG_module";
5279 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5280 case DW_TAG_set_type: return "DW_TAG_set_type";
5281 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5282 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5283 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5284 case DW_TAG_base_type: return "DW_TAG_base_type";
5285 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5286 case DW_TAG_const_type: return "DW_TAG_const_type";
5287 case DW_TAG_constant: return "DW_TAG_constant";
5288 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5289 case DW_TAG_file_type: return "DW_TAG_file_type";
5290 case DW_TAG_friend: return "DW_TAG_friend";
5291 case DW_TAG_namelist: return "DW_TAG_namelist";
5292 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5293 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5294 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5295 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5296 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5297 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5298 case DW_TAG_try_block: return "DW_TAG_try_block";
5299 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5300 case DW_TAG_variable: return "DW_TAG_variable";
5301 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5302 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5303 case DW_TAG_format_label: return "DW_TAG_format_label";
5304 case DW_TAG_function_template: return "DW_TAG_function_template";
5305 case DW_TAG_class_template: return "DW_TAG_class_template";
5306 default:
5308 static char buffer [100];
5310 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5311 return buffer;
5316 static char *
5317 get_AT_name (attribute)
5318 unsigned long attribute;
5320 switch (attribute)
5322 case DW_AT_sibling: return "DW_AT_sibling";
5323 case DW_AT_location: return "DW_AT_location";
5324 case DW_AT_name: return "DW_AT_name";
5325 case DW_AT_ordering: return "DW_AT_ordering";
5326 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5327 case DW_AT_byte_size: return "DW_AT_byte_size";
5328 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5329 case DW_AT_bit_size: return "DW_AT_bit_size";
5330 case DW_AT_element_list: return "DW_AT_element_list";
5331 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5332 case DW_AT_low_pc: return "DW_AT_low_pc";
5333 case DW_AT_high_pc: return "DW_AT_high_pc";
5334 case DW_AT_language: return "DW_AT_language";
5335 case DW_AT_member: return "DW_AT_member";
5336 case DW_AT_discr: return "DW_AT_discr";
5337 case DW_AT_discr_value: return "DW_AT_discr_value";
5338 case DW_AT_visibility: return "DW_AT_visibility";
5339 case DW_AT_import: return "DW_AT_import";
5340 case DW_AT_string_length: return "DW_AT_string_length";
5341 case DW_AT_common_reference: return "DW_AT_common_reference";
5342 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5343 case DW_AT_const_value: return "DW_AT_const_value";
5344 case DW_AT_containing_type: return "DW_AT_containing_type";
5345 case DW_AT_default_value: return "DW_AT_default_value";
5346 case DW_AT_inline: return "DW_AT_inline";
5347 case DW_AT_is_optional: return "DW_AT_is_optional";
5348 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5349 case DW_AT_producer: return "DW_AT_producer";
5350 case DW_AT_prototyped: return "DW_AT_prototyped";
5351 case DW_AT_return_addr: return "DW_AT_return_addr";
5352 case DW_AT_start_scope: return "DW_AT_start_scope";
5353 case DW_AT_stride_size: return "DW_AT_stride_size";
5354 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5355 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5356 case DW_AT_accessibility: return "DW_AT_accessibility";
5357 case DW_AT_address_class: return "DW_AT_address_class";
5358 case DW_AT_artificial: return "DW_AT_artificial";
5359 case DW_AT_base_types: return "DW_AT_base_types";
5360 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5361 case DW_AT_count: return "DW_AT_count";
5362 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5363 case DW_AT_decl_column: return "DW_AT_decl_column";
5364 case DW_AT_decl_file: return "DW_AT_decl_file";
5365 case DW_AT_decl_line: return "DW_AT_decl_line";
5366 case DW_AT_declaration: return "DW_AT_declaration";
5367 case DW_AT_discr_list: return "DW_AT_discr_list";
5368 case DW_AT_encoding: return "DW_AT_encoding";
5369 case DW_AT_external: return "DW_AT_external";
5370 case DW_AT_frame_base: return "DW_AT_frame_base";
5371 case DW_AT_friend: return "DW_AT_friend";
5372 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5373 case DW_AT_macro_info: return "DW_AT_macro_info";
5374 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5375 case DW_AT_priority: return "DW_AT_priority";
5376 case DW_AT_segment: return "DW_AT_segment";
5377 case DW_AT_specification: return "DW_AT_specification";
5378 case DW_AT_static_link: return "DW_AT_static_link";
5379 case DW_AT_type: return "DW_AT_type";
5380 case DW_AT_use_location: return "DW_AT_use_location";
5381 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5382 case DW_AT_virtuality: return "DW_AT_virtuality";
5383 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5384 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5385 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5386 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5387 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5388 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5389 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5390 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5391 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5392 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5393 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5394 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5395 case DW_AT_sf_names: return "DW_AT_sf_names";
5396 case DW_AT_src_info: return "DW_AT_src_info";
5397 case DW_AT_mac_info: return "DW_AT_mac_info";
5398 case DW_AT_src_coords: return "DW_AT_src_coords";
5399 case DW_AT_body_begin: return "DW_AT_body_begin";
5400 case DW_AT_body_end: return "DW_AT_body_end";
5401 default:
5403 static char buffer [100];
5405 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5406 return buffer;
5411 static char *
5412 get_FORM_name (form)
5413 unsigned long form;
5415 switch (form)
5417 case DW_FORM_addr: return "DW_FORM_addr";
5418 case DW_FORM_block2: return "DW_FORM_block2";
5419 case DW_FORM_block4: return "DW_FORM_block4";
5420 case DW_FORM_data2: return "DW_FORM_data2";
5421 case DW_FORM_data4: return "DW_FORM_data4";
5422 case DW_FORM_data8: return "DW_FORM_data8";
5423 case DW_FORM_string: return "DW_FORM_string";
5424 case DW_FORM_block: return "DW_FORM_block";
5425 case DW_FORM_block1: return "DW_FORM_block1";
5426 case DW_FORM_data1: return "DW_FORM_data1";
5427 case DW_FORM_flag: return "DW_FORM_flag";
5428 case DW_FORM_sdata: return "DW_FORM_sdata";
5429 case DW_FORM_strp: return "DW_FORM_strp";
5430 case DW_FORM_udata: return "DW_FORM_udata";
5431 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5432 case DW_FORM_ref1: return "DW_FORM_ref1";
5433 case DW_FORM_ref2: return "DW_FORM_ref2";
5434 case DW_FORM_ref4: return "DW_FORM_ref4";
5435 case DW_FORM_ref8: return "DW_FORM_ref8";
5436 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5437 case DW_FORM_indirect: return "DW_FORM_indirect";
5438 default:
5440 static char buffer [100];
5442 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5443 return buffer;
5448 /* FIXME: There are better and more effiecint ways to handle
5449 these structures. For now though, I just want something that
5450 is simple to implement. */
5451 typedef struct abbrev_attr
5453 unsigned long attribute;
5454 unsigned long form;
5455 struct abbrev_attr * next;
5457 abbrev_attr;
5459 typedef struct abbrev_entry
5461 unsigned long entry;
5462 unsigned long tag;
5463 int children;
5464 struct abbrev_attr * first_attr;
5465 struct abbrev_attr * last_attr;
5466 struct abbrev_entry * next;
5468 abbrev_entry;
5470 static abbrev_entry * first_abbrev = NULL;
5471 static abbrev_entry * last_abbrev = NULL;
5473 static void
5474 free_abbrevs PARAMS ((void))
5476 abbrev_entry * abbrev;
5478 for (abbrev = first_abbrev; abbrev;)
5480 abbrev_entry * next = abbrev->next;
5481 abbrev_attr * attr;
5483 for (attr = abbrev->first_attr; attr;)
5485 abbrev_attr * next = attr->next;
5487 free (attr);
5488 attr = next;
5491 free (abbrev);
5492 abbrev = next;
5495 last_abbrev = first_abbrev = NULL;
5498 static void
5499 add_abbrev (number, tag, children)
5500 unsigned long number;
5501 unsigned long tag;
5502 int children;
5504 abbrev_entry * entry;
5506 entry = (abbrev_entry *) malloc (sizeof (* entry));
5508 if (entry == NULL)
5509 /* ugg */
5510 return;
5512 entry->entry = number;
5513 entry->tag = tag;
5514 entry->children = children;
5515 entry->first_attr = NULL;
5516 entry->last_attr = NULL;
5517 entry->next = NULL;
5519 if (first_abbrev == NULL)
5520 first_abbrev = entry;
5521 else
5522 last_abbrev->next = entry;
5524 last_abbrev = entry;
5527 static void
5528 add_abbrev_attr (attribute, form)
5529 unsigned long attribute;
5530 unsigned long form;
5532 abbrev_attr * attr;
5534 attr = (abbrev_attr *) malloc (sizeof (* attr));
5536 if (attr == NULL)
5537 /* ugg */
5538 return;
5540 attr->attribute = attribute;
5541 attr->form = form;
5542 attr->next = NULL;
5544 if (last_abbrev->first_attr == NULL)
5545 last_abbrev->first_attr = attr;
5546 else
5547 last_abbrev->last_attr->next = attr;
5549 last_abbrev->last_attr = attr;
5552 /* Processes the (partial) contents of a .debug_abbrev section.
5553 Returns NULL if the end of the section was encountered.
5554 Returns the address after the last byte read if the end of
5555 an abbreviation set was found. */
5557 static unsigned char *
5558 process_abbrev_section (start, end)
5559 unsigned char * start;
5560 unsigned char * end;
5562 if (first_abbrev != NULL)
5563 return NULL;
5565 while (start < end)
5567 int bytes_read;
5568 unsigned long entry;
5569 unsigned long tag;
5570 unsigned long attribute;
5571 int children;
5573 entry = read_leb128 (start, & bytes_read, 0);
5574 start += bytes_read;
5576 /* A single zero is supposed to end the section according
5577 to the standard. If there's more, then signal that to
5578 the caller. */
5579 if (entry == 0)
5580 return start == end ? NULL : start;
5582 tag = read_leb128 (start, & bytes_read, 0);
5583 start += bytes_read;
5585 children = * start ++;
5587 add_abbrev (entry, tag, children);
5591 unsigned long form;
5593 attribute = read_leb128 (start, & bytes_read, 0);
5594 start += bytes_read;
5596 form = read_leb128 (start, & bytes_read, 0);
5597 start += bytes_read;
5599 if (attribute != 0)
5600 add_abbrev_attr (attribute, form);
5602 while (attribute != 0);
5605 return NULL;
5609 static int
5610 display_debug_abbrev (section, start, file)
5611 Elf32_Internal_Shdr * section;
5612 unsigned char * start;
5613 FILE * file ATTRIBUTE_UNUSED;
5615 abbrev_entry * entry;
5616 unsigned char * end = start + section->sh_size;
5618 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5622 start = process_abbrev_section (start, end);
5624 printf (_(" Number TAG\n"));
5626 for (entry = first_abbrev; entry; entry = entry->next)
5628 abbrev_attr * attr;
5630 printf (_(" %ld %s [%s]\n"),
5631 entry->entry,
5632 get_TAG_name (entry->tag),
5633 entry->children ? _("has children") : _("no children"));
5635 for (attr = entry->first_attr; attr; attr = attr->next)
5637 printf (_(" %-18s %s\n"),
5638 get_AT_name (attr->attribute),
5639 get_FORM_name (attr->form));
5643 while (start);
5645 printf ("\n");
5647 return 1;
5651 static unsigned char *
5652 display_block (data, length)
5653 unsigned char * data;
5654 unsigned long length;
5656 printf (_(" %lu byte block: "), length);
5658 while (length --)
5659 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5661 return data;
5664 static void
5665 decode_location_expression (data, pointer_size, length)
5666 unsigned char * data;
5667 unsigned int pointer_size;
5668 unsigned long length;
5670 unsigned op;
5671 int bytes_read;
5672 unsigned long uvalue;
5673 unsigned char *end = data + length;
5675 while (data < end)
5677 op = * data ++;
5679 switch (op)
5681 case DW_OP_addr:
5682 printf ("DW_OP_addr: %lx",
5683 (unsigned long) byte_get (data, pointer_size));
5684 data += pointer_size;
5685 break;
5686 case DW_OP_deref:
5687 printf ("DW_OP_deref");
5688 break;
5689 case DW_OP_const1u:
5690 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
5691 break;
5692 case DW_OP_const1s:
5693 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
5694 break;
5695 case DW_OP_const2u:
5696 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5697 data += 2;
5698 break;
5699 case DW_OP_const2s:
5700 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5701 data += 2;
5702 break;
5703 case DW_OP_const4u:
5704 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5705 data += 4;
5706 break;
5707 case DW_OP_const4s:
5708 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5709 data += 4;
5710 break;
5711 case DW_OP_const8u:
5712 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5713 (unsigned long) byte_get (data + 4, 4));
5714 data += 8;
5715 break;
5716 case DW_OP_const8s:
5717 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5718 (long) byte_get (data + 4, 4));
5719 data += 8;
5720 break;
5721 case DW_OP_constu:
5722 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
5723 data += bytes_read;
5724 break;
5725 case DW_OP_consts:
5726 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
5727 data += bytes_read;
5728 break;
5729 case DW_OP_dup:
5730 printf ("DW_OP_dup");
5731 break;
5732 case DW_OP_drop:
5733 printf ("DW_OP_drop");
5734 break;
5735 case DW_OP_over:
5736 printf ("DW_OP_over");
5737 break;
5738 case DW_OP_pick:
5739 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
5740 break;
5741 case DW_OP_swap:
5742 printf ("DW_OP_swap");
5743 break;
5744 case DW_OP_rot:
5745 printf ("DW_OP_rot");
5746 break;
5747 case DW_OP_xderef:
5748 printf ("DW_OP_xderef");
5749 break;
5750 case DW_OP_abs:
5751 printf ("DW_OP_abs");
5752 break;
5753 case DW_OP_and:
5754 printf ("DW_OP_and");
5755 break;
5756 case DW_OP_div:
5757 printf ("DW_OP_div");
5758 break;
5759 case DW_OP_minus:
5760 printf ("DW_OP_minus");
5761 break;
5762 case DW_OP_mod:
5763 printf ("DW_OP_mod");
5764 break;
5765 case DW_OP_mul:
5766 printf ("DW_OP_mul");
5767 break;
5768 case DW_OP_neg:
5769 printf ("DW_OP_neg");
5770 break;
5771 case DW_OP_not:
5772 printf ("DW_OP_not");
5773 break;
5774 case DW_OP_or:
5775 printf ("DW_OP_or");
5776 break;
5777 case DW_OP_plus:
5778 printf ("DW_OP_plus");
5779 break;
5780 case DW_OP_plus_uconst:
5781 printf ("DW_OP_plus_uconst: %lu",
5782 read_leb128 (data, &bytes_read, 0));
5783 data += bytes_read;
5784 break;
5785 case DW_OP_shl:
5786 printf ("DW_OP_shl");
5787 break;
5788 case DW_OP_shr:
5789 printf ("DW_OP_shr");
5790 break;
5791 case DW_OP_shra:
5792 printf ("DW_OP_shra");
5793 break;
5794 case DW_OP_xor:
5795 printf ("DW_OP_xor");
5796 break;
5797 case DW_OP_bra:
5798 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5799 data += 2;
5800 break;
5801 case DW_OP_eq:
5802 printf ("DW_OP_eq");
5803 break;
5804 case DW_OP_ge:
5805 printf ("DW_OP_ge");
5806 break;
5807 case DW_OP_gt:
5808 printf ("DW_OP_gt");
5809 break;
5810 case DW_OP_le:
5811 printf ("DW_OP_le");
5812 break;
5813 case DW_OP_lt:
5814 printf ("DW_OP_lt");
5815 break;
5816 case DW_OP_ne:
5817 printf ("DW_OP_ne");
5818 break;
5819 case DW_OP_skip:
5820 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5821 data += 2;
5822 break;
5824 case DW_OP_lit0:
5825 case DW_OP_lit1:
5826 case DW_OP_lit2:
5827 case DW_OP_lit3:
5828 case DW_OP_lit4:
5829 case DW_OP_lit5:
5830 case DW_OP_lit6:
5831 case DW_OP_lit7:
5832 case DW_OP_lit8:
5833 case DW_OP_lit9:
5834 case DW_OP_lit10:
5835 case DW_OP_lit11:
5836 case DW_OP_lit12:
5837 case DW_OP_lit13:
5838 case DW_OP_lit14:
5839 case DW_OP_lit15:
5840 case DW_OP_lit16:
5841 case DW_OP_lit17:
5842 case DW_OP_lit18:
5843 case DW_OP_lit19:
5844 case DW_OP_lit20:
5845 case DW_OP_lit21:
5846 case DW_OP_lit22:
5847 case DW_OP_lit23:
5848 case DW_OP_lit24:
5849 case DW_OP_lit25:
5850 case DW_OP_lit26:
5851 case DW_OP_lit27:
5852 case DW_OP_lit28:
5853 case DW_OP_lit29:
5854 case DW_OP_lit30:
5855 case DW_OP_lit31:
5856 printf ("DW_OP_lit%d", op - DW_OP_lit0);
5857 break;
5859 case DW_OP_reg0:
5860 case DW_OP_reg1:
5861 case DW_OP_reg2:
5862 case DW_OP_reg3:
5863 case DW_OP_reg4:
5864 case DW_OP_reg5:
5865 case DW_OP_reg6:
5866 case DW_OP_reg7:
5867 case DW_OP_reg8:
5868 case DW_OP_reg9:
5869 case DW_OP_reg10:
5870 case DW_OP_reg11:
5871 case DW_OP_reg12:
5872 case DW_OP_reg13:
5873 case DW_OP_reg14:
5874 case DW_OP_reg15:
5875 case DW_OP_reg16:
5876 case DW_OP_reg17:
5877 case DW_OP_reg18:
5878 case DW_OP_reg19:
5879 case DW_OP_reg20:
5880 case DW_OP_reg21:
5881 case DW_OP_reg22:
5882 case DW_OP_reg23:
5883 case DW_OP_reg24:
5884 case DW_OP_reg25:
5885 case DW_OP_reg26:
5886 case DW_OP_reg27:
5887 case DW_OP_reg28:
5888 case DW_OP_reg29:
5889 case DW_OP_reg30:
5890 case DW_OP_reg31:
5891 printf ("DW_OP_reg%d", op - DW_OP_reg0);
5892 break;
5894 case DW_OP_breg0:
5895 case DW_OP_breg1:
5896 case DW_OP_breg2:
5897 case DW_OP_breg3:
5898 case DW_OP_breg4:
5899 case DW_OP_breg5:
5900 case DW_OP_breg6:
5901 case DW_OP_breg7:
5902 case DW_OP_breg8:
5903 case DW_OP_breg9:
5904 case DW_OP_breg10:
5905 case DW_OP_breg11:
5906 case DW_OP_breg12:
5907 case DW_OP_breg13:
5908 case DW_OP_breg14:
5909 case DW_OP_breg15:
5910 case DW_OP_breg16:
5911 case DW_OP_breg17:
5912 case DW_OP_breg18:
5913 case DW_OP_breg19:
5914 case DW_OP_breg20:
5915 case DW_OP_breg21:
5916 case DW_OP_breg22:
5917 case DW_OP_breg23:
5918 case DW_OP_breg24:
5919 case DW_OP_breg25:
5920 case DW_OP_breg26:
5921 case DW_OP_breg27:
5922 case DW_OP_breg28:
5923 case DW_OP_breg29:
5924 case DW_OP_breg30:
5925 case DW_OP_breg31:
5926 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
5927 read_leb128 (data, &bytes_read, 1));
5928 data += bytes_read;
5929 break;
5931 case DW_OP_regx:
5932 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
5933 data += bytes_read;
5934 break;
5935 case DW_OP_fbreg:
5936 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
5937 data += bytes_read;
5938 break;
5939 case DW_OP_bregx:
5940 uvalue = read_leb128 (data, &bytes_read, 0);
5941 data += bytes_read;
5942 printf ("DW_OP_bregx: %lu %ld", uvalue,
5943 read_leb128 (data, &bytes_read, 1));
5944 data += bytes_read;
5945 break;
5946 case DW_OP_piece:
5947 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
5948 data += bytes_read;
5949 break;
5950 case DW_OP_deref_size:
5951 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
5952 break;
5953 case DW_OP_xderef_size:
5954 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
5955 break;
5956 case DW_OP_nop:
5957 printf ("DW_OP_nop");
5958 break;
5960 default:
5961 if (op >= DW_OP_lo_user
5962 && op <= DW_OP_hi_user)
5963 printf (_("(User defined location op)"));
5964 else
5965 printf (_("(Unknown location op)"));
5966 /* No way to tell where the next op is, so just bail. */
5967 return;
5973 static unsigned char *
5974 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
5975 unsigned long attribute;
5976 unsigned long form;
5977 unsigned char * data;
5978 unsigned long cu_offset;
5979 unsigned long pointer_size;
5981 unsigned long uvalue = 0;
5982 unsigned char * block_start = NULL;
5983 int bytes_read;
5985 printf (" %-18s:", get_AT_name (attribute));
5987 switch (form)
5989 default:
5990 break;
5992 case DW_FORM_ref_addr:
5993 case DW_FORM_addr:
5994 uvalue = byte_get (data, pointer_size);
5995 data += pointer_size;
5996 break;
5998 case DW_FORM_ref1:
5999 case DW_FORM_flag:
6000 case DW_FORM_data1:
6001 uvalue = byte_get (data ++, 1);
6002 break;
6004 case DW_FORM_ref2:
6005 case DW_FORM_data2:
6006 uvalue = byte_get (data, 2);
6007 data += 2;
6008 break;
6010 case DW_FORM_ref4:
6011 case DW_FORM_data4:
6012 uvalue = byte_get (data, 4);
6013 data += 4;
6014 break;
6016 case DW_FORM_sdata:
6017 uvalue = read_leb128 (data, & bytes_read, 1);
6018 data += bytes_read;
6019 break;
6021 case DW_FORM_ref_udata:
6022 case DW_FORM_udata:
6023 uvalue = read_leb128 (data, & bytes_read, 0);
6024 data += bytes_read;
6025 break;
6028 switch (form)
6030 case DW_FORM_ref_addr:
6031 printf (" <#%lx>", uvalue);
6032 break;
6034 case DW_FORM_ref1:
6035 case DW_FORM_ref2:
6036 case DW_FORM_ref4:
6037 case DW_FORM_ref_udata:
6038 printf (" <%lx>", uvalue + cu_offset);
6039 break;
6041 case DW_FORM_addr:
6042 printf (" %#lx", uvalue);
6044 case DW_FORM_flag:
6045 case DW_FORM_data1:
6046 case DW_FORM_data2:
6047 case DW_FORM_data4:
6048 case DW_FORM_sdata:
6049 case DW_FORM_udata:
6050 printf (" %ld", uvalue);
6051 break;
6053 case DW_FORM_ref8:
6054 case DW_FORM_data8:
6055 uvalue = byte_get (data, 4);
6056 printf (" %lx", uvalue);
6057 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6058 data += 8;
6059 break;
6061 case DW_FORM_string:
6062 printf (" %s", data);
6063 data += strlen ((char *) data) + 1;
6064 break;
6066 case DW_FORM_block:
6067 uvalue = read_leb128 (data, & bytes_read, 0);
6068 block_start = data + bytes_read;
6069 data = display_block (block_start, uvalue);
6070 break;
6072 case DW_FORM_block1:
6073 uvalue = byte_get (data, 1);
6074 block_start = data + 1;
6075 data = display_block (block_start, uvalue);
6076 break;
6078 case DW_FORM_block2:
6079 uvalue = byte_get (data, 2);
6080 block_start = data + 2;
6081 data = display_block (block_start, uvalue);
6082 break;
6084 case DW_FORM_block4:
6085 uvalue = byte_get (data, 4);
6086 block_start = data + 4;
6087 data = display_block (block_start, uvalue);
6088 break;
6090 case DW_FORM_strp:
6091 case DW_FORM_indirect:
6092 warn (_("Unable to handle FORM: %d"), form);
6093 break;
6095 default:
6096 warn (_("Unrecognised form: %d"), form);
6097 break;
6100 /* For some attributes we can display futher information. */
6102 printf ("\t");
6104 switch (attribute)
6106 case DW_AT_inline:
6107 switch (uvalue)
6109 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6110 case DW_INL_inlined: printf (_("(inlined)")); break;
6111 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6112 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6113 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6115 break;
6117 case DW_AT_language:
6118 switch (uvalue)
6120 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6121 case DW_LANG_C89: printf ("(ANSI C)"); break;
6122 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6123 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6124 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6125 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6126 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6127 case DW_LANG_Ada83: printf ("(Ada)"); break;
6128 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6129 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6130 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6131 default: printf ("(Unknown: %lx)", uvalue); break;
6133 break;
6135 case DW_AT_encoding:
6136 switch (uvalue)
6138 case DW_ATE_void: printf ("(void)"); break;
6139 case DW_ATE_address: printf ("(machine address)"); break;
6140 case DW_ATE_boolean: printf ("(boolean)"); break;
6141 case DW_ATE_complex_float: printf ("(complex float)"); break;
6142 case DW_ATE_float: printf ("(float)"); break;
6143 case DW_ATE_signed: printf ("(signed)"); break;
6144 case DW_ATE_signed_char: printf ("(signed char)"); break;
6145 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6146 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6147 default:
6148 if (uvalue >= DW_ATE_lo_user
6149 && uvalue <= DW_ATE_hi_user)
6150 printf ("(user defined type)");
6151 else
6152 printf ("(unknown type)");
6153 break;
6155 break;
6157 case DW_AT_accessibility:
6158 switch (uvalue)
6160 case DW_ACCESS_public: printf ("(public)"); break;
6161 case DW_ACCESS_protected: printf ("(protected)"); break;
6162 case DW_ACCESS_private: printf ("(private)"); break;
6163 default: printf ("(unknown accessibility)"); break;
6165 break;
6167 case DW_AT_visibility:
6168 switch (uvalue)
6170 case DW_VIS_local: printf ("(local)"); break;
6171 case DW_VIS_exported: printf ("(exported)"); break;
6172 case DW_VIS_qualified: printf ("(qualified)"); break;
6173 default: printf ("(unknown visibility)"); break;
6175 break;
6177 case DW_AT_virtuality:
6178 switch (uvalue)
6180 case DW_VIRTUALITY_none: printf ("(none)"); break;
6181 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6182 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6183 default: printf ("(unknown virtuality)"); break;
6185 break;
6187 case DW_AT_identifier_case:
6188 switch (uvalue)
6190 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6191 case DW_ID_up_case: printf ("(up_case)"); break;
6192 case DW_ID_down_case: printf ("(down_case)"); break;
6193 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6194 default: printf ("(unknown case)"); break;
6196 break;
6198 case DW_AT_calling_convention:
6199 switch (uvalue)
6201 case DW_CC_normal: printf ("(normal)"); break;
6202 case DW_CC_program: printf ("(program)"); break;
6203 case DW_CC_nocall: printf ("(nocall)"); break;
6204 default:
6205 if (uvalue >= DW_CC_lo_user
6206 && uvalue <= DW_CC_hi_user)
6207 printf ("(user defined)");
6208 else
6209 printf ("(unknown convention)");
6211 break;
6213 case DW_AT_frame_base:
6214 case DW_AT_location:
6215 case DW_AT_data_member_location:
6216 case DW_AT_vtable_elem_location:
6217 if (block_start)
6219 printf ("(");
6220 decode_location_expression (block_start, pointer_size, uvalue);
6221 printf (")");
6223 break;
6225 default:
6226 break;
6229 printf ("\n");
6230 return data;
6233 static int
6234 display_debug_info (section, start, file)
6235 Elf32_Internal_Shdr * section;
6236 unsigned char * start;
6237 FILE * file;
6239 unsigned char * end = start + section->sh_size;
6240 unsigned char * section_begin = start;
6242 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6244 while (start < end)
6246 DWARF2_External_CompUnit * external;
6247 DWARF2_Internal_CompUnit compunit;
6248 unsigned char * tags;
6249 int i;
6250 int level;
6251 unsigned long cu_offset;
6253 external = (DWARF2_External_CompUnit *) start;
6255 compunit.cu_length = BYTE_GET (external->cu_length);
6256 compunit.cu_version = BYTE_GET (external->cu_version);
6257 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6258 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6260 tags = start + sizeof (* external);
6261 cu_offset = start - section_begin;
6262 start += compunit.cu_length + sizeof (external->cu_length);
6264 if (compunit.cu_version != 2)
6266 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6267 continue;
6270 printf (_(" Compilation Unit:\n"));
6271 printf (_(" Length: %ld\n"), compunit.cu_length);
6272 printf (_(" Version: %d\n"), compunit.cu_version);
6273 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6274 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6276 if (first_abbrev != NULL)
6277 free_abbrevs ();
6279 /* Read in the abbrevs used by this compilation unit. */
6282 Elf32_Internal_Shdr * sec;
6283 unsigned char * begin;
6285 /* Locate the .debug_abbrev section and process it. */
6286 for (i = 0, sec = section_headers;
6287 i < elf_header.e_shnum;
6288 i ++, sec ++)
6289 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6290 break;
6292 if (i == -1 || sec->sh_size == 0)
6294 warn (_("Unable to locate .debug_abbrev section!\n"));
6295 return 0;
6298 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6299 "debug_abbrev section data");
6301 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6302 begin + sec->sh_size);
6304 free (begin);
6307 level = 0;
6308 while (tags < start)
6310 int bytes_read;
6311 unsigned long abbrev_number;
6312 abbrev_entry * entry;
6313 abbrev_attr * attr;
6315 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6316 tags += bytes_read;
6318 /* A null DIE marks the end of a list of children. */
6319 if (abbrev_number == 0)
6321 --level;
6322 continue;
6325 /* Scan through the abbreviation list until we reach the
6326 correct entry. */
6327 for (entry = first_abbrev;
6328 entry && entry->entry != abbrev_number;
6329 entry = entry->next)
6330 continue;
6332 if (entry == NULL)
6334 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6335 abbrev_number);
6336 return 0;
6339 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6340 level, tags - section_begin - bytes_read,
6341 abbrev_number,
6342 get_TAG_name (entry->tag));
6344 for (attr = entry->first_attr; attr; attr = attr->next)
6345 tags = read_and_display_attr (attr->attribute,
6346 attr->form,
6347 tags, cu_offset,
6348 compunit.cu_pointer_size);
6350 if (entry->children)
6351 ++level;
6355 printf ("\n");
6357 return 1;
6360 static int
6361 display_debug_aranges (section, start, file)
6362 Elf32_Internal_Shdr * section;
6363 unsigned char * start;
6364 FILE * file ATTRIBUTE_UNUSED;
6366 unsigned char * end = start + section->sh_size;
6368 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6370 while (start < end)
6372 DWARF2_External_ARange * external;
6373 DWARF2_Internal_ARange arange;
6374 unsigned char * ranges;
6375 unsigned long length;
6376 unsigned long address;
6377 int excess;
6379 external = (DWARF2_External_ARange *) start;
6381 arange.ar_length = BYTE_GET (external->ar_length);
6382 arange.ar_version = BYTE_GET (external->ar_version);
6383 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6384 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6385 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6387 printf (_(" Length: %ld\n"), arange.ar_length);
6388 printf (_(" Version: %d\n"), arange.ar_version);
6389 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6390 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6391 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6393 printf (_("\n Address Length\n"));
6395 ranges = start + sizeof (* external);
6397 /* Must pad to an alignment boundary that is twice the pointer size. */
6398 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6399 if (excess)
6400 ranges += (2 * arange.ar_pointer_size) - excess;
6402 for (;;)
6404 address = byte_get (ranges, arange.ar_pointer_size);
6406 ranges += arange.ar_pointer_size;
6408 length = byte_get (ranges, arange.ar_pointer_size);
6410 ranges += arange.ar_pointer_size;
6412 /* A pair of zeros marks the end of the list. */
6413 if (address == 0 && length == 0)
6414 break;
6416 printf (" %8.8lx %lu\n", address, length);
6419 start += arange.ar_length + sizeof (external->ar_length);
6422 printf ("\n");
6424 return 1;
6428 static int
6429 display_debug_not_supported (section, start, file)
6430 Elf32_Internal_Shdr * section;
6431 unsigned char * start ATTRIBUTE_UNUSED;
6432 FILE * file ATTRIBUTE_UNUSED;
6434 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6435 SECTION_NAME (section));
6437 return 1;
6440 /* Pre-scan the .debug_info section to record the size of address.
6441 When dumping the .debug_line, we use that size information, assuming
6442 that all compilation units have the same address size. */
6443 static int
6444 prescan_debug_info (section, start, file)
6445 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6446 unsigned char * start;
6447 FILE * file ATTRIBUTE_UNUSED;
6449 DWARF2_External_CompUnit * external;
6451 external = (DWARF2_External_CompUnit *) start;
6453 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6454 return 0;
6457 /* A structure containing the name of a debug section and a pointer
6458 to a function that can decode it. The third field is a prescan
6459 function to be run over the section before displaying any of the
6460 sections. */
6461 struct
6463 char * name;
6464 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6465 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6467 debug_displays[] =
6469 { ".debug_info", display_debug_info, prescan_debug_info },
6470 { ".debug_abbrev", display_debug_abbrev, NULL },
6471 { ".debug_line", display_debug_lines, NULL },
6472 { ".debug_aranges", display_debug_aranges, NULL },
6473 { ".debug_pubnames", display_debug_pubnames, NULL },
6474 { ".debug_macinfo", display_debug_not_supported, NULL },
6475 { ".debug_frame", display_debug_not_supported, NULL },
6476 { ".debug_str", display_debug_not_supported, NULL },
6477 { ".debug_static_func", display_debug_not_supported, NULL },
6478 { ".debug_static_vars", display_debug_not_supported, NULL },
6479 { ".debug_types", display_debug_not_supported, NULL },
6480 { ".debug_weaknames", display_debug_not_supported, NULL }
6483 static int
6484 display_debug_section (section, file)
6485 Elf32_Internal_Shdr * section;
6486 FILE * file;
6488 char * name = SECTION_NAME (section);
6489 bfd_size_type length;
6490 unsigned char * start;
6491 int i;
6493 length = section->sh_size;
6494 if (length == 0)
6496 printf (_("\nSection '%s' has no debugging data.\n"), name);
6497 return 0;
6500 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6501 "debug section data");
6503 /* See if we know how to display the contents of this section. */
6504 for (i = NUM_ELEM (debug_displays); i--;)
6505 if (strcmp (debug_displays[i].name, name) == 0)
6507 debug_displays[i].display (section, start, file);
6508 break;
6511 if (i == -1)
6512 printf (_("Unrecognised debug section: %s\n"), name);
6514 free (start);
6516 /* If we loaded in the abbrev section at some point,
6517 we must release it here. */
6518 if (first_abbrev != NULL)
6519 free_abbrevs ();
6521 return 1;
6524 static int
6525 process_section_contents (file)
6526 FILE * file;
6528 Elf32_Internal_Shdr * section;
6529 unsigned int i;
6531 if (! do_dump)
6532 return 1;
6534 /* Pre-scan the debug sections to find some debug information not
6535 present in some of them. For the .debug_line, we must find out the
6536 size of address (specified in .debug_info and .debug_aranges). */
6537 for (i = 0, section = section_headers;
6538 i < elf_header.e_shnum && i < num_dump_sects;
6539 i ++, section ++)
6541 char * name = SECTION_NAME (section);
6542 int j;
6544 if (section->sh_size == 0)
6545 continue;
6547 /* See if there is some pre-scan operation for this section. */
6548 for (j = NUM_ELEM (debug_displays); j--;)
6549 if (strcmp (debug_displays[j].name, name) == 0)
6551 if (debug_displays[j].prescan != NULL)
6553 bfd_size_type length;
6554 unsigned char * start;
6556 length = section->sh_size;
6557 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6558 "debug section data");
6560 debug_displays[j].prescan (section, start, file);
6561 free (start);
6564 break;
6568 for (i = 0, section = section_headers;
6569 i < elf_header.e_shnum && i < num_dump_sects;
6570 i ++, section ++)
6572 #ifdef SUPPORT_DISASSEMBLY
6573 if (dump_sects[i] & DISASS_DUMP)
6574 disassemble_section (section, file);
6575 #endif
6576 if (dump_sects[i] & HEX_DUMP)
6577 dump_section (section, file);
6579 if (dump_sects[i] & DEBUG_DUMP)
6580 display_debug_section (section, file);
6583 if (i < num_dump_sects)
6584 warn (_("Some sections were not dumped because they do not exist!\n"));
6586 return 1;
6589 static void
6590 process_mips_fpe_exception (mask)
6591 int mask;
6593 if (mask)
6595 int first = 1;
6596 if (mask & OEX_FPU_INEX)
6597 fputs ("INEX", stdout), first = 0;
6598 if (mask & OEX_FPU_UFLO)
6599 printf ("%sUFLO", first ? "" : "|"), first = 0;
6600 if (mask & OEX_FPU_OFLO)
6601 printf ("%sOFLO", first ? "" : "|"), first = 0;
6602 if (mask & OEX_FPU_DIV0)
6603 printf ("%sDIV0", first ? "" : "|"), first = 0;
6604 if (mask & OEX_FPU_INVAL)
6605 printf ("%sINVAL", first ? "" : "|");
6607 else
6608 fputs ("0", stdout);
6611 static int
6612 process_mips_specific (file)
6613 FILE * file;
6615 Elf_Internal_Dyn * entry;
6616 size_t liblist_offset = 0;
6617 size_t liblistno = 0;
6618 size_t conflictsno = 0;
6619 size_t options_offset = 0;
6620 size_t conflicts_offset = 0;
6622 /* We have a lot of special sections. Thanks SGI! */
6623 if (dynamic_segment == NULL)
6624 /* No information available. */
6625 return 0;
6627 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6628 switch (entry->d_tag)
6630 case DT_MIPS_LIBLIST:
6631 liblist_offset = entry->d_un.d_val - loadaddr;
6632 break;
6633 case DT_MIPS_LIBLISTNO:
6634 liblistno = entry->d_un.d_val;
6635 break;
6636 case DT_MIPS_OPTIONS:
6637 options_offset = entry->d_un.d_val - loadaddr;
6638 break;
6639 case DT_MIPS_CONFLICT:
6640 conflicts_offset = entry->d_un.d_val - loadaddr;
6641 break;
6642 case DT_MIPS_CONFLICTNO:
6643 conflictsno = entry->d_un.d_val;
6644 break;
6645 default:
6646 break;
6649 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6651 Elf32_External_Lib * elib;
6652 size_t cnt;
6654 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6655 elib, Elf32_External_Lib *, "liblist");
6657 printf ("\nSection '.liblist' contains %lu entries:\n",
6658 (unsigned long) liblistno);
6659 fputs (" Library Time Stamp Checksum Version Flags\n",
6660 stdout);
6662 for (cnt = 0; cnt < liblistno; ++cnt)
6664 Elf32_Lib liblist;
6665 time_t time;
6666 char timebuf[20];
6667 struct tm * tmp;
6669 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6670 time = BYTE_GET (elib[cnt].l_time_stamp);
6671 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6672 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6673 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6675 tmp = gmtime (&time);
6676 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
6677 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6678 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6680 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
6681 dynamic_strings + liblist.l_name, timebuf,
6682 liblist.l_checksum, liblist.l_version);
6684 if (liblist.l_flags == 0)
6685 puts (" NONE");
6686 else
6688 static const struct
6690 const char * name;
6691 int bit;
6693 l_flags_vals[] =
6695 { " EXACT_MATCH", LL_EXACT_MATCH },
6696 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6697 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6698 { " EXPORTS", LL_EXPORTS },
6699 { " DELAY_LOAD", LL_DELAY_LOAD },
6700 { " DELTA", LL_DELTA }
6702 int flags = liblist.l_flags;
6703 size_t fcnt;
6705 for (fcnt = 0;
6706 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6707 ++fcnt)
6708 if ((flags & l_flags_vals[fcnt].bit) != 0)
6710 fputs (l_flags_vals[fcnt].name, stdout);
6711 flags ^= l_flags_vals[fcnt].bit;
6713 if (flags != 0)
6714 printf (" %#x", (unsigned int) flags);
6716 puts ("");
6720 free (elib);
6723 if (options_offset != 0)
6725 Elf_External_Options * eopt;
6726 Elf_Internal_Shdr * sect = section_headers;
6727 Elf_Internal_Options * iopt;
6728 Elf_Internal_Options * option;
6729 size_t offset;
6730 int cnt;
6732 /* Find the section header so that we get the size. */
6733 while (sect->sh_type != SHT_MIPS_OPTIONS)
6734 ++ sect;
6736 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6737 Elf_External_Options *, "options");
6739 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6740 * sizeof (*iopt));
6741 if (iopt == NULL)
6743 error (_("Out of memory"));
6744 return 0;
6747 offset = cnt = 0;
6748 option = iopt;
6750 while (offset < sect->sh_size)
6752 Elf_External_Options * eoption;
6754 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6756 option->kind = BYTE_GET (eoption->kind);
6757 option->size = BYTE_GET (eoption->size);
6758 option->section = BYTE_GET (eoption->section);
6759 option->info = BYTE_GET (eoption->info);
6761 offset += option->size;
6763 ++option;
6764 ++cnt;
6767 printf (_("\nSection '%s' contains %d entries:\n"),
6768 string_table + sect->sh_name, cnt);
6770 option = iopt;
6772 while (cnt-- > 0)
6774 size_t len;
6776 switch (option->kind)
6778 case ODK_NULL:
6779 /* This shouldn't happen. */
6780 printf (" NULL %d %lx", option->section, option->info);
6781 break;
6782 case ODK_REGINFO:
6783 printf (" REGINFO ");
6784 if (elf_header.e_machine == EM_MIPS)
6786 /* 32bit form. */
6787 Elf32_External_RegInfo *ereg;
6788 Elf32_RegInfo reginfo;
6790 ereg = (Elf32_External_RegInfo *) (option + 1);
6791 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6792 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6793 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6794 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6795 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6796 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6798 printf ("GPR %08lx GP 0x%lx\n",
6799 reginfo.ri_gprmask,
6800 (unsigned long) reginfo.ri_gp_value);
6801 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6802 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6803 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6805 else
6807 /* 64 bit form. */
6808 Elf64_External_RegInfo * ereg;
6809 Elf64_Internal_RegInfo reginfo;
6811 ereg = (Elf64_External_RegInfo *) (option + 1);
6812 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6813 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6814 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6815 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6816 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6817 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6819 printf ("GPR %08lx GP 0x",
6820 reginfo.ri_gprmask);
6821 printf_vma (reginfo.ri_gp_value);
6822 printf ("\n");
6824 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6825 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6826 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6828 ++option;
6829 continue;
6830 case ODK_EXCEPTIONS:
6831 fputs (" EXCEPTIONS fpe_min(", stdout);
6832 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6833 fputs (") fpe_max(", stdout);
6834 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6835 fputs (")", stdout);
6837 if (option->info & OEX_PAGE0)
6838 fputs (" PAGE0", stdout);
6839 if (option->info & OEX_SMM)
6840 fputs (" SMM", stdout);
6841 if (option->info & OEX_FPDBUG)
6842 fputs (" FPDBUG", stdout);
6843 if (option->info & OEX_DISMISS)
6844 fputs (" DISMISS", stdout);
6845 break;
6846 case ODK_PAD:
6847 fputs (" PAD ", stdout);
6848 if (option->info & OPAD_PREFIX)
6849 fputs (" PREFIX", stdout);
6850 if (option->info & OPAD_POSTFIX)
6851 fputs (" POSTFIX", stdout);
6852 if (option->info & OPAD_SYMBOL)
6853 fputs (" SYMBOL", stdout);
6854 break;
6855 case ODK_HWPATCH:
6856 fputs (" HWPATCH ", stdout);
6857 if (option->info & OHW_R4KEOP)
6858 fputs (" R4KEOP", stdout);
6859 if (option->info & OHW_R8KPFETCH)
6860 fputs (" R8KPFETCH", stdout);
6861 if (option->info & OHW_R5KEOP)
6862 fputs (" R5KEOP", stdout);
6863 if (option->info & OHW_R5KCVTL)
6864 fputs (" R5KCVTL", stdout);
6865 break;
6866 case ODK_FILL:
6867 fputs (" FILL ", stdout);
6868 /* XXX Print content of info word? */
6869 break;
6870 case ODK_TAGS:
6871 fputs (" TAGS ", stdout);
6872 /* XXX Print content of info word? */
6873 break;
6874 case ODK_HWAND:
6875 fputs (" HWAND ", stdout);
6876 if (option->info & OHWA0_R4KEOP_CHECKED)
6877 fputs (" R4KEOP_CHECKED", stdout);
6878 if (option->info & OHWA0_R4KEOP_CLEAN)
6879 fputs (" R4KEOP_CLEAN", stdout);
6880 break;
6881 case ODK_HWOR:
6882 fputs (" HWOR ", stdout);
6883 if (option->info & OHWA0_R4KEOP_CHECKED)
6884 fputs (" R4KEOP_CHECKED", stdout);
6885 if (option->info & OHWA0_R4KEOP_CLEAN)
6886 fputs (" R4KEOP_CLEAN", stdout);
6887 break;
6888 case ODK_GP_GROUP:
6889 printf (" GP_GROUP %#06lx self-contained %#06lx",
6890 option->info & OGP_GROUP,
6891 (option->info & OGP_SELF) >> 16);
6892 break;
6893 case ODK_IDENT:
6894 printf (" IDENT %#06lx self-contained %#06lx",
6895 option->info & OGP_GROUP,
6896 (option->info & OGP_SELF) >> 16);
6897 break;
6898 default:
6899 /* This shouldn't happen. */
6900 printf (" %3d ??? %d %lx",
6901 option->kind, option->section, option->info);
6902 break;
6905 len = sizeof (*eopt);
6906 while (len < option->size)
6907 if (((char *) option)[len] >= ' '
6908 && ((char *) option)[len] < 0x7f)
6909 printf ("%c", ((char *) option)[len++]);
6910 else
6911 printf ("\\%03o", ((char *) option)[len++]);
6913 fputs ("\n", stdout);
6914 ++option;
6917 free (eopt);
6920 if (conflicts_offset != 0 && conflictsno != 0)
6922 Elf32_External_Conflict * econf32;
6923 Elf64_External_Conflict * econf64;
6924 Elf32_Conflict * iconf;
6925 size_t cnt;
6927 if (dynamic_symbols == NULL)
6929 error (_("conflict list with without table"));
6930 return 0;
6933 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6934 if (iconf == NULL)
6936 error (_("Out of memory"));
6937 return 0;
6940 if (is_32bit_elf)
6942 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6943 econf32, Elf32_External_Conflict *, "conflict");
6945 for (cnt = 0; cnt < conflictsno; ++cnt)
6946 iconf[cnt] = BYTE_GET (econf32[cnt]);
6948 else
6950 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6951 econf64, Elf64_External_Conflict *, "conflict");
6953 for (cnt = 0; cnt < conflictsno; ++cnt)
6954 iconf[cnt] = BYTE_GET (econf64[cnt]);
6957 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6958 puts (_(" Num: Index Value Name"));
6960 for (cnt = 0; cnt < conflictsno; ++cnt)
6962 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
6964 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
6965 print_vma (psym->st_value, FULL_HEX);
6966 printf (" %s\n", dynamic_strings + psym->st_name);
6969 free (iconf);
6972 return 1;
6975 static char *
6976 get_note_type (e_type)
6977 unsigned e_type;
6979 static char buff[64];
6981 switch (e_type)
6983 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
6984 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
6985 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
6986 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
6987 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
6988 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
6989 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
6990 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
6991 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6992 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6993 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
6994 default:
6995 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
6996 return buff;
7000 /* Note that by the ELF standard, the name field is already null byte
7001 terminated, and namesz includes the terminating null byte.
7002 I.E. the value of namesz for the name "FSF" is 4.
7004 If the value of namesz is zero, there is no name present. */
7005 static int
7006 process_note (pnote)
7007 Elf32_Internal_Note * pnote;
7009 printf (" %s\t\t0x%08lx\t%s\n",
7010 pnote->namesz ? pnote->namedata : "(NONE)",
7011 pnote->descsz, get_note_type (pnote->type));
7012 return 1;
7016 static int
7017 process_corefile_note_segment (file, offset, length)
7018 FILE * file;
7019 bfd_vma offset;
7020 bfd_vma length;
7022 Elf_External_Note * pnotes;
7023 Elf_External_Note * external;
7024 int res = 1;
7026 if (length <= 0)
7027 return 0;
7029 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
7031 external = pnotes;
7033 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
7034 (unsigned long) offset, (unsigned long) length);
7035 printf (_(" Owner\t\tData size\tDescription\n"));
7037 while (external < (Elf_External_Note *)((char *) pnotes + length))
7039 Elf32_Internal_Note inote;
7040 char * temp = NULL;
7042 inote.type = BYTE_GET (external->type);
7043 inote.namesz = BYTE_GET (external->namesz);
7044 inote.namedata = external->name;
7045 inote.descsz = BYTE_GET (external->descsz);
7046 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
7047 inote.descpos = offset + (inote.descdata - (char *) pnotes);
7049 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
7051 /* Verify that name is null terminated. It appears that at least
7052 one version of Linux (RedHat 6.0) generates corefiles that don't
7053 comply with the ELF spec by failing to include the null byte in
7054 namesz. */
7055 if (inote.namedata[inote.namesz] != '\0')
7057 temp = malloc (inote.namesz + 1);
7059 if (temp == NULL)
7061 error (_("Out of memory\n"));
7062 res = 0;
7063 break;
7066 strncpy (temp, inote.namedata, inote.namesz);
7067 temp[inote.namesz] = 0;
7069 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7070 inote.namedata = temp;
7073 res &= process_note (& inote);
7075 if (temp != NULL)
7077 free (temp);
7078 temp = NULL;
7082 free (pnotes);
7084 return res;
7087 static int
7088 process_corefile_note_segments (file)
7089 FILE * file;
7091 Elf_Internal_Phdr * program_headers;
7092 Elf_Internal_Phdr * segment;
7093 unsigned int i;
7094 int res = 1;
7096 program_headers = (Elf_Internal_Phdr *) malloc
7097 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7099 if (program_headers == NULL)
7101 error (_("Out of memory\n"));
7102 return 0;
7105 if (is_32bit_elf)
7106 i = get_32bit_program_headers (file, program_headers);
7107 else
7108 i = get_64bit_program_headers (file, program_headers);
7110 if (i == 0)
7112 free (program_headers);
7113 return 0;
7116 for (i = 0, segment = program_headers;
7117 i < elf_header.e_phnum;
7118 i ++, segment ++)
7120 if (segment->p_type == PT_NOTE)
7121 res &= process_corefile_note_segment (file,
7122 (bfd_vma) segment->p_offset,
7123 (bfd_vma) segment->p_filesz);
7126 free (program_headers);
7128 return res;
7131 static int
7132 process_corefile_contents (file)
7133 FILE * file;
7135 /* If we have not been asked to display the notes then do nothing. */
7136 if (! do_notes)
7137 return 1;
7139 /* If file is not a core file then exit. */
7140 if (elf_header.e_type != ET_CORE)
7141 return 1;
7143 /* No program headers means no NOTE segment. */
7144 if (elf_header.e_phnum == 0)
7146 printf (_("No note segments present in the core file.\n"));
7147 return 1;
7150 return process_corefile_note_segments (file);
7153 static int
7154 process_arch_specific (file)
7155 FILE * file;
7157 if (! do_arch)
7158 return 1;
7160 switch (elf_header.e_machine)
7162 case EM_MIPS:
7163 case EM_MIPS_RS4_BE:
7164 return process_mips_specific (file);
7165 break;
7166 default:
7167 break;
7169 return 1;
7172 static int
7173 get_file_header (file)
7174 FILE * file;
7176 /* Read in the identity array. */
7177 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7178 return 0;
7180 /* Determine how to read the rest of the header. */
7181 switch (elf_header.e_ident [EI_DATA])
7183 default: /* fall through */
7184 case ELFDATANONE: /* fall through */
7185 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7186 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7189 /* For now we only support 32 bit and 64 bit ELF files. */
7190 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7192 /* Read in the rest of the header. */
7193 if (is_32bit_elf)
7195 Elf32_External_Ehdr ehdr32;
7197 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7198 return 0;
7200 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7201 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7202 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7203 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7204 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7205 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7206 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7207 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7208 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7209 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7210 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7211 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7212 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7214 else
7216 Elf64_External_Ehdr ehdr64;
7218 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7219 we will not be able to cope with the 64bit data found in
7220 64 ELF files. Detect this now and abort before we start
7221 overwritting things. */
7222 if (sizeof (bfd_vma) < 8)
7224 error (_("This instance of readelf has been built without support for a\n"));
7225 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7226 return 0;
7229 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7230 return 0;
7232 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7233 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7234 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7235 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7236 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7237 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7238 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7239 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7240 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7241 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7242 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7243 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7244 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7247 return 1;
7250 static void
7251 process_file (file_name)
7252 char * file_name;
7254 FILE * file;
7255 struct stat statbuf;
7256 unsigned int i;
7258 if (stat (file_name, & statbuf) < 0)
7260 error (_("Cannot stat input file %s.\n"), file_name);
7261 return;
7264 file = fopen (file_name, "rb");
7265 if (file == NULL)
7267 error (_("Input file %s not found.\n"), file_name);
7268 return;
7271 if (! get_file_header (file))
7273 error (_("%s: Failed to read file header\n"), file_name);
7274 fclose (file);
7275 return;
7278 /* Initialise per file variables. */
7279 for (i = NUM_ELEM (version_info); i--;)
7280 version_info[i] = 0;
7282 for (i = NUM_ELEM (dynamic_info); i--;)
7283 dynamic_info[i] = 0;
7285 /* Process the file. */
7286 if (show_name)
7287 printf (_("\nFile: %s\n"), file_name);
7289 if (! process_file_header ())
7291 fclose (file);
7292 return;
7295 process_section_headers (file);
7297 process_program_headers (file);
7299 process_dynamic_segment (file);
7301 process_relocs (file);
7303 process_symbol_table (file);
7305 process_syminfo (file);
7307 process_version_sections (file);
7309 process_section_contents (file);
7311 process_corefile_contents (file);
7313 process_arch_specific (file);
7315 fclose (file);
7317 if (section_headers)
7319 free (section_headers);
7320 section_headers = NULL;
7323 if (string_table)
7325 free (string_table);
7326 string_table = NULL;
7329 if (dynamic_strings)
7331 free (dynamic_strings);
7332 dynamic_strings = NULL;
7335 if (dynamic_symbols)
7337 free (dynamic_symbols);
7338 dynamic_symbols = NULL;
7339 num_dynamic_syms = 0;
7342 if (dynamic_syminfo)
7344 free (dynamic_syminfo);
7345 dynamic_syminfo = NULL;
7349 #ifdef SUPPORT_DISASSEMBLY
7350 /* Needed by the i386 disassembler. For extra credit, someone could
7351 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7352 symbols */
7354 void
7355 print_address (unsigned int addr, FILE * outfile)
7357 fprintf (outfile,"0x%8.8x", addr);
7360 /* Needed by the i386 disassembler. */
7361 void
7362 db_task_printsym (unsigned int addr)
7364 print_address (addr, stderr);
7366 #endif
7369 main (argc, argv)
7370 int argc;
7371 char ** argv;
7373 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7374 setlocale (LC_MESSAGES, "");
7375 #endif
7376 bindtextdomain (PACKAGE, LOCALEDIR);
7377 textdomain (PACKAGE);
7379 parse_args (argc, argv);
7381 if (optind < (argc - 1))
7382 show_name = 1;
7384 while (optind < argc)
7385 process_file (argv [optind ++]);
7387 if (dump_sects != NULL)
7388 free (dump_sects);
7390 return 0;