2000-10-31 Philip Blundell <philb@gnu.org>
[binutils.git] / binutils / readelf.c
blobd9686731fda9d630e793e2bb1a1e88db9e5fbe97
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"
74 #include "elf/cris.h"
75 #include "elf/i860.h"
77 #include "bucomm.h"
78 #include "getopt.h"
80 char * program_name = "readelf";
81 unsigned int dynamic_addr;
82 bfd_size_type dynamic_size;
83 unsigned int rela_addr;
84 unsigned int rela_size;
85 char * dynamic_strings;
86 char * string_table;
87 unsigned long num_dynamic_syms;
88 Elf_Internal_Sym * dynamic_symbols;
89 Elf_Internal_Syminfo * dynamic_syminfo;
90 unsigned long dynamic_syminfo_offset;
91 unsigned int dynamic_syminfo_nent;
92 char program_interpreter [64];
93 int dynamic_info[DT_JMPREL + 1];
94 int version_info[16];
95 int loadaddr = 0;
96 Elf_Internal_Ehdr elf_header;
97 Elf_Internal_Shdr * section_headers;
98 Elf_Internal_Dyn * dynamic_segment;
99 int show_name;
100 int do_dynamic;
101 int do_syms;
102 int do_reloc;
103 int do_sections;
104 int do_segments;
105 int do_using_dynamic;
106 int do_header;
107 int do_dump;
108 int do_version;
109 int do_histogram;
110 int do_debugging;
111 int do_debug_info;
112 int do_debug_abbrevs;
113 int do_debug_lines;
114 int do_debug_pubnames;
115 int do_debug_aranges;
116 int do_arch;
117 int do_notes;
118 int is_32bit_elf;
120 /* A dynamic array of flags indicating which sections require dumping. */
121 char * dump_sects = NULL;
122 unsigned int num_dump_sects = 0;
124 #define HEX_DUMP (1 << 0)
125 #define DISASS_DUMP (1 << 1)
126 #define DEBUG_DUMP (1 << 2)
128 /* How to rpint a vma value. */
129 typedef enum print_mode
131 HEX,
132 DEC,
133 DEC_5,
134 UNSIGNED,
135 PREFIX_HEX,
136 FULL_HEX,
137 LONG_HEX
139 print_mode;
141 /* Forward declarations for dumb compilers. */
142 static void print_vma PARAMS ((bfd_vma, print_mode));
143 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
144 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
145 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
146 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
147 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
148 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
149 static const char * get_dynamic_type PARAMS ((unsigned long));
150 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
151 static char * get_file_type PARAMS ((unsigned));
152 static char * get_machine_name PARAMS ((unsigned));
153 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
154 static char * get_machine_flags PARAMS ((unsigned, unsigned));
155 static const char * get_mips_segment_type PARAMS ((unsigned long));
156 static const char * get_parisc_segment_type PARAMS ((unsigned long));
157 static const char * get_segment_type PARAMS ((unsigned long));
158 static const char * get_mips_section_type_name PARAMS ((unsigned int));
159 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
160 static const char * get_section_type_name PARAMS ((unsigned int));
161 static const char * get_symbol_binding PARAMS ((unsigned int));
162 static const char * get_symbol_type PARAMS ((unsigned int));
163 static const char * get_symbol_visibility PARAMS ((unsigned int));
164 static const char * get_symbol_index_type PARAMS ((unsigned int));
165 static const char * get_dynamic_flags PARAMS ((bfd_vma));
166 static void usage PARAMS ((void));
167 static void parse_args PARAMS ((int, char **));
168 static int process_file_header PARAMS ((void));
169 static int process_program_headers PARAMS ((FILE *));
170 static int process_section_headers PARAMS ((FILE *));
171 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
172 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
173 static int process_dynamic_segment PARAMS ((FILE *));
174 static int process_symbol_table PARAMS ((FILE *));
175 static int process_section_contents PARAMS ((FILE *));
176 static void process_file PARAMS ((char *));
177 static int process_relocs PARAMS ((FILE *));
178 static int process_version_sections PARAMS ((FILE *));
179 static char * get_ver_flags PARAMS ((unsigned int));
180 static int get_32bit_section_headers PARAMS ((FILE *));
181 static int get_64bit_section_headers PARAMS ((FILE *));
182 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
183 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
184 static int get_file_header PARAMS ((FILE *));
185 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
186 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
187 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
188 static int get_32bit_dynamic_segment PARAMS ((FILE *));
189 static int get_64bit_dynamic_segment PARAMS ((FILE *));
190 #ifdef SUPPORT_DISASSEMBLY
191 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
192 #endif
193 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
194 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
195 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
196 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
199 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
200 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
201 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
202 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
203 static void reset_state_machine PARAMS ((int));
204 static char * get_TAG_name PARAMS ((unsigned long));
205 static char * get_AT_name PARAMS ((unsigned long));
206 static char * get_FORM_name PARAMS ((unsigned long));
207 static void free_abbrevs PARAMS ((void));
208 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
209 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
210 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
211 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
212 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
213 static void request_dump PARAMS ((unsigned int, char));
214 static const char * get_elf_class PARAMS ((unsigned char));
215 static const char * get_data_encoding PARAMS ((unsigned char));
216 static const char * get_osabi_name PARAMS ((unsigned char));
217 static int guess_is_rela PARAMS ((unsigned long));
218 static char * get_note_type PARAMS ((unsigned int));
219 static int process_note PARAMS ((Elf32_Internal_Note *));
220 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
221 static int process_corefile_note_segments PARAMS ((FILE *));
222 static int process_corefile_contents PARAMS ((FILE *));
224 typedef int Elf32_Word;
226 #ifndef TRUE
227 #define TRUE 1
228 #define FALSE 0
229 #endif
230 #define UNKNOWN -1
232 #define SECTION_NAME(X) (string_table + (X)->sh_name)
234 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
236 #define BYTE_GET(field) byte_get (field, sizeof (field))
238 /* If we can support a 64 bit data type then BFD64 should be defined
239 and sizeof (bfd_vma) == 8. In this case when translating from an
240 external 8 byte field to an internal field, we can assume that the
241 internal field is also 8 bytes wide and so we can extact all the data.
242 If, however, BFD64 is not defined, then we must assume that the
243 internal data structure only has 4 byte wide fields that are the
244 equivalent of the 8 byte wide external counterparts, and so we must
245 truncate the data. */
246 #ifdef BFD64
247 #define BYTE_GET8(field) byte_get (field, -8)
248 #else
249 #define BYTE_GET8(field) byte_get (field, 8)
250 #endif
252 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
254 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
255 if (fseek (file, offset, SEEK_SET)) \
257 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
258 return 0; \
261 var = (type) malloc (size); \
263 if (var == NULL) \
265 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
266 return 0; \
269 if (fread (var, size, 1, file) != 1) \
271 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
272 free (var); \
273 var = NULL; \
274 return 0; \
278 #define GET_DATA(offset, var, reason) \
279 if (fseek (file, offset, SEEK_SET)) \
281 error (_("Unable to seek to %x for %s\n"), offset, reason); \
282 return 0; \
284 else if (fread (& var, sizeof (var), 1, file) != 1) \
286 error (_("Unable to read data at %x for %s\n"), offset, reason); \
287 return 0; \
290 #define GET_ELF_SYMBOLS(file, offset, size) \
291 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
292 : get_64bit_elf_symbols (file, offset, size))
295 #ifdef ANSI_PROTOTYPES
296 static void
297 error (const char * message, ...)
299 va_list args;
301 fprintf (stderr, _("%s: Error: "), program_name);
302 va_start (args, message);
303 vfprintf (stderr, message, args);
304 va_end (args);
305 return;
308 static void
309 warn (const char * message, ...)
311 va_list args;
313 fprintf (stderr, _("%s: Warning: "), program_name);
314 va_start (args, message);
315 vfprintf (stderr, message, args);
316 va_end (args);
317 return;
319 #else
320 static void
321 error (va_alist)
322 va_dcl
324 char * message;
325 va_list args;
327 fprintf (stderr, _("%s: Error: "), program_name);
328 va_start (args);
329 message = va_arg (args, char *);
330 vfprintf (stderr, message, args);
331 va_end (args);
332 return;
335 static void
336 warn (va_alist)
337 va_dcl
339 char * message;
340 va_list args;
342 fprintf (stderr, _("%s: Warning: "), program_name);
343 va_start (args);
344 message = va_arg (args, char *);
345 vfprintf (stderr, message, args);
346 va_end (args);
347 return;
349 #endif
351 static bfd_vma
352 byte_get_little_endian (field, size)
353 unsigned char * field;
354 int size;
356 switch (size)
358 case 1:
359 return * field;
361 case 2:
362 return ((unsigned int) (field [0]))
363 | (((unsigned int) (field [1])) << 8);
365 case 8:
366 /* We want to extract data from an 8 byte wide field and
367 place it into a 4 byte wide field. Since this is a little
368 endian source we can juts use the 4 byte extraction code. */
369 /* Fall through. */
370 case 4:
371 return ((unsigned long) (field [0]))
372 | (((unsigned long) (field [1])) << 8)
373 | (((unsigned long) (field [2])) << 16)
374 | (((unsigned long) (field [3])) << 24);
376 #ifdef BFD64
377 case -8:
378 /* This is a special case, generated by the BYTE_GET8 macro.
379 It means that we are loading an 8 byte value from a field
380 in an external structure into an 8 byte value in a field
381 in an internal strcuture. */
382 return ((bfd_vma) (field [0]))
383 | (((bfd_vma) (field [1])) << 8)
384 | (((bfd_vma) (field [2])) << 16)
385 | (((bfd_vma) (field [3])) << 24)
386 | (((bfd_vma) (field [4])) << 32)
387 | (((bfd_vma) (field [5])) << 40)
388 | (((bfd_vma) (field [6])) << 48)
389 | (((bfd_vma) (field [7])) << 56);
390 #endif
391 default:
392 error (_("Unhandled data length: %d\n"), size);
393 abort ();
397 /* Print a VMA value. */
398 static void
399 print_vma (vma, mode)
400 bfd_vma vma;
401 print_mode mode;
403 #ifdef BFD64
404 if (is_32bit_elf)
405 #endif
407 switch (mode)
409 case FULL_HEX: printf ("0x"); /* drop through */
410 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
411 case PREFIX_HEX: printf ("0x"); /* drop through */
412 case HEX: printf ("%lx", (unsigned long) vma); break;
413 case DEC: printf ("%ld", (unsigned long) vma); break;
414 case DEC_5: printf ("%5ld", (long) vma); break;
415 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
418 #ifdef BFD64
419 else
421 switch (mode)
423 case FULL_HEX:
424 printf ("0x");
425 /* drop through */
427 case LONG_HEX:
428 printf_vma (vma);
429 break;
431 case PREFIX_HEX:
432 printf ("0x");
433 /* drop through */
435 case HEX:
436 #if BFD_HOST_64BIT_LONG
437 printf ("%lx", vma);
438 #else
439 if (_bfd_int64_high (vma))
440 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
441 else
442 printf ("%lx", _bfd_int64_low (vma));
443 #endif
444 break;
446 case DEC:
447 #if BFD_HOST_64BIT_LONG
448 printf ("%ld", vma);
449 #else
450 if (_bfd_int64_high (vma))
451 /* ugg */
452 printf ("++%ld", _bfd_int64_low (vma));
453 else
454 printf ("%ld", _bfd_int64_low (vma));
455 #endif
456 break;
458 case DEC_5:
459 #if BFD_HOST_64BIT_LONG
460 printf ("%5ld", vma);
461 #else
462 if (_bfd_int64_high (vma))
463 /* ugg */
464 printf ("++%ld", _bfd_int64_low (vma));
465 else
466 printf ("%5ld", _bfd_int64_low (vma));
467 #endif
468 break;
470 case UNSIGNED:
471 #if BFD_HOST_64BIT_LONG
472 printf ("%lu", vma);
473 #else
474 if (_bfd_int64_high (vma))
475 /* ugg */
476 printf ("++%lu", _bfd_int64_low (vma));
477 else
478 printf ("%lu", _bfd_int64_low (vma));
479 #endif
480 break;
483 #endif
486 static bfd_vma
487 byte_get_big_endian (field, size)
488 unsigned char * field;
489 int size;
491 switch (size)
493 case 1:
494 return * field;
496 case 2:
497 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
499 case 4:
500 return ((unsigned long) (field [3]))
501 | (((unsigned long) (field [2])) << 8)
502 | (((unsigned long) (field [1])) << 16)
503 | (((unsigned long) (field [0])) << 24);
505 case 8:
506 /* Although we are extracing data from an 8 byte wide field, we
507 are returning only 4 bytes of data. */
508 return ((unsigned long) (field [7]))
509 | (((unsigned long) (field [6])) << 8)
510 | (((unsigned long) (field [5])) << 16)
511 | (((unsigned long) (field [4])) << 24);
513 #ifdef BFD64
514 case -8:
515 /* This is a special case, generated by the BYTE_GET8 macro.
516 It means that we are loading an 8 byte value from a field
517 in an external structure into an 8 byte value in a field
518 in an internal strcuture. */
519 return ((bfd_vma) (field [7]))
520 | (((bfd_vma) (field [6])) << 8)
521 | (((bfd_vma) (field [5])) << 16)
522 | (((bfd_vma) (field [4])) << 24)
523 | (((bfd_vma) (field [3])) << 32)
524 | (((bfd_vma) (field [2])) << 40)
525 | (((bfd_vma) (field [1])) << 48)
526 | (((bfd_vma) (field [0])) << 56);
527 #endif
529 default:
530 error (_("Unhandled data length: %d\n"), size);
531 abort ();
536 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
537 static int
538 guess_is_rela (e_machine)
539 unsigned long e_machine;
541 switch (e_machine)
543 /* Targets that use REL relocations. */
544 case EM_ARM:
545 case EM_386:
546 case EM_486:
547 case EM_960:
548 case EM_CYGNUS_M32R:
549 case EM_CYGNUS_D10V:
550 case EM_MIPS:
551 case EM_MIPS_RS4_BE:
552 return FALSE;
554 /* Targets that use RELA relocations. */
555 case EM_68K:
556 case EM_SPARC32PLUS:
557 case EM_SPARCV9:
558 case EM_SPARC:
559 case EM_PPC:
560 case EM_CYGNUS_V850:
561 case EM_CYGNUS_D30V:
562 case EM_CYGNUS_MN10200:
563 case EM_CYGNUS_MN10300:
564 case EM_CYGNUS_FR30:
565 case EM_SH:
566 case EM_ALPHA:
567 case EM_MCORE:
568 case EM_IA_64:
569 case EM_AVR:
570 case EM_CRIS:
571 case EM_860:
572 return TRUE;
574 case EM_MMA:
575 case EM_PCP:
576 case EM_NCPU:
577 case EM_NDR1:
578 case EM_STARCORE:
579 case EM_ME16:
580 case EM_ST100:
581 case EM_TINYJ:
582 case EM_FX66:
583 case EM_ST9PLUS:
584 case EM_ST7:
585 case EM_68HC16:
586 case EM_68HC11:
587 case EM_68HC08:
588 case EM_68HC05:
589 case EM_SVX:
590 case EM_ST19:
591 case EM_VAX:
592 default:
593 warn (_("Don't know about relocations on this machine architecture\n"));
594 return FALSE;
598 /* Display the contents of the relocation data found at the specified offset. */
599 static int
600 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
601 FILE * file;
602 unsigned long rel_offset;
603 unsigned long rel_size;
604 Elf_Internal_Sym * symtab;
605 unsigned long nsyms;
606 char * strtab;
607 int is_rela;
609 unsigned int i;
610 Elf_Internal_Rel * rels;
611 Elf_Internal_Rela * relas;
614 if (is_rela == UNKNOWN)
615 is_rela = guess_is_rela (elf_header.e_machine);
617 if (is_rela)
619 if (is_32bit_elf)
621 Elf32_External_Rela * erelas;
623 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
624 Elf32_External_Rela *, "relocs");
626 rel_size = rel_size / sizeof (Elf32_External_Rela);
628 relas = (Elf_Internal_Rela *)
629 malloc (rel_size * sizeof (Elf_Internal_Rela));
631 if (relas == NULL)
633 error(_("out of memory parsing relocs"));
634 return 0;
637 for (i = 0; i < rel_size; i++)
639 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
640 relas[i].r_info = BYTE_GET (erelas[i].r_info);
641 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
644 free (erelas);
646 rels = (Elf_Internal_Rel *) relas;
648 else
650 Elf64_External_Rela * erelas;
652 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
653 Elf64_External_Rela *, "relocs");
655 rel_size = rel_size / sizeof (Elf64_External_Rela);
657 relas = (Elf_Internal_Rela *)
658 malloc (rel_size * sizeof (Elf_Internal_Rela));
660 if (relas == NULL)
662 error(_("out of memory parsing relocs"));
663 return 0;
666 for (i = 0; i < rel_size; i++)
668 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
669 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
670 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
673 free (erelas);
675 rels = (Elf_Internal_Rel *) relas;
678 else
680 if (is_32bit_elf)
682 Elf32_External_Rel * erels;
684 GET_DATA_ALLOC (rel_offset, rel_size, erels,
685 Elf32_External_Rel *, "relocs");
687 rel_size = rel_size / sizeof (Elf32_External_Rel);
689 rels = (Elf_Internal_Rel *)
690 malloc (rel_size * sizeof (Elf_Internal_Rel));
692 if (rels == NULL)
694 error(_("out of memory parsing relocs"));
695 return 0;
698 for (i = 0; i < rel_size; i++)
700 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
701 rels[i].r_info = BYTE_GET (erels[i].r_info);
704 free (erels);
706 relas = (Elf_Internal_Rela *) rels;
708 else
710 Elf64_External_Rel * erels;
712 GET_DATA_ALLOC (rel_offset, rel_size, erels,
713 Elf64_External_Rel *, "relocs");
715 rel_size = rel_size / sizeof (Elf64_External_Rel);
717 rels = (Elf_Internal_Rel *)
718 malloc (rel_size * sizeof (Elf_Internal_Rel));
720 if (rels == NULL)
722 error(_("out of memory parsing relocs"));
723 return 0;
726 for (i = 0; i < rel_size; i++)
728 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
729 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
732 free (erels);
734 relas = (Elf_Internal_Rela *) rels;
738 if (is_rela)
739 printf
740 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
741 else
742 printf
743 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
745 for (i = 0; i < rel_size; i++)
747 const char * rtype;
748 bfd_vma offset;
749 bfd_vma info;
750 bfd_vma symtab_index;
751 bfd_vma type;
753 if (is_rela)
755 offset = relas [i].r_offset;
756 info = relas [i].r_info;
758 else
760 offset = rels [i].r_offset;
761 info = rels [i].r_info;
764 if (is_32bit_elf)
766 type = ELF32_R_TYPE (info);
767 symtab_index = ELF32_R_SYM (info);
769 else
771 if (elf_header.e_machine == EM_SPARCV9)
772 type = ELF64_R_TYPE_ID (info);
773 else
774 type = ELF64_R_TYPE (info);
775 /* The #ifdef BFD64 below is to prevent a compile time warning.
776 We know that if we do not have a 64 bit data type that we
777 will never execute this code anyway. */
778 #ifdef BFD64
779 symtab_index = ELF64_R_SYM (info);
780 #endif
783 #ifdef _bfd_int64_low
784 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
785 #else
786 printf (" %8.8lx %5.5lx ", offset, info);
787 #endif
789 switch (elf_header.e_machine)
791 default:
792 rtype = NULL;
793 break;
795 case EM_CYGNUS_M32R:
796 rtype = elf_m32r_reloc_type (type);
797 break;
799 case EM_386:
800 case EM_486:
801 rtype = elf_i386_reloc_type (type);
802 break;
804 case EM_68K:
805 rtype = elf_m68k_reloc_type (type);
806 break;
808 case EM_960:
809 rtype = elf_i960_reloc_type (type);
810 break;
812 case EM_AVR:
813 rtype = elf_avr_reloc_type (type);
814 break;
816 case EM_OLD_SPARCV9:
817 case EM_SPARC32PLUS:
818 case EM_SPARCV9:
819 case EM_SPARC:
820 rtype = elf_sparc_reloc_type (type);
821 break;
823 case EM_CYGNUS_V850:
824 rtype = v850_reloc_type (type);
825 break;
827 case EM_CYGNUS_D10V:
828 rtype = elf_d10v_reloc_type (type);
829 break;
831 case EM_CYGNUS_D30V:
832 rtype = elf_d30v_reloc_type (type);
833 break;
835 case EM_SH:
836 rtype = elf_sh_reloc_type (type);
837 break;
839 case EM_CYGNUS_MN10300:
840 rtype = elf_mn10300_reloc_type (type);
841 break;
843 case EM_CYGNUS_MN10200:
844 rtype = elf_mn10200_reloc_type (type);
845 break;
847 case EM_CYGNUS_FR30:
848 rtype = elf_fr30_reloc_type (type);
849 break;
851 case EM_MCORE:
852 rtype = elf_mcore_reloc_type (type);
853 break;
855 case EM_PPC:
856 rtype = elf_ppc_reloc_type (type);
857 break;
859 case EM_MIPS:
860 case EM_MIPS_RS4_BE:
861 rtype = elf_mips_reloc_type (type);
862 break;
864 case EM_ALPHA:
865 rtype = elf_alpha_reloc_type (type);
866 break;
868 case EM_ARM:
869 rtype = elf_arm_reloc_type (type);
870 break;
872 case EM_CYGNUS_ARC:
873 rtype = elf_arc_reloc_type (type);
874 break;
876 case EM_PARISC:
877 rtype = elf_hppa_reloc_type (type);
878 break;
880 case EM_PJ:
881 rtype = elf_pj_reloc_type (type);
882 break;
883 case EM_IA_64:
884 rtype = elf_ia64_reloc_type (type);
885 break;
887 case EM_CRIS:
888 rtype = elf_cris_reloc_type (type);
889 break;
891 case EM_860:
892 rtype = elf_i860_reloc_type (type);
893 break;
896 if (rtype == NULL)
897 #ifdef _bfd_int64_low
898 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
899 #else
900 printf (_("unrecognised: %-7lx"), type);
901 #endif
902 else
903 printf ("%-21.21s", rtype);
905 if (symtab_index)
907 if (symtab != NULL)
909 if (symtab_index >= nsyms)
910 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
911 else
913 Elf_Internal_Sym * psym;
915 psym = symtab + symtab_index;
917 printf (" ");
918 print_vma (psym->st_value, LONG_HEX);
919 printf (" ");
921 if (psym->st_name == 0)
922 printf ("%-25.25s",
923 SECTION_NAME (section_headers + psym->st_shndx));
924 else if (strtab == NULL)
925 printf (_("<string table index %3ld>"), psym->st_name);
926 else
927 printf ("%-25.25s", strtab + psym->st_name);
929 if (is_rela)
930 printf (" + %lx", (unsigned long) relas [i].r_addend);
934 else if (is_rela)
936 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
937 print_vma (relas[i].r_addend, LONG_HEX);
940 if (elf_header.e_machine == EM_SPARCV9
941 && !strcmp (rtype, "R_SPARC_OLO10"))
942 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
944 putchar ('\n');
947 free (relas);
949 return 1;
952 static const char *
953 get_mips_dynamic_type (type)
954 unsigned long type;
956 switch (type)
958 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
959 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
960 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
961 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
962 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
963 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
964 case DT_MIPS_MSYM: return "MIPS_MSYM";
965 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
966 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
967 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
968 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
969 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
970 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
971 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
972 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
973 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
974 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
975 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
976 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
977 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
978 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
979 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
980 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
981 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
982 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
983 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
984 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
985 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
986 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
987 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
988 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
989 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
990 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
991 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
992 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
993 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
994 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
995 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
996 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
997 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
998 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
999 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1000 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1001 default:
1002 return NULL;
1006 static const char *
1007 get_sparc64_dynamic_type (type)
1008 unsigned long type;
1010 switch (type)
1012 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1013 default:
1014 return NULL;
1018 static const char *
1019 get_parisc_dynamic_type (type)
1020 unsigned long type;
1022 switch (type)
1024 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1025 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1026 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1027 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1028 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1029 case DT_HP_PREINIT: return "HP_PREINIT";
1030 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1031 case DT_HP_NEEDED: return "HP_NEEDED";
1032 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1033 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1034 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1035 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1036 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1037 default:
1038 return NULL;
1042 static const char *
1043 get_dynamic_type (type)
1044 unsigned long type;
1046 static char buff [32];
1048 switch (type)
1050 case DT_NULL: return "NULL";
1051 case DT_NEEDED: return "NEEDED";
1052 case DT_PLTRELSZ: return "PLTRELSZ";
1053 case DT_PLTGOT: return "PLTGOT";
1054 case DT_HASH: return "HASH";
1055 case DT_STRTAB: return "STRTAB";
1056 case DT_SYMTAB: return "SYMTAB";
1057 case DT_RELA: return "RELA";
1058 case DT_RELASZ: return "RELASZ";
1059 case DT_RELAENT: return "RELAENT";
1060 case DT_STRSZ: return "STRSZ";
1061 case DT_SYMENT: return "SYMENT";
1062 case DT_INIT: return "INIT";
1063 case DT_FINI: return "FINI";
1064 case DT_SONAME: return "SONAME";
1065 case DT_RPATH: return "RPATH";
1066 case DT_SYMBOLIC: return "SYMBOLIC";
1067 case DT_REL: return "REL";
1068 case DT_RELSZ: return "RELSZ";
1069 case DT_RELENT: return "RELENT";
1070 case DT_PLTREL: return "PLTREL";
1071 case DT_DEBUG: return "DEBUG";
1072 case DT_TEXTREL: return "TEXTREL";
1073 case DT_JMPREL: return "JMPREL";
1074 case DT_BIND_NOW: return "BIND_NOW";
1075 case DT_INIT_ARRAY: return "INIT_ARRAY";
1076 case DT_FINI_ARRAY: return "FINI_ARRAY";
1077 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1078 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1079 case DT_RUNPATH: return "RUNPATH";
1080 case DT_FLAGS: return "FLAGS";
1082 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1083 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1085 case DT_CHECKSUM: return "CHECKSUM";
1086 case DT_PLTPADSZ: return "PLTPADSZ";
1087 case DT_MOVEENT: return "MOVEENT";
1088 case DT_MOVESZ: return "MOVESZ";
1089 case DT_FEATURE: return "FEATURE";
1090 case DT_POSFLAG_1: return "POSFLAG_1";
1091 case DT_SYMINSZ: return "SYMINSZ";
1092 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1094 case DT_ADDRRNGLO: return "ADDRRNGLO";
1095 case DT_CONFIG: return "CONFIG";
1096 case DT_DEPAUDIT: return "DEPAUDIT";
1097 case DT_AUDIT: return "AUDIT";
1098 case DT_PLTPAD: return "PLTPAD";
1099 case DT_MOVETAB: return "MOVETAB";
1100 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1102 case DT_VERSYM: return "VERSYM";
1104 case DT_RELACOUNT: return "RELACOUNT";
1105 case DT_RELCOUNT: return "RELCOUNT";
1106 case DT_FLAGS_1: return "FLAGS_1";
1107 case DT_VERDEF: return "VERDEF";
1108 case DT_VERDEFNUM: return "VERDEFNUM";
1109 case DT_VERNEED: return "VERNEED";
1110 case DT_VERNEEDNUM: return "VERNEEDNUM";
1112 case DT_AUXILIARY: return "AUXILIARY";
1113 case DT_USED: return "USED";
1114 case DT_FILTER: return "FILTER";
1116 default:
1117 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1119 const char * result;
1121 switch (elf_header.e_machine)
1123 case EM_MIPS:
1124 case EM_MIPS_RS4_BE:
1125 result = get_mips_dynamic_type (type);
1126 break;
1127 case EM_SPARCV9:
1128 result = get_sparc64_dynamic_type (type);
1129 break;
1130 default:
1131 result = NULL;
1132 break;
1135 if (result != NULL)
1136 return result;
1138 sprintf (buff, _("Processor Specific: %lx"), type);
1140 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1142 const char * result;
1144 switch (elf_header.e_machine)
1146 case EM_PARISC:
1147 result = get_parisc_dynamic_type (type);
1148 break;
1149 default:
1150 result = NULL;
1151 break;
1154 if (result != NULL)
1155 return result;
1157 sprintf (buff, _("Operating System specific: %lx"), type);
1159 else
1160 sprintf (buff, _("<unknown>: %lx"), type);
1162 return buff;
1166 static char *
1167 get_file_type (e_type)
1168 unsigned e_type;
1170 static char buff [32];
1172 switch (e_type)
1174 case ET_NONE: return _("NONE (None)");
1175 case ET_REL: return _("REL (Relocatable file)");
1176 case ET_EXEC: return _("EXEC (Executable file)");
1177 case ET_DYN: return _("DYN (Shared object file)");
1178 case ET_CORE: return _("CORE (Core file)");
1180 default:
1181 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1182 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1183 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1184 sprintf (buff, _("OS Specific: (%x)"), e_type);
1185 else
1186 sprintf (buff, _("<unknown>: %x"), e_type);
1187 return buff;
1191 static char *
1192 get_machine_name (e_machine)
1193 unsigned e_machine;
1195 static char buff [64]; /* XXX */
1197 switch (e_machine)
1199 case EM_NONE: return _("None");
1200 case EM_M32: return "WE32100";
1201 case EM_SPARC: return "Sparc";
1202 case EM_386: return "Intel 80386";
1203 case EM_68K: return "MC68000";
1204 case EM_88K: return "MC88000";
1205 case EM_486: return "Intel 80486";
1206 case EM_860: return "Intel 80860";
1207 case EM_MIPS: return "MIPS R3000";
1208 case EM_S370: return "IBM System/370";
1209 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1210 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1211 case EM_PARISC: return "HPPA";
1212 case EM_PPC_OLD: return "Power PC (old)";
1213 case EM_SPARC32PLUS: return "Sparc v8+" ;
1214 case EM_960: return "Intel 90860";
1215 case EM_PPC: return "PowerPC";
1216 case EM_V800: return "NEC V800";
1217 case EM_FR20: return "Fujitsu FR20";
1218 case EM_RH32: return "TRW RH32";
1219 case EM_MCORE: return "MCORE";
1220 case EM_ARM: return "ARM";
1221 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1222 case EM_SH: return "Hitachi SH";
1223 case EM_SPARCV9: return "Sparc v9";
1224 case EM_TRICORE: return "Siemens Tricore";
1225 case EM_ARC: return "Argonaut RISC Core";
1226 case EM_H8_300: return "Hitachi H8/300";
1227 case EM_H8_300H: return "Hitachi H8/300H";
1228 case EM_H8S: return "Hitachi H8S";
1229 case EM_H8_500: return "Hitachi H8/500";
1230 case EM_IA_64: return "Intel IA-64";
1231 case EM_MIPS_X: return "Stanford MIPS-X";
1232 case EM_COLDFIRE: return "Motorola Coldfire";
1233 case EM_68HC12: return "Motorola M68HC12";
1234 case EM_ALPHA: return "Alpha";
1235 case EM_CYGNUS_D10V: return "d10v";
1236 case EM_CYGNUS_D30V: return "d30v";
1237 case EM_CYGNUS_ARC: return "Arc";
1238 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1239 case EM_CYGNUS_V850: return "NEC v850";
1240 case EM_CYGNUS_MN10300: return "mn10300";
1241 case EM_CYGNUS_MN10200: return "mn10200";
1242 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1243 case EM_PJ: return "picoJava";
1244 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1245 case EM_PCP: return "Siemens PCP";
1246 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1247 case EM_NDR1: return "Denso NDR1 microprocesspr";
1248 case EM_STARCORE: return "Motorola Star*Core processor";
1249 case EM_ME16: return "Toyota ME16 processor";
1250 case EM_ST100: return "STMicroelectronics ST100 processor";
1251 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1252 case EM_FX66: return "Siemens FX66 microcontroller";
1253 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1254 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1255 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1256 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1257 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1258 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1259 case EM_SVX: return "Silicon Graphics SVx";
1260 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1261 case EM_VAX: return "Digital VAX";
1262 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1263 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1264 default:
1265 sprintf (buff, _("<unknown>: %x"), e_machine);
1266 return buff;
1270 static void
1271 decode_ARM_machine_flags (e_flags, buf)
1272 unsigned e_flags;
1273 char buf[];
1275 unsigned eabi;
1276 int unknown = 0;
1278 eabi = EF_ARM_EABI_VERSION (e_flags);
1279 e_flags &= ~ EF_ARM_EABIMASK;
1281 /* Handle "generic" ARM flags. */
1282 if (e_flags & EF_ARM_RELEXEC)
1284 strcat (buf, ", relocatable executable");
1285 e_flags &= ~ EF_ARM_RELEXEC;
1288 if (e_flags & EF_ARM_HASENTRY)
1290 strcat (buf, ", has entry point");
1291 e_flags &= ~ EF_ARM_HASENTRY;
1294 /* Now handle EABI specific flags. */
1295 switch (eabi)
1297 default:
1298 strcat (buf, ", <unknown EABI>");
1299 if (e_flags)
1300 unknown = 1;
1301 break;
1303 case EF_ARM_EABI_VER1:
1304 while (e_flags)
1306 unsigned flag;
1308 /* Process flags one bit at a time. */
1309 flag = e_flags & - e_flags;
1310 e_flags &= ~ flag;
1312 switch (flag)
1314 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1315 strcat (buf, ", sorted symbol tables");
1316 break;
1318 default:
1319 unknown = 1;
1320 break;
1323 break;
1325 case EF_ARM_EABI_UNKNOWN:
1326 while (e_flags)
1328 unsigned flag;
1330 /* Process flags one bit at a time. */
1331 flag = e_flags & - e_flags;
1332 e_flags &= ~ flag;
1334 switch (flag)
1336 case EF_INTERWORK:
1337 strcat (buf, ", interworking enabled");
1338 break;
1340 case EF_APCS_26:
1341 strcat (buf, ", uses APCS/26");
1342 break;
1344 case EF_APCS_FLOAT:
1345 strcat (buf, ", uses APCS/float");
1346 break;
1348 case EF_PIC:
1349 strcat (buf, ", position independent");
1350 break;
1352 case EF_ALIGN8:
1353 strcat (buf, ", 8 bit structure alignment");
1354 break;
1356 case EF_NEW_ABI:
1357 strcat (buf, ", uses new ABI");
1358 break;
1360 case EF_OLD_ABI:
1361 strcat (buf, ", uses old ABI");
1362 break;
1364 case EF_SOFT_FLOAT:
1365 strcat (buf, ", software FP");
1366 break;
1368 default:
1369 unknown = 1;
1370 break;
1375 if (unknown)
1376 strcat (buf,", <unknown>");
1379 static char *
1380 get_machine_flags (e_flags, e_machine)
1381 unsigned e_flags;
1382 unsigned e_machine;
1384 static char buf [1024];
1386 buf[0] = '\0';
1388 if (e_flags)
1390 switch (e_machine)
1392 default:
1393 break;
1395 case EM_ARM:
1396 decode_ARM_machine_flags (e_flags, buf);
1397 break;
1399 case EM_68K:
1400 if (e_flags & EF_CPU32)
1401 strcat (buf, ", cpu32");
1402 break;
1404 case EM_PPC:
1405 if (e_flags & EF_PPC_EMB)
1406 strcat (buf, ", emb");
1408 if (e_flags & EF_PPC_RELOCATABLE)
1409 strcat (buf, ", relocatable");
1411 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1412 strcat (buf, ", relocatable-lib");
1413 break;
1415 case EM_CYGNUS_V850:
1416 switch (e_flags & EF_V850_ARCH)
1418 case E_V850E_ARCH:
1419 strcat (buf, ", v850e");
1420 break;
1421 case E_V850EA_ARCH:
1422 strcat (buf, ", v850ea");
1423 break;
1424 case E_V850_ARCH:
1425 strcat (buf, ", v850");
1426 break;
1427 default:
1428 strcat (buf, ", unknown v850 architecture variant");
1429 break;
1431 break;
1433 case EM_CYGNUS_M32R:
1434 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1435 strcat (buf, ", m32r");
1437 break;
1439 case EM_MIPS:
1440 case EM_MIPS_RS4_BE:
1441 if (e_flags & EF_MIPS_NOREORDER)
1442 strcat (buf, ", noreorder");
1444 if (e_flags & EF_MIPS_PIC)
1445 strcat (buf, ", pic");
1447 if (e_flags & EF_MIPS_CPIC)
1448 strcat (buf, ", cpic");
1450 if (e_flags & EF_MIPS_ABI2)
1451 strcat (buf, ", abi2");
1453 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1454 strcat (buf, ", mips1");
1456 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1457 strcat (buf, ", mips2");
1459 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1460 strcat (buf, ", mips3");
1462 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1463 strcat (buf, ", mips4");
1465 switch ((e_flags & EF_MIPS_MACH))
1467 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1468 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1469 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1470 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1471 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1472 case E_MIPS_MACH_MIPS32: strcat (buf, ", mips32"); break;
1474 break;
1476 case EM_SPARCV9:
1477 if (e_flags & EF_SPARC_32PLUS)
1478 strcat (buf, ", v8+");
1480 if (e_flags & EF_SPARC_SUN_US1)
1481 strcat (buf, ", ultrasparcI");
1483 if (e_flags & EF_SPARC_SUN_US3)
1484 strcat (buf, ", ultrasparcIII");
1486 if (e_flags & EF_SPARC_HAL_R1)
1487 strcat (buf, ", halr1");
1489 if (e_flags & EF_SPARC_LEDATA)
1490 strcat (buf, ", ledata");
1492 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1493 strcat (buf, ", tso");
1495 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1496 strcat (buf, ", pso");
1498 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1499 strcat (buf, ", rmo");
1500 break;
1502 case EM_PARISC:
1503 switch (e_flags & EF_PARISC_ARCH)
1505 case EFA_PARISC_1_0:
1506 strcpy (buf, ", PA-RISC 1.0");
1507 break;
1508 case EFA_PARISC_1_1:
1509 strcpy (buf, ", PA-RISC 1.1");
1510 break;
1511 case EFA_PARISC_2_0:
1512 strcpy (buf, ", PA-RISC 2.0");
1513 break;
1514 default:
1515 break;
1517 if (e_flags & EF_PARISC_TRAPNIL)
1518 strcat (buf, ", trapnil");
1519 if (e_flags & EF_PARISC_EXT)
1520 strcat (buf, ", ext");
1521 if (e_flags & EF_PARISC_LSB)
1522 strcat (buf, ", lsb");
1523 if (e_flags & EF_PARISC_WIDE)
1524 strcat (buf, ", wide");
1525 if (e_flags & EF_PARISC_NO_KABP)
1526 strcat (buf, ", no kabp");
1527 if (e_flags & EF_PARISC_LAZYSWAP)
1528 strcat (buf, ", lazyswap");
1529 break;
1531 case EM_PJ:
1532 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1533 strcat (buf, ", new calling convention");
1535 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1536 strcat (buf, ", gnu calling convention");
1537 break;
1541 return buf;
1544 static const char *
1545 get_mips_segment_type (type)
1546 unsigned long type;
1548 switch (type)
1550 case PT_MIPS_REGINFO:
1551 return "REGINFO";
1552 case PT_MIPS_RTPROC:
1553 return "RTPROC";
1554 case PT_MIPS_OPTIONS:
1555 return "OPTIONS";
1556 default:
1557 break;
1560 return NULL;
1563 static const char *
1564 get_parisc_segment_type (type)
1565 unsigned long type;
1567 switch (type)
1569 case PT_HP_TLS: return "HP_TLS";
1570 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1571 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1572 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1573 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1574 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1575 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1576 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1577 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1578 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1579 case PT_HP_PARALLEL: return "HP_PARALLEL";
1580 case PT_HP_FASTBIND: return "HP_FASTBIND";
1581 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1582 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1583 default:
1584 break;
1587 return NULL;
1590 static const char *
1591 get_segment_type (p_type)
1592 unsigned long p_type;
1594 static char buff [32];
1596 switch (p_type)
1598 case PT_NULL: return "NULL";
1599 case PT_LOAD: return "LOAD";
1600 case PT_DYNAMIC: return "DYNAMIC";
1601 case PT_INTERP: return "INTERP";
1602 case PT_NOTE: return "NOTE";
1603 case PT_SHLIB: return "SHLIB";
1604 case PT_PHDR: return "PHDR";
1606 default:
1607 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1609 const char * result;
1611 switch (elf_header.e_machine)
1613 case EM_MIPS:
1614 case EM_MIPS_RS4_BE:
1615 result = get_mips_segment_type (p_type);
1616 break;
1617 case EM_PARISC:
1618 result = get_parisc_segment_type (p_type);
1619 break;
1620 default:
1621 result = NULL;
1622 break;
1625 if (result != NULL)
1626 return result;
1628 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1630 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1632 const char * result;
1634 switch (elf_header.e_machine)
1636 case EM_PARISC:
1637 result = get_parisc_segment_type (p_type);
1638 break;
1639 default:
1640 result = NULL;
1641 break;
1644 if (result != NULL)
1645 return result;
1647 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1649 else
1650 sprintf (buff, _("<unknown>: %lx"), p_type);
1652 return buff;
1656 static const char *
1657 get_mips_section_type_name (sh_type)
1658 unsigned int sh_type;
1660 switch (sh_type)
1662 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1663 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1664 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1665 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1666 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1667 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1668 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1669 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1670 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1671 case SHT_MIPS_RELD: return "MIPS_RELD";
1672 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1673 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1674 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1675 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1676 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1677 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1678 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1679 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1680 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1681 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1682 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1683 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1684 case SHT_MIPS_LINE: return "MIPS_LINE";
1685 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1686 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1687 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1688 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1689 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1690 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1691 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1692 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1693 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1694 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1695 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1696 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1697 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1698 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1699 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1700 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1701 default:
1702 break;
1704 return NULL;
1707 static const char *
1708 get_parisc_section_type_name (sh_type)
1709 unsigned int sh_type;
1711 switch (sh_type)
1713 case SHT_PARISC_EXT: return "PARISC_EXT";
1714 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1715 case SHT_PARISC_DOC: return "PARISC_DOC";
1716 default:
1717 break;
1719 return NULL;
1722 static const char *
1723 get_section_type_name (sh_type)
1724 unsigned int sh_type;
1726 static char buff [32];
1728 switch (sh_type)
1730 case SHT_NULL: return "NULL";
1731 case SHT_PROGBITS: return "PROGBITS";
1732 case SHT_SYMTAB: return "SYMTAB";
1733 case SHT_STRTAB: return "STRTAB";
1734 case SHT_RELA: return "RELA";
1735 case SHT_HASH: return "HASH";
1736 case SHT_DYNAMIC: return "DYNAMIC";
1737 case SHT_NOTE: return "NOTE";
1738 case SHT_NOBITS: return "NOBITS";
1739 case SHT_REL: return "REL";
1740 case SHT_SHLIB: return "SHLIB";
1741 case SHT_DYNSYM: return "DYNSYM";
1742 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1743 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1744 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1745 case SHT_GNU_verdef: return "VERDEF";
1746 case SHT_GNU_verneed: return "VERNEED";
1747 case SHT_GNU_versym: return "VERSYM";
1748 case 0x6ffffff0: return "VERSYM";
1749 case 0x6ffffffc: return "VERDEF";
1750 case 0x7ffffffd: return "AUXILIARY";
1751 case 0x7fffffff: return "FILTER";
1753 default:
1754 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1756 const char * result;
1758 switch (elf_header.e_machine)
1760 case EM_MIPS:
1761 case EM_MIPS_RS4_BE:
1762 result = get_mips_section_type_name (sh_type);
1763 break;
1764 case EM_PARISC:
1765 result = get_parisc_section_type_name (sh_type);
1766 break;
1767 default:
1768 result = NULL;
1769 break;
1772 if (result != NULL)
1773 return result;
1775 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1777 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1778 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1779 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1780 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1781 else
1782 sprintf (buff, _("<unknown>: %x"), sh_type);
1784 return buff;
1788 struct option options [] =
1790 {"all", no_argument, 0, 'a'},
1791 {"file-header", no_argument, 0, 'h'},
1792 {"program-headers", no_argument, 0, 'l'},
1793 {"headers", no_argument, 0, 'e'},
1794 {"histogram", no_argument, 0, 'I'},
1795 {"segments", no_argument, 0, 'l'},
1796 {"sections", no_argument, 0, 'S'},
1797 {"section-headers", no_argument, 0, 'S'},
1798 {"symbols", no_argument, 0, 's'},
1799 {"syms", no_argument, 0, 's'},
1800 {"relocs", no_argument, 0, 'r'},
1801 {"notes", no_argument, 0, 'n'},
1802 {"dynamic", no_argument, 0, 'd'},
1803 {"arch-specific", no_argument, 0, 'A'},
1804 {"version-info", no_argument, 0, 'V'},
1805 {"use-dynamic", no_argument, 0, 'D'},
1806 {"hex-dump", required_argument, 0, 'x'},
1807 {"debug-dump", optional_argument, 0, 'w'},
1808 #ifdef SUPPORT_DISASSEMBLY
1809 {"instruction-dump", required_argument, 0, 'i'},
1810 #endif
1812 {"version", no_argument, 0, 'v'},
1813 {"help", no_argument, 0, 'H'},
1814 {0, no_argument, 0, 0}
1817 static void
1818 usage ()
1820 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1821 fprintf (stdout, _(" Options are:\n"));
1822 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1823 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1824 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1825 fprintf (stdout, _(" Display the program headers\n"));
1826 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1827 fprintf (stdout, _(" Display the sections' header\n"));
1828 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1829 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1830 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1831 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1832 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1833 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1834 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1835 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1836 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1837 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1838 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1839 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1840 #ifdef SUPPORT_DISASSEMBLY
1841 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1842 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1843 #endif
1844 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1845 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1846 fprintf (stdout, _(" -H or --help Display this information\n"));
1847 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1849 exit (0);
1852 static void
1853 request_dump (section, type)
1854 unsigned int section;
1855 char type;
1857 if (section >= num_dump_sects)
1859 char * new_dump_sects;
1861 new_dump_sects = (char *) calloc (section + 1, 1);
1863 if (new_dump_sects == NULL)
1864 error (_("Out of memory allocating dump request table."));
1865 else
1867 /* Copy current flag settings. */
1868 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1870 free (dump_sects);
1872 dump_sects = new_dump_sects;
1873 num_dump_sects = section + 1;
1877 if (dump_sects)
1878 dump_sects [section] |= type;
1880 return;
1883 static void
1884 parse_args (argc, argv)
1885 int argc;
1886 char ** argv;
1888 int c;
1890 if (argc < 2)
1891 usage ();
1893 while ((c = getopt_long
1894 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1896 char * cp;
1897 int section;
1899 switch (c)
1901 case 0:
1902 /* Long options. */
1903 break;
1904 case 'H':
1905 usage ();
1906 break;
1908 case 'a':
1909 do_syms ++;
1910 do_reloc ++;
1911 do_dynamic ++;
1912 do_header ++;
1913 do_sections ++;
1914 do_segments ++;
1915 do_version ++;
1916 do_histogram ++;
1917 do_arch ++;
1918 do_notes ++;
1919 break;
1920 case 'e':
1921 do_header ++;
1922 do_sections ++;
1923 do_segments ++;
1924 break;
1925 case 'A':
1926 do_arch ++;
1927 break;
1928 case 'D':
1929 do_using_dynamic ++;
1930 break;
1931 case 'r':
1932 do_reloc ++;
1933 break;
1934 case 'h':
1935 do_header ++;
1936 break;
1937 case 'l':
1938 do_segments ++;
1939 break;
1940 case 's':
1941 do_syms ++;
1942 break;
1943 case 'S':
1944 do_sections ++;
1945 break;
1946 case 'd':
1947 do_dynamic ++;
1948 break;
1949 case 'I':
1950 do_histogram ++;
1951 break;
1952 case 'n':
1953 do_notes ++;
1954 break;
1955 case 'x':
1956 do_dump ++;
1957 section = strtoul (optarg, & cp, 0);
1958 if (! * cp && section >= 0)
1960 request_dump (section, HEX_DUMP);
1961 break;
1963 goto oops;
1964 case 'w':
1965 do_dump ++;
1966 if (optarg == 0)
1967 do_debugging = 1;
1968 else
1970 do_debugging = 0;
1971 switch (optarg[0])
1973 case 'i':
1974 case 'I':
1975 do_debug_info = 1;
1976 break;
1978 case 'a':
1979 case 'A':
1980 do_debug_abbrevs = 1;
1981 break;
1983 case 'l':
1984 case 'L':
1985 do_debug_lines = 1;
1986 break;
1988 case 'p':
1989 case 'P':
1990 do_debug_pubnames = 1;
1991 break;
1993 case 'r':
1994 case 'R':
1995 do_debug_aranges = 1;
1996 break;
1998 default:
1999 warn (_("Unrecognised debug option '%s'\n"), optarg);
2000 break;
2003 break;
2004 #ifdef SUPPORT_DISASSEMBLY
2005 case 'i':
2006 do_dump ++;
2007 section = strtoul (optarg, & cp, 0);
2008 if (! * cp && section >= 0)
2010 request_dump (section, DISASS_DUMP);
2011 break;
2013 goto oops;
2014 #endif
2015 case 'v':
2016 print_version (program_name);
2017 break;
2018 case 'V':
2019 do_version ++;
2020 break;
2021 default:
2022 oops:
2023 /* xgettext:c-format */
2024 error (_("Invalid option '-%c'\n"), c);
2025 /* Drop through. */
2026 case '?':
2027 usage ();
2031 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
2032 && !do_segments && !do_header && !do_dump && !do_version
2033 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2034 usage ();
2035 else if (argc < 3)
2037 warn (_("Nothing to do.\n"));
2038 usage();
2042 static const char *
2043 get_elf_class (elf_class)
2044 unsigned char elf_class;
2046 static char buff [32];
2048 switch (elf_class)
2050 case ELFCLASSNONE: return _("none");
2051 case ELFCLASS32: return _("ELF32");
2052 case ELFCLASS64: return _("ELF64");
2053 default:
2054 sprintf (buff, _("<unknown: %x>"), elf_class);
2055 return buff;
2059 static const char *
2060 get_data_encoding (encoding)
2061 unsigned char encoding;
2063 static char buff [32];
2065 switch (encoding)
2067 case ELFDATANONE: return _("none");
2068 case ELFDATA2LSB: return _("2's complement, little endian");
2069 case ELFDATA2MSB: return _("2's complement, big endian");
2070 default:
2071 sprintf (buff, _("<unknown: %x>"), encoding);
2072 return buff;
2076 static const char *
2077 get_osabi_name (osabi)
2078 unsigned char osabi;
2080 static char buff [32];
2082 switch (osabi)
2084 case ELFOSABI_NONE: return _("UNIX - System V");
2085 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2086 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2087 case ELFOSABI_LINUX: return _("UNIX - Linux");
2088 case ELFOSABI_HURD: return _("GNU/Hurd");
2089 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2090 case ELFOSABI_MONTEREY: return _("UNIX - Monterey");
2091 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2092 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2093 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2094 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2095 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2096 case ELFOSABI_STANDALONE: return _("Standalone App");
2097 case ELFOSABI_ARM: return _("ARM");
2098 default:
2099 sprintf (buff, _("<unknown: %x>"), osabi);
2100 return buff;
2104 /* Decode the data held in 'elf_header'. */
2105 static int
2106 process_file_header ()
2108 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2109 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2110 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2111 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2113 error
2114 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2115 return 0;
2118 if (do_header)
2120 int i;
2122 printf (_("ELF Header:\n"));
2123 printf (_(" Magic: "));
2124 for (i = 0; i < EI_NIDENT; i ++)
2125 printf ("%2.2x ", elf_header.e_ident [i]);
2126 printf ("\n");
2127 printf (_(" Class: %s\n"),
2128 get_elf_class (elf_header.e_ident [EI_CLASS]));
2129 printf (_(" Data: %s\n"),
2130 get_data_encoding (elf_header.e_ident [EI_DATA]));
2131 printf (_(" Version: %d %s\n"),
2132 elf_header.e_ident [EI_VERSION],
2133 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2134 ? "(current)"
2135 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2136 ? "<unknown: %lx>"
2137 : "")));
2138 printf (_(" OS/ABI: %s\n"),
2139 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2140 printf (_(" ABI Version: %d\n"),
2141 elf_header.e_ident [EI_ABIVERSION]);
2142 printf (_(" Type: %s\n"),
2143 get_file_type (elf_header.e_type));
2144 printf (_(" Machine: %s\n"),
2145 get_machine_name (elf_header.e_machine));
2146 printf (_(" Version: 0x%lx\n"),
2147 (unsigned long) elf_header.e_version);
2149 printf (_(" Entry point address: "));
2150 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2151 printf (_("\n Start of program headers: "));
2152 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2153 printf (_(" (bytes into file)\n Start of section headers: "));
2154 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2155 printf (_(" (bytes into file)\n"));
2157 printf (_(" Flags: 0x%lx%s\n"),
2158 (unsigned long) elf_header.e_flags,
2159 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2160 printf (_(" Size of this header: %ld (bytes)\n"),
2161 (long) elf_header.e_ehsize);
2162 printf (_(" Size of program headers: %ld (bytes)\n"),
2163 (long) elf_header.e_phentsize);
2164 printf (_(" Number of program headers: %ld\n"),
2165 (long) elf_header.e_phnum);
2166 printf (_(" Size of section headers: %ld (bytes)\n"),
2167 (long) elf_header.e_shentsize);
2168 printf (_(" Number of section headers: %ld\n"),
2169 (long) elf_header.e_shnum);
2170 printf (_(" Section header string table index: %ld\n"),
2171 (long) elf_header.e_shstrndx);
2174 return 1;
2178 static int
2179 get_32bit_program_headers (file, program_headers)
2180 FILE * file;
2181 Elf_Internal_Phdr * program_headers;
2183 Elf32_External_Phdr * phdrs;
2184 Elf32_External_Phdr * external;
2185 Elf32_Internal_Phdr * internal;
2186 unsigned int i;
2188 GET_DATA_ALLOC (elf_header.e_phoff,
2189 elf_header.e_phentsize * elf_header.e_phnum,
2190 phdrs, Elf32_External_Phdr *, "program headers");
2192 for (i = 0, internal = program_headers, external = phdrs;
2193 i < elf_header.e_phnum;
2194 i ++, internal ++, external ++)
2196 internal->p_type = BYTE_GET (external->p_type);
2197 internal->p_offset = BYTE_GET (external->p_offset);
2198 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2199 internal->p_paddr = BYTE_GET (external->p_paddr);
2200 internal->p_filesz = BYTE_GET (external->p_filesz);
2201 internal->p_memsz = BYTE_GET (external->p_memsz);
2202 internal->p_flags = BYTE_GET (external->p_flags);
2203 internal->p_align = BYTE_GET (external->p_align);
2206 free (phdrs);
2208 return 1;
2211 static int
2212 get_64bit_program_headers (file, program_headers)
2213 FILE * file;
2214 Elf_Internal_Phdr * program_headers;
2216 Elf64_External_Phdr * phdrs;
2217 Elf64_External_Phdr * external;
2218 Elf64_Internal_Phdr * internal;
2219 unsigned int i;
2221 GET_DATA_ALLOC (elf_header.e_phoff,
2222 elf_header.e_phentsize * elf_header.e_phnum,
2223 phdrs, Elf64_External_Phdr *, "program headers");
2225 for (i = 0, internal = program_headers, external = phdrs;
2226 i < elf_header.e_phnum;
2227 i ++, internal ++, external ++)
2229 internal->p_type = BYTE_GET (external->p_type);
2230 internal->p_flags = BYTE_GET (external->p_flags);
2231 internal->p_offset = BYTE_GET8 (external->p_offset);
2232 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2233 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2234 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2235 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2236 internal->p_align = BYTE_GET8 (external->p_align);
2239 free (phdrs);
2241 return 1;
2244 static int
2245 process_program_headers (file)
2246 FILE * file;
2248 Elf_Internal_Phdr * program_headers;
2249 Elf_Internal_Phdr * segment;
2250 unsigned int i;
2252 if (elf_header.e_phnum == 0)
2254 if (do_segments)
2255 printf (_("\nThere are no program headers in this file.\n"));
2256 return 1;
2259 if (do_segments && !do_header)
2261 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2262 printf (_("Entry point "));
2263 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2264 printf (_("\nThere are %d program headers, starting at offset "),
2265 elf_header.e_phnum);
2266 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2267 printf ("\n");
2270 program_headers = (Elf_Internal_Phdr *) malloc
2271 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2273 if (program_headers == NULL)
2275 error (_("Out of memory\n"));
2276 return 0;
2279 if (is_32bit_elf)
2280 i = get_32bit_program_headers (file, program_headers);
2281 else
2282 i = get_64bit_program_headers (file, program_headers);
2284 if (i == 0)
2286 free (program_headers);
2287 return 0;
2290 if (do_segments)
2292 printf
2293 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2295 if (is_32bit_elf)
2296 printf
2297 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2298 else
2300 printf
2301 (_(" Type Offset VirtAddr PhysAddr\n"));
2302 printf
2303 (_(" FileSiz MemSiz Flags Align\n"));
2307 loadaddr = -1;
2308 dynamic_addr = 0;
2309 dynamic_size = 0;
2311 for (i = 0, segment = program_headers;
2312 i < elf_header.e_phnum;
2313 i ++, segment ++)
2315 if (do_segments)
2317 printf (" %-14.14s ", get_segment_type (segment->p_type));
2319 if (is_32bit_elf)
2321 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2322 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2323 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2324 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2325 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2326 printf ("%c%c%c ",
2327 (segment->p_flags & PF_R ? 'R' : ' '),
2328 (segment->p_flags & PF_W ? 'W' : ' '),
2329 (segment->p_flags & PF_X ? 'E' : ' '));
2330 printf ("%#lx", (unsigned long) segment->p_align);
2332 else
2334 print_vma (segment->p_offset, FULL_HEX);
2335 putchar (' ');
2336 print_vma (segment->p_vaddr, FULL_HEX);
2337 putchar (' ');
2338 print_vma (segment->p_paddr, FULL_HEX);
2339 printf ("\n ");
2340 print_vma (segment->p_filesz, FULL_HEX);
2341 putchar (' ');
2342 print_vma (segment->p_memsz, FULL_HEX);
2343 printf (" %c%c%c ",
2344 (segment->p_flags & PF_R ? 'R' : ' '),
2345 (segment->p_flags & PF_W ? 'W' : ' '),
2346 (segment->p_flags & PF_X ? 'E' : ' '));
2347 print_vma (segment->p_align, HEX);
2351 switch (segment->p_type)
2353 case PT_LOAD:
2354 if (loadaddr == -1)
2355 loadaddr = (segment->p_vaddr & 0xfffff000)
2356 - (segment->p_offset & 0xfffff000);
2357 break;
2359 case PT_DYNAMIC:
2360 if (dynamic_addr)
2361 error (_("more than one dynamic segment\n"));
2363 dynamic_addr = segment->p_offset;
2364 dynamic_size = segment->p_filesz;
2365 break;
2367 case PT_INTERP:
2368 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2369 error (_("Unable to find program interpreter name\n"));
2370 else
2372 program_interpreter[0] = 0;
2373 fscanf (file, "%63s", program_interpreter);
2375 if (do_segments)
2376 printf (_("\n [Requesting program interpreter: %s]"),
2377 program_interpreter);
2379 break;
2382 if (do_segments)
2383 putc ('\n', stdout);
2386 if (loadaddr == -1)
2388 /* Very strange. */
2389 loadaddr = 0;
2392 if (do_segments && section_headers != NULL)
2394 printf (_("\n Section to Segment mapping:\n"));
2395 printf (_(" Segment Sections...\n"));
2397 assert (string_table != NULL);
2399 for (i = 0; i < elf_header.e_phnum; i++)
2401 int j;
2402 Elf_Internal_Shdr * section;
2404 segment = program_headers + i;
2405 section = section_headers;
2407 printf (" %2.2d ", i);
2409 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2411 if (section->sh_size > 0
2412 /* Compare allocated sections by VMA, unallocated
2413 sections by file offset. */
2414 && (section->sh_flags & SHF_ALLOC
2415 ? (section->sh_addr >= segment->p_vaddr
2416 && section->sh_addr + section->sh_size
2417 <= segment->p_vaddr + segment->p_memsz)
2418 : ((bfd_vma) section->sh_offset >= segment->p_offset
2419 && (section->sh_offset + section->sh_size
2420 <= segment->p_offset + segment->p_filesz))))
2421 printf ("%s ", SECTION_NAME (section));
2424 putc ('\n',stdout);
2428 free (program_headers);
2430 return 1;
2434 static int
2435 get_32bit_section_headers (file)
2436 FILE * file;
2438 Elf32_External_Shdr * shdrs;
2439 Elf32_Internal_Shdr * internal;
2440 unsigned int i;
2442 GET_DATA_ALLOC (elf_header.e_shoff,
2443 elf_header.e_shentsize * elf_header.e_shnum,
2444 shdrs, Elf32_External_Shdr *, "section headers");
2446 section_headers = (Elf_Internal_Shdr *) malloc
2447 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2449 if (section_headers == NULL)
2451 error (_("Out of memory\n"));
2452 return 0;
2455 for (i = 0, internal = section_headers;
2456 i < elf_header.e_shnum;
2457 i ++, internal ++)
2459 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2460 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2461 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2462 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2463 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2464 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2465 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2466 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2467 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2468 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2471 free (shdrs);
2473 return 1;
2476 static int
2477 get_64bit_section_headers (file)
2478 FILE * file;
2480 Elf64_External_Shdr * shdrs;
2481 Elf64_Internal_Shdr * internal;
2482 unsigned int i;
2484 GET_DATA_ALLOC (elf_header.e_shoff,
2485 elf_header.e_shentsize * elf_header.e_shnum,
2486 shdrs, Elf64_External_Shdr *, "section headers");
2488 section_headers = (Elf_Internal_Shdr *) malloc
2489 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2491 if (section_headers == NULL)
2493 error (_("Out of memory\n"));
2494 return 0;
2497 for (i = 0, internal = section_headers;
2498 i < elf_header.e_shnum;
2499 i ++, internal ++)
2501 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2502 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2503 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2504 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2505 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2506 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2507 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2508 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2509 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2510 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2513 free (shdrs);
2515 return 1;
2518 static Elf_Internal_Sym *
2519 get_32bit_elf_symbols (file, offset, number)
2520 FILE * file;
2521 unsigned long offset;
2522 unsigned long number;
2524 Elf32_External_Sym * esyms;
2525 Elf_Internal_Sym * isyms;
2526 Elf_Internal_Sym * psym;
2527 unsigned int j;
2529 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2530 esyms, Elf32_External_Sym *, "symbols");
2532 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2534 if (isyms == NULL)
2536 error (_("Out of memory\n"));
2537 free (esyms);
2539 return NULL;
2542 for (j = 0, psym = isyms;
2543 j < number;
2544 j ++, psym ++)
2546 psym->st_name = BYTE_GET (esyms[j].st_name);
2547 psym->st_value = BYTE_GET (esyms[j].st_value);
2548 psym->st_size = BYTE_GET (esyms[j].st_size);
2549 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2550 psym->st_info = BYTE_GET (esyms[j].st_info);
2551 psym->st_other = BYTE_GET (esyms[j].st_other);
2554 free (esyms);
2556 return isyms;
2559 static Elf_Internal_Sym *
2560 get_64bit_elf_symbols (file, offset, number)
2561 FILE * file;
2562 unsigned long offset;
2563 unsigned long number;
2565 Elf64_External_Sym * esyms;
2566 Elf_Internal_Sym * isyms;
2567 Elf_Internal_Sym * psym;
2568 unsigned int j;
2570 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2571 esyms, Elf64_External_Sym *, "symbols");
2573 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2575 if (isyms == NULL)
2577 error (_("Out of memory\n"));
2578 free (esyms);
2580 return NULL;
2583 for (j = 0, psym = isyms;
2584 j < number;
2585 j ++, psym ++)
2587 psym->st_name = BYTE_GET (esyms[j].st_name);
2588 psym->st_info = BYTE_GET (esyms[j].st_info);
2589 psym->st_other = BYTE_GET (esyms[j].st_other);
2590 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2591 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2592 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2595 free (esyms);
2597 return isyms;
2600 static const char *
2601 get_elf_section_flags (sh_flags)
2602 bfd_vma sh_flags;
2604 static char buff [32];
2606 * buff = 0;
2608 while (sh_flags)
2610 bfd_vma flag;
2612 flag = sh_flags & - sh_flags;
2613 sh_flags &= ~ flag;
2615 switch (flag)
2617 case SHF_WRITE: strcat (buff, "W"); break;
2618 case SHF_ALLOC: strcat (buff, "A"); break;
2619 case SHF_EXECINSTR: strcat (buff, "X"); break;
2620 case SHF_MERGE: strcat (buff, "M"); break;
2621 case SHF_STRINGS: strcat (buff, "S"); break;
2622 case SHF_INFO_LINK: strcat (buff, "I"); break;
2623 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2624 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2626 default:
2627 if (flag & SHF_MASKOS)
2629 strcat (buff, "o");
2630 sh_flags &= ~ SHF_MASKOS;
2632 else if (flag & SHF_MASKPROC)
2634 strcat (buff, "p");
2635 sh_flags &= ~ SHF_MASKPROC;
2637 else
2638 strcat (buff, "x");
2639 break;
2643 return buff;
2646 static int
2647 process_section_headers (file)
2648 FILE * file;
2650 Elf_Internal_Shdr * section;
2651 int i;
2653 section_headers = NULL;
2655 if (elf_header.e_shnum == 0)
2657 if (do_sections)
2658 printf (_("\nThere are no sections in this file.\n"));
2660 return 1;
2663 if (do_sections && !do_header)
2664 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2665 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2667 if (is_32bit_elf)
2669 if (! get_32bit_section_headers (file))
2670 return 0;
2672 else if (! get_64bit_section_headers (file))
2673 return 0;
2675 /* Read in the string table, so that we have names to display. */
2676 section = section_headers + elf_header.e_shstrndx;
2678 if (section->sh_size != 0)
2680 unsigned long string_table_offset;
2682 string_table_offset = section->sh_offset;
2684 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2685 string_table, char *, "string table");
2688 /* Scan the sections for the dynamic symbol table
2689 and dynamic string table and debug sections. */
2690 dynamic_symbols = NULL;
2691 dynamic_strings = NULL;
2692 dynamic_syminfo = NULL;
2694 for (i = 0, section = section_headers;
2695 i < elf_header.e_shnum;
2696 i ++, section ++)
2698 char * name = SECTION_NAME (section);
2700 if (section->sh_type == SHT_DYNSYM)
2702 if (dynamic_symbols != NULL)
2704 error (_("File contains multiple dynamic symbol tables\n"));
2705 continue;
2708 num_dynamic_syms = section->sh_size / section->sh_entsize;
2709 dynamic_symbols =
2710 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2712 else if (section->sh_type == SHT_STRTAB
2713 && strcmp (name, ".dynstr") == 0)
2715 if (dynamic_strings != NULL)
2717 error (_("File contains multiple dynamic string tables\n"));
2718 continue;
2721 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2722 dynamic_strings, char *, "dynamic strings");
2724 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2725 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2726 && strncmp (name, ".debug_", 7) == 0)
2728 name += 7;
2730 if (do_debugging
2731 || (do_debug_info && (strcmp (name, "info") == 0))
2732 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2733 || (do_debug_lines && (strcmp (name, "line") == 0))
2734 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2735 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2737 request_dump (i, DEBUG_DUMP);
2741 if (! do_sections)
2742 return 1;
2744 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2746 if (is_32bit_elf)
2747 printf
2748 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2749 else
2751 printf (_(" [Nr] Name Type Address Offset\n"));
2752 printf (_(" Size EntSize Flags Link Info Align\n"));
2755 for (i = 0, section = section_headers;
2756 i < elf_header.e_shnum;
2757 i ++, section ++)
2759 printf (" [%2d] %-17.17s %-15.15s ",
2761 SECTION_NAME (section),
2762 get_section_type_name (section->sh_type));
2764 if (is_32bit_elf)
2766 print_vma (section->sh_addr, LONG_HEX);
2768 printf ( " %6.6lx %6.6lx %2.2lx",
2769 (unsigned long) section->sh_offset,
2770 (unsigned long) section->sh_size,
2771 (unsigned long) section->sh_entsize);
2773 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2775 printf (" %2ld %3lx %ld\n",
2776 (unsigned long) section->sh_link,
2777 (unsigned long) section->sh_info,
2778 (unsigned long) section->sh_addralign);
2780 else
2782 putchar (' ');
2783 print_vma (section->sh_addr, LONG_HEX);
2784 printf (" %8.8lx", section->sh_offset);
2785 printf ("\n ");
2786 print_vma (section->sh_size, LONG_HEX);
2787 printf (" ");
2788 print_vma (section->sh_entsize, LONG_HEX);
2790 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2792 printf (" %2ld %3lx %ld\n",
2793 (unsigned long) section->sh_link,
2794 (unsigned long) section->sh_info,
2795 (unsigned long) section->sh_addralign);
2799 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2800 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2801 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2803 return 1;
2806 /* Process the reloc section. */
2807 static int
2808 process_relocs (file)
2809 FILE * file;
2811 unsigned long rel_size;
2812 unsigned long rel_offset;
2815 if (!do_reloc)
2816 return 1;
2818 if (do_using_dynamic)
2820 int is_rela = FALSE;
2822 rel_size = 0;
2823 rel_offset = 0;
2825 if (dynamic_info[DT_REL])
2827 rel_offset = dynamic_info[DT_REL];
2828 rel_size = dynamic_info[DT_RELSZ];
2829 is_rela = FALSE;
2831 else if (dynamic_info [DT_RELA])
2833 rel_offset = dynamic_info[DT_RELA];
2834 rel_size = dynamic_info[DT_RELASZ];
2835 is_rela = TRUE;
2837 else if (dynamic_info[DT_JMPREL])
2839 rel_offset = dynamic_info[DT_JMPREL];
2840 rel_size = dynamic_info[DT_PLTRELSZ];
2842 switch (dynamic_info[DT_PLTREL])
2844 case DT_REL:
2845 is_rela = FALSE;
2846 break;
2847 case DT_RELA:
2848 is_rela = TRUE;
2849 break;
2850 default:
2851 is_rela = UNKNOWN;
2852 break;
2856 if (rel_size)
2858 printf
2859 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2860 rel_offset, rel_size);
2862 dump_relocations (file, rel_offset - loadaddr, rel_size,
2863 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2865 else
2866 printf (_("\nThere are no dynamic relocations in this file.\n"));
2868 else
2870 Elf32_Internal_Shdr * section;
2871 unsigned long i;
2872 int found = 0;
2874 for (i = 0, section = section_headers;
2875 i < elf_header.e_shnum;
2876 i++, section ++)
2878 if ( section->sh_type != SHT_RELA
2879 && section->sh_type != SHT_REL)
2880 continue;
2882 rel_offset = section->sh_offset;
2883 rel_size = section->sh_size;
2885 if (rel_size)
2887 Elf32_Internal_Shdr * strsec;
2888 Elf32_Internal_Shdr * symsec;
2889 Elf_Internal_Sym * symtab;
2890 char * strtab;
2891 int is_rela;
2892 unsigned long nsyms;
2894 printf (_("\nRelocation section "));
2896 if (string_table == NULL)
2897 printf ("%d", section->sh_name);
2898 else
2899 printf ("'%s'", SECTION_NAME (section));
2901 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2902 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2904 symsec = section_headers + section->sh_link;
2906 nsyms = symsec->sh_size / symsec->sh_entsize;
2907 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2909 if (symtab == NULL)
2910 continue;
2912 strsec = section_headers + symsec->sh_link;
2914 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2915 char *, "string table");
2917 is_rela = section->sh_type == SHT_RELA;
2919 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2921 free (strtab);
2922 free (symtab);
2924 found = 1;
2928 if (! found)
2929 printf (_("\nThere are no relocations in this file.\n"));
2932 return 1;
2936 static void
2937 dynamic_segment_mips_val (entry)
2938 Elf_Internal_Dyn * entry;
2940 switch (entry->d_tag)
2942 case DT_MIPS_FLAGS:
2943 if (entry->d_un.d_val == 0)
2944 printf ("NONE\n");
2945 else
2947 static const char * opts[] =
2949 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2950 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2951 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2952 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2953 "RLD_ORDER_SAFE"
2955 unsigned int cnt;
2956 int first = 1;
2957 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2958 if (entry->d_un.d_val & (1 << cnt))
2960 printf ("%s%s", first ? "" : " ", opts[cnt]);
2961 first = 0;
2963 puts ("");
2965 break;
2967 case DT_MIPS_IVERSION:
2968 if (dynamic_strings != NULL)
2969 printf ("Interface Version: %s\n",
2970 dynamic_strings + entry->d_un.d_val);
2971 else
2972 printf ("%ld\n", (long) entry->d_un.d_ptr);
2973 break;
2975 case DT_MIPS_TIME_STAMP:
2977 char timebuf[20];
2978 struct tm * tmp;
2980 time_t time = entry->d_un.d_val;
2981 tmp = gmtime (&time);
2982 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
2983 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
2984 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2985 printf ("Time Stamp: %s\n", timebuf);
2987 break;
2989 case DT_MIPS_RLD_VERSION:
2990 case DT_MIPS_LOCAL_GOTNO:
2991 case DT_MIPS_CONFLICTNO:
2992 case DT_MIPS_LIBLISTNO:
2993 case DT_MIPS_SYMTABNO:
2994 case DT_MIPS_UNREFEXTNO:
2995 case DT_MIPS_HIPAGENO:
2996 case DT_MIPS_DELTA_CLASS_NO:
2997 case DT_MIPS_DELTA_INSTANCE_NO:
2998 case DT_MIPS_DELTA_RELOC_NO:
2999 case DT_MIPS_DELTA_SYM_NO:
3000 case DT_MIPS_DELTA_CLASSSYM_NO:
3001 case DT_MIPS_COMPACT_SIZE:
3002 printf ("%ld\n", (long) entry->d_un.d_ptr);
3003 break;
3005 default:
3006 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3011 static void
3012 dynamic_segment_parisc_val (entry)
3013 Elf_Internal_Dyn * entry;
3015 switch (entry->d_tag)
3017 case DT_HP_DLD_FLAGS:
3019 static struct
3021 long int bit;
3022 const char * str;
3024 flags[] =
3026 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3027 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3028 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3029 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3030 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3031 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3032 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3033 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3034 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3035 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3036 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3038 int first = 1;
3039 size_t cnt;
3040 bfd_vma val = entry->d_un.d_val;
3042 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3043 if (val & flags[cnt].bit)
3045 if (! first)
3046 putchar (' ');
3047 fputs (flags[cnt].str, stdout);
3048 first = 0;
3049 val ^= flags[cnt].bit;
3052 if (val != 0 || first)
3054 if (! first)
3055 putchar (' ');
3056 print_vma (val, HEX);
3059 break;
3061 default:
3062 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3063 break;
3067 static int
3068 get_32bit_dynamic_segment (file)
3069 FILE * file;
3071 Elf32_External_Dyn * edyn;
3072 Elf_Internal_Dyn * entry;
3073 bfd_size_type i;
3075 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3076 edyn, Elf32_External_Dyn *, "dynamic segment");
3078 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3079 how large this .dynamic is now. We can do this even before the byte
3080 swapping since the DT_NULL tag is recognizable. */
3081 dynamic_size = 0;
3082 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3085 dynamic_segment = (Elf_Internal_Dyn *)
3086 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3088 if (dynamic_segment == NULL)
3090 error (_("Out of memory\n"));
3091 free (edyn);
3092 return 0;
3095 for (i = 0, entry = dynamic_segment;
3096 i < dynamic_size;
3097 i ++, entry ++)
3099 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3100 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3103 free (edyn);
3105 return 1;
3108 static int
3109 get_64bit_dynamic_segment (file)
3110 FILE * file;
3112 Elf64_External_Dyn * edyn;
3113 Elf_Internal_Dyn * entry;
3114 bfd_size_type i;
3116 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3117 edyn, Elf64_External_Dyn *, "dynamic segment");
3119 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3120 how large this .dynamic is now. We can do this even before the byte
3121 swapping since the DT_NULL tag is recognizable. */
3122 dynamic_size = 0;
3123 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3126 dynamic_segment = (Elf_Internal_Dyn *)
3127 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3129 if (dynamic_segment == NULL)
3131 error (_("Out of memory\n"));
3132 free (edyn);
3133 return 0;
3136 for (i = 0, entry = dynamic_segment;
3137 i < dynamic_size;
3138 i ++, entry ++)
3140 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3141 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3144 free (edyn);
3146 return 1;
3149 static const char *
3150 get_dynamic_flags (flags)
3151 bfd_vma flags;
3153 static char buff [64];
3154 while (flags)
3156 bfd_vma flag;
3158 flag = flags & - flags;
3159 flags &= ~ flag;
3161 switch (flag)
3163 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3164 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3165 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3166 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3167 default: strcat (buff, "unknown "); break;
3170 return buff;
3173 /* Parse and display the contents of the dynamic segment. */
3174 static int
3175 process_dynamic_segment (file)
3176 FILE * file;
3178 Elf_Internal_Dyn * entry;
3179 bfd_size_type i;
3181 if (dynamic_size == 0)
3183 if (do_dynamic)
3184 printf (_("\nThere is no dynamic segment in this file.\n"));
3186 return 1;
3189 if (is_32bit_elf)
3191 if (! get_32bit_dynamic_segment (file))
3192 return 0;
3194 else if (! get_64bit_dynamic_segment (file))
3195 return 0;
3197 /* Find the appropriate symbol table. */
3198 if (dynamic_symbols == NULL)
3200 for (i = 0, entry = dynamic_segment;
3201 i < dynamic_size;
3202 ++i, ++ entry)
3204 unsigned long offset;
3206 if (entry->d_tag != DT_SYMTAB)
3207 continue;
3209 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3211 /* Since we do not know how big the symbol table is,
3212 we default to reading in the entire file (!) and
3213 processing that. This is overkill, I know, but it
3214 should work. */
3215 offset = entry->d_un.d_val - loadaddr;
3217 if (fseek (file, 0, SEEK_END))
3218 error (_("Unable to seek to end of file!"));
3220 if (is_32bit_elf)
3221 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3222 else
3223 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3225 if (num_dynamic_syms < 1)
3227 error (_("Unable to determine the number of symbols to load\n"));
3228 continue;
3231 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3235 /* Similarly find a string table. */
3236 if (dynamic_strings == NULL)
3238 for (i = 0, entry = dynamic_segment;
3239 i < dynamic_size;
3240 ++i, ++ entry)
3242 unsigned long offset;
3243 long str_tab_len;
3245 if (entry->d_tag != DT_STRTAB)
3246 continue;
3248 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3250 /* Since we do not know how big the string table is,
3251 we default to reading in the entire file (!) and
3252 processing that. This is overkill, I know, but it
3253 should work. */
3255 offset = entry->d_un.d_val - loadaddr;
3256 if (fseek (file, 0, SEEK_END))
3257 error (_("Unable to seek to end of file\n"));
3258 str_tab_len = ftell (file) - offset;
3260 if (str_tab_len < 1)
3262 error
3263 (_("Unable to determine the length of the dynamic string table\n"));
3264 continue;
3267 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3268 "dynamic string table");
3270 break;
3274 /* And find the syminfo section if available. */
3275 if (dynamic_syminfo == NULL)
3277 unsigned int syminsz = 0;
3279 for (i = 0, entry = dynamic_segment;
3280 i < dynamic_size;
3281 ++i, ++ entry)
3283 if (entry->d_tag == DT_SYMINENT)
3285 /* Note: these braces are necessary to avoid a syntax
3286 error from the SunOS4 C compiler. */
3287 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3289 else if (entry->d_tag == DT_SYMINSZ)
3290 syminsz = entry->d_un.d_val;
3291 else if (entry->d_tag == DT_SYMINFO)
3292 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3295 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3297 Elf_External_Syminfo * extsyminfo;
3298 Elf_Internal_Syminfo * syminfo;
3300 /* There is a syminfo section. Read the data. */
3301 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3302 Elf_External_Syminfo *, "symbol information");
3304 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3305 if (dynamic_syminfo == NULL)
3307 error (_("Out of memory\n"));
3308 return 0;
3311 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3312 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3313 ++i, ++syminfo)
3315 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3316 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3319 free (extsyminfo);
3323 if (do_dynamic && dynamic_addr)
3324 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3325 dynamic_addr, (long) dynamic_size);
3326 if (do_dynamic)
3327 printf (_(" Tag Type Name/Value\n"));
3329 for (i = 0, entry = dynamic_segment;
3330 i < dynamic_size;
3331 i++, entry ++)
3333 if (do_dynamic)
3335 const char * dtype;
3337 putchar (' ');
3338 print_vma (entry->d_tag, FULL_HEX);
3339 dtype = get_dynamic_type (entry->d_tag);
3340 printf (" (%s)%*s", dtype,
3341 ((is_32bit_elf ? 27 : 19)
3342 - (int) strlen (dtype)),
3343 " ");
3346 switch (entry->d_tag)
3348 case DT_FLAGS:
3349 if (do_dynamic)
3350 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3351 break;
3353 case DT_AUXILIARY:
3354 case DT_FILTER:
3355 case DT_CONFIG:
3356 case DT_DEPAUDIT:
3357 case DT_AUDIT:
3358 if (do_dynamic)
3360 switch (entry->d_tag)
3362 case DT_AUXILIARY:
3363 printf (_("Auxiliary library"));
3364 break;
3366 case DT_FILTER:
3367 printf (_("Filter library"));
3368 break;
3370 case DT_CONFIG:
3371 printf (_("Configuration file"));
3372 break;
3374 case DT_DEPAUDIT:
3375 printf (_("Dependency audit library"));
3376 break;
3378 case DT_AUDIT:
3379 printf (_("Audit library"));
3380 break;
3383 if (dynamic_strings)
3384 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3385 else
3387 printf (": ");
3388 print_vma (entry->d_un.d_val, PREFIX_HEX);
3389 putchar ('\n');
3392 break;
3394 case DT_FEATURE:
3395 if (do_dynamic)
3397 printf (_("Flags:"));
3398 if (entry->d_un.d_val == 0)
3399 printf (_(" None\n"));
3400 else
3402 unsigned long int val = entry->d_un.d_val;
3403 if (val & DTF_1_PARINIT)
3405 printf (" PARINIT");
3406 val ^= DTF_1_PARINIT;
3408 if (val & DTF_1_CONFEXP)
3410 printf (" CONFEXP");
3411 val ^= DTF_1_CONFEXP;
3413 if (val != 0)
3414 printf (" %lx", val);
3415 puts ("");
3418 break;
3420 case DT_POSFLAG_1:
3421 if (do_dynamic)
3423 printf (_("Flags:"));
3424 if (entry->d_un.d_val == 0)
3425 printf (_(" None\n"));
3426 else
3428 unsigned long int val = entry->d_un.d_val;
3429 if (val & DF_P1_LAZYLOAD)
3431 printf (" LAZYLOAD");
3432 val ^= DF_P1_LAZYLOAD;
3434 if (val & DF_P1_GROUPPERM)
3436 printf (" GROUPPERM");
3437 val ^= DF_P1_GROUPPERM;
3439 if (val != 0)
3440 printf (" %lx", val);
3441 puts ("");
3444 break;
3446 case DT_FLAGS_1:
3447 if (do_dynamic)
3449 printf (_("Flags:"));
3450 if (entry->d_un.d_val == 0)
3451 printf (_(" None\n"));
3452 else
3454 unsigned long int val = entry->d_un.d_val;
3455 if (val & DF_1_NOW)
3457 printf (" NOW");
3458 val ^= DF_1_NOW;
3460 if (val & DF_1_GLOBAL)
3462 printf (" GLOBAL");
3463 val ^= DF_1_GLOBAL;
3465 if (val & DF_1_GROUP)
3467 printf (" GROUP");
3468 val ^= DF_1_GROUP;
3470 if (val & DF_1_NODELETE)
3472 printf (" NODELETE");
3473 val ^= DF_1_NODELETE;
3475 if (val & DF_1_LOADFLTR)
3477 printf (" LOADFLTR");
3478 val ^= DF_1_LOADFLTR;
3480 if (val & DF_1_INITFIRST)
3482 printf (" INITFIRST");
3483 val ^= DF_1_INITFIRST;
3485 if (val & DF_1_NOOPEN)
3487 printf (" NOOPEN");
3488 val ^= DF_1_NOOPEN;
3490 if (val & DF_1_ORIGIN)
3492 printf (" ORIGIN");
3493 val ^= DF_1_ORIGIN;
3495 if (val & DF_1_DIRECT)
3497 printf (" DIRECT");
3498 val ^= DF_1_DIRECT;
3500 if (val & DF_1_TRANS)
3502 printf (" TRANS");
3503 val ^= DF_1_TRANS;
3505 if (val & DF_1_INTERPOSE)
3507 printf (" INTERPOSE");
3508 val ^= DF_1_INTERPOSE;
3510 if (val & DF_1_NODEFLIB)
3512 printf (" NODEFLIB");
3513 val ^= DF_1_NODEFLIB;
3515 if (val & DF_1_NODUMP)
3517 printf (" NODUMP");
3518 val ^= DF_1_NODUMP;
3520 if (val & DF_1_CONLFAT)
3522 printf (" CONLFAT");
3523 val ^= DF_1_CONLFAT;
3525 if (val != 0)
3526 printf (" %lx", val);
3527 puts ("");
3530 break;
3532 case DT_PLTREL:
3533 if (do_dynamic)
3534 puts (get_dynamic_type (entry->d_un.d_val));
3535 break;
3537 case DT_NULL :
3538 case DT_NEEDED :
3539 case DT_PLTGOT :
3540 case DT_HASH :
3541 case DT_STRTAB :
3542 case DT_SYMTAB :
3543 case DT_RELA :
3544 case DT_INIT :
3545 case DT_FINI :
3546 case DT_SONAME :
3547 case DT_RPATH :
3548 case DT_SYMBOLIC:
3549 case DT_REL :
3550 case DT_DEBUG :
3551 case DT_TEXTREL :
3552 case DT_JMPREL :
3553 case DT_RUNPATH :
3554 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3556 if (do_dynamic)
3558 char * name;
3560 if (dynamic_strings == NULL)
3561 name = NULL;
3562 else
3563 name = dynamic_strings + entry->d_un.d_val;
3565 if (name)
3567 switch (entry->d_tag)
3569 case DT_NEEDED:
3570 printf (_("Shared library: [%s]"), name);
3572 if (strcmp (name, program_interpreter) == 0)
3573 printf (_(" program interpreter"));
3574 break;
3576 case DT_SONAME:
3577 printf (_("Library soname: [%s]"), name);
3578 break;
3580 case DT_RPATH:
3581 printf (_("Library rpath: [%s]"), name);
3582 break;
3584 case DT_RUNPATH:
3585 printf (_("Library runpath: [%s]"), name);
3586 break;
3588 default:
3589 print_vma (entry->d_un.d_val, PREFIX_HEX);
3590 break;
3593 else
3594 print_vma (entry->d_un.d_val, PREFIX_HEX);
3596 putchar ('\n');
3598 break;
3600 case DT_PLTRELSZ:
3601 case DT_RELASZ :
3602 case DT_STRSZ :
3603 case DT_RELSZ :
3604 case DT_RELAENT :
3605 case DT_SYMENT :
3606 case DT_RELENT :
3607 case DT_PLTPADSZ:
3608 case DT_MOVEENT :
3609 case DT_MOVESZ :
3610 case DT_INIT_ARRAYSZ:
3611 case DT_FINI_ARRAYSZ:
3612 if (do_dynamic)
3614 print_vma (entry->d_un.d_val, UNSIGNED);
3615 printf (" (bytes)\n");
3617 break;
3619 case DT_VERDEFNUM:
3620 case DT_VERNEEDNUM:
3621 case DT_RELACOUNT:
3622 case DT_RELCOUNT:
3623 if (do_dynamic)
3625 print_vma (entry->d_un.d_val, UNSIGNED);
3626 putchar ('\n');
3628 break;
3630 case DT_SYMINSZ:
3631 case DT_SYMINENT:
3632 case DT_SYMINFO:
3633 case DT_USED:
3634 case DT_INIT_ARRAY:
3635 case DT_FINI_ARRAY:
3636 if (do_dynamic)
3638 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3640 char * name;
3642 name = dynamic_strings + entry->d_un.d_val;
3644 if (* name)
3646 printf (_("Not needed object: [%s]\n"), name);
3647 break;
3651 print_vma (entry->d_un.d_val, PREFIX_HEX);
3652 putchar ('\n');
3654 break;
3656 case DT_BIND_NOW:
3657 /* The value of this entry is ignored. */
3658 break;
3660 default:
3661 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3662 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3663 entry->d_un.d_val;
3665 if (do_dynamic)
3667 switch (elf_header.e_machine)
3669 case EM_MIPS:
3670 case EM_MIPS_RS4_BE:
3671 dynamic_segment_mips_val (entry);
3672 break;
3673 case EM_PARISC:
3674 dynamic_segment_parisc_val (entry);
3675 break;
3676 default:
3677 print_vma (entry->d_un.d_val, PREFIX_HEX);
3678 putchar ('\n');
3681 break;
3685 return 1;
3688 static char *
3689 get_ver_flags (flags)
3690 unsigned int flags;
3692 static char buff [32];
3694 buff[0] = 0;
3696 if (flags == 0)
3697 return _("none");
3699 if (flags & VER_FLG_BASE)
3700 strcat (buff, "BASE ");
3702 if (flags & VER_FLG_WEAK)
3704 if (flags & VER_FLG_BASE)
3705 strcat (buff, "| ");
3707 strcat (buff, "WEAK ");
3710 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3711 strcat (buff, "| <unknown>");
3713 return buff;
3716 /* Display the contents of the version sections. */
3717 static int
3718 process_version_sections (file)
3719 FILE * file;
3721 Elf32_Internal_Shdr * section;
3722 unsigned i;
3723 int found = 0;
3725 if (! do_version)
3726 return 1;
3728 for (i = 0, section = section_headers;
3729 i < elf_header.e_shnum;
3730 i++, section ++)
3732 switch (section->sh_type)
3734 case SHT_GNU_verdef:
3736 Elf_External_Verdef * edefs;
3737 unsigned int idx;
3738 unsigned int cnt;
3740 found = 1;
3742 printf
3743 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3744 SECTION_NAME (section), section->sh_info);
3746 printf (_(" Addr: 0x"));
3747 printf_vma (section->sh_addr);
3748 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3749 (unsigned long) section->sh_offset, section->sh_link,
3750 SECTION_NAME (section_headers + section->sh_link));
3752 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3753 edefs, Elf_External_Verdef *,
3754 "version definition section");
3756 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3758 char * vstart;
3759 Elf_External_Verdef * edef;
3760 Elf_Internal_Verdef ent;
3761 Elf_External_Verdaux * eaux;
3762 Elf_Internal_Verdaux aux;
3763 int j;
3764 int isum;
3766 vstart = ((char *) edefs) + idx;
3768 edef = (Elf_External_Verdef *) vstart;
3770 ent.vd_version = BYTE_GET (edef->vd_version);
3771 ent.vd_flags = BYTE_GET (edef->vd_flags);
3772 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3773 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3774 ent.vd_hash = BYTE_GET (edef->vd_hash);
3775 ent.vd_aux = BYTE_GET (edef->vd_aux);
3776 ent.vd_next = BYTE_GET (edef->vd_next);
3778 printf (_(" %#06x: Rev: %d Flags: %s"),
3779 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3781 printf (_(" Index: %d Cnt: %d "),
3782 ent.vd_ndx, ent.vd_cnt);
3784 vstart += ent.vd_aux;
3786 eaux = (Elf_External_Verdaux *) vstart;
3788 aux.vda_name = BYTE_GET (eaux->vda_name);
3789 aux.vda_next = BYTE_GET (eaux->vda_next);
3791 if (dynamic_strings)
3792 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3793 else
3794 printf (_("Name index: %ld\n"), aux.vda_name);
3796 isum = idx + ent.vd_aux;
3798 for (j = 1; j < ent.vd_cnt; j ++)
3800 isum += aux.vda_next;
3801 vstart += aux.vda_next;
3803 eaux = (Elf_External_Verdaux *) vstart;
3805 aux.vda_name = BYTE_GET (eaux->vda_name);
3806 aux.vda_next = BYTE_GET (eaux->vda_next);
3808 if (dynamic_strings)
3809 printf (_(" %#06x: Parent %d: %s\n"),
3810 isum, j, dynamic_strings + aux.vda_name);
3811 else
3812 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3813 isum, j, aux.vda_name);
3816 idx += ent.vd_next;
3819 free (edefs);
3821 break;
3823 case SHT_GNU_verneed:
3825 Elf_External_Verneed * eneed;
3826 unsigned int idx;
3827 unsigned int cnt;
3829 found = 1;
3831 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3832 SECTION_NAME (section), section->sh_info);
3834 printf (_(" Addr: 0x"));
3835 printf_vma (section->sh_addr);
3836 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3837 (unsigned long) section->sh_offset, section->sh_link,
3838 SECTION_NAME (section_headers + section->sh_link));
3840 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3841 eneed, Elf_External_Verneed *,
3842 "version need section");
3844 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3846 Elf_External_Verneed * entry;
3847 Elf_Internal_Verneed ent;
3848 int j;
3849 int isum;
3850 char * vstart;
3852 vstart = ((char *) eneed) + idx;
3854 entry = (Elf_External_Verneed *) vstart;
3856 ent.vn_version = BYTE_GET (entry->vn_version);
3857 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3858 ent.vn_file = BYTE_GET (entry->vn_file);
3859 ent.vn_aux = BYTE_GET (entry->vn_aux);
3860 ent.vn_next = BYTE_GET (entry->vn_next);
3862 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3864 if (dynamic_strings)
3865 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3866 else
3867 printf (_(" File: %lx"), ent.vn_file);
3869 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3871 vstart += ent.vn_aux;
3873 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3875 Elf_External_Vernaux * eaux;
3876 Elf_Internal_Vernaux aux;
3878 eaux = (Elf_External_Vernaux *) vstart;
3880 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3881 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3882 aux.vna_other = BYTE_GET (eaux->vna_other);
3883 aux.vna_name = BYTE_GET (eaux->vna_name);
3884 aux.vna_next = BYTE_GET (eaux->vna_next);
3886 if (dynamic_strings)
3887 printf (_(" %#06x: Name: %s"),
3888 isum, dynamic_strings + aux.vna_name);
3889 else
3890 printf (_(" %#06x: Name index: %lx"),
3891 isum, aux.vna_name);
3893 printf (_(" Flags: %s Version: %d\n"),
3894 get_ver_flags (aux.vna_flags), aux.vna_other);
3896 isum += aux.vna_next;
3897 vstart += aux.vna_next;
3900 idx += ent.vn_next;
3903 free (eneed);
3905 break;
3907 case SHT_GNU_versym:
3909 Elf32_Internal_Shdr * link_section;
3910 int total;
3911 int cnt;
3912 unsigned char * edata;
3913 unsigned short * data;
3914 char * strtab;
3915 Elf_Internal_Sym * symbols;
3916 Elf32_Internal_Shdr * string_sec;
3918 link_section = section_headers + section->sh_link;
3919 total = section->sh_size / section->sh_entsize;
3921 found = 1;
3923 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3924 link_section->sh_size / link_section->sh_entsize);
3926 string_sec = section_headers + link_section->sh_link;
3928 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3929 strtab, char *, "version string table");
3931 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3932 SECTION_NAME (section), total);
3934 printf (_(" Addr: "));
3935 printf_vma (section->sh_addr);
3936 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3937 (unsigned long) section->sh_offset, section->sh_link,
3938 SECTION_NAME (link_section));
3940 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3941 - loadaddr,
3942 total * sizeof (short), edata,
3943 unsigned char *, "version symbol data");
3945 data = (unsigned short *) malloc (total * sizeof (short));
3947 for (cnt = total; cnt --;)
3948 data [cnt] = byte_get (edata + cnt * sizeof (short),
3949 sizeof (short));
3951 free (edata);
3953 for (cnt = 0; cnt < total; cnt += 4)
3955 int j, nn;
3956 char * name;
3958 printf (" %03x:", cnt);
3960 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3961 switch (data [cnt + j])
3963 case 0:
3964 fputs (_(" 0 (*local*) "), stdout);
3965 break;
3967 case 1:
3968 fputs (_(" 1 (*global*) "), stdout);
3969 break;
3971 default:
3972 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3973 data [cnt + j] & 0x8000 ? 'h' : ' ');
3975 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3976 && section_headers[symbols [cnt + j].st_shndx].sh_type
3977 == SHT_NOBITS)
3979 /* We must test both. */
3980 Elf_Internal_Verneed ivn;
3981 unsigned long offset;
3983 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3984 - loadaddr;
3988 Elf_External_Verneed evn;
3989 Elf_External_Vernaux evna;
3990 Elf_Internal_Vernaux ivna;
3991 unsigned long vna_off;
3993 GET_DATA (offset, evn, "version need");
3995 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3996 ivn.vn_next = BYTE_GET (evn.vn_next);
3998 vna_off = offset + ivn.vn_aux;
4002 GET_DATA (vna_off, evna,
4003 "version need aux (1)");
4005 ivna.vna_next = BYTE_GET (evna.vna_next);
4006 ivna.vna_other = BYTE_GET (evna.vna_other);
4008 vna_off += ivna.vna_next;
4010 while (ivna.vna_other != data [cnt + j]
4011 && ivna.vna_next != 0);
4013 if (ivna.vna_other == data [cnt + j])
4015 ivna.vna_name = BYTE_GET (evna.vna_name);
4017 name = strtab + ivna.vna_name;
4018 nn += printf ("(%s%-*s",
4019 name,
4020 12 - (int) strlen (name),
4021 ")");
4022 break;
4024 else if (ivn.vn_next == 0)
4026 if (data [cnt + j] != 0x8001)
4028 Elf_Internal_Verdef ivd;
4029 Elf_External_Verdef evd;
4031 offset = version_info
4032 [DT_VERSIONTAGIDX (DT_VERDEF)]
4033 - loadaddr;
4037 GET_DATA (offset, evd,
4038 "version definition");
4040 ivd.vd_next = BYTE_GET (evd.vd_next);
4041 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4043 offset += ivd.vd_next;
4045 while (ivd.vd_ndx
4046 != (data [cnt + j] & 0x7fff)
4047 && ivd.vd_next != 0);
4049 if (ivd.vd_ndx
4050 == (data [cnt + j] & 0x7fff))
4052 Elf_External_Verdaux evda;
4053 Elf_Internal_Verdaux ivda;
4055 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4057 GET_DATA (offset + ivd.vd_aux, evda,
4058 "version definition aux");
4060 ivda.vda_name =
4061 BYTE_GET (evda.vda_name);
4063 name = strtab + ivda.vda_name;
4064 nn +=
4065 printf ("(%s%-*s",
4066 name,
4067 12 - (int) strlen (name),
4068 ")");
4072 break;
4074 else
4075 offset += ivn.vn_next;
4077 while (ivn.vn_next);
4079 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4081 Elf_Internal_Verneed ivn;
4082 unsigned long offset;
4084 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4085 - loadaddr;
4089 Elf_Internal_Vernaux ivna;
4090 Elf_External_Verneed evn;
4091 Elf_External_Vernaux evna;
4092 unsigned long a_off;
4094 GET_DATA (offset, evn, "version need");
4096 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4097 ivn.vn_next = BYTE_GET (evn.vn_next);
4099 a_off = offset + ivn.vn_aux;
4103 GET_DATA (a_off, evna,
4104 "version need aux (2)");
4106 ivna.vna_next = BYTE_GET (evna.vna_next);
4107 ivna.vna_other = BYTE_GET (evna.vna_other);
4109 a_off += ivna.vna_next;
4111 while (ivna.vna_other != data [cnt + j]
4112 && ivna.vna_next != 0);
4114 if (ivna.vna_other == data [cnt + j])
4116 ivna.vna_name = BYTE_GET (evna.vna_name);
4118 name = strtab + ivna.vna_name;
4119 nn += printf ("(%s%-*s",
4120 name,
4121 12 - (int) strlen (name),
4122 ")");
4123 break;
4126 offset += ivn.vn_next;
4128 while (ivn.vn_next);
4130 else if (data [cnt + j] != 0x8001)
4132 Elf_Internal_Verdef ivd;
4133 Elf_External_Verdef evd;
4134 unsigned long offset;
4136 offset = version_info
4137 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4141 GET_DATA (offset, evd, "version def");
4143 ivd.vd_next = BYTE_GET (evd.vd_next);
4144 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4146 offset += ivd.vd_next;
4148 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4149 && ivd.vd_next != 0);
4151 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4153 Elf_External_Verdaux evda;
4154 Elf_Internal_Verdaux ivda;
4156 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4158 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4159 evda, "version def aux");
4161 ivda.vda_name = BYTE_GET (evda.vda_name);
4163 name = strtab + ivda.vda_name;
4164 nn += printf ("(%s%-*s",
4165 name,
4166 12 - (int) strlen (name),
4167 ")");
4171 if (nn < 18)
4172 printf ("%*c", 18 - nn, ' ');
4175 putchar ('\n');
4178 free (data);
4179 free (strtab);
4180 free (symbols);
4182 break;
4184 default:
4185 break;
4189 if (! found)
4190 printf (_("\nNo version information found in this file.\n"));
4192 return 1;
4195 static const char *
4196 get_symbol_binding (binding)
4197 unsigned int binding;
4199 static char buff [32];
4201 switch (binding)
4203 case STB_LOCAL: return "LOCAL";
4204 case STB_GLOBAL: return "GLOBAL";
4205 case STB_WEAK: return "WEAK";
4206 default:
4207 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4208 sprintf (buff, _("<processor specific>: %d"), binding);
4209 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4210 sprintf (buff, _("<OS specific>: %d"), binding);
4211 else
4212 sprintf (buff, _("<unknown>: %d"), binding);
4213 return buff;
4217 static const char *
4218 get_symbol_type (type)
4219 unsigned int type;
4221 static char buff [32];
4223 switch (type)
4225 case STT_NOTYPE: return "NOTYPE";
4226 case STT_OBJECT: return "OBJECT";
4227 case STT_FUNC: return "FUNC";
4228 case STT_SECTION: return "SECTION";
4229 case STT_FILE: return "FILE";
4230 case STT_COMMON: return "COMMON";
4231 default:
4232 if (type >= STT_LOPROC && type <= STT_HIPROC)
4234 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4235 return "THUMB_FUNC";
4237 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4238 return "REGISTER";
4240 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4241 return "PARISC_MILLI";
4243 sprintf (buff, _("<processor specific>: %d"), type);
4245 else if (type >= STT_LOOS && type <= STT_HIOS)
4247 if (elf_header.e_machine == EM_PARISC)
4249 if (type == STT_HP_OPAQUE)
4250 return "HP_OPAQUE";
4251 if (type == STT_HP_STUB)
4252 return "HP_STUB";
4255 sprintf (buff, _("<OS specific>: %d"), type);
4257 else
4258 sprintf (buff, _("<unknown>: %d"), type);
4259 return buff;
4263 static const char *
4264 get_symbol_visibility (visibility)
4265 unsigned int visibility;
4267 switch (visibility)
4269 case STV_DEFAULT: return "DEFAULT";
4270 case STV_INTERNAL: return "INTERNAL";
4271 case STV_HIDDEN: return "HIDDEN";
4272 case STV_PROTECTED: return "PROTECTED";
4273 default: abort ();
4277 static const char *
4278 get_symbol_index_type (type)
4279 unsigned int type;
4281 switch (type)
4283 case SHN_UNDEF: return "UND";
4284 case SHN_ABS: return "ABS";
4285 case SHN_COMMON: return "COM";
4286 default:
4287 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4288 return "PRC";
4289 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4290 return "RSV";
4291 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4292 return "OS ";
4293 else
4295 static char buff [32];
4297 sprintf (buff, "%3d", type);
4298 return buff;
4303 static int *
4304 get_dynamic_data (file, number)
4305 FILE * file;
4306 unsigned int number;
4308 unsigned char * e_data;
4309 int * i_data;
4311 e_data = (unsigned char *) malloc (number * 4);
4313 if (e_data == NULL)
4315 error (_("Out of memory\n"));
4316 return NULL;
4319 if (fread (e_data, 4, number, file) != number)
4321 error (_("Unable to read in dynamic data\n"));
4322 return NULL;
4325 i_data = (int *) malloc (number * sizeof (* i_data));
4327 if (i_data == NULL)
4329 error (_("Out of memory\n"));
4330 free (e_data);
4331 return NULL;
4334 while (number--)
4335 i_data [number] = byte_get (e_data + number * 4, 4);
4337 free (e_data);
4339 return i_data;
4342 /* Dump the symbol table */
4343 static int
4344 process_symbol_table (file)
4345 FILE * file;
4347 Elf32_Internal_Shdr * section;
4348 unsigned char nb [4];
4349 unsigned char nc [4];
4350 int nbuckets = 0;
4351 int nchains = 0;
4352 int * buckets = NULL;
4353 int * chains = NULL;
4355 if (! do_syms && !do_histogram)
4356 return 1;
4358 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4359 || do_histogram))
4361 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4363 error (_("Unable to seek to start of dynamic information"));
4364 return 0;
4367 if (fread (nb, sizeof (nb), 1, file) != 1)
4369 error (_("Failed to read in number of buckets\n"));
4370 return 0;
4373 if (fread (nc, sizeof (nc), 1, file) != 1)
4375 error (_("Failed to read in number of chains\n"));
4376 return 0;
4379 nbuckets = byte_get (nb, 4);
4380 nchains = byte_get (nc, 4);
4382 buckets = get_dynamic_data (file, nbuckets);
4383 chains = get_dynamic_data (file, nchains);
4385 if (buckets == NULL || chains == NULL)
4386 return 0;
4389 if (do_syms
4390 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4392 int hn;
4393 int si;
4395 printf (_("\nSymbol table for image:\n"));
4396 if (is_32bit_elf)
4397 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4398 else
4399 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4401 for (hn = 0; hn < nbuckets; hn++)
4403 if (! buckets [hn])
4404 continue;
4406 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4408 Elf_Internal_Sym * psym;
4410 psym = dynamic_symbols + si;
4412 printf (" %3d %3d: ", si, hn);
4413 print_vma (psym->st_value, LONG_HEX);
4414 putchar (' ' );
4415 print_vma (psym->st_size, DEC_5);
4417 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4418 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4419 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4420 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4421 printf (" %s\n", dynamic_strings + psym->st_name);
4425 else if (do_syms && !do_using_dynamic)
4427 unsigned int i;
4429 for (i = 0, section = section_headers;
4430 i < elf_header.e_shnum;
4431 i++, section++)
4433 unsigned int si;
4434 char * strtab;
4435 Elf_Internal_Sym * symtab;
4436 Elf_Internal_Sym * psym;
4439 if ( section->sh_type != SHT_SYMTAB
4440 && section->sh_type != SHT_DYNSYM)
4441 continue;
4443 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4444 SECTION_NAME (section),
4445 (unsigned long) (section->sh_size / section->sh_entsize));
4446 if (is_32bit_elf)
4447 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4448 else
4449 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4451 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4452 section->sh_size / section->sh_entsize);
4453 if (symtab == NULL)
4454 continue;
4456 if (section->sh_link == elf_header.e_shstrndx)
4457 strtab = string_table;
4458 else
4460 Elf32_Internal_Shdr * string_sec;
4462 string_sec = section_headers + section->sh_link;
4464 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4465 strtab, char *, "string table");
4468 for (si = 0, psym = symtab;
4469 si < section->sh_size / section->sh_entsize;
4470 si ++, psym ++)
4472 printf ("%6d: ", si);
4473 print_vma (psym->st_value, LONG_HEX);
4474 putchar (' ');
4475 print_vma (psym->st_size, DEC_5);
4476 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4477 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4478 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4479 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4480 printf (" %s", strtab + psym->st_name);
4482 if (section->sh_type == SHT_DYNSYM &&
4483 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4485 unsigned char data[2];
4486 unsigned short vers_data;
4487 unsigned long offset;
4488 int is_nobits;
4489 int check_def;
4491 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4492 - loadaddr;
4494 GET_DATA (offset + si * sizeof (vers_data), data,
4495 "version data");
4497 vers_data = byte_get (data, 2);
4499 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4500 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4501 : 0;
4503 check_def = (psym->st_shndx != SHN_UNDEF);
4505 if ((vers_data & 0x8000) || vers_data > 1)
4507 if (is_nobits || ! check_def)
4509 Elf_External_Verneed evn;
4510 Elf_Internal_Verneed ivn;
4511 Elf_Internal_Vernaux ivna;
4513 /* We must test both. */
4514 offset = version_info
4515 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4519 unsigned long vna_off;
4521 GET_DATA (offset, evn, "version need");
4523 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4524 ivn.vn_next = BYTE_GET (evn.vn_next);
4526 vna_off = offset + ivn.vn_aux;
4530 Elf_External_Vernaux evna;
4532 GET_DATA (vna_off, evna,
4533 "version need aux (3)");
4535 ivna.vna_other = BYTE_GET (evna.vna_other);
4536 ivna.vna_next = BYTE_GET (evna.vna_next);
4537 ivna.vna_name = BYTE_GET (evna.vna_name);
4539 vna_off += ivna.vna_next;
4541 while (ivna.vna_other != vers_data
4542 && ivna.vna_next != 0);
4544 if (ivna.vna_other == vers_data)
4545 break;
4547 offset += ivn.vn_next;
4549 while (ivn.vn_next != 0);
4551 if (ivna.vna_other == vers_data)
4553 printf ("@%s (%d)",
4554 strtab + ivna.vna_name, ivna.vna_other);
4555 check_def = 0;
4557 else if (! is_nobits)
4558 error (_("bad dynamic symbol"));
4559 else
4560 check_def = 1;
4563 if (check_def)
4565 if (vers_data != 0x8001)
4567 Elf_Internal_Verdef ivd;
4568 Elf_Internal_Verdaux ivda;
4569 Elf_External_Verdaux evda;
4570 unsigned long offset;
4572 offset =
4573 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4574 - loadaddr;
4578 Elf_External_Verdef evd;
4580 GET_DATA (offset, evd, "version def");
4582 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4583 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4584 ivd.vd_next = BYTE_GET (evd.vd_next);
4586 offset += ivd.vd_next;
4588 while (ivd.vd_ndx != (vers_data & 0x7fff)
4589 && ivd.vd_next != 0);
4591 offset -= ivd.vd_next;
4592 offset += ivd.vd_aux;
4594 GET_DATA (offset, evda, "version def aux");
4596 ivda.vda_name = BYTE_GET (evda.vda_name);
4598 if (psym->st_name != ivda.vda_name)
4599 printf ((vers_data & 0x8000)
4600 ? "@%s" : "@@%s",
4601 strtab + ivda.vda_name);
4607 putchar ('\n');
4610 free (symtab);
4611 if (strtab != string_table)
4612 free (strtab);
4615 else if (do_syms)
4616 printf
4617 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4619 if (do_histogram && buckets != NULL)
4621 int *lengths;
4622 int *counts;
4623 int hn;
4624 int si;
4625 int maxlength = 0;
4626 int nzero_counts = 0;
4627 int nsyms = 0;
4629 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4630 nbuckets);
4631 printf (_(" Length Number %% of total Coverage\n"));
4633 lengths = (int *) calloc (nbuckets, sizeof (int));
4634 if (lengths == NULL)
4636 error (_("Out of memory"));
4637 return 0;
4639 for (hn = 0; hn < nbuckets; ++hn)
4641 if (! buckets [hn])
4642 continue;
4644 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4646 ++ nsyms;
4647 if (maxlength < ++lengths[hn])
4648 ++ maxlength;
4652 counts = (int *) calloc (maxlength + 1, sizeof (int));
4653 if (counts == NULL)
4655 error (_("Out of memory"));
4656 return 0;
4659 for (hn = 0; hn < nbuckets; ++hn)
4660 ++ counts [lengths [hn]];
4662 if (nbuckets > 0)
4664 printf (" 0 %-10d (%5.1f%%)\n",
4665 counts[0], (counts[0] * 100.0) / nbuckets);
4666 for (si = 1; si <= maxlength; ++si)
4668 nzero_counts += counts[si] * si;
4669 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4670 si, counts[si], (counts[si] * 100.0) / nbuckets,
4671 (nzero_counts * 100.0) / nsyms);
4675 free (counts);
4676 free (lengths);
4679 if (buckets != NULL)
4681 free (buckets);
4682 free (chains);
4685 return 1;
4688 static int
4689 process_syminfo (file)
4690 FILE * file ATTRIBUTE_UNUSED;
4692 unsigned int i;
4694 if (dynamic_syminfo == NULL
4695 || !do_dynamic)
4696 /* No syminfo, this is ok. */
4697 return 1;
4699 /* There better should be a dynamic symbol section. */
4700 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4701 return 0;
4703 if (dynamic_addr)
4704 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4705 dynamic_syminfo_offset, dynamic_syminfo_nent);
4707 printf (_(" Num: Name BoundTo Flags\n"));
4708 for (i = 0; i < dynamic_syminfo_nent; ++i)
4710 unsigned short int flags = dynamic_syminfo[i].si_flags;
4712 printf ("%4d: %-30s ", i,
4713 dynamic_strings + dynamic_symbols[i].st_name);
4715 switch (dynamic_syminfo[i].si_boundto)
4717 case SYMINFO_BT_SELF:
4718 fputs ("SELF ", stdout);
4719 break;
4720 case SYMINFO_BT_PARENT:
4721 fputs ("PARENT ", stdout);
4722 break;
4723 default:
4724 if (dynamic_syminfo[i].si_boundto > 0
4725 && dynamic_syminfo[i].si_boundto < dynamic_size)
4726 printf ("%-10s ",
4727 dynamic_strings
4728 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4729 else
4730 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4731 break;
4734 if (flags & SYMINFO_FLG_DIRECT)
4735 printf (" DIRECT");
4736 if (flags & SYMINFO_FLG_PASSTHRU)
4737 printf (" PASSTHRU");
4738 if (flags & SYMINFO_FLG_COPY)
4739 printf (" COPY");
4740 if (flags & SYMINFO_FLG_LAZYLOAD)
4741 printf (" LAZYLOAD");
4743 puts ("");
4746 return 1;
4749 #ifdef SUPPORT_DISASSEMBLY
4750 static void
4751 disassemble_section (section, file)
4752 Elf32_Internal_Shdr * section;
4753 FILE * file;
4755 printf (_("\nAssembly dump of section %s\n"),
4756 SECTION_NAME (section));
4758 /* XXX -- to be done --- XXX */
4760 return 1;
4762 #endif
4764 static int
4765 dump_section (section, file)
4766 Elf32_Internal_Shdr * section;
4767 FILE * file;
4769 bfd_size_type bytes;
4770 bfd_vma addr;
4771 unsigned char * data;
4772 unsigned char * start;
4774 bytes = section->sh_size;
4776 if (bytes == 0)
4778 printf (_("\nSection '%s' has no data to dump.\n"),
4779 SECTION_NAME (section));
4780 return 0;
4782 else
4783 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4785 addr = section->sh_addr;
4787 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4788 "section data");
4790 data = start;
4792 while (bytes)
4794 int j;
4795 int k;
4796 int lbytes;
4798 lbytes = (bytes > 16 ? 16 : bytes);
4800 printf (" 0x%8.8lx ", (unsigned long) addr);
4802 switch (elf_header.e_ident [EI_DATA])
4804 default:
4805 case ELFDATA2LSB:
4806 for (j = 15; j >= 0; j --)
4808 if (j < lbytes)
4809 printf ("%2.2x", data [j]);
4810 else
4811 printf (" ");
4813 if (!(j & 0x3))
4814 printf (" ");
4816 break;
4818 case ELFDATA2MSB:
4819 for (j = 0; j < 16; j++)
4821 if (j < lbytes)
4822 printf ("%2.2x", data [j]);
4823 else
4824 printf (" ");
4826 if ((j & 3) == 3)
4827 printf (" ");
4829 break;
4832 for (j = 0; j < lbytes; j++)
4834 k = data [j];
4835 if (k >= ' ' && k < 0x80)
4836 printf ("%c", k);
4837 else
4838 printf (".");
4841 putchar ('\n');
4843 data += lbytes;
4844 addr += lbytes;
4845 bytes -= lbytes;
4848 free (start);
4850 return 1;
4854 static unsigned long int
4855 read_leb128 (data, length_return, sign)
4856 unsigned char * data;
4857 int * length_return;
4858 int sign;
4860 unsigned long int result = 0;
4861 unsigned int num_read = 0;
4862 int shift = 0;
4863 unsigned char byte;
4867 byte = * data ++;
4868 num_read ++;
4870 result |= (byte & 0x7f) << shift;
4872 shift += 7;
4875 while (byte & 0x80);
4877 if (length_return != NULL)
4878 * length_return = num_read;
4880 if (sign && (shift < 32) && (byte & 0x40))
4881 result |= -1 << shift;
4883 return result;
4886 typedef struct State_Machine_Registers
4888 unsigned long address;
4889 unsigned int file;
4890 unsigned int line;
4891 unsigned int column;
4892 int is_stmt;
4893 int basic_block;
4894 int end_sequence;
4895 /* This variable hold the number of the last entry seen
4896 in the File Table. */
4897 unsigned int last_file_entry;
4898 } SMR;
4900 static SMR state_machine_regs;
4902 static void
4903 reset_state_machine (is_stmt)
4904 int is_stmt;
4906 state_machine_regs.address = 0;
4907 state_machine_regs.file = 1;
4908 state_machine_regs.line = 1;
4909 state_machine_regs.column = 0;
4910 state_machine_regs.is_stmt = is_stmt;
4911 state_machine_regs.basic_block = 0;
4912 state_machine_regs.end_sequence = 0;
4913 state_machine_regs.last_file_entry = 0;
4916 /* Handled an extend line op. Returns true if this is the end
4917 of sequence. */
4918 static int
4919 process_extended_line_op (data, is_stmt, pointer_size)
4920 unsigned char * data;
4921 int is_stmt;
4922 int pointer_size;
4924 unsigned char op_code;
4925 int bytes_read;
4926 unsigned int len;
4927 unsigned char * name;
4928 unsigned long adr;
4930 len = read_leb128 (data, & bytes_read, 0);
4931 data += bytes_read;
4933 if (len == 0)
4935 warn (_("badly formed extended line op encountered!"));
4936 return bytes_read;
4939 len += bytes_read;
4940 op_code = * data ++;
4942 printf (_(" Extended opcode %d: "), op_code);
4944 switch (op_code)
4946 case DW_LNE_end_sequence:
4947 printf (_("End of Sequence\n\n"));
4948 reset_state_machine (is_stmt);
4949 break;
4951 case DW_LNE_set_address:
4952 adr = byte_get (data, pointer_size);
4953 printf (_("set Address to 0x%lx\n"), adr);
4954 state_machine_regs.address = adr;
4955 break;
4957 case DW_LNE_define_file:
4958 printf (_(" define new File Table entry\n"));
4959 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4961 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4962 name = data;
4963 data += strlen ((char *) data) + 1;
4964 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4965 data += bytes_read;
4966 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4967 data += bytes_read;
4968 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4969 printf (_("%s\n\n"), name);
4970 break;
4972 default:
4973 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4974 break;
4977 return len;
4980 /* Size of pointers in the .debug_line section. This information is not
4981 really present in that section. It's obtained before dumping the debug
4982 sections by doing some pre-scan of the .debug_info section. */
4983 static int debug_line_pointer_size = 4;
4985 static int
4986 display_debug_lines (section, start, file)
4987 Elf32_Internal_Shdr * section;
4988 unsigned char * start;
4989 FILE * file ATTRIBUTE_UNUSED;
4991 DWARF2_External_LineInfo * external;
4992 DWARF2_Internal_LineInfo info;
4993 unsigned char * standard_opcodes;
4994 unsigned char * data = start;
4995 unsigned char * end = start + section->sh_size;
4996 unsigned char * end_of_sequence;
4997 int i;
4999 printf (_("\nDump of debug contents of section %s:\n\n"),
5000 SECTION_NAME (section));
5002 while (data < end)
5004 external = (DWARF2_External_LineInfo *) data;
5006 /* Check the length of the block. */
5007 info.li_length = BYTE_GET (external->li_length);
5008 if (info.li_length > section->sh_size)
5010 warn
5011 (_("The line info appears to be corrupt - the section is too small\n"));
5012 return 0;
5015 /* Check its version number. */
5016 info.li_version = BYTE_GET (external->li_version);
5017 if (info.li_version != 2)
5019 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5020 return 0;
5023 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5024 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5025 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5026 info.li_line_base = BYTE_GET (external->li_line_base);
5027 info.li_line_range = BYTE_GET (external->li_line_range);
5028 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5030 /* Sign extend the line base field. */
5031 info.li_line_base <<= 24;
5032 info.li_line_base >>= 24;
5034 printf (_(" Length: %ld\n"), info.li_length);
5035 printf (_(" DWARF Version: %d\n"), info.li_version);
5036 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
5037 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5038 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5039 printf (_(" Line Base: %d\n"), info.li_line_base);
5040 printf (_(" Line Range: %d\n"), info.li_line_range);
5041 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5043 end_of_sequence = data + info.li_length + sizeof (info.li_length);
5045 reset_state_machine (info.li_default_is_stmt);
5047 /* Display the contents of the Opcodes table. */
5048 standard_opcodes = data + sizeof (* external);
5050 printf (_("\n Opcodes:\n"));
5052 for (i = 1; i < info.li_opcode_base; i++)
5053 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5055 /* Display the contents of the Directory table. */
5056 data = standard_opcodes + info.li_opcode_base - 1;
5058 if (* data == 0)
5059 printf (_("\n The Directory Table is empty.\n"));
5060 else
5062 printf (_("\n The Directory Table:\n"));
5064 while (* data != 0)
5066 printf (_(" %s\n"), data);
5068 data += strlen ((char *) data) + 1;
5072 /* Skip the NUL at the end of the table. */
5073 data ++;
5075 /* Display the contents of the File Name table. */
5076 if (* data == 0)
5077 printf (_("\n The File Name Table is empty.\n"));
5078 else
5080 printf (_("\n The File Name Table:\n"));
5081 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5083 while (* data != 0)
5085 unsigned char * name;
5086 int bytes_read;
5088 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5089 name = data;
5091 data += strlen ((char *) data) + 1;
5093 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5094 data += bytes_read;
5095 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5096 data += bytes_read;
5097 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5098 data += bytes_read;
5099 printf (_("%s\n"), name);
5103 /* Skip the NUL at the end of the table. */
5104 data ++;
5106 /* Now display the statements. */
5107 printf (_("\n Line Number Statements:\n"));
5110 while (data < end_of_sequence)
5112 unsigned char op_code;
5113 int adv;
5114 int bytes_read;
5116 op_code = * data ++;
5118 switch (op_code)
5120 case DW_LNS_extended_op:
5121 data += process_extended_line_op (data, info.li_default_is_stmt,
5122 debug_line_pointer_size);
5123 break;
5125 case DW_LNS_copy:
5126 printf (_(" Copy\n"));
5127 break;
5129 case DW_LNS_advance_pc:
5130 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5131 data += bytes_read;
5132 state_machine_regs.address += adv;
5133 printf (_(" Advance PC by %d to %lx\n"), adv,
5134 state_machine_regs.address);
5135 break;
5137 case DW_LNS_advance_line:
5138 adv = read_leb128 (data, & bytes_read, 1);
5139 data += bytes_read;
5140 state_machine_regs.line += adv;
5141 printf (_(" Advance Line by %d to %d\n"), adv,
5142 state_machine_regs.line);
5143 break;
5145 case DW_LNS_set_file:
5146 adv = read_leb128 (data, & bytes_read, 0);
5147 data += bytes_read;
5148 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5149 adv);
5150 state_machine_regs.file = adv;
5151 break;
5153 case DW_LNS_set_column:
5154 adv = read_leb128 (data, & bytes_read, 0);
5155 data += bytes_read;
5156 printf (_(" Set column to %d\n"), adv);
5157 state_machine_regs.column = adv;
5158 break;
5160 case DW_LNS_negate_stmt:
5161 adv = state_machine_regs.is_stmt;
5162 adv = ! adv;
5163 printf (_(" Set is_stmt to %d\n"), adv);
5164 state_machine_regs.is_stmt = adv;
5165 break;
5167 case DW_LNS_set_basic_block:
5168 printf (_(" Set basic block\n"));
5169 state_machine_regs.basic_block = 1;
5170 break;
5172 case DW_LNS_const_add_pc:
5173 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5174 * info.li_min_insn_length);
5175 state_machine_regs.address += adv;
5176 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5177 state_machine_regs.address);
5178 break;
5180 case DW_LNS_fixed_advance_pc:
5181 adv = byte_get (data, 2);
5182 data += 2;
5183 state_machine_regs.address += adv;
5184 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5185 adv, state_machine_regs.address);
5186 break;
5188 default:
5189 op_code -= info.li_opcode_base;
5190 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5191 state_machine_regs.address += adv;
5192 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5193 op_code, adv, state_machine_regs.address);
5194 adv = (op_code % info.li_line_range) + info.li_line_base;
5195 state_machine_regs.line += adv;
5196 printf (_(" and Line by %d to %d\n"),
5197 adv, state_machine_regs.line);
5198 break;
5201 printf ("\n");
5204 return 1;
5207 static int
5208 display_debug_pubnames (section, start, file)
5209 Elf32_Internal_Shdr * section;
5210 unsigned char * start;
5211 FILE * file ATTRIBUTE_UNUSED;
5213 DWARF2_External_PubNames * external;
5214 DWARF2_Internal_PubNames pubnames;
5215 unsigned char * end;
5217 end = start + section->sh_size;
5219 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5221 while (start < end)
5223 unsigned char * data;
5224 unsigned long offset;
5226 external = (DWARF2_External_PubNames *) start;
5228 pubnames.pn_length = BYTE_GET (external->pn_length);
5229 pubnames.pn_version = BYTE_GET (external->pn_version);
5230 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5231 pubnames.pn_size = BYTE_GET (external->pn_size);
5233 data = start + sizeof (* external);
5234 start += pubnames.pn_length + sizeof (external->pn_length);
5236 if (pubnames.pn_version != 2)
5238 static int warned = 0;
5240 if (! warned)
5242 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5243 warned = 1;
5246 continue;
5249 printf (_(" Length: %ld\n"),
5250 pubnames.pn_length);
5251 printf (_(" Version: %d\n"),
5252 pubnames.pn_version);
5253 printf (_(" Offset into .debug_info section: %ld\n"),
5254 pubnames.pn_offset);
5255 printf (_(" Size of area in .debug_info section: %ld\n"),
5256 pubnames.pn_size);
5258 printf (_("\n Offset\tName\n"));
5262 offset = byte_get (data, 4);
5264 if (offset != 0)
5266 data += 4;
5267 printf (" %ld\t\t%s\n", offset, data);
5268 data += strlen ((char *) data) + 1;
5271 while (offset != 0);
5274 printf ("\n");
5275 return 1;
5278 static char *
5279 get_TAG_name (tag)
5280 unsigned long tag;
5282 switch (tag)
5284 case DW_TAG_padding: return "DW_TAG_padding";
5285 case DW_TAG_array_type: return "DW_TAG_array_type";
5286 case DW_TAG_class_type: return "DW_TAG_class_type";
5287 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5288 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5289 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5290 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5291 case DW_TAG_label: return "DW_TAG_label";
5292 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5293 case DW_TAG_member: return "DW_TAG_member";
5294 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5295 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5296 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5297 case DW_TAG_string_type: return "DW_TAG_string_type";
5298 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5299 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5300 case DW_TAG_typedef: return "DW_TAG_typedef";
5301 case DW_TAG_union_type: return "DW_TAG_union_type";
5302 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5303 case DW_TAG_variant: return "DW_TAG_variant";
5304 case DW_TAG_common_block: return "DW_TAG_common_block";
5305 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5306 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5307 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5308 case DW_TAG_module: return "DW_TAG_module";
5309 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5310 case DW_TAG_set_type: return "DW_TAG_set_type";
5311 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5312 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5313 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5314 case DW_TAG_base_type: return "DW_TAG_base_type";
5315 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5316 case DW_TAG_const_type: return "DW_TAG_const_type";
5317 case DW_TAG_constant: return "DW_TAG_constant";
5318 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5319 case DW_TAG_file_type: return "DW_TAG_file_type";
5320 case DW_TAG_friend: return "DW_TAG_friend";
5321 case DW_TAG_namelist: return "DW_TAG_namelist";
5322 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5323 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5324 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5325 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5326 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5327 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5328 case DW_TAG_try_block: return "DW_TAG_try_block";
5329 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5330 case DW_TAG_variable: return "DW_TAG_variable";
5331 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5332 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5333 case DW_TAG_format_label: return "DW_TAG_format_label";
5334 case DW_TAG_function_template: return "DW_TAG_function_template";
5335 case DW_TAG_class_template: return "DW_TAG_class_template";
5336 default:
5338 static char buffer [100];
5340 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5341 return buffer;
5346 static char *
5347 get_AT_name (attribute)
5348 unsigned long attribute;
5350 switch (attribute)
5352 case DW_AT_sibling: return "DW_AT_sibling";
5353 case DW_AT_location: return "DW_AT_location";
5354 case DW_AT_name: return "DW_AT_name";
5355 case DW_AT_ordering: return "DW_AT_ordering";
5356 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5357 case DW_AT_byte_size: return "DW_AT_byte_size";
5358 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5359 case DW_AT_bit_size: return "DW_AT_bit_size";
5360 case DW_AT_element_list: return "DW_AT_element_list";
5361 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5362 case DW_AT_low_pc: return "DW_AT_low_pc";
5363 case DW_AT_high_pc: return "DW_AT_high_pc";
5364 case DW_AT_language: return "DW_AT_language";
5365 case DW_AT_member: return "DW_AT_member";
5366 case DW_AT_discr: return "DW_AT_discr";
5367 case DW_AT_discr_value: return "DW_AT_discr_value";
5368 case DW_AT_visibility: return "DW_AT_visibility";
5369 case DW_AT_import: return "DW_AT_import";
5370 case DW_AT_string_length: return "DW_AT_string_length";
5371 case DW_AT_common_reference: return "DW_AT_common_reference";
5372 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5373 case DW_AT_const_value: return "DW_AT_const_value";
5374 case DW_AT_containing_type: return "DW_AT_containing_type";
5375 case DW_AT_default_value: return "DW_AT_default_value";
5376 case DW_AT_inline: return "DW_AT_inline";
5377 case DW_AT_is_optional: return "DW_AT_is_optional";
5378 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5379 case DW_AT_producer: return "DW_AT_producer";
5380 case DW_AT_prototyped: return "DW_AT_prototyped";
5381 case DW_AT_return_addr: return "DW_AT_return_addr";
5382 case DW_AT_start_scope: return "DW_AT_start_scope";
5383 case DW_AT_stride_size: return "DW_AT_stride_size";
5384 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5385 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5386 case DW_AT_accessibility: return "DW_AT_accessibility";
5387 case DW_AT_address_class: return "DW_AT_address_class";
5388 case DW_AT_artificial: return "DW_AT_artificial";
5389 case DW_AT_base_types: return "DW_AT_base_types";
5390 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5391 case DW_AT_count: return "DW_AT_count";
5392 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5393 case DW_AT_decl_column: return "DW_AT_decl_column";
5394 case DW_AT_decl_file: return "DW_AT_decl_file";
5395 case DW_AT_decl_line: return "DW_AT_decl_line";
5396 case DW_AT_declaration: return "DW_AT_declaration";
5397 case DW_AT_discr_list: return "DW_AT_discr_list";
5398 case DW_AT_encoding: return "DW_AT_encoding";
5399 case DW_AT_external: return "DW_AT_external";
5400 case DW_AT_frame_base: return "DW_AT_frame_base";
5401 case DW_AT_friend: return "DW_AT_friend";
5402 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5403 case DW_AT_macro_info: return "DW_AT_macro_info";
5404 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5405 case DW_AT_priority: return "DW_AT_priority";
5406 case DW_AT_segment: return "DW_AT_segment";
5407 case DW_AT_specification: return "DW_AT_specification";
5408 case DW_AT_static_link: return "DW_AT_static_link";
5409 case DW_AT_type: return "DW_AT_type";
5410 case DW_AT_use_location: return "DW_AT_use_location";
5411 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5412 case DW_AT_virtuality: return "DW_AT_virtuality";
5413 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5414 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5415 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5416 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5417 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5418 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5419 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5420 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5421 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5422 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5423 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5424 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5425 case DW_AT_sf_names: return "DW_AT_sf_names";
5426 case DW_AT_src_info: return "DW_AT_src_info";
5427 case DW_AT_mac_info: return "DW_AT_mac_info";
5428 case DW_AT_src_coords: return "DW_AT_src_coords";
5429 case DW_AT_body_begin: return "DW_AT_body_begin";
5430 case DW_AT_body_end: return "DW_AT_body_end";
5431 default:
5433 static char buffer [100];
5435 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5436 return buffer;
5441 static char *
5442 get_FORM_name (form)
5443 unsigned long form;
5445 switch (form)
5447 case DW_FORM_addr: return "DW_FORM_addr";
5448 case DW_FORM_block2: return "DW_FORM_block2";
5449 case DW_FORM_block4: return "DW_FORM_block4";
5450 case DW_FORM_data2: return "DW_FORM_data2";
5451 case DW_FORM_data4: return "DW_FORM_data4";
5452 case DW_FORM_data8: return "DW_FORM_data8";
5453 case DW_FORM_string: return "DW_FORM_string";
5454 case DW_FORM_block: return "DW_FORM_block";
5455 case DW_FORM_block1: return "DW_FORM_block1";
5456 case DW_FORM_data1: return "DW_FORM_data1";
5457 case DW_FORM_flag: return "DW_FORM_flag";
5458 case DW_FORM_sdata: return "DW_FORM_sdata";
5459 case DW_FORM_strp: return "DW_FORM_strp";
5460 case DW_FORM_udata: return "DW_FORM_udata";
5461 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5462 case DW_FORM_ref1: return "DW_FORM_ref1";
5463 case DW_FORM_ref2: return "DW_FORM_ref2";
5464 case DW_FORM_ref4: return "DW_FORM_ref4";
5465 case DW_FORM_ref8: return "DW_FORM_ref8";
5466 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5467 case DW_FORM_indirect: return "DW_FORM_indirect";
5468 default:
5470 static char buffer [100];
5472 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5473 return buffer;
5478 /* FIXME: There are better and more effiecint ways to handle
5479 these structures. For now though, I just want something that
5480 is simple to implement. */
5481 typedef struct abbrev_attr
5483 unsigned long attribute;
5484 unsigned long form;
5485 struct abbrev_attr * next;
5487 abbrev_attr;
5489 typedef struct abbrev_entry
5491 unsigned long entry;
5492 unsigned long tag;
5493 int children;
5494 struct abbrev_attr * first_attr;
5495 struct abbrev_attr * last_attr;
5496 struct abbrev_entry * next;
5498 abbrev_entry;
5500 static abbrev_entry * first_abbrev = NULL;
5501 static abbrev_entry * last_abbrev = NULL;
5503 static void
5504 free_abbrevs PARAMS ((void))
5506 abbrev_entry * abbrev;
5508 for (abbrev = first_abbrev; abbrev;)
5510 abbrev_entry * next = abbrev->next;
5511 abbrev_attr * attr;
5513 for (attr = abbrev->first_attr; attr;)
5515 abbrev_attr * next = attr->next;
5517 free (attr);
5518 attr = next;
5521 free (abbrev);
5522 abbrev = next;
5525 last_abbrev = first_abbrev = NULL;
5528 static void
5529 add_abbrev (number, tag, children)
5530 unsigned long number;
5531 unsigned long tag;
5532 int children;
5534 abbrev_entry * entry;
5536 entry = (abbrev_entry *) malloc (sizeof (* entry));
5538 if (entry == NULL)
5539 /* ugg */
5540 return;
5542 entry->entry = number;
5543 entry->tag = tag;
5544 entry->children = children;
5545 entry->first_attr = NULL;
5546 entry->last_attr = NULL;
5547 entry->next = NULL;
5549 if (first_abbrev == NULL)
5550 first_abbrev = entry;
5551 else
5552 last_abbrev->next = entry;
5554 last_abbrev = entry;
5557 static void
5558 add_abbrev_attr (attribute, form)
5559 unsigned long attribute;
5560 unsigned long form;
5562 abbrev_attr * attr;
5564 attr = (abbrev_attr *) malloc (sizeof (* attr));
5566 if (attr == NULL)
5567 /* ugg */
5568 return;
5570 attr->attribute = attribute;
5571 attr->form = form;
5572 attr->next = NULL;
5574 if (last_abbrev->first_attr == NULL)
5575 last_abbrev->first_attr = attr;
5576 else
5577 last_abbrev->last_attr->next = attr;
5579 last_abbrev->last_attr = attr;
5582 /* Processes the (partial) contents of a .debug_abbrev section.
5583 Returns NULL if the end of the section was encountered.
5584 Returns the address after the last byte read if the end of
5585 an abbreviation set was found. */
5587 static unsigned char *
5588 process_abbrev_section (start, end)
5589 unsigned char * start;
5590 unsigned char * end;
5592 if (first_abbrev != NULL)
5593 return NULL;
5595 while (start < end)
5597 int bytes_read;
5598 unsigned long entry;
5599 unsigned long tag;
5600 unsigned long attribute;
5601 int children;
5603 entry = read_leb128 (start, & bytes_read, 0);
5604 start += bytes_read;
5606 /* A single zero is supposed to end the section according
5607 to the standard. If there's more, then signal that to
5608 the caller. */
5609 if (entry == 0)
5610 return start == end ? NULL : start;
5612 tag = read_leb128 (start, & bytes_read, 0);
5613 start += bytes_read;
5615 children = * start ++;
5617 add_abbrev (entry, tag, children);
5621 unsigned long form;
5623 attribute = read_leb128 (start, & bytes_read, 0);
5624 start += bytes_read;
5626 form = read_leb128 (start, & bytes_read, 0);
5627 start += bytes_read;
5629 if (attribute != 0)
5630 add_abbrev_attr (attribute, form);
5632 while (attribute != 0);
5635 return NULL;
5639 static int
5640 display_debug_abbrev (section, start, file)
5641 Elf32_Internal_Shdr * section;
5642 unsigned char * start;
5643 FILE * file ATTRIBUTE_UNUSED;
5645 abbrev_entry * entry;
5646 unsigned char * end = start + section->sh_size;
5648 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5652 start = process_abbrev_section (start, end);
5654 printf (_(" Number TAG\n"));
5656 for (entry = first_abbrev; entry; entry = entry->next)
5658 abbrev_attr * attr;
5660 printf (_(" %ld %s [%s]\n"),
5661 entry->entry,
5662 get_TAG_name (entry->tag),
5663 entry->children ? _("has children") : _("no children"));
5665 for (attr = entry->first_attr; attr; attr = attr->next)
5667 printf (_(" %-18s %s\n"),
5668 get_AT_name (attr->attribute),
5669 get_FORM_name (attr->form));
5673 while (start);
5675 printf ("\n");
5677 return 1;
5681 static unsigned char *
5682 display_block (data, length)
5683 unsigned char * data;
5684 unsigned long length;
5686 printf (_(" %lu byte block: "), length);
5688 while (length --)
5689 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5691 return data;
5694 static void
5695 decode_location_expression (data, pointer_size, length)
5696 unsigned char * data;
5697 unsigned int pointer_size;
5698 unsigned long length;
5700 unsigned op;
5701 int bytes_read;
5702 unsigned long uvalue;
5703 unsigned char *end = data + length;
5705 while (data < end)
5707 op = * data ++;
5709 switch (op)
5711 case DW_OP_addr:
5712 printf ("DW_OP_addr: %lx",
5713 (unsigned long) byte_get (data, pointer_size));
5714 data += pointer_size;
5715 break;
5716 case DW_OP_deref:
5717 printf ("DW_OP_deref");
5718 break;
5719 case DW_OP_const1u:
5720 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
5721 break;
5722 case DW_OP_const1s:
5723 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
5724 break;
5725 case DW_OP_const2u:
5726 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5727 data += 2;
5728 break;
5729 case DW_OP_const2s:
5730 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5731 data += 2;
5732 break;
5733 case DW_OP_const4u:
5734 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5735 data += 4;
5736 break;
5737 case DW_OP_const4s:
5738 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5739 data += 4;
5740 break;
5741 case DW_OP_const8u:
5742 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5743 (unsigned long) byte_get (data + 4, 4));
5744 data += 8;
5745 break;
5746 case DW_OP_const8s:
5747 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5748 (long) byte_get (data + 4, 4));
5749 data += 8;
5750 break;
5751 case DW_OP_constu:
5752 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
5753 data += bytes_read;
5754 break;
5755 case DW_OP_consts:
5756 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
5757 data += bytes_read;
5758 break;
5759 case DW_OP_dup:
5760 printf ("DW_OP_dup");
5761 break;
5762 case DW_OP_drop:
5763 printf ("DW_OP_drop");
5764 break;
5765 case DW_OP_over:
5766 printf ("DW_OP_over");
5767 break;
5768 case DW_OP_pick:
5769 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
5770 break;
5771 case DW_OP_swap:
5772 printf ("DW_OP_swap");
5773 break;
5774 case DW_OP_rot:
5775 printf ("DW_OP_rot");
5776 break;
5777 case DW_OP_xderef:
5778 printf ("DW_OP_xderef");
5779 break;
5780 case DW_OP_abs:
5781 printf ("DW_OP_abs");
5782 break;
5783 case DW_OP_and:
5784 printf ("DW_OP_and");
5785 break;
5786 case DW_OP_div:
5787 printf ("DW_OP_div");
5788 break;
5789 case DW_OP_minus:
5790 printf ("DW_OP_minus");
5791 break;
5792 case DW_OP_mod:
5793 printf ("DW_OP_mod");
5794 break;
5795 case DW_OP_mul:
5796 printf ("DW_OP_mul");
5797 break;
5798 case DW_OP_neg:
5799 printf ("DW_OP_neg");
5800 break;
5801 case DW_OP_not:
5802 printf ("DW_OP_not");
5803 break;
5804 case DW_OP_or:
5805 printf ("DW_OP_or");
5806 break;
5807 case DW_OP_plus:
5808 printf ("DW_OP_plus");
5809 break;
5810 case DW_OP_plus_uconst:
5811 printf ("DW_OP_plus_uconst: %lu",
5812 read_leb128 (data, &bytes_read, 0));
5813 data += bytes_read;
5814 break;
5815 case DW_OP_shl:
5816 printf ("DW_OP_shl");
5817 break;
5818 case DW_OP_shr:
5819 printf ("DW_OP_shr");
5820 break;
5821 case DW_OP_shra:
5822 printf ("DW_OP_shra");
5823 break;
5824 case DW_OP_xor:
5825 printf ("DW_OP_xor");
5826 break;
5827 case DW_OP_bra:
5828 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5829 data += 2;
5830 break;
5831 case DW_OP_eq:
5832 printf ("DW_OP_eq");
5833 break;
5834 case DW_OP_ge:
5835 printf ("DW_OP_ge");
5836 break;
5837 case DW_OP_gt:
5838 printf ("DW_OP_gt");
5839 break;
5840 case DW_OP_le:
5841 printf ("DW_OP_le");
5842 break;
5843 case DW_OP_lt:
5844 printf ("DW_OP_lt");
5845 break;
5846 case DW_OP_ne:
5847 printf ("DW_OP_ne");
5848 break;
5849 case DW_OP_skip:
5850 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5851 data += 2;
5852 break;
5854 case DW_OP_lit0:
5855 case DW_OP_lit1:
5856 case DW_OP_lit2:
5857 case DW_OP_lit3:
5858 case DW_OP_lit4:
5859 case DW_OP_lit5:
5860 case DW_OP_lit6:
5861 case DW_OP_lit7:
5862 case DW_OP_lit8:
5863 case DW_OP_lit9:
5864 case DW_OP_lit10:
5865 case DW_OP_lit11:
5866 case DW_OP_lit12:
5867 case DW_OP_lit13:
5868 case DW_OP_lit14:
5869 case DW_OP_lit15:
5870 case DW_OP_lit16:
5871 case DW_OP_lit17:
5872 case DW_OP_lit18:
5873 case DW_OP_lit19:
5874 case DW_OP_lit20:
5875 case DW_OP_lit21:
5876 case DW_OP_lit22:
5877 case DW_OP_lit23:
5878 case DW_OP_lit24:
5879 case DW_OP_lit25:
5880 case DW_OP_lit26:
5881 case DW_OP_lit27:
5882 case DW_OP_lit28:
5883 case DW_OP_lit29:
5884 case DW_OP_lit30:
5885 case DW_OP_lit31:
5886 printf ("DW_OP_lit%d", op - DW_OP_lit0);
5887 break;
5889 case DW_OP_reg0:
5890 case DW_OP_reg1:
5891 case DW_OP_reg2:
5892 case DW_OP_reg3:
5893 case DW_OP_reg4:
5894 case DW_OP_reg5:
5895 case DW_OP_reg6:
5896 case DW_OP_reg7:
5897 case DW_OP_reg8:
5898 case DW_OP_reg9:
5899 case DW_OP_reg10:
5900 case DW_OP_reg11:
5901 case DW_OP_reg12:
5902 case DW_OP_reg13:
5903 case DW_OP_reg14:
5904 case DW_OP_reg15:
5905 case DW_OP_reg16:
5906 case DW_OP_reg17:
5907 case DW_OP_reg18:
5908 case DW_OP_reg19:
5909 case DW_OP_reg20:
5910 case DW_OP_reg21:
5911 case DW_OP_reg22:
5912 case DW_OP_reg23:
5913 case DW_OP_reg24:
5914 case DW_OP_reg25:
5915 case DW_OP_reg26:
5916 case DW_OP_reg27:
5917 case DW_OP_reg28:
5918 case DW_OP_reg29:
5919 case DW_OP_reg30:
5920 case DW_OP_reg31:
5921 printf ("DW_OP_reg%d", op - DW_OP_reg0);
5922 break;
5924 case DW_OP_breg0:
5925 case DW_OP_breg1:
5926 case DW_OP_breg2:
5927 case DW_OP_breg3:
5928 case DW_OP_breg4:
5929 case DW_OP_breg5:
5930 case DW_OP_breg6:
5931 case DW_OP_breg7:
5932 case DW_OP_breg8:
5933 case DW_OP_breg9:
5934 case DW_OP_breg10:
5935 case DW_OP_breg11:
5936 case DW_OP_breg12:
5937 case DW_OP_breg13:
5938 case DW_OP_breg14:
5939 case DW_OP_breg15:
5940 case DW_OP_breg16:
5941 case DW_OP_breg17:
5942 case DW_OP_breg18:
5943 case DW_OP_breg19:
5944 case DW_OP_breg20:
5945 case DW_OP_breg21:
5946 case DW_OP_breg22:
5947 case DW_OP_breg23:
5948 case DW_OP_breg24:
5949 case DW_OP_breg25:
5950 case DW_OP_breg26:
5951 case DW_OP_breg27:
5952 case DW_OP_breg28:
5953 case DW_OP_breg29:
5954 case DW_OP_breg30:
5955 case DW_OP_breg31:
5956 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
5957 read_leb128 (data, &bytes_read, 1));
5958 data += bytes_read;
5959 break;
5961 case DW_OP_regx:
5962 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
5963 data += bytes_read;
5964 break;
5965 case DW_OP_fbreg:
5966 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
5967 data += bytes_read;
5968 break;
5969 case DW_OP_bregx:
5970 uvalue = read_leb128 (data, &bytes_read, 0);
5971 data += bytes_read;
5972 printf ("DW_OP_bregx: %lu %ld", uvalue,
5973 read_leb128 (data, &bytes_read, 1));
5974 data += bytes_read;
5975 break;
5976 case DW_OP_piece:
5977 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
5978 data += bytes_read;
5979 break;
5980 case DW_OP_deref_size:
5981 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
5982 break;
5983 case DW_OP_xderef_size:
5984 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
5985 break;
5986 case DW_OP_nop:
5987 printf ("DW_OP_nop");
5988 break;
5990 default:
5991 if (op >= DW_OP_lo_user
5992 && op <= DW_OP_hi_user)
5993 printf (_("(User defined location op)"));
5994 else
5995 printf (_("(Unknown location op)"));
5996 /* No way to tell where the next op is, so just bail. */
5997 return;
6003 static unsigned char *
6004 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6005 unsigned long attribute;
6006 unsigned long form;
6007 unsigned char * data;
6008 unsigned long cu_offset;
6009 unsigned long pointer_size;
6011 unsigned long uvalue = 0;
6012 unsigned char * block_start = NULL;
6013 int bytes_read;
6015 printf (" %-18s:", get_AT_name (attribute));
6017 switch (form)
6019 default:
6020 break;
6022 case DW_FORM_ref_addr:
6023 case DW_FORM_addr:
6024 uvalue = byte_get (data, pointer_size);
6025 data += pointer_size;
6026 break;
6028 case DW_FORM_ref1:
6029 case DW_FORM_flag:
6030 case DW_FORM_data1:
6031 uvalue = byte_get (data ++, 1);
6032 break;
6034 case DW_FORM_ref2:
6035 case DW_FORM_data2:
6036 uvalue = byte_get (data, 2);
6037 data += 2;
6038 break;
6040 case DW_FORM_ref4:
6041 case DW_FORM_data4:
6042 uvalue = byte_get (data, 4);
6043 data += 4;
6044 break;
6046 case DW_FORM_sdata:
6047 uvalue = read_leb128 (data, & bytes_read, 1);
6048 data += bytes_read;
6049 break;
6051 case DW_FORM_ref_udata:
6052 case DW_FORM_udata:
6053 uvalue = read_leb128 (data, & bytes_read, 0);
6054 data += bytes_read;
6055 break;
6058 switch (form)
6060 case DW_FORM_ref_addr:
6061 printf (" <#%lx>", uvalue);
6062 break;
6064 case DW_FORM_ref1:
6065 case DW_FORM_ref2:
6066 case DW_FORM_ref4:
6067 case DW_FORM_ref_udata:
6068 printf (" <%lx>", uvalue + cu_offset);
6069 break;
6071 case DW_FORM_addr:
6072 printf (" %#lx", uvalue);
6074 case DW_FORM_flag:
6075 case DW_FORM_data1:
6076 case DW_FORM_data2:
6077 case DW_FORM_data4:
6078 case DW_FORM_sdata:
6079 case DW_FORM_udata:
6080 printf (" %ld", uvalue);
6081 break;
6083 case DW_FORM_ref8:
6084 case DW_FORM_data8:
6085 uvalue = byte_get (data, 4);
6086 printf (" %lx", uvalue);
6087 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6088 data += 8;
6089 break;
6091 case DW_FORM_string:
6092 printf (" %s", data);
6093 data += strlen ((char *) data) + 1;
6094 break;
6096 case DW_FORM_block:
6097 uvalue = read_leb128 (data, & bytes_read, 0);
6098 block_start = data + bytes_read;
6099 data = display_block (block_start, uvalue);
6100 break;
6102 case DW_FORM_block1:
6103 uvalue = byte_get (data, 1);
6104 block_start = data + 1;
6105 data = display_block (block_start, uvalue);
6106 break;
6108 case DW_FORM_block2:
6109 uvalue = byte_get (data, 2);
6110 block_start = data + 2;
6111 data = display_block (block_start, uvalue);
6112 break;
6114 case DW_FORM_block4:
6115 uvalue = byte_get (data, 4);
6116 block_start = data + 4;
6117 data = display_block (block_start, uvalue);
6118 break;
6120 case DW_FORM_strp:
6121 case DW_FORM_indirect:
6122 warn (_("Unable to handle FORM: %d"), form);
6123 break;
6125 default:
6126 warn (_("Unrecognised form: %d"), form);
6127 break;
6130 /* For some attributes we can display futher information. */
6132 printf ("\t");
6134 switch (attribute)
6136 case DW_AT_inline:
6137 switch (uvalue)
6139 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6140 case DW_INL_inlined: printf (_("(inlined)")); break;
6141 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6142 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6143 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6145 break;
6147 case DW_AT_language:
6148 switch (uvalue)
6150 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6151 case DW_LANG_C89: printf ("(ANSI C)"); break;
6152 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6153 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6154 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6155 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6156 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6157 case DW_LANG_Ada83: printf ("(Ada)"); break;
6158 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6159 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6160 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6161 default: printf ("(Unknown: %lx)", uvalue); break;
6163 break;
6165 case DW_AT_encoding:
6166 switch (uvalue)
6168 case DW_ATE_void: printf ("(void)"); break;
6169 case DW_ATE_address: printf ("(machine address)"); break;
6170 case DW_ATE_boolean: printf ("(boolean)"); break;
6171 case DW_ATE_complex_float: printf ("(complex float)"); break;
6172 case DW_ATE_float: printf ("(float)"); break;
6173 case DW_ATE_signed: printf ("(signed)"); break;
6174 case DW_ATE_signed_char: printf ("(signed char)"); break;
6175 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6176 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6177 default:
6178 if (uvalue >= DW_ATE_lo_user
6179 && uvalue <= DW_ATE_hi_user)
6180 printf ("(user defined type)");
6181 else
6182 printf ("(unknown type)");
6183 break;
6185 break;
6187 case DW_AT_accessibility:
6188 switch (uvalue)
6190 case DW_ACCESS_public: printf ("(public)"); break;
6191 case DW_ACCESS_protected: printf ("(protected)"); break;
6192 case DW_ACCESS_private: printf ("(private)"); break;
6193 default: printf ("(unknown accessibility)"); break;
6195 break;
6197 case DW_AT_visibility:
6198 switch (uvalue)
6200 case DW_VIS_local: printf ("(local)"); break;
6201 case DW_VIS_exported: printf ("(exported)"); break;
6202 case DW_VIS_qualified: printf ("(qualified)"); break;
6203 default: printf ("(unknown visibility)"); break;
6205 break;
6207 case DW_AT_virtuality:
6208 switch (uvalue)
6210 case DW_VIRTUALITY_none: printf ("(none)"); break;
6211 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6212 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6213 default: printf ("(unknown virtuality)"); break;
6215 break;
6217 case DW_AT_identifier_case:
6218 switch (uvalue)
6220 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6221 case DW_ID_up_case: printf ("(up_case)"); break;
6222 case DW_ID_down_case: printf ("(down_case)"); break;
6223 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6224 default: printf ("(unknown case)"); break;
6226 break;
6228 case DW_AT_calling_convention:
6229 switch (uvalue)
6231 case DW_CC_normal: printf ("(normal)"); break;
6232 case DW_CC_program: printf ("(program)"); break;
6233 case DW_CC_nocall: printf ("(nocall)"); break;
6234 default:
6235 if (uvalue >= DW_CC_lo_user
6236 && uvalue <= DW_CC_hi_user)
6237 printf ("(user defined)");
6238 else
6239 printf ("(unknown convention)");
6241 break;
6243 case DW_AT_frame_base:
6244 case DW_AT_location:
6245 case DW_AT_data_member_location:
6246 case DW_AT_vtable_elem_location:
6247 if (block_start)
6249 printf ("(");
6250 decode_location_expression (block_start, pointer_size, uvalue);
6251 printf (")");
6253 break;
6255 default:
6256 break;
6259 printf ("\n");
6260 return data;
6263 static int
6264 display_debug_info (section, start, file)
6265 Elf32_Internal_Shdr * section;
6266 unsigned char * start;
6267 FILE * file;
6269 unsigned char * end = start + section->sh_size;
6270 unsigned char * section_begin = start;
6272 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6274 while (start < end)
6276 DWARF2_External_CompUnit * external;
6277 DWARF2_Internal_CompUnit compunit;
6278 unsigned char * tags;
6279 int i;
6280 int level;
6281 unsigned long cu_offset;
6283 external = (DWARF2_External_CompUnit *) start;
6285 compunit.cu_length = BYTE_GET (external->cu_length);
6286 compunit.cu_version = BYTE_GET (external->cu_version);
6287 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6288 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6290 tags = start + sizeof (* external);
6291 cu_offset = start - section_begin;
6292 start += compunit.cu_length + sizeof (external->cu_length);
6294 if (compunit.cu_version != 2)
6296 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6297 continue;
6300 printf (_(" Compilation Unit:\n"));
6301 printf (_(" Length: %ld\n"), compunit.cu_length);
6302 printf (_(" Version: %d\n"), compunit.cu_version);
6303 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6304 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6306 if (first_abbrev != NULL)
6307 free_abbrevs ();
6309 /* Read in the abbrevs used by this compilation unit. */
6312 Elf32_Internal_Shdr * sec;
6313 unsigned char * begin;
6315 /* Locate the .debug_abbrev section and process it. */
6316 for (i = 0, sec = section_headers;
6317 i < elf_header.e_shnum;
6318 i ++, sec ++)
6319 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6320 break;
6322 if (i == -1 || sec->sh_size == 0)
6324 warn (_("Unable to locate .debug_abbrev section!\n"));
6325 return 0;
6328 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6329 "debug_abbrev section data");
6331 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6332 begin + sec->sh_size);
6334 free (begin);
6337 level = 0;
6338 while (tags < start)
6340 int bytes_read;
6341 unsigned long abbrev_number;
6342 abbrev_entry * entry;
6343 abbrev_attr * attr;
6345 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6346 tags += bytes_read;
6348 /* A null DIE marks the end of a list of children. */
6349 if (abbrev_number == 0)
6351 --level;
6352 continue;
6355 /* Scan through the abbreviation list until we reach the
6356 correct entry. */
6357 for (entry = first_abbrev;
6358 entry && entry->entry != abbrev_number;
6359 entry = entry->next)
6360 continue;
6362 if (entry == NULL)
6364 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6365 abbrev_number);
6366 return 0;
6369 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6370 level, tags - section_begin - bytes_read,
6371 abbrev_number,
6372 get_TAG_name (entry->tag));
6374 for (attr = entry->first_attr; attr; attr = attr->next)
6375 tags = read_and_display_attr (attr->attribute,
6376 attr->form,
6377 tags, cu_offset,
6378 compunit.cu_pointer_size);
6380 if (entry->children)
6381 ++level;
6385 printf ("\n");
6387 return 1;
6390 static int
6391 display_debug_aranges (section, start, file)
6392 Elf32_Internal_Shdr * section;
6393 unsigned char * start;
6394 FILE * file ATTRIBUTE_UNUSED;
6396 unsigned char * end = start + section->sh_size;
6398 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6400 while (start < end)
6402 DWARF2_External_ARange * external;
6403 DWARF2_Internal_ARange arange;
6404 unsigned char * ranges;
6405 unsigned long length;
6406 unsigned long address;
6407 int excess;
6409 external = (DWARF2_External_ARange *) start;
6411 arange.ar_length = BYTE_GET (external->ar_length);
6412 arange.ar_version = BYTE_GET (external->ar_version);
6413 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6414 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6415 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6417 if (arange.ar_version != 2)
6419 warn (_("Only DWARF 2 aranges are currently supported.\n"));
6420 break;
6423 printf (_(" Length: %ld\n"), arange.ar_length);
6424 printf (_(" Version: %d\n"), arange.ar_version);
6425 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6426 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6427 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6429 printf (_("\n Address Length\n"));
6431 ranges = start + sizeof (* external);
6433 /* Must pad to an alignment boundary that is twice the pointer size. */
6434 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6435 if (excess)
6436 ranges += (2 * arange.ar_pointer_size) - excess;
6438 for (;;)
6440 address = byte_get (ranges, arange.ar_pointer_size);
6442 ranges += arange.ar_pointer_size;
6444 length = byte_get (ranges, arange.ar_pointer_size);
6446 ranges += arange.ar_pointer_size;
6448 /* A pair of zeros marks the end of the list. */
6449 if (address == 0 && length == 0)
6450 break;
6452 printf (" %8.8lx %lu\n", address, length);
6455 start += arange.ar_length + sizeof (external->ar_length);
6458 printf ("\n");
6460 return 1;
6464 static int
6465 display_debug_not_supported (section, start, file)
6466 Elf32_Internal_Shdr * section;
6467 unsigned char * start ATTRIBUTE_UNUSED;
6468 FILE * file ATTRIBUTE_UNUSED;
6470 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6471 SECTION_NAME (section));
6473 return 1;
6476 /* Pre-scan the .debug_info section to record the size of address.
6477 When dumping the .debug_line, we use that size information, assuming
6478 that all compilation units have the same address size. */
6479 static int
6480 prescan_debug_info (section, start, file)
6481 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6482 unsigned char * start;
6483 FILE * file ATTRIBUTE_UNUSED;
6485 DWARF2_External_CompUnit * external;
6487 external = (DWARF2_External_CompUnit *) start;
6489 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6490 return 0;
6493 /* A structure containing the name of a debug section and a pointer
6494 to a function that can decode it. The third field is a prescan
6495 function to be run over the section before displaying any of the
6496 sections. */
6497 struct
6499 char * name;
6500 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6501 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6503 debug_displays[] =
6505 { ".debug_info", display_debug_info, prescan_debug_info },
6506 { ".debug_abbrev", display_debug_abbrev, NULL },
6507 { ".debug_line", display_debug_lines, NULL },
6508 { ".debug_aranges", display_debug_aranges, NULL },
6509 { ".debug_pubnames", display_debug_pubnames, NULL },
6510 { ".debug_macinfo", display_debug_not_supported, NULL },
6511 { ".debug_frame", display_debug_not_supported, NULL },
6512 { ".debug_str", display_debug_not_supported, NULL },
6513 { ".debug_static_func", display_debug_not_supported, NULL },
6514 { ".debug_static_vars", display_debug_not_supported, NULL },
6515 { ".debug_types", display_debug_not_supported, NULL },
6516 { ".debug_weaknames", display_debug_not_supported, NULL }
6519 static int
6520 display_debug_section (section, file)
6521 Elf32_Internal_Shdr * section;
6522 FILE * file;
6524 char * name = SECTION_NAME (section);
6525 bfd_size_type length;
6526 unsigned char * start;
6527 int i;
6529 length = section->sh_size;
6530 if (length == 0)
6532 printf (_("\nSection '%s' has no debugging data.\n"), name);
6533 return 0;
6536 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6537 "debug section data");
6539 /* See if we know how to display the contents of this section. */
6540 for (i = NUM_ELEM (debug_displays); i--;)
6541 if (strcmp (debug_displays[i].name, name) == 0)
6543 debug_displays[i].display (section, start, file);
6544 break;
6547 if (i == -1)
6548 printf (_("Unrecognised debug section: %s\n"), name);
6550 free (start);
6552 /* If we loaded in the abbrev section at some point,
6553 we must release it here. */
6554 if (first_abbrev != NULL)
6555 free_abbrevs ();
6557 return 1;
6560 static int
6561 process_section_contents (file)
6562 FILE * file;
6564 Elf32_Internal_Shdr * section;
6565 unsigned int i;
6567 if (! do_dump)
6568 return 1;
6570 /* Pre-scan the debug sections to find some debug information not
6571 present in some of them. For the .debug_line, we must find out the
6572 size of address (specified in .debug_info and .debug_aranges). */
6573 for (i = 0, section = section_headers;
6574 i < elf_header.e_shnum && i < num_dump_sects;
6575 i ++, section ++)
6577 char * name = SECTION_NAME (section);
6578 int j;
6580 if (section->sh_size == 0)
6581 continue;
6583 /* See if there is some pre-scan operation for this section. */
6584 for (j = NUM_ELEM (debug_displays); j--;)
6585 if (strcmp (debug_displays[j].name, name) == 0)
6587 if (debug_displays[j].prescan != NULL)
6589 bfd_size_type length;
6590 unsigned char * start;
6592 length = section->sh_size;
6593 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6594 "debug section data");
6596 debug_displays[j].prescan (section, start, file);
6597 free (start);
6600 break;
6604 for (i = 0, section = section_headers;
6605 i < elf_header.e_shnum && i < num_dump_sects;
6606 i ++, section ++)
6608 #ifdef SUPPORT_DISASSEMBLY
6609 if (dump_sects[i] & DISASS_DUMP)
6610 disassemble_section (section, file);
6611 #endif
6612 if (dump_sects[i] & HEX_DUMP)
6613 dump_section (section, file);
6615 if (dump_sects[i] & DEBUG_DUMP)
6616 display_debug_section (section, file);
6619 if (i < num_dump_sects)
6620 warn (_("Some sections were not dumped because they do not exist!\n"));
6622 return 1;
6625 static void
6626 process_mips_fpe_exception (mask)
6627 int mask;
6629 if (mask)
6631 int first = 1;
6632 if (mask & OEX_FPU_INEX)
6633 fputs ("INEX", stdout), first = 0;
6634 if (mask & OEX_FPU_UFLO)
6635 printf ("%sUFLO", first ? "" : "|"), first = 0;
6636 if (mask & OEX_FPU_OFLO)
6637 printf ("%sOFLO", first ? "" : "|"), first = 0;
6638 if (mask & OEX_FPU_DIV0)
6639 printf ("%sDIV0", first ? "" : "|"), first = 0;
6640 if (mask & OEX_FPU_INVAL)
6641 printf ("%sINVAL", first ? "" : "|");
6643 else
6644 fputs ("0", stdout);
6647 static int
6648 process_mips_specific (file)
6649 FILE * file;
6651 Elf_Internal_Dyn * entry;
6652 size_t liblist_offset = 0;
6653 size_t liblistno = 0;
6654 size_t conflictsno = 0;
6655 size_t options_offset = 0;
6656 size_t conflicts_offset = 0;
6658 /* We have a lot of special sections. Thanks SGI! */
6659 if (dynamic_segment == NULL)
6660 /* No information available. */
6661 return 0;
6663 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6664 switch (entry->d_tag)
6666 case DT_MIPS_LIBLIST:
6667 liblist_offset = entry->d_un.d_val - loadaddr;
6668 break;
6669 case DT_MIPS_LIBLISTNO:
6670 liblistno = entry->d_un.d_val;
6671 break;
6672 case DT_MIPS_OPTIONS:
6673 options_offset = entry->d_un.d_val - loadaddr;
6674 break;
6675 case DT_MIPS_CONFLICT:
6676 conflicts_offset = entry->d_un.d_val - loadaddr;
6677 break;
6678 case DT_MIPS_CONFLICTNO:
6679 conflictsno = entry->d_un.d_val;
6680 break;
6681 default:
6682 break;
6685 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6687 Elf32_External_Lib * elib;
6688 size_t cnt;
6690 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6691 elib, Elf32_External_Lib *, "liblist");
6693 printf ("\nSection '.liblist' contains %lu entries:\n",
6694 (unsigned long) liblistno);
6695 fputs (" Library Time Stamp Checksum Version Flags\n",
6696 stdout);
6698 for (cnt = 0; cnt < liblistno; ++cnt)
6700 Elf32_Lib liblist;
6701 time_t time;
6702 char timebuf[20];
6703 struct tm * tmp;
6705 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6706 time = BYTE_GET (elib[cnt].l_time_stamp);
6707 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6708 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6709 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6711 tmp = gmtime (&time);
6712 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
6713 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6714 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6716 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
6717 dynamic_strings + liblist.l_name, timebuf,
6718 liblist.l_checksum, liblist.l_version);
6720 if (liblist.l_flags == 0)
6721 puts (" NONE");
6722 else
6724 static const struct
6726 const char * name;
6727 int bit;
6729 l_flags_vals[] =
6731 { " EXACT_MATCH", LL_EXACT_MATCH },
6732 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6733 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6734 { " EXPORTS", LL_EXPORTS },
6735 { " DELAY_LOAD", LL_DELAY_LOAD },
6736 { " DELTA", LL_DELTA }
6738 int flags = liblist.l_flags;
6739 size_t fcnt;
6741 for (fcnt = 0;
6742 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6743 ++fcnt)
6744 if ((flags & l_flags_vals[fcnt].bit) != 0)
6746 fputs (l_flags_vals[fcnt].name, stdout);
6747 flags ^= l_flags_vals[fcnt].bit;
6749 if (flags != 0)
6750 printf (" %#x", (unsigned int) flags);
6752 puts ("");
6756 free (elib);
6759 if (options_offset != 0)
6761 Elf_External_Options * eopt;
6762 Elf_Internal_Shdr * sect = section_headers;
6763 Elf_Internal_Options * iopt;
6764 Elf_Internal_Options * option;
6765 size_t offset;
6766 int cnt;
6768 /* Find the section header so that we get the size. */
6769 while (sect->sh_type != SHT_MIPS_OPTIONS)
6770 ++ sect;
6772 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6773 Elf_External_Options *, "options");
6775 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6776 * sizeof (*iopt));
6777 if (iopt == NULL)
6779 error (_("Out of memory"));
6780 return 0;
6783 offset = cnt = 0;
6784 option = iopt;
6786 while (offset < sect->sh_size)
6788 Elf_External_Options * eoption;
6790 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6792 option->kind = BYTE_GET (eoption->kind);
6793 option->size = BYTE_GET (eoption->size);
6794 option->section = BYTE_GET (eoption->section);
6795 option->info = BYTE_GET (eoption->info);
6797 offset += option->size;
6799 ++option;
6800 ++cnt;
6803 printf (_("\nSection '%s' contains %d entries:\n"),
6804 string_table + sect->sh_name, cnt);
6806 option = iopt;
6808 while (cnt-- > 0)
6810 size_t len;
6812 switch (option->kind)
6814 case ODK_NULL:
6815 /* This shouldn't happen. */
6816 printf (" NULL %d %lx", option->section, option->info);
6817 break;
6818 case ODK_REGINFO:
6819 printf (" REGINFO ");
6820 if (elf_header.e_machine == EM_MIPS)
6822 /* 32bit form. */
6823 Elf32_External_RegInfo *ereg;
6824 Elf32_RegInfo reginfo;
6826 ereg = (Elf32_External_RegInfo *) (option + 1);
6827 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6828 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6829 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6830 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6831 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6832 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6834 printf ("GPR %08lx GP 0x%lx\n",
6835 reginfo.ri_gprmask,
6836 (unsigned long) reginfo.ri_gp_value);
6837 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6838 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6839 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6841 else
6843 /* 64 bit form. */
6844 Elf64_External_RegInfo * ereg;
6845 Elf64_Internal_RegInfo reginfo;
6847 ereg = (Elf64_External_RegInfo *) (option + 1);
6848 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6849 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6850 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6851 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6852 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6853 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6855 printf ("GPR %08lx GP 0x",
6856 reginfo.ri_gprmask);
6857 printf_vma (reginfo.ri_gp_value);
6858 printf ("\n");
6860 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6861 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6862 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6864 ++option;
6865 continue;
6866 case ODK_EXCEPTIONS:
6867 fputs (" EXCEPTIONS fpe_min(", stdout);
6868 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6869 fputs (") fpe_max(", stdout);
6870 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6871 fputs (")", stdout);
6873 if (option->info & OEX_PAGE0)
6874 fputs (" PAGE0", stdout);
6875 if (option->info & OEX_SMM)
6876 fputs (" SMM", stdout);
6877 if (option->info & OEX_FPDBUG)
6878 fputs (" FPDBUG", stdout);
6879 if (option->info & OEX_DISMISS)
6880 fputs (" DISMISS", stdout);
6881 break;
6882 case ODK_PAD:
6883 fputs (" PAD ", stdout);
6884 if (option->info & OPAD_PREFIX)
6885 fputs (" PREFIX", stdout);
6886 if (option->info & OPAD_POSTFIX)
6887 fputs (" POSTFIX", stdout);
6888 if (option->info & OPAD_SYMBOL)
6889 fputs (" SYMBOL", stdout);
6890 break;
6891 case ODK_HWPATCH:
6892 fputs (" HWPATCH ", stdout);
6893 if (option->info & OHW_R4KEOP)
6894 fputs (" R4KEOP", stdout);
6895 if (option->info & OHW_R8KPFETCH)
6896 fputs (" R8KPFETCH", stdout);
6897 if (option->info & OHW_R5KEOP)
6898 fputs (" R5KEOP", stdout);
6899 if (option->info & OHW_R5KCVTL)
6900 fputs (" R5KCVTL", stdout);
6901 break;
6902 case ODK_FILL:
6903 fputs (" FILL ", stdout);
6904 /* XXX Print content of info word? */
6905 break;
6906 case ODK_TAGS:
6907 fputs (" TAGS ", stdout);
6908 /* XXX Print content of info word? */
6909 break;
6910 case ODK_HWAND:
6911 fputs (" HWAND ", stdout);
6912 if (option->info & OHWA0_R4KEOP_CHECKED)
6913 fputs (" R4KEOP_CHECKED", stdout);
6914 if (option->info & OHWA0_R4KEOP_CLEAN)
6915 fputs (" R4KEOP_CLEAN", stdout);
6916 break;
6917 case ODK_HWOR:
6918 fputs (" HWOR ", stdout);
6919 if (option->info & OHWA0_R4KEOP_CHECKED)
6920 fputs (" R4KEOP_CHECKED", stdout);
6921 if (option->info & OHWA0_R4KEOP_CLEAN)
6922 fputs (" R4KEOP_CLEAN", stdout);
6923 break;
6924 case ODK_GP_GROUP:
6925 printf (" GP_GROUP %#06lx self-contained %#06lx",
6926 option->info & OGP_GROUP,
6927 (option->info & OGP_SELF) >> 16);
6928 break;
6929 case ODK_IDENT:
6930 printf (" IDENT %#06lx self-contained %#06lx",
6931 option->info & OGP_GROUP,
6932 (option->info & OGP_SELF) >> 16);
6933 break;
6934 default:
6935 /* This shouldn't happen. */
6936 printf (" %3d ??? %d %lx",
6937 option->kind, option->section, option->info);
6938 break;
6941 len = sizeof (*eopt);
6942 while (len < option->size)
6943 if (((char *) option)[len] >= ' '
6944 && ((char *) option)[len] < 0x7f)
6945 printf ("%c", ((char *) option)[len++]);
6946 else
6947 printf ("\\%03o", ((char *) option)[len++]);
6949 fputs ("\n", stdout);
6950 ++option;
6953 free (eopt);
6956 if (conflicts_offset != 0 && conflictsno != 0)
6958 Elf32_External_Conflict * econf32;
6959 Elf64_External_Conflict * econf64;
6960 Elf32_Conflict * iconf;
6961 size_t cnt;
6963 if (dynamic_symbols == NULL)
6965 error (_("conflict list with without table"));
6966 return 0;
6969 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6970 if (iconf == NULL)
6972 error (_("Out of memory"));
6973 return 0;
6976 if (is_32bit_elf)
6978 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6979 econf32, Elf32_External_Conflict *, "conflict");
6981 for (cnt = 0; cnt < conflictsno; ++cnt)
6982 iconf[cnt] = BYTE_GET (econf32[cnt]);
6984 else
6986 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6987 econf64, Elf64_External_Conflict *, "conflict");
6989 for (cnt = 0; cnt < conflictsno; ++cnt)
6990 iconf[cnt] = BYTE_GET (econf64[cnt]);
6993 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6994 puts (_(" Num: Index Value Name"));
6996 for (cnt = 0; cnt < conflictsno; ++cnt)
6998 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
7000 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
7001 print_vma (psym->st_value, FULL_HEX);
7002 printf (" %s\n", dynamic_strings + psym->st_name);
7005 free (iconf);
7008 return 1;
7011 static char *
7012 get_note_type (e_type)
7013 unsigned e_type;
7015 static char buff[64];
7017 switch (e_type)
7019 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
7020 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
7021 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
7022 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
7023 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
7024 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
7025 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
7026 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
7027 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
7028 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
7029 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
7030 default:
7031 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
7032 return buff;
7036 /* Note that by the ELF standard, the name field is already null byte
7037 terminated, and namesz includes the terminating null byte.
7038 I.E. the value of namesz for the name "FSF" is 4.
7040 If the value of namesz is zero, there is no name present. */
7041 static int
7042 process_note (pnote)
7043 Elf32_Internal_Note * pnote;
7045 printf (" %s\t\t0x%08lx\t%s\n",
7046 pnote->namesz ? pnote->namedata : "(NONE)",
7047 pnote->descsz, get_note_type (pnote->type));
7048 return 1;
7052 static int
7053 process_corefile_note_segment (file, offset, length)
7054 FILE * file;
7055 bfd_vma offset;
7056 bfd_vma length;
7058 Elf_External_Note * pnotes;
7059 Elf_External_Note * external;
7060 int res = 1;
7062 if (length <= 0)
7063 return 0;
7065 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
7067 external = pnotes;
7069 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
7070 (unsigned long) offset, (unsigned long) length);
7071 printf (_(" Owner\t\tData size\tDescription\n"));
7073 while (external < (Elf_External_Note *)((char *) pnotes + length))
7075 Elf32_Internal_Note inote;
7076 char * temp = NULL;
7078 inote.type = BYTE_GET (external->type);
7079 inote.namesz = BYTE_GET (external->namesz);
7080 inote.namedata = external->name;
7081 inote.descsz = BYTE_GET (external->descsz);
7082 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
7083 inote.descpos = offset + (inote.descdata - (char *) pnotes);
7085 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
7087 /* Verify that name is null terminated. It appears that at least
7088 one version of Linux (RedHat 6.0) generates corefiles that don't
7089 comply with the ELF spec by failing to include the null byte in
7090 namesz. */
7091 if (inote.namedata[inote.namesz] != '\0')
7093 temp = malloc (inote.namesz + 1);
7095 if (temp == NULL)
7097 error (_("Out of memory\n"));
7098 res = 0;
7099 break;
7102 strncpy (temp, inote.namedata, inote.namesz);
7103 temp[inote.namesz] = 0;
7105 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7106 inote.namedata = temp;
7109 res &= process_note (& inote);
7111 if (temp != NULL)
7113 free (temp);
7114 temp = NULL;
7118 free (pnotes);
7120 return res;
7123 static int
7124 process_corefile_note_segments (file)
7125 FILE * file;
7127 Elf_Internal_Phdr * program_headers;
7128 Elf_Internal_Phdr * segment;
7129 unsigned int i;
7130 int res = 1;
7132 program_headers = (Elf_Internal_Phdr *) malloc
7133 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7135 if (program_headers == NULL)
7137 error (_("Out of memory\n"));
7138 return 0;
7141 if (is_32bit_elf)
7142 i = get_32bit_program_headers (file, program_headers);
7143 else
7144 i = get_64bit_program_headers (file, program_headers);
7146 if (i == 0)
7148 free (program_headers);
7149 return 0;
7152 for (i = 0, segment = program_headers;
7153 i < elf_header.e_phnum;
7154 i ++, segment ++)
7156 if (segment->p_type == PT_NOTE)
7157 res &= process_corefile_note_segment (file,
7158 (bfd_vma) segment->p_offset,
7159 (bfd_vma) segment->p_filesz);
7162 free (program_headers);
7164 return res;
7167 static int
7168 process_corefile_contents (file)
7169 FILE * file;
7171 /* If we have not been asked to display the notes then do nothing. */
7172 if (! do_notes)
7173 return 1;
7175 /* If file is not a core file then exit. */
7176 if (elf_header.e_type != ET_CORE)
7177 return 1;
7179 /* No program headers means no NOTE segment. */
7180 if (elf_header.e_phnum == 0)
7182 printf (_("No note segments present in the core file.\n"));
7183 return 1;
7186 return process_corefile_note_segments (file);
7189 static int
7190 process_arch_specific (file)
7191 FILE * file;
7193 if (! do_arch)
7194 return 1;
7196 switch (elf_header.e_machine)
7198 case EM_MIPS:
7199 case EM_MIPS_RS4_BE:
7200 return process_mips_specific (file);
7201 break;
7202 default:
7203 break;
7205 return 1;
7208 static int
7209 get_file_header (file)
7210 FILE * file;
7212 /* Read in the identity array. */
7213 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7214 return 0;
7216 /* Determine how to read the rest of the header. */
7217 switch (elf_header.e_ident [EI_DATA])
7219 default: /* fall through */
7220 case ELFDATANONE: /* fall through */
7221 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7222 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7225 /* For now we only support 32 bit and 64 bit ELF files. */
7226 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7228 /* Read in the rest of the header. */
7229 if (is_32bit_elf)
7231 Elf32_External_Ehdr ehdr32;
7233 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7234 return 0;
7236 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7237 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7238 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7239 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7240 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7241 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7242 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7243 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7244 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7245 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7246 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7247 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7248 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7250 else
7252 Elf64_External_Ehdr ehdr64;
7254 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7255 we will not be able to cope with the 64bit data found in
7256 64 ELF files. Detect this now and abort before we start
7257 overwritting things. */
7258 if (sizeof (bfd_vma) < 8)
7260 error (_("This instance of readelf has been built without support for a\n"));
7261 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7262 return 0;
7265 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7266 return 0;
7268 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7269 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7270 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7271 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7272 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7273 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7274 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7275 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7276 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7277 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7278 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7279 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7280 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7283 return 1;
7286 static void
7287 process_file (file_name)
7288 char * file_name;
7290 FILE * file;
7291 struct stat statbuf;
7292 unsigned int i;
7294 if (stat (file_name, & statbuf) < 0)
7296 error (_("Cannot stat input file %s.\n"), file_name);
7297 return;
7300 file = fopen (file_name, "rb");
7301 if (file == NULL)
7303 error (_("Input file %s not found.\n"), file_name);
7304 return;
7307 if (! get_file_header (file))
7309 error (_("%s: Failed to read file header\n"), file_name);
7310 fclose (file);
7311 return;
7314 /* Initialise per file variables. */
7315 for (i = NUM_ELEM (version_info); i--;)
7316 version_info[i] = 0;
7318 for (i = NUM_ELEM (dynamic_info); i--;)
7319 dynamic_info[i] = 0;
7321 /* Process the file. */
7322 if (show_name)
7323 printf (_("\nFile: %s\n"), file_name);
7325 if (! process_file_header ())
7327 fclose (file);
7328 return;
7331 process_section_headers (file);
7333 process_program_headers (file);
7335 process_dynamic_segment (file);
7337 process_relocs (file);
7339 process_symbol_table (file);
7341 process_syminfo (file);
7343 process_version_sections (file);
7345 process_section_contents (file);
7347 process_corefile_contents (file);
7349 process_arch_specific (file);
7351 fclose (file);
7353 if (section_headers)
7355 free (section_headers);
7356 section_headers = NULL;
7359 if (string_table)
7361 free (string_table);
7362 string_table = NULL;
7365 if (dynamic_strings)
7367 free (dynamic_strings);
7368 dynamic_strings = NULL;
7371 if (dynamic_symbols)
7373 free (dynamic_symbols);
7374 dynamic_symbols = NULL;
7375 num_dynamic_syms = 0;
7378 if (dynamic_syminfo)
7380 free (dynamic_syminfo);
7381 dynamic_syminfo = NULL;
7385 #ifdef SUPPORT_DISASSEMBLY
7386 /* Needed by the i386 disassembler. For extra credit, someone could
7387 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7388 symbols */
7390 void
7391 print_address (unsigned int addr, FILE * outfile)
7393 fprintf (outfile,"0x%8.8x", addr);
7396 /* Needed by the i386 disassembler. */
7397 void
7398 db_task_printsym (unsigned int addr)
7400 print_address (addr, stderr);
7402 #endif
7405 main (argc, argv)
7406 int argc;
7407 char ** argv;
7409 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7410 setlocale (LC_MESSAGES, "");
7411 #endif
7412 bindtextdomain (PACKAGE, LOCALEDIR);
7413 textdomain (PACKAGE);
7415 parse_args (argc, argv);
7417 if (optind < (argc - 1))
7418 show_name = 1;
7420 while (optind < argc)
7421 process_file (argv [optind ++]);
7423 if (dump_sects != NULL)
7424 free (dump_sects);
7426 return 0;