Add 'H' to getlongopts so that "readelf -H" does not display "unknown option"
[binutils.git] / binutils / readelf.c
blobfa6aa57896660c06b818fdc467983ee1ee9b81ef
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
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 believe 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/alpha.h"
53 #include "elf/arc.h"
54 #include "elf/arm.h"
55 #include "elf/avr.h"
56 #include "elf/cris.h"
57 #include "elf/d10v.h"
58 #include "elf/d30v.h"
59 #include "elf/dlx.h"
60 #include "elf/fr30.h"
61 #include "elf/frv.h"
62 #include "elf/h8.h"
63 #include "elf/hppa.h"
64 #include "elf/i386.h"
65 #include "elf/i370.h"
66 #include "elf/i860.h"
67 #include "elf/i960.h"
68 #include "elf/ia64.h"
69 #include "elf/ip2k.h"
70 #include "elf/m32r.h"
71 #include "elf/m68k.h"
72 #include "elf/m68hc11.h"
73 #include "elf/mcore.h"
74 #include "elf/mips.h"
75 #include "elf/mmix.h"
76 #include "elf/mn10200.h"
77 #include "elf/mn10300.h"
78 #include "elf/msp430.h"
79 #include "elf/or32.h"
80 #include "elf/pj.h"
81 #include "elf/ppc.h"
82 #include "elf/ppc64.h"
83 #include "elf/s390.h"
84 #include "elf/sh.h"
85 #include "elf/sparc.h"
86 #include "elf/v850.h"
87 #include "elf/vax.h"
88 #include "elf/x86-64.h"
89 #include "elf/xstormy16.h"
90 #include "elf/iq2000.h"
92 #include "bucomm.h"
93 #include "getopt.h"
95 char *program_name = "readelf";
96 unsigned long dynamic_addr;
97 bfd_size_type dynamic_size;
98 char *dynamic_strings;
99 char *string_table;
100 unsigned long string_table_length;
101 unsigned long num_dynamic_syms;
102 Elf_Internal_Sym *dynamic_symbols;
103 Elf_Internal_Syminfo *dynamic_syminfo;
104 unsigned long dynamic_syminfo_offset;
105 unsigned int dynamic_syminfo_nent;
106 char program_interpreter[64];
107 long dynamic_info[DT_JMPREL + 1];
108 long version_info[16];
109 long loadaddr = 0;
110 Elf_Internal_Ehdr elf_header;
111 Elf_Internal_Shdr *section_headers;
112 Elf_Internal_Dyn *dynamic_segment;
113 Elf_Internal_Shdr *symtab_shndx_hdr;
114 int show_name;
115 int do_dynamic;
116 int do_syms;
117 int do_reloc;
118 int do_sections;
119 int do_segments;
120 int do_unwind;
121 int do_using_dynamic;
122 int do_header;
123 int do_dump;
124 int do_version;
125 int do_wide;
126 int do_histogram;
127 int do_debugging;
128 int do_debug_info;
129 int do_debug_abbrevs;
130 int do_debug_lines;
131 int do_debug_pubnames;
132 int do_debug_aranges;
133 int do_debug_frames;
134 int do_debug_frames_interp;
135 int do_debug_macinfo;
136 int do_debug_str;
137 int do_debug_loc;
138 int do_arch;
139 int do_notes;
140 int is_32bit_elf;
142 /* A dynamic array of flags indicating which sections require dumping. */
143 char *dump_sects = NULL;
144 unsigned int num_dump_sects = 0;
146 #define HEX_DUMP (1 << 0)
147 #define DISASS_DUMP (1 << 1)
148 #define DEBUG_DUMP (1 << 2)
150 /* How to rpint a vma value. */
151 typedef enum print_mode
153 HEX,
154 DEC,
155 DEC_5,
156 UNSIGNED,
157 PREFIX_HEX,
158 FULL_HEX,
159 LONG_HEX
161 print_mode;
163 /* Forward declarations for dumb compilers. */
164 static void print_vma
165 PARAMS ((bfd_vma, print_mode));
166 static void print_symbol
167 PARAMS ((int, const char *));
168 static bfd_vma (*byte_get)
169 PARAMS ((unsigned char *, int));
170 static bfd_vma byte_get_little_endian
171 PARAMS ((unsigned char *, int));
172 static bfd_vma byte_get_big_endian
173 PARAMS ((unsigned char *, int));
174 static const char *get_mips_dynamic_type
175 PARAMS ((unsigned long));
176 static const char *get_sparc64_dynamic_type
177 PARAMS ((unsigned long));
178 static const char *get_ppc64_dynamic_type
179 PARAMS ((unsigned long));
180 static const char *get_parisc_dynamic_type
181 PARAMS ((unsigned long));
182 static const char *get_dynamic_type
183 PARAMS ((unsigned long));
184 static int slurp_rela_relocs
185 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
186 unsigned long *));
187 static int slurp_rel_relocs
188 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
189 unsigned long *));
190 static int dump_relocations
191 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *,
192 unsigned long, char *, int));
193 static char *get_file_type
194 PARAMS ((unsigned));
195 static char *get_machine_name
196 PARAMS ((unsigned));
197 static void decode_ARM_machine_flags
198 PARAMS ((unsigned, char[]));
199 static char *get_machine_flags
200 PARAMS ((unsigned, unsigned));
201 static const char *get_mips_segment_type
202 PARAMS ((unsigned long));
203 static const char *get_parisc_segment_type
204 PARAMS ((unsigned long));
205 static const char *get_ia64_segment_type
206 PARAMS ((unsigned long));
207 static const char *get_segment_type
208 PARAMS ((unsigned long));
209 static const char *get_mips_section_type_name
210 PARAMS ((unsigned int));
211 static const char *get_parisc_section_type_name
212 PARAMS ((unsigned int));
213 static const char *get_ia64_section_type_name
214 PARAMS ((unsigned int));
215 static const char *get_section_type_name
216 PARAMS ((unsigned int));
217 static const char *get_symbol_binding
218 PARAMS ((unsigned int));
219 static const char *get_symbol_type
220 PARAMS ((unsigned int));
221 static const char *get_symbol_visibility
222 PARAMS ((unsigned int));
223 static const char *get_symbol_index_type
224 PARAMS ((unsigned int));
225 static const char *get_dynamic_flags
226 PARAMS ((bfd_vma));
227 static void usage
228 PARAMS ((void));
229 static void parse_args
230 PARAMS ((int, char **));
231 static int process_file_header
232 PARAMS ((void));
233 static int process_program_headers
234 PARAMS ((FILE *));
235 static int process_section_headers
236 PARAMS ((FILE *));
237 static int process_unwind
238 PARAMS ((FILE *));
239 static void dynamic_segment_mips_val
240 PARAMS ((Elf_Internal_Dyn *));
241 static void dynamic_segment_parisc_val
242 PARAMS ((Elf_Internal_Dyn *));
243 static int process_dynamic_segment
244 PARAMS ((FILE *));
245 static int process_symbol_table
246 PARAMS ((FILE *));
247 static int process_syminfo
248 PARAMS ((FILE *));
249 static int process_section_contents
250 PARAMS ((FILE *));
251 static void process_mips_fpe_exception
252 PARAMS ((int));
253 static int process_mips_specific
254 PARAMS ((FILE *));
255 static int process_file
256 PARAMS ((char *));
257 static int process_relocs
258 PARAMS ((FILE *));
259 static int process_version_sections
260 PARAMS ((FILE *));
261 static char *get_ver_flags
262 PARAMS ((unsigned int));
263 static int get_32bit_section_headers
264 PARAMS ((FILE *, unsigned int));
265 static int get_64bit_section_headers
266 PARAMS ((FILE *, unsigned int));
267 static int get_32bit_program_headers
268 PARAMS ((FILE *, Elf_Internal_Phdr *));
269 static int get_64bit_program_headers
270 PARAMS ((FILE *, Elf_Internal_Phdr *));
271 static int get_file_header
272 PARAMS ((FILE *));
273 static Elf_Internal_Sym *get_32bit_elf_symbols
274 PARAMS ((FILE *, Elf_Internal_Shdr *));
275 static Elf_Internal_Sym *get_64bit_elf_symbols
276 PARAMS ((FILE *, Elf_Internal_Shdr *));
277 static const char *get_elf_section_flags
278 PARAMS ((bfd_vma));
279 static int *get_dynamic_data
280 PARAMS ((FILE *, unsigned int));
281 static int get_32bit_dynamic_segment
282 PARAMS ((FILE *));
283 static int get_64bit_dynamic_segment
284 PARAMS ((FILE *));
285 #ifdef SUPPORT_DISASSEMBLY
286 static int disassemble_section
287 PARAMS ((Elf_Internal_Shdr *, FILE *));
288 #endif
289 static int dump_section
290 PARAMS ((Elf_Internal_Shdr *, FILE *));
291 static int display_debug_section
292 PARAMS ((Elf_Internal_Shdr *, FILE *));
293 static int display_debug_info
294 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
295 static int display_debug_not_supported
296 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
297 static int prescan_debug_info
298 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
299 static int display_debug_lines
300 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
301 static int display_debug_pubnames
302 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
303 static int display_debug_abbrev
304 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
305 static int display_debug_aranges
306 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
307 static int display_debug_frames
308 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
309 static int display_debug_macinfo
310 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
311 static int display_debug_str
312 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
313 static int display_debug_loc
314 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
315 static unsigned char *process_abbrev_section
316 PARAMS ((unsigned char *, unsigned char *));
317 static void load_debug_str
318 PARAMS ((FILE *));
319 static void free_debug_str
320 PARAMS ((void));
321 static const char *fetch_indirect_string
322 PARAMS ((unsigned long));
323 static void load_debug_loc
324 PARAMS ((FILE *));
325 static void free_debug_loc
326 PARAMS ((void));
327 static unsigned long read_leb128
328 PARAMS ((unsigned char *, int *, int));
329 static int process_extended_line_op
330 PARAMS ((unsigned char *, int, int));
331 static void reset_state_machine
332 PARAMS ((int));
333 static char *get_TAG_name
334 PARAMS ((unsigned long));
335 static char *get_AT_name
336 PARAMS ((unsigned long));
337 static char *get_FORM_name
338 PARAMS ((unsigned long));
339 static void free_abbrevs
340 PARAMS ((void));
341 static void add_abbrev
342 PARAMS ((unsigned long, unsigned long, int));
343 static void add_abbrev_attr
344 PARAMS ((unsigned long, unsigned long));
345 static unsigned char *read_and_display_attr
346 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
347 unsigned long));
348 static unsigned char *read_and_display_attr_value
349 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
350 unsigned long));
351 static unsigned char *display_block
352 PARAMS ((unsigned char *, unsigned long));
353 static void decode_location_expression
354 PARAMS ((unsigned char *, unsigned int, unsigned long));
355 static void request_dump
356 PARAMS ((unsigned int, int));
357 static const char *get_elf_class
358 PARAMS ((unsigned int));
359 static const char *get_data_encoding
360 PARAMS ((unsigned int));
361 static const char *get_osabi_name
362 PARAMS ((unsigned int));
363 static int guess_is_rela
364 PARAMS ((unsigned long));
365 static const char *get_note_type
366 PARAMS ((unsigned int));
367 static const char *get_netbsd_elfcore_note_type
368 PARAMS ((unsigned int));
369 static int process_note
370 PARAMS ((Elf_Internal_Note *));
371 static int process_corefile_note_segment
372 PARAMS ((FILE *, bfd_vma, bfd_vma));
373 static int process_corefile_note_segments
374 PARAMS ((FILE *));
375 static int process_corefile_contents
376 PARAMS ((FILE *));
377 static int process_arch_specific
378 PARAMS ((FILE *));
379 static int process_gnu_liblist
380 PARAMS ((FILE *));
382 typedef int Elf32_Word;
384 #define UNKNOWN -1
386 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
387 ((X)->sh_name >= string_table_length \
388 ? "<corrupt>" : string_table + (X)->sh_name))
390 /* Given st_shndx I, map to section_headers index. */
391 #define SECTION_HEADER_INDEX(I) \
392 ((I) < SHN_LORESERVE \
393 ? (I) \
394 : ((I) <= SHN_HIRESERVE \
395 ? 0 \
396 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
398 /* Reverse of the above. */
399 #define SECTION_HEADER_NUM(N) \
400 ((N) < SHN_LORESERVE \
401 ? (N) \
402 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
404 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
406 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
408 #define BYTE_GET(field) byte_get (field, sizeof (field))
410 /* If we can support a 64 bit data type then BFD64 should be defined
411 and sizeof (bfd_vma) == 8. In this case when translating from an
412 external 8 byte field to an internal field, we can assume that the
413 internal field is also 8 bytes wide and so we can extract all the data.
414 If, however, BFD64 is not defined, then we must assume that the
415 internal data structure only has 4 byte wide fields that are the
416 equivalent of the 8 byte wide external counterparts, and so we must
417 truncate the data. */
418 #ifdef BFD64
419 #define BYTE_GET8(field) byte_get (field, -8)
420 #else
421 #define BYTE_GET8(field) byte_get (field, 8)
422 #endif
424 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
426 #define GET_ELF_SYMBOLS(file, section) \
427 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
428 : get_64bit_elf_symbols (file, section))
431 static void
432 error VPARAMS ((const char *message, ...))
434 VA_OPEN (args, message);
435 VA_FIXEDARG (args, const char *, message);
437 fprintf (stderr, _("%s: Error: "), program_name);
438 vfprintf (stderr, message, args);
439 VA_CLOSE (args);
442 static void
443 warn VPARAMS ((const char *message, ...))
445 VA_OPEN (args, message);
446 VA_FIXEDARG (args, const char *, message);
448 fprintf (stderr, _("%s: Warning: "), program_name);
449 vfprintf (stderr, message, args);
450 VA_CLOSE (args);
453 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
455 static PTR
456 get_data (var, file, offset, size, reason)
457 PTR var;
458 FILE *file;
459 long offset;
460 size_t size;
461 const char *reason;
463 PTR mvar;
465 if (size == 0)
466 return NULL;
468 if (fseek (file, offset, SEEK_SET))
470 error (_("Unable to seek to %x for %s\n"), offset, reason);
471 return NULL;
474 mvar = var;
475 if (mvar == NULL)
477 mvar = (PTR) malloc (size);
479 if (mvar == NULL)
481 error (_("Out of memory allocating %d bytes for %s\n"),
482 size, reason);
483 return NULL;
487 if (fread (mvar, size, 1, file) != 1)
489 error (_("Unable to read in %d bytes of %s\n"), size, reason);
490 if (mvar != var)
491 free (mvar);
492 return NULL;
495 return mvar;
498 static bfd_vma
499 byte_get_little_endian (field, size)
500 unsigned char *field;
501 int size;
503 switch (size)
505 case 1:
506 return *field;
508 case 2:
509 return ((unsigned int) (field[0]))
510 | (((unsigned int) (field[1])) << 8);
512 #ifndef BFD64
513 case 8:
514 /* We want to extract data from an 8 byte wide field and
515 place it into a 4 byte wide field. Since this is a little
516 endian source we can just use the 4 byte extraction code. */
517 /* Fall through. */
518 #endif
519 case 4:
520 return ((unsigned long) (field[0]))
521 | (((unsigned long) (field[1])) << 8)
522 | (((unsigned long) (field[2])) << 16)
523 | (((unsigned long) (field[3])) << 24);
525 #ifdef BFD64
526 case 8:
527 case -8:
528 /* This is a special case, generated by the BYTE_GET8 macro.
529 It means that we are loading an 8 byte value from a field
530 in an external structure into an 8 byte value in a field
531 in an internal strcuture. */
532 return ((bfd_vma) (field[0]))
533 | (((bfd_vma) (field[1])) << 8)
534 | (((bfd_vma) (field[2])) << 16)
535 | (((bfd_vma) (field[3])) << 24)
536 | (((bfd_vma) (field[4])) << 32)
537 | (((bfd_vma) (field[5])) << 40)
538 | (((bfd_vma) (field[6])) << 48)
539 | (((bfd_vma) (field[7])) << 56);
540 #endif
541 default:
542 error (_("Unhandled data length: %d\n"), size);
543 abort ();
547 /* Print a VMA value. */
548 static void
549 print_vma (vma, mode)
550 bfd_vma vma;
551 print_mode mode;
553 #ifdef BFD64
554 if (is_32bit_elf)
555 #endif
557 switch (mode)
559 case FULL_HEX: printf ("0x"); /* drop through */
560 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
561 case PREFIX_HEX: printf ("0x"); /* drop through */
562 case HEX: printf ("%lx", (unsigned long) vma); break;
563 case DEC: printf ("%ld", (unsigned long) vma); break;
564 case DEC_5: printf ("%5ld", (long) vma); break;
565 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
568 #ifdef BFD64
569 else
571 switch (mode)
573 case FULL_HEX:
574 printf ("0x");
575 /* drop through */
577 case LONG_HEX:
578 printf_vma (vma);
579 break;
581 case PREFIX_HEX:
582 printf ("0x");
583 /* drop through */
585 case HEX:
586 #if BFD_HOST_64BIT_LONG
587 printf ("%lx", vma);
588 #else
589 if (_bfd_int64_high (vma))
590 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
591 else
592 printf ("%lx", _bfd_int64_low (vma));
593 #endif
594 break;
596 case DEC:
597 #if BFD_HOST_64BIT_LONG
598 printf ("%ld", vma);
599 #else
600 if (_bfd_int64_high (vma))
601 /* ugg */
602 printf ("++%ld", _bfd_int64_low (vma));
603 else
604 printf ("%ld", _bfd_int64_low (vma));
605 #endif
606 break;
608 case DEC_5:
609 #if BFD_HOST_64BIT_LONG
610 printf ("%5ld", vma);
611 #else
612 if (_bfd_int64_high (vma))
613 /* ugg */
614 printf ("++%ld", _bfd_int64_low (vma));
615 else
616 printf ("%5ld", _bfd_int64_low (vma));
617 #endif
618 break;
620 case UNSIGNED:
621 #if BFD_HOST_64BIT_LONG
622 printf ("%lu", vma);
623 #else
624 if (_bfd_int64_high (vma))
625 /* ugg */
626 printf ("++%lu", _bfd_int64_low (vma));
627 else
628 printf ("%lu", _bfd_int64_low (vma));
629 #endif
630 break;
633 #endif
636 /* Display a symbol on stdout. If do_wide is not true then
637 format the symbol to be at most WIDTH characters,
638 truncating as necessary. If WIDTH is negative then
639 format the string to be exactly - WIDTH characters,
640 truncating or padding as necessary. */
642 static void
643 print_symbol (width, symbol)
644 int width;
645 const char *symbol;
647 if (do_wide)
648 printf ("%s", symbol);
649 else if (width < 0)
650 printf ("%-*.*s", width, width, symbol);
651 else
652 printf ("%-.*s", width, symbol);
655 static bfd_vma
656 byte_get_big_endian (field, size)
657 unsigned char *field;
658 int size;
660 switch (size)
662 case 1:
663 return *field;
665 case 2:
666 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
668 case 4:
669 return ((unsigned long) (field[3]))
670 | (((unsigned long) (field[2])) << 8)
671 | (((unsigned long) (field[1])) << 16)
672 | (((unsigned long) (field[0])) << 24);
674 #ifndef BFD64
675 case 8:
676 /* Although we are extracing data from an 8 byte wide field, we
677 are returning only 4 bytes of data. */
678 return ((unsigned long) (field[7]))
679 | (((unsigned long) (field[6])) << 8)
680 | (((unsigned long) (field[5])) << 16)
681 | (((unsigned long) (field[4])) << 24);
682 #else
683 case 8:
684 case -8:
685 /* This is a special case, generated by the BYTE_GET8 macro.
686 It means that we are loading an 8 byte value from a field
687 in an external structure into an 8 byte value in a field
688 in an internal strcuture. */
689 return ((bfd_vma) (field[7]))
690 | (((bfd_vma) (field[6])) << 8)
691 | (((bfd_vma) (field[5])) << 16)
692 | (((bfd_vma) (field[4])) << 24)
693 | (((bfd_vma) (field[3])) << 32)
694 | (((bfd_vma) (field[2])) << 40)
695 | (((bfd_vma) (field[1])) << 48)
696 | (((bfd_vma) (field[0])) << 56);
697 #endif
699 default:
700 error (_("Unhandled data length: %d\n"), size);
701 abort ();
705 /* Guess the relocation size commonly used by the specific machines. */
707 static int
708 guess_is_rela (e_machine)
709 unsigned long e_machine;
711 switch (e_machine)
713 /* Targets that use REL relocations. */
714 case EM_ARM:
715 case EM_386:
716 case EM_486:
717 case EM_960:
718 case EM_DLX:
719 case EM_OPENRISC:
720 case EM_OR32:
721 case EM_M32R:
722 case EM_CYGNUS_M32R:
723 case EM_D10V:
724 case EM_CYGNUS_D10V:
725 case EM_MIPS:
726 case EM_MIPS_RS3_LE:
727 return FALSE;
729 /* Targets that use RELA relocations. */
730 case EM_68K:
731 case EM_H8_300:
732 case EM_H8_300H:
733 case EM_H8S:
734 case EM_SPARC32PLUS:
735 case EM_SPARCV9:
736 case EM_SPARC:
737 case EM_PPC:
738 case EM_PPC64:
739 case EM_V850:
740 case EM_CYGNUS_V850:
741 case EM_D30V:
742 case EM_CYGNUS_D30V:
743 case EM_MN10200:
744 case EM_CYGNUS_MN10200:
745 case EM_MN10300:
746 case EM_CYGNUS_MN10300:
747 case EM_FR30:
748 case EM_CYGNUS_FR30:
749 case EM_CYGNUS_FRV:
750 case EM_SH:
751 case EM_ALPHA:
752 case EM_MCORE:
753 case EM_IA_64:
754 case EM_AVR:
755 case EM_AVR_OLD:
756 case EM_CRIS:
757 case EM_860:
758 case EM_X86_64:
759 case EM_S390:
760 case EM_S390_OLD:
761 case EM_MMIX:
762 case EM_MSP430:
763 case EM_MSP430_OLD:
764 case EM_XSTORMY16:
765 case EM_VAX:
766 case EM_IP2K:
767 case EM_IP2K_OLD:
768 case EM_IQ2000:
769 return TRUE;
771 case EM_MMA:
772 case EM_PCP:
773 case EM_NCPU:
774 case EM_NDR1:
775 case EM_STARCORE:
776 case EM_ME16:
777 case EM_ST100:
778 case EM_TINYJ:
779 case EM_FX66:
780 case EM_ST9PLUS:
781 case EM_ST7:
782 case EM_68HC16:
783 case EM_68HC11:
784 case EM_68HC08:
785 case EM_68HC05:
786 case EM_SVX:
787 case EM_ST19:
788 default:
789 warn (_("Don't know about relocations on this machine architecture\n"));
790 return FALSE;
794 static int
795 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
796 FILE *file;
797 unsigned long rel_offset;
798 unsigned long rel_size;
799 Elf_Internal_Rela **relasp;
800 unsigned long *nrelasp;
802 Elf_Internal_Rela *relas;
803 unsigned long nrelas;
804 unsigned int i;
806 if (is_32bit_elf)
808 Elf32_External_Rela *erelas;
810 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
811 rel_size, _("relocs"));
812 if (!erelas)
813 return 0;
815 nrelas = rel_size / sizeof (Elf32_External_Rela);
817 relas = (Elf_Internal_Rela *)
818 malloc (nrelas * sizeof (Elf_Internal_Rela));
820 if (relas == NULL)
822 error(_("out of memory parsing relocs"));
823 return 0;
826 for (i = 0; i < nrelas; i++)
828 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
829 relas[i].r_info = BYTE_GET (erelas[i].r_info);
830 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
833 free (erelas);
835 else
837 Elf64_External_Rela *erelas;
839 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
840 rel_size, _("relocs"));
841 if (!erelas)
842 return 0;
844 nrelas = rel_size / sizeof (Elf64_External_Rela);
846 relas = (Elf_Internal_Rela *)
847 malloc (nrelas * sizeof (Elf_Internal_Rela));
849 if (relas == NULL)
851 error(_("out of memory parsing relocs"));
852 return 0;
855 for (i = 0; i < nrelas; i++)
857 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
858 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
859 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
862 free (erelas);
864 *relasp = relas;
865 *nrelasp = nrelas;
866 return 1;
869 static int
870 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
871 FILE *file;
872 unsigned long rel_offset;
873 unsigned long rel_size;
874 Elf_Internal_Rela **relsp;
875 unsigned long *nrelsp;
877 Elf_Internal_Rela *rels;
878 unsigned long nrels;
879 unsigned int i;
881 if (is_32bit_elf)
883 Elf32_External_Rel *erels;
885 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
886 rel_size, _("relocs"));
887 if (!erels)
888 return 0;
890 nrels = rel_size / sizeof (Elf32_External_Rel);
892 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
894 if (rels == NULL)
896 error(_("out of memory parsing relocs"));
897 return 0;
900 for (i = 0; i < nrels; i++)
902 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
903 rels[i].r_info = BYTE_GET (erels[i].r_info);
904 rels[i].r_addend = 0;
907 free (erels);
909 else
911 Elf64_External_Rel *erels;
913 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
914 rel_size, _("relocs"));
915 if (!erels)
916 return 0;
918 nrels = rel_size / sizeof (Elf64_External_Rel);
920 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
922 if (rels == NULL)
924 error(_("out of memory parsing relocs"));
925 return 0;
928 for (i = 0; i < nrels; i++)
930 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
931 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
932 rels[i].r_addend = 0;
935 free (erels);
937 *relsp = rels;
938 *nrelsp = nrels;
939 return 1;
942 /* Display the contents of the relocation data found at the specified offset. */
943 static int
944 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
945 FILE *file;
946 unsigned long rel_offset;
947 unsigned long rel_size;
948 Elf_Internal_Sym *symtab;
949 unsigned long nsyms;
950 char *strtab;
951 int is_rela;
953 unsigned int i;
954 Elf_Internal_Rela *rels;
957 if (is_rela == UNKNOWN)
958 is_rela = guess_is_rela (elf_header.e_machine);
960 if (is_rela)
962 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
963 return 0;
965 else
967 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
968 return 0;
971 if (is_32bit_elf)
973 if (is_rela)
975 if (do_wide)
976 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
977 else
978 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
980 else
982 if (do_wide)
983 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
984 else
985 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
988 else
990 if (is_rela)
992 if (do_wide)
993 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
994 else
995 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
997 else
999 if (do_wide)
1000 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1001 else
1002 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1006 for (i = 0; i < rel_size; i++)
1008 const char *rtype;
1009 const char *rtype2 = NULL;
1010 const char *rtype3 = NULL;
1011 bfd_vma offset;
1012 bfd_vma info;
1013 bfd_vma symtab_index;
1014 bfd_vma type;
1015 bfd_vma type2 = (bfd_vma) NULL;
1016 bfd_vma type3 = (bfd_vma) NULL;
1018 offset = rels[i].r_offset;
1019 info = rels[i].r_info;
1021 if (is_32bit_elf)
1023 type = ELF32_R_TYPE (info);
1024 symtab_index = ELF32_R_SYM (info);
1026 else
1028 /* The #ifdef BFD64 below is to prevent a compile time warning.
1029 We know that if we do not have a 64 bit data type that we
1030 will never execute this code anyway. */
1031 #ifdef BFD64
1032 if (elf_header.e_machine == EM_MIPS)
1034 /* In little-endian objects, r_info isn't really a 64-bit
1035 little-endian value: it has a 32-bit little-endian
1036 symbol index followed by four individual byte fields.
1037 Reorder INFO accordingly. */
1038 if (elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1039 info = (((info & 0xffffffff) << 32)
1040 | ((info >> 56) & 0xff)
1041 | ((info >> 40) & 0xff00)
1042 | ((info >> 24) & 0xff0000)
1043 | ((info >> 8) & 0xff000000));
1044 type = ELF64_MIPS_R_TYPE (info);
1045 type2 = ELF64_MIPS_R_TYPE2 (info);
1046 type3 = ELF64_MIPS_R_TYPE3 (info);
1048 else if (elf_header.e_machine == EM_SPARCV9)
1049 type = ELF64_R_TYPE_ID (info);
1050 else
1051 type = ELF64_R_TYPE (info);
1053 symtab_index = ELF64_R_SYM (info);
1054 #endif
1057 if (is_32bit_elf)
1059 #ifdef _bfd_int64_low
1060 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
1061 #else
1062 printf ("%8.8lx %8.8lx ", offset, info);
1063 #endif
1065 else
1067 #ifdef _bfd_int64_low
1068 printf (do_wide
1069 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1070 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1071 _bfd_int64_high (offset),
1072 _bfd_int64_low (offset),
1073 _bfd_int64_high (info),
1074 _bfd_int64_low (info));
1075 #else
1076 printf (do_wide
1077 ? "%16.16lx %16.16lx "
1078 : "%12.12lx %12.12lx ",
1079 offset, info);
1080 #endif
1083 switch (elf_header.e_machine)
1085 default:
1086 rtype = NULL;
1087 break;
1089 case EM_M32R:
1090 case EM_CYGNUS_M32R:
1091 rtype = elf_m32r_reloc_type (type);
1092 break;
1094 case EM_386:
1095 case EM_486:
1096 rtype = elf_i386_reloc_type (type);
1097 break;
1099 case EM_68HC11:
1100 case EM_68HC12:
1101 rtype = elf_m68hc11_reloc_type (type);
1102 break;
1104 case EM_68K:
1105 rtype = elf_m68k_reloc_type (type);
1106 break;
1108 case EM_960:
1109 rtype = elf_i960_reloc_type (type);
1110 break;
1112 case EM_AVR:
1113 case EM_AVR_OLD:
1114 rtype = elf_avr_reloc_type (type);
1115 break;
1117 case EM_OLD_SPARCV9:
1118 case EM_SPARC32PLUS:
1119 case EM_SPARCV9:
1120 case EM_SPARC:
1121 rtype = elf_sparc_reloc_type (type);
1122 break;
1124 case EM_V850:
1125 case EM_CYGNUS_V850:
1126 rtype = v850_reloc_type (type);
1127 break;
1129 case EM_D10V:
1130 case EM_CYGNUS_D10V:
1131 rtype = elf_d10v_reloc_type (type);
1132 break;
1134 case EM_D30V:
1135 case EM_CYGNUS_D30V:
1136 rtype = elf_d30v_reloc_type (type);
1137 break;
1139 case EM_DLX:
1140 rtype = elf_dlx_reloc_type (type);
1141 break;
1143 case EM_SH:
1144 rtype = elf_sh_reloc_type (type);
1145 break;
1147 case EM_MN10300:
1148 case EM_CYGNUS_MN10300:
1149 rtype = elf_mn10300_reloc_type (type);
1150 break;
1152 case EM_MN10200:
1153 case EM_CYGNUS_MN10200:
1154 rtype = elf_mn10200_reloc_type (type);
1155 break;
1157 case EM_FR30:
1158 case EM_CYGNUS_FR30:
1159 rtype = elf_fr30_reloc_type (type);
1160 break;
1162 case EM_CYGNUS_FRV:
1163 rtype = elf_frv_reloc_type (type);
1164 break;
1166 case EM_MCORE:
1167 rtype = elf_mcore_reloc_type (type);
1168 break;
1170 case EM_MMIX:
1171 rtype = elf_mmix_reloc_type (type);
1172 break;
1174 case EM_MSP430:
1175 case EM_MSP430_OLD:
1176 rtype = elf_msp430_reloc_type (type);
1177 break;
1179 case EM_PPC:
1180 rtype = elf_ppc_reloc_type (type);
1181 break;
1183 case EM_PPC64:
1184 rtype = elf_ppc64_reloc_type (type);
1185 break;
1187 case EM_MIPS:
1188 case EM_MIPS_RS3_LE:
1189 rtype = elf_mips_reloc_type (type);
1190 if (!is_32bit_elf)
1192 rtype2 = elf_mips_reloc_type (type2);
1193 rtype3 = elf_mips_reloc_type (type3);
1195 break;
1197 case EM_ALPHA:
1198 rtype = elf_alpha_reloc_type (type);
1199 break;
1201 case EM_ARM:
1202 rtype = elf_arm_reloc_type (type);
1203 break;
1205 case EM_ARC:
1206 rtype = elf_arc_reloc_type (type);
1207 break;
1209 case EM_PARISC:
1210 rtype = elf_hppa_reloc_type (type);
1211 break;
1213 case EM_H8_300:
1214 case EM_H8_300H:
1215 case EM_H8S:
1216 rtype = elf_h8_reloc_type (type);
1217 break;
1219 case EM_OPENRISC:
1220 case EM_OR32:
1221 rtype = elf_or32_reloc_type (type);
1222 break;
1224 case EM_PJ:
1225 case EM_PJ_OLD:
1226 rtype = elf_pj_reloc_type (type);
1227 break;
1228 case EM_IA_64:
1229 rtype = elf_ia64_reloc_type (type);
1230 break;
1232 case EM_CRIS:
1233 rtype = elf_cris_reloc_type (type);
1234 break;
1236 case EM_860:
1237 rtype = elf_i860_reloc_type (type);
1238 break;
1240 case EM_X86_64:
1241 rtype = elf_x86_64_reloc_type (type);
1242 break;
1244 case EM_S370:
1245 rtype = i370_reloc_type (type);
1246 break;
1248 case EM_S390_OLD:
1249 case EM_S390:
1250 rtype = elf_s390_reloc_type (type);
1251 break;
1253 case EM_XSTORMY16:
1254 rtype = elf_xstormy16_reloc_type (type);
1255 break;
1257 case EM_VAX:
1258 rtype = elf_vax_reloc_type (type);
1259 break;
1261 case EM_IP2K:
1262 case EM_IP2K_OLD:
1263 rtype = elf_ip2k_reloc_type (type);
1264 break;
1266 case EM_IQ2000:
1267 rtype = elf_iq2000_reloc_type (type);
1268 break;
1271 if (rtype == NULL)
1272 #ifdef _bfd_int64_low
1273 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1274 #else
1275 printf (_("unrecognized: %-7lx"), type);
1276 #endif
1277 else
1278 printf (do_wide ? "%-21.21s" : "%-17.17s", rtype);
1280 if (symtab_index)
1282 if (symtab == NULL || symtab_index >= nsyms)
1283 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1284 else
1286 Elf_Internal_Sym *psym;
1288 psym = symtab + symtab_index;
1290 printf (" ");
1291 print_vma (psym->st_value, LONG_HEX);
1292 printf (is_32bit_elf ? " " : " ");
1294 if (psym->st_name == 0)
1296 const char *sec_name = "<null>";
1297 char name_buf[40];
1299 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1301 bfd_vma sec_index = (bfd_vma) -1;
1303 if (psym->st_shndx < SHN_LORESERVE)
1304 sec_index = psym->st_shndx;
1305 else if (psym->st_shndx > SHN_LORESERVE)
1306 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1307 - SHN_LORESERVE);
1309 if (sec_index != (bfd_vma) -1)
1310 sec_name = SECTION_NAME (section_headers + sec_index);
1311 else if (psym->st_shndx == SHN_ABS)
1312 sec_name = "ABS";
1313 else if (psym->st_shndx == SHN_COMMON)
1314 sec_name = "COMMON";
1315 else
1317 sprintf (name_buf, "<section 0x%x>",
1318 (unsigned int) psym->st_shndx);
1319 sec_name = name_buf;
1322 print_symbol (22, sec_name);
1324 else if (strtab == NULL)
1325 printf (_("<string table index %3ld>"), psym->st_name);
1326 else
1327 print_symbol (22, strtab + psym->st_name);
1329 if (is_rela)
1330 printf (" + %lx", (unsigned long) rels[i].r_addend);
1333 else if (is_rela)
1335 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1336 print_vma (rels[i].r_addend, LONG_HEX);
1339 if (elf_header.e_machine == EM_SPARCV9
1340 && !strcmp (rtype, "R_SPARC_OLO10"))
1341 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1343 putchar ('\n');
1345 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1347 printf (" Type2: ");
1349 if (rtype2 == NULL)
1350 #ifdef _bfd_int64_low
1351 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1352 #else
1353 printf (_("unrecognized: %-7lx"), type2);
1354 #endif
1355 else
1356 printf ("%-17.17s", rtype2);
1358 printf("\n Type3: ");
1360 if (rtype3 == NULL)
1361 #ifdef _bfd_int64_low
1362 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1363 #else
1364 printf (_("unrecognized: %-7lx"), type3);
1365 #endif
1366 else
1367 printf ("%-17.17s", rtype3);
1369 putchar ('\n');
1373 free (rels);
1375 return 1;
1378 static const char *
1379 get_mips_dynamic_type (type)
1380 unsigned long type;
1382 switch (type)
1384 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1385 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1386 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1387 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1388 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1389 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1390 case DT_MIPS_MSYM: return "MIPS_MSYM";
1391 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1392 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1393 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1394 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1395 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1396 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1397 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1398 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1399 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1400 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1401 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1402 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1403 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1404 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1405 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1406 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1407 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1408 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1409 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1410 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1411 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1412 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1413 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1414 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1415 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1416 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1417 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1418 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1419 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1420 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1421 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1422 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1423 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1424 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1425 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1426 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1427 default:
1428 return NULL;
1432 static const char *
1433 get_sparc64_dynamic_type (type)
1434 unsigned long type;
1436 switch (type)
1438 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1439 default:
1440 return NULL;
1444 static const char *
1445 get_ppc64_dynamic_type (type)
1446 unsigned long type;
1448 switch (type)
1450 case DT_PPC64_GLINK: return "PPC64_GLINK";
1451 case DT_PPC64_OPD: return "PPC64_OPD";
1452 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1453 default:
1454 return NULL;
1458 static const char *
1459 get_parisc_dynamic_type (type)
1460 unsigned long type;
1462 switch (type)
1464 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1465 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1466 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1467 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1468 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1469 case DT_HP_PREINIT: return "HP_PREINIT";
1470 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1471 case DT_HP_NEEDED: return "HP_NEEDED";
1472 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1473 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1474 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1475 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1476 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1477 default:
1478 return NULL;
1482 static const char *
1483 get_dynamic_type (type)
1484 unsigned long type;
1486 static char buff[32];
1488 switch (type)
1490 case DT_NULL: return "NULL";
1491 case DT_NEEDED: return "NEEDED";
1492 case DT_PLTRELSZ: return "PLTRELSZ";
1493 case DT_PLTGOT: return "PLTGOT";
1494 case DT_HASH: return "HASH";
1495 case DT_STRTAB: return "STRTAB";
1496 case DT_SYMTAB: return "SYMTAB";
1497 case DT_RELA: return "RELA";
1498 case DT_RELASZ: return "RELASZ";
1499 case DT_RELAENT: return "RELAENT";
1500 case DT_STRSZ: return "STRSZ";
1501 case DT_SYMENT: return "SYMENT";
1502 case DT_INIT: return "INIT";
1503 case DT_FINI: return "FINI";
1504 case DT_SONAME: return "SONAME";
1505 case DT_RPATH: return "RPATH";
1506 case DT_SYMBOLIC: return "SYMBOLIC";
1507 case DT_REL: return "REL";
1508 case DT_RELSZ: return "RELSZ";
1509 case DT_RELENT: return "RELENT";
1510 case DT_PLTREL: return "PLTREL";
1511 case DT_DEBUG: return "DEBUG";
1512 case DT_TEXTREL: return "TEXTREL";
1513 case DT_JMPREL: return "JMPREL";
1514 case DT_BIND_NOW: return "BIND_NOW";
1515 case DT_INIT_ARRAY: return "INIT_ARRAY";
1516 case DT_FINI_ARRAY: return "FINI_ARRAY";
1517 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1518 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1519 case DT_RUNPATH: return "RUNPATH";
1520 case DT_FLAGS: return "FLAGS";
1522 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1523 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1525 case DT_CHECKSUM: return "CHECKSUM";
1526 case DT_PLTPADSZ: return "PLTPADSZ";
1527 case DT_MOVEENT: return "MOVEENT";
1528 case DT_MOVESZ: return "MOVESZ";
1529 case DT_FEATURE: return "FEATURE";
1530 case DT_POSFLAG_1: return "POSFLAG_1";
1531 case DT_SYMINSZ: return "SYMINSZ";
1532 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1534 case DT_ADDRRNGLO: return "ADDRRNGLO";
1535 case DT_CONFIG: return "CONFIG";
1536 case DT_DEPAUDIT: return "DEPAUDIT";
1537 case DT_AUDIT: return "AUDIT";
1538 case DT_PLTPAD: return "PLTPAD";
1539 case DT_MOVETAB: return "MOVETAB";
1540 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1542 case DT_VERSYM: return "VERSYM";
1544 case DT_RELACOUNT: return "RELACOUNT";
1545 case DT_RELCOUNT: return "RELCOUNT";
1546 case DT_FLAGS_1: return "FLAGS_1";
1547 case DT_VERDEF: return "VERDEF";
1548 case DT_VERDEFNUM: return "VERDEFNUM";
1549 case DT_VERNEED: return "VERNEED";
1550 case DT_VERNEEDNUM: return "VERNEEDNUM";
1552 case DT_AUXILIARY: return "AUXILIARY";
1553 case DT_USED: return "USED";
1554 case DT_FILTER: return "FILTER";
1556 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1557 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1558 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1559 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1560 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1562 default:
1563 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1565 const char *result;
1567 switch (elf_header.e_machine)
1569 case EM_MIPS:
1570 case EM_MIPS_RS3_LE:
1571 result = get_mips_dynamic_type (type);
1572 break;
1573 case EM_SPARCV9:
1574 result = get_sparc64_dynamic_type (type);
1575 break;
1576 case EM_PPC64:
1577 result = get_ppc64_dynamic_type (type);
1578 break;
1579 default:
1580 result = NULL;
1581 break;
1584 if (result != NULL)
1585 return result;
1587 sprintf (buff, _("Processor Specific: %lx"), type);
1589 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1591 const char *result;
1593 switch (elf_header.e_machine)
1595 case EM_PARISC:
1596 result = get_parisc_dynamic_type (type);
1597 break;
1598 default:
1599 result = NULL;
1600 break;
1603 if (result != NULL)
1604 return result;
1606 sprintf (buff, _("Operating System specific: %lx"), type);
1608 else
1609 sprintf (buff, _("<unknown>: %lx"), type);
1611 return buff;
1615 static char *
1616 get_file_type (e_type)
1617 unsigned e_type;
1619 static char buff[32];
1621 switch (e_type)
1623 case ET_NONE: return _("NONE (None)");
1624 case ET_REL: return _("REL (Relocatable file)");
1625 case ET_EXEC: return _("EXEC (Executable file)");
1626 case ET_DYN: return _("DYN (Shared object file)");
1627 case ET_CORE: return _("CORE (Core file)");
1629 default:
1630 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1631 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1632 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1633 sprintf (buff, _("OS Specific: (%x)"), e_type);
1634 else
1635 sprintf (buff, _("<unknown>: %x"), e_type);
1636 return buff;
1640 static char *
1641 get_machine_name (e_machine)
1642 unsigned e_machine;
1644 static char buff[64]; /* XXX */
1646 switch (e_machine)
1648 case EM_NONE: return _("None");
1649 case EM_M32: return "WE32100";
1650 case EM_SPARC: return "Sparc";
1651 case EM_386: return "Intel 80386";
1652 case EM_68K: return "MC68000";
1653 case EM_88K: return "MC88000";
1654 case EM_486: return "Intel 80486";
1655 case EM_860: return "Intel 80860";
1656 case EM_MIPS: return "MIPS R3000";
1657 case EM_S370: return "IBM System/370";
1658 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1659 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1660 case EM_PARISC: return "HPPA";
1661 case EM_PPC_OLD: return "Power PC (old)";
1662 case EM_SPARC32PLUS: return "Sparc v8+" ;
1663 case EM_960: return "Intel 90860";
1664 case EM_PPC: return "PowerPC";
1665 case EM_PPC64: return "PowerPC64";
1666 case EM_V800: return "NEC V800";
1667 case EM_FR20: return "Fujitsu FR20";
1668 case EM_RH32: return "TRW RH32";
1669 case EM_MCORE: return "MCORE";
1670 case EM_ARM: return "ARM";
1671 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1672 case EM_SH: return "Hitachi SH";
1673 case EM_SPARCV9: return "Sparc v9";
1674 case EM_TRICORE: return "Siemens Tricore";
1675 case EM_ARC: return "ARC";
1676 case EM_H8_300: return "Hitachi H8/300";
1677 case EM_H8_300H: return "Hitachi H8/300H";
1678 case EM_H8S: return "Hitachi H8S";
1679 case EM_H8_500: return "Hitachi H8/500";
1680 case EM_IA_64: return "Intel IA-64";
1681 case EM_MIPS_X: return "Stanford MIPS-X";
1682 case EM_COLDFIRE: return "Motorola Coldfire";
1683 case EM_68HC12: return "Motorola M68HC12";
1684 case EM_ALPHA: return "Alpha";
1685 case EM_CYGNUS_D10V:
1686 case EM_D10V: return "d10v";
1687 case EM_CYGNUS_D30V:
1688 case EM_D30V: return "d30v";
1689 case EM_CYGNUS_M32R:
1690 case EM_M32R: return "Mitsubishi M32r";
1691 case EM_CYGNUS_V850:
1692 case EM_V850: return "NEC v850";
1693 case EM_CYGNUS_MN10300:
1694 case EM_MN10300: return "mn10300";
1695 case EM_CYGNUS_MN10200:
1696 case EM_MN10200: return "mn10200";
1697 case EM_CYGNUS_FR30:
1698 case EM_FR30: return "Fujitsu FR30";
1699 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1700 case EM_PJ_OLD:
1701 case EM_PJ: return "picoJava";
1702 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1703 case EM_PCP: return "Siemens PCP";
1704 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1705 case EM_NDR1: return "Denso NDR1 microprocesspr";
1706 case EM_STARCORE: return "Motorola Star*Core processor";
1707 case EM_ME16: return "Toyota ME16 processor";
1708 case EM_ST100: return "STMicroelectronics ST100 processor";
1709 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1710 case EM_FX66: return "Siemens FX66 microcontroller";
1711 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1712 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1713 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1714 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1715 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1716 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1717 case EM_SVX: return "Silicon Graphics SVx";
1718 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1719 case EM_VAX: return "Digital VAX";
1720 case EM_AVR_OLD:
1721 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1722 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1723 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1724 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1725 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1726 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1727 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1728 case EM_PRISM: return "Vitesse Prism";
1729 case EM_X86_64: return "Advanced Micro Devices X86-64";
1730 case EM_S390_OLD:
1731 case EM_S390: return "IBM S/390";
1732 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1733 case EM_OPENRISC:
1734 case EM_OR32: return "OpenRISC";
1735 case EM_DLX: return "OpenDLX";
1736 case EM_IP2K_OLD:
1737 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1738 case EM_IQ2000: return "Vitesse IQ2000";
1739 default:
1740 sprintf (buff, _("<unknown>: %x"), e_machine);
1741 return buff;
1745 static void
1746 decode_ARM_machine_flags (e_flags, buf)
1747 unsigned e_flags;
1748 char buf[];
1750 unsigned eabi;
1751 int unknown = 0;
1753 eabi = EF_ARM_EABI_VERSION (e_flags);
1754 e_flags &= ~ EF_ARM_EABIMASK;
1756 /* Handle "generic" ARM flags. */
1757 if (e_flags & EF_ARM_RELEXEC)
1759 strcat (buf, ", relocatable executable");
1760 e_flags &= ~ EF_ARM_RELEXEC;
1763 if (e_flags & EF_ARM_HASENTRY)
1765 strcat (buf, ", has entry point");
1766 e_flags &= ~ EF_ARM_HASENTRY;
1769 /* Now handle EABI specific flags. */
1770 switch (eabi)
1772 default:
1773 strcat (buf, ", <unrecognized EABI>");
1774 if (e_flags)
1775 unknown = 1;
1776 break;
1778 case EF_ARM_EABI_VER1:
1779 strcat (buf, ", Version1 EABI");
1780 while (e_flags)
1782 unsigned flag;
1784 /* Process flags one bit at a time. */
1785 flag = e_flags & - e_flags;
1786 e_flags &= ~ flag;
1788 switch (flag)
1790 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1791 strcat (buf, ", sorted symbol tables");
1792 break;
1794 default:
1795 unknown = 1;
1796 break;
1799 break;
1801 case EF_ARM_EABI_VER2:
1802 strcat (buf, ", Version2 EABI");
1803 while (e_flags)
1805 unsigned flag;
1807 /* Process flags one bit at a time. */
1808 flag = e_flags & - e_flags;
1809 e_flags &= ~ flag;
1811 switch (flag)
1813 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1814 strcat (buf, ", sorted symbol tables");
1815 break;
1817 case EF_ARM_DYNSYMSUSESEGIDX:
1818 strcat (buf, ", dynamic symbols use segment index");
1819 break;
1821 case EF_ARM_MAPSYMSFIRST:
1822 strcat (buf, ", mapping symbols precede others");
1823 break;
1825 default:
1826 unknown = 1;
1827 break;
1830 break;
1832 case EF_ARM_EABI_UNKNOWN:
1833 strcat (buf, ", GNU EABI");
1834 while (e_flags)
1836 unsigned flag;
1838 /* Process flags one bit at a time. */
1839 flag = e_flags & - e_flags;
1840 e_flags &= ~ flag;
1842 switch (flag)
1844 case EF_ARM_INTERWORK:
1845 strcat (buf, ", interworking enabled");
1846 break;
1848 case EF_ARM_APCS_26:
1849 strcat (buf, ", uses APCS/26");
1850 break;
1852 case EF_ARM_APCS_FLOAT:
1853 strcat (buf, ", uses APCS/float");
1854 break;
1856 case EF_ARM_PIC:
1857 strcat (buf, ", position independent");
1858 break;
1860 case EF_ARM_ALIGN8:
1861 strcat (buf, ", 8 bit structure alignment");
1862 break;
1864 case EF_ARM_NEW_ABI:
1865 strcat (buf, ", uses new ABI");
1866 break;
1868 case EF_ARM_OLD_ABI:
1869 strcat (buf, ", uses old ABI");
1870 break;
1872 case EF_ARM_SOFT_FLOAT:
1873 strcat (buf, ", software FP");
1874 break;
1876 case EF_ARM_MAVERICK_FLOAT:
1877 strcat (buf, ", Maverick FP");
1878 break;
1880 default:
1881 unknown = 1;
1882 break;
1887 if (unknown)
1888 strcat (buf,", <unknown>");
1891 static char *
1892 get_machine_flags (e_flags, e_machine)
1893 unsigned e_flags;
1894 unsigned e_machine;
1896 static char buf[1024];
1898 buf[0] = '\0';
1900 if (e_flags)
1902 switch (e_machine)
1904 default:
1905 break;
1907 case EM_ARM:
1908 decode_ARM_machine_flags (e_flags, buf);
1909 break;
1911 case EM_68K:
1912 if (e_flags & EF_CPU32)
1913 strcat (buf, ", cpu32");
1914 if (e_flags & EF_M68000)
1915 strcat (buf, ", m68000");
1916 break;
1918 case EM_PPC:
1919 if (e_flags & EF_PPC_EMB)
1920 strcat (buf, ", emb");
1922 if (e_flags & EF_PPC_RELOCATABLE)
1923 strcat (buf, ", relocatable");
1925 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1926 strcat (buf, ", relocatable-lib");
1927 break;
1929 case EM_V850:
1930 case EM_CYGNUS_V850:
1931 switch (e_flags & EF_V850_ARCH)
1933 case E_V850E_ARCH:
1934 strcat (buf, ", v850e");
1935 break;
1936 case E_V850_ARCH:
1937 strcat (buf, ", v850");
1938 break;
1939 default:
1940 strcat (buf, ", unknown v850 architecture variant");
1941 break;
1943 break;
1945 case EM_M32R:
1946 case EM_CYGNUS_M32R:
1947 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1948 strcat (buf, ", m32r");
1950 break;
1952 case EM_MIPS:
1953 case EM_MIPS_RS3_LE:
1954 if (e_flags & EF_MIPS_NOREORDER)
1955 strcat (buf, ", noreorder");
1957 if (e_flags & EF_MIPS_PIC)
1958 strcat (buf, ", pic");
1960 if (e_flags & EF_MIPS_CPIC)
1961 strcat (buf, ", cpic");
1963 if (e_flags & EF_MIPS_UCODE)
1964 strcat (buf, ", ugen_reserved");
1966 if (e_flags & EF_MIPS_ABI2)
1967 strcat (buf, ", abi2");
1969 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1970 strcat (buf, ", odk first");
1972 if (e_flags & EF_MIPS_32BITMODE)
1973 strcat (buf, ", 32bitmode");
1975 switch ((e_flags & EF_MIPS_MACH))
1977 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1978 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1979 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1980 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1981 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
1982 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1983 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
1984 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
1985 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1986 case 0:
1987 /* We simply ignore the field in this case to avoid confusion:
1988 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1989 extension. */
1990 break;
1991 default: strcat (buf, ", unknown CPU"); break;
1994 switch ((e_flags & EF_MIPS_ABI))
1996 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1997 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1998 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1999 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2000 case 0:
2001 /* We simply ignore the field in this case to avoid confusion:
2002 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2003 This means it is likely to be an o32 file, but not for
2004 sure. */
2005 break;
2006 default: strcat (buf, ", unknown ABI"); break;
2009 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2010 strcat (buf, ", mdmx");
2012 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2013 strcat (buf, ", mips16");
2015 switch ((e_flags & EF_MIPS_ARCH))
2017 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2018 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2019 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2020 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2021 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2022 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2023 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2024 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2025 default: strcat (buf, ", unknown ISA"); break;
2028 break;
2030 case EM_SPARCV9:
2031 if (e_flags & EF_SPARC_32PLUS)
2032 strcat (buf, ", v8+");
2034 if (e_flags & EF_SPARC_SUN_US1)
2035 strcat (buf, ", ultrasparcI");
2037 if (e_flags & EF_SPARC_SUN_US3)
2038 strcat (buf, ", ultrasparcIII");
2040 if (e_flags & EF_SPARC_HAL_R1)
2041 strcat (buf, ", halr1");
2043 if (e_flags & EF_SPARC_LEDATA)
2044 strcat (buf, ", ledata");
2046 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2047 strcat (buf, ", tso");
2049 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2050 strcat (buf, ", pso");
2052 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2053 strcat (buf, ", rmo");
2054 break;
2056 case EM_PARISC:
2057 switch (e_flags & EF_PARISC_ARCH)
2059 case EFA_PARISC_1_0:
2060 strcpy (buf, ", PA-RISC 1.0");
2061 break;
2062 case EFA_PARISC_1_1:
2063 strcpy (buf, ", PA-RISC 1.1");
2064 break;
2065 case EFA_PARISC_2_0:
2066 strcpy (buf, ", PA-RISC 2.0");
2067 break;
2068 default:
2069 break;
2071 if (e_flags & EF_PARISC_TRAPNIL)
2072 strcat (buf, ", trapnil");
2073 if (e_flags & EF_PARISC_EXT)
2074 strcat (buf, ", ext");
2075 if (e_flags & EF_PARISC_LSB)
2076 strcat (buf, ", lsb");
2077 if (e_flags & EF_PARISC_WIDE)
2078 strcat (buf, ", wide");
2079 if (e_flags & EF_PARISC_NO_KABP)
2080 strcat (buf, ", no kabp");
2081 if (e_flags & EF_PARISC_LAZYSWAP)
2082 strcat (buf, ", lazyswap");
2083 break;
2085 case EM_PJ:
2086 case EM_PJ_OLD:
2087 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2088 strcat (buf, ", new calling convention");
2090 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2091 strcat (buf, ", gnu calling convention");
2092 break;
2094 case EM_IA_64:
2095 if ((e_flags & EF_IA_64_ABI64))
2096 strcat (buf, ", 64-bit");
2097 else
2098 strcat (buf, ", 32-bit");
2099 if ((e_flags & EF_IA_64_REDUCEDFP))
2100 strcat (buf, ", reduced fp model");
2101 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2102 strcat (buf, ", no function descriptors, constant gp");
2103 else if ((e_flags & EF_IA_64_CONS_GP))
2104 strcat (buf, ", constant gp");
2105 if ((e_flags & EF_IA_64_ABSOLUTE))
2106 strcat (buf, ", absolute");
2107 break;
2109 case EM_VAX:
2110 if ((e_flags & EF_VAX_NONPIC))
2111 strcat (buf, ", non-PIC");
2112 if ((e_flags & EF_VAX_DFLOAT))
2113 strcat (buf, ", D-Float");
2114 if ((e_flags & EF_VAX_GFLOAT))
2115 strcat (buf, ", G-Float");
2116 break;
2120 return buf;
2123 static const char *
2124 get_mips_segment_type (type)
2125 unsigned long type;
2127 switch (type)
2129 case PT_MIPS_REGINFO:
2130 return "REGINFO";
2131 case PT_MIPS_RTPROC:
2132 return "RTPROC";
2133 case PT_MIPS_OPTIONS:
2134 return "OPTIONS";
2135 default:
2136 break;
2139 return NULL;
2142 static const char *
2143 get_parisc_segment_type (type)
2144 unsigned long type;
2146 switch (type)
2148 case PT_HP_TLS: return "HP_TLS";
2149 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2150 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2151 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2152 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2153 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2154 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2155 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2156 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2157 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2158 case PT_HP_PARALLEL: return "HP_PARALLEL";
2159 case PT_HP_FASTBIND: return "HP_FASTBIND";
2160 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2161 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2162 default:
2163 break;
2166 return NULL;
2169 static const char *
2170 get_ia64_segment_type (type)
2171 unsigned long type;
2173 switch (type)
2175 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2176 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2177 case PT_HP_TLS: return "HP_TLS";
2178 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2179 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2180 case PT_IA_64_HP_STACK: return "HP_STACK";
2181 default:
2182 break;
2185 return NULL;
2188 static const char *
2189 get_segment_type (p_type)
2190 unsigned long p_type;
2192 static char buff[32];
2194 switch (p_type)
2196 case PT_NULL: return "NULL";
2197 case PT_LOAD: return "LOAD";
2198 case PT_DYNAMIC: return "DYNAMIC";
2199 case PT_INTERP: return "INTERP";
2200 case PT_NOTE: return "NOTE";
2201 case PT_SHLIB: return "SHLIB";
2202 case PT_PHDR: return "PHDR";
2203 case PT_TLS: return "TLS";
2205 case PT_GNU_EH_FRAME:
2206 return "GNU_EH_FRAME";
2208 default:
2209 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2211 const char *result;
2213 switch (elf_header.e_machine)
2215 case EM_MIPS:
2216 case EM_MIPS_RS3_LE:
2217 result = get_mips_segment_type (p_type);
2218 break;
2219 case EM_PARISC:
2220 result = get_parisc_segment_type (p_type);
2221 break;
2222 case EM_IA_64:
2223 result = get_ia64_segment_type (p_type);
2224 break;
2225 default:
2226 result = NULL;
2227 break;
2230 if (result != NULL)
2231 return result;
2233 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2235 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2237 const char *result;
2239 switch (elf_header.e_machine)
2241 case EM_PARISC:
2242 result = get_parisc_segment_type (p_type);
2243 break;
2244 case EM_IA_64:
2245 result = get_ia64_segment_type (p_type);
2246 break;
2247 default:
2248 result = NULL;
2249 break;
2252 if (result != NULL)
2253 return result;
2255 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2257 else
2258 sprintf (buff, _("<unknown>: %lx"), p_type);
2260 return buff;
2264 static const char *
2265 get_mips_section_type_name (sh_type)
2266 unsigned int sh_type;
2268 switch (sh_type)
2270 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2271 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2272 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2273 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2274 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2275 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2276 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2277 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2278 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2279 case SHT_MIPS_RELD: return "MIPS_RELD";
2280 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2281 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2282 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2283 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2284 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2285 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2286 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2287 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2288 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2289 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2290 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2291 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2292 case SHT_MIPS_LINE: return "MIPS_LINE";
2293 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2294 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2295 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2296 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2297 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2298 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2299 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2300 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2301 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2302 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2303 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2304 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2305 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2306 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2307 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2308 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2309 default:
2310 break;
2312 return NULL;
2315 static const char *
2316 get_parisc_section_type_name (sh_type)
2317 unsigned int sh_type;
2319 switch (sh_type)
2321 case SHT_PARISC_EXT: return "PARISC_EXT";
2322 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2323 case SHT_PARISC_DOC: return "PARISC_DOC";
2324 default:
2325 break;
2327 return NULL;
2330 static const char *
2331 get_ia64_section_type_name (sh_type)
2332 unsigned int sh_type;
2334 switch (sh_type)
2336 case SHT_IA_64_EXT: return "IA_64_EXT";
2337 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2338 default:
2339 break;
2341 return NULL;
2344 static const char *
2345 get_section_type_name (sh_type)
2346 unsigned int sh_type;
2348 static char buff[32];
2350 switch (sh_type)
2352 case SHT_NULL: return "NULL";
2353 case SHT_PROGBITS: return "PROGBITS";
2354 case SHT_SYMTAB: return "SYMTAB";
2355 case SHT_STRTAB: return "STRTAB";
2356 case SHT_RELA: return "RELA";
2357 case SHT_HASH: return "HASH";
2358 case SHT_DYNAMIC: return "DYNAMIC";
2359 case SHT_NOTE: return "NOTE";
2360 case SHT_NOBITS: return "NOBITS";
2361 case SHT_REL: return "REL";
2362 case SHT_SHLIB: return "SHLIB";
2363 case SHT_DYNSYM: return "DYNSYM";
2364 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2365 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2366 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2367 case SHT_GROUP: return "GROUP";
2368 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2369 case SHT_GNU_verdef: return "VERDEF";
2370 case SHT_GNU_verneed: return "VERNEED";
2371 case SHT_GNU_versym: return "VERSYM";
2372 case 0x6ffffff0: return "VERSYM";
2373 case 0x6ffffffc: return "VERDEF";
2374 case 0x7ffffffd: return "AUXILIARY";
2375 case 0x7fffffff: return "FILTER";
2376 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2378 default:
2379 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2381 const char *result;
2383 switch (elf_header.e_machine)
2385 case EM_MIPS:
2386 case EM_MIPS_RS3_LE:
2387 result = get_mips_section_type_name (sh_type);
2388 break;
2389 case EM_PARISC:
2390 result = get_parisc_section_type_name (sh_type);
2391 break;
2392 case EM_IA_64:
2393 result = get_ia64_section_type_name (sh_type);
2394 break;
2395 default:
2396 result = NULL;
2397 break;
2400 if (result != NULL)
2401 return result;
2403 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2405 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2406 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2407 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2408 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2409 else
2410 sprintf (buff, _("<unknown>: %x"), sh_type);
2412 return buff;
2416 #define OPTION_DEBUG_DUMP 512
2418 struct option options[] =
2420 {"all", no_argument, 0, 'a'},
2421 {"file-header", no_argument, 0, 'h'},
2422 {"program-headers", no_argument, 0, 'l'},
2423 {"headers", no_argument, 0, 'e'},
2424 {"histogram", no_argument, 0, 'I'},
2425 {"segments", no_argument, 0, 'l'},
2426 {"sections", no_argument, 0, 'S'},
2427 {"section-headers", no_argument, 0, 'S'},
2428 {"symbols", no_argument, 0, 's'},
2429 {"syms", no_argument, 0, 's'},
2430 {"relocs", no_argument, 0, 'r'},
2431 {"notes", no_argument, 0, 'n'},
2432 {"dynamic", no_argument, 0, 'd'},
2433 {"arch-specific", no_argument, 0, 'A'},
2434 {"version-info", no_argument, 0, 'V'},
2435 {"use-dynamic", no_argument, 0, 'D'},
2436 {"hex-dump", required_argument, 0, 'x'},
2437 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2438 {"unwind", no_argument, 0, 'u'},
2439 #ifdef SUPPORT_DISASSEMBLY
2440 {"instruction-dump", required_argument, 0, 'i'},
2441 #endif
2443 {"version", no_argument, 0, 'v'},
2444 {"wide", no_argument, 0, 'W'},
2445 {"help", no_argument, 0, 'H'},
2446 {0, no_argument, 0, 0}
2449 static void
2450 usage ()
2452 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2453 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2454 fprintf (stdout, _(" Options are:\n\
2455 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2456 -h --file-header Display the ELF file header\n\
2457 -l --program-headers Display the program headers\n\
2458 --segments An alias for --program-headers\n\
2459 -S --section-headers Display the sections' header\n\
2460 --sections An alias for --section-headers\n\
2461 -e --headers Equivalent to: -h -l -S\n\
2462 -s --syms Display the symbol table\n\
2463 --symbols An alias for --syms\n\
2464 -n --notes Display the core notes (if present)\n\
2465 -r --relocs Display the relocations (if present)\n\
2466 -u --unwind Display the unwind info (if present)\n\
2467 -d --dynamic Display the dynamic segment (if present)\n\
2468 -V --version-info Display the version sections (if present)\n\
2469 -A --arch-specific Display architecture specific information (if any).\n\
2470 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2471 -x --hex-dump=<number> Dump the contents of section <number>\n\
2472 -w[liaprmfFso] or\n\
2473 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2474 Display the contents of DWARF2 debug sections\n"));
2475 #ifdef SUPPORT_DISASSEMBLY
2476 fprintf (stdout, _("\
2477 -i --instruction-dump=<number>\n\
2478 Disassemble the contents of section <number>\n"));
2479 #endif
2480 fprintf (stdout, _("\
2481 -I --histogram Display histogram of bucket list lengths\n\
2482 -W --wide Allow output width to exceed 80 characters\n\
2483 -H --help Display this information\n\
2484 -v --version Display the version number of readelf\n"));
2485 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2487 exit (0);
2490 static void
2491 request_dump (section, type)
2492 unsigned int section;
2493 int type;
2495 if (section >= num_dump_sects)
2497 char *new_dump_sects;
2499 new_dump_sects = (char *) calloc (section + 1, 1);
2501 if (new_dump_sects == NULL)
2502 error (_("Out of memory allocating dump request table."));
2503 else
2505 /* Copy current flag settings. */
2506 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2508 free (dump_sects);
2510 dump_sects = new_dump_sects;
2511 num_dump_sects = section + 1;
2515 if (dump_sects)
2516 dump_sects[section] |= type;
2518 return;
2521 static void
2522 parse_args (argc, argv)
2523 int argc;
2524 char **argv;
2526 int c;
2528 if (argc < 2)
2529 usage ();
2531 while ((c = getopt_long
2532 (argc, argv, "ersuahnldSDAIw::x:i:vVWH", options, NULL)) != EOF)
2534 char *cp;
2535 int section;
2537 switch (c)
2539 case 0:
2540 /* Long options. */
2541 break;
2542 case 'H':
2543 usage ();
2544 break;
2546 case 'a':
2547 do_syms++;
2548 do_reloc++;
2549 do_unwind++;
2550 do_dynamic++;
2551 do_header++;
2552 do_sections++;
2553 do_segments++;
2554 do_version++;
2555 do_histogram++;
2556 do_arch++;
2557 do_notes++;
2558 break;
2559 case 'e':
2560 do_header++;
2561 do_sections++;
2562 do_segments++;
2563 break;
2564 case 'A':
2565 do_arch++;
2566 break;
2567 case 'D':
2568 do_using_dynamic++;
2569 break;
2570 case 'r':
2571 do_reloc++;
2572 break;
2573 case 'u':
2574 do_unwind++;
2575 break;
2576 case 'h':
2577 do_header++;
2578 break;
2579 case 'l':
2580 do_segments++;
2581 break;
2582 case 's':
2583 do_syms++;
2584 break;
2585 case 'S':
2586 do_sections++;
2587 break;
2588 case 'd':
2589 do_dynamic++;
2590 break;
2591 case 'I':
2592 do_histogram++;
2593 break;
2594 case 'n':
2595 do_notes++;
2596 break;
2597 case 'x':
2598 do_dump++;
2599 section = strtoul (optarg, & cp, 0);
2600 if (! *cp && section >= 0)
2602 request_dump (section, HEX_DUMP);
2603 break;
2605 goto oops;
2606 case 'w':
2607 do_dump++;
2608 if (optarg == 0)
2609 do_debugging = 1;
2610 else
2612 unsigned int index = 0;
2614 do_debugging = 0;
2616 while (optarg[index])
2617 switch (optarg[index++])
2619 case 'i':
2620 case 'I':
2621 do_debug_info = 1;
2622 break;
2624 case 'a':
2625 case 'A':
2626 do_debug_abbrevs = 1;
2627 break;
2629 case 'l':
2630 case 'L':
2631 do_debug_lines = 1;
2632 break;
2634 case 'p':
2635 case 'P':
2636 do_debug_pubnames = 1;
2637 break;
2639 case 'r':
2640 case 'R':
2641 do_debug_aranges = 1;
2642 break;
2644 case 'F':
2645 do_debug_frames_interp = 1;
2646 case 'f':
2647 do_debug_frames = 1;
2648 break;
2650 case 'm':
2651 case 'M':
2652 do_debug_macinfo = 1;
2653 break;
2655 case 's':
2656 case 'S':
2657 do_debug_str = 1;
2658 break;
2660 case 'o':
2661 case 'O':
2662 do_debug_loc = 1;
2663 break;
2665 default:
2666 warn (_("Unrecognized debug option '%s'\n"), optarg);
2667 break;
2670 break;
2671 case OPTION_DEBUG_DUMP:
2672 do_dump++;
2673 if (optarg == 0)
2674 do_debugging = 1;
2675 else
2677 static const char *debug_dump_opt[]
2678 = { "line", "info", "abbrev", "pubnames", "ranges",
2679 "macro", "frames", "frames-interp", "str", "loc", NULL };
2680 unsigned int index;
2681 const char *p;
2683 do_debugging = 0;
2685 p = optarg;
2686 while (*p)
2688 for (index = 0; debug_dump_opt[index]; index++)
2690 size_t len = strlen (debug_dump_opt[index]);
2692 if (strncmp (p, debug_dump_opt[index], len) == 0
2693 && (p[len] == ',' || p[len] == '\0'))
2695 switch (p[0])
2697 case 'i':
2698 do_debug_info = 1;
2699 break;
2701 case 'a':
2702 do_debug_abbrevs = 1;
2703 break;
2705 case 'l':
2706 if (p[1] == 'i')
2707 do_debug_lines = 1;
2708 else
2709 do_debug_loc = 1;
2710 break;
2712 case 'p':
2713 do_debug_pubnames = 1;
2714 break;
2716 case 'r':
2717 do_debug_aranges = 1;
2718 break;
2720 case 'f':
2721 if (len > 6)
2722 do_debug_frames_interp = 1;
2723 do_debug_frames = 1;
2724 break;
2726 case 'm':
2727 do_debug_macinfo = 1;
2728 break;
2730 case 's':
2731 do_debug_str = 1;
2732 break;
2735 p += len;
2736 break;
2740 if (debug_dump_opt[index] == NULL)
2742 warn (_("Unrecognized debug option '%s'\n"), p);
2743 p = strchr (p, ',');
2744 if (p == NULL)
2745 break;
2748 if (*p == ',')
2749 p++;
2752 break;
2753 #ifdef SUPPORT_DISASSEMBLY
2754 case 'i':
2755 do_dump++;
2756 section = strtoul (optarg, & cp, 0);
2757 if (! *cp && section >= 0)
2759 request_dump (section, DISASS_DUMP);
2760 break;
2762 goto oops;
2763 #endif
2764 case 'v':
2765 print_version (program_name);
2766 break;
2767 case 'V':
2768 do_version++;
2769 break;
2770 case 'W':
2771 do_wide++;
2772 break;
2773 default:
2774 oops:
2775 /* xgettext:c-format */
2776 error (_("Invalid option '-%c'\n"), c);
2777 /* Drop through. */
2778 case '?':
2779 usage ();
2783 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2784 && !do_segments && !do_header && !do_dump && !do_version
2785 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2786 usage ();
2787 else if (argc < 3)
2789 warn (_("Nothing to do.\n"));
2790 usage();
2794 static const char *
2795 get_elf_class (elf_class)
2796 unsigned int elf_class;
2798 static char buff[32];
2800 switch (elf_class)
2802 case ELFCLASSNONE: return _("none");
2803 case ELFCLASS32: return "ELF32";
2804 case ELFCLASS64: return "ELF64";
2805 default:
2806 sprintf (buff, _("<unknown: %x>"), elf_class);
2807 return buff;
2811 static const char *
2812 get_data_encoding (encoding)
2813 unsigned int encoding;
2815 static char buff[32];
2817 switch (encoding)
2819 case ELFDATANONE: return _("none");
2820 case ELFDATA2LSB: return _("2's complement, little endian");
2821 case ELFDATA2MSB: return _("2's complement, big endian");
2822 default:
2823 sprintf (buff, _("<unknown: %x>"), encoding);
2824 return buff;
2828 static const char *
2829 get_osabi_name (osabi)
2830 unsigned int osabi;
2832 static char buff[32];
2834 switch (osabi)
2836 case ELFOSABI_NONE: return "UNIX - System V";
2837 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2838 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2839 case ELFOSABI_LINUX: return "UNIX - Linux";
2840 case ELFOSABI_HURD: return "GNU/Hurd";
2841 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2842 case ELFOSABI_AIX: return "UNIX - AIX";
2843 case ELFOSABI_IRIX: return "UNIX - IRIX";
2844 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2845 case ELFOSABI_TRU64: return "UNIX - TRU64";
2846 case ELFOSABI_MODESTO: return "Novell - Modesto";
2847 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2848 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2849 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2850 case ELFOSABI_AROS: return "Amiga Research OS";
2851 case ELFOSABI_STANDALONE: return _("Standalone App");
2852 case ELFOSABI_ARM: return "ARM";
2853 default:
2854 sprintf (buff, _("<unknown: %x>"), osabi);
2855 return buff;
2859 /* Decode the data held in 'elf_header'. */
2860 static int
2861 process_file_header ()
2863 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
2864 || elf_header.e_ident[EI_MAG1] != ELFMAG1
2865 || elf_header.e_ident[EI_MAG2] != ELFMAG2
2866 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
2868 error
2869 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2870 return 0;
2873 if (do_header)
2875 int i;
2877 printf (_("ELF Header:\n"));
2878 printf (_(" Magic: "));
2879 for (i = 0; i < EI_NIDENT; i++)
2880 printf ("%2.2x ", elf_header.e_ident[i]);
2881 printf ("\n");
2882 printf (_(" Class: %s\n"),
2883 get_elf_class (elf_header.e_ident[EI_CLASS]));
2884 printf (_(" Data: %s\n"),
2885 get_data_encoding (elf_header.e_ident[EI_DATA]));
2886 printf (_(" Version: %d %s\n"),
2887 elf_header.e_ident[EI_VERSION],
2888 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
2889 ? "(current)"
2890 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2891 ? "<unknown: %lx>"
2892 : "")));
2893 printf (_(" OS/ABI: %s\n"),
2894 get_osabi_name (elf_header.e_ident[EI_OSABI]));
2895 printf (_(" ABI Version: %d\n"),
2896 elf_header.e_ident[EI_ABIVERSION]);
2897 printf (_(" Type: %s\n"),
2898 get_file_type (elf_header.e_type));
2899 printf (_(" Machine: %s\n"),
2900 get_machine_name (elf_header.e_machine));
2901 printf (_(" Version: 0x%lx\n"),
2902 (unsigned long) elf_header.e_version);
2904 printf (_(" Entry point address: "));
2905 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2906 printf (_("\n Start of program headers: "));
2907 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2908 printf (_(" (bytes into file)\n Start of section headers: "));
2909 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2910 printf (_(" (bytes into file)\n"));
2912 printf (_(" Flags: 0x%lx%s\n"),
2913 (unsigned long) elf_header.e_flags,
2914 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2915 printf (_(" Size of this header: %ld (bytes)\n"),
2916 (long) elf_header.e_ehsize);
2917 printf (_(" Size of program headers: %ld (bytes)\n"),
2918 (long) elf_header.e_phentsize);
2919 printf (_(" Number of program headers: %ld\n"),
2920 (long) elf_header.e_phnum);
2921 printf (_(" Size of section headers: %ld (bytes)\n"),
2922 (long) elf_header.e_shentsize);
2923 printf (_(" Number of section headers: %ld"),
2924 (long) elf_header.e_shnum);
2925 if (section_headers != NULL && elf_header.e_shnum == 0)
2926 printf (" (%ld)", (long) section_headers[0].sh_size);
2927 putc ('\n', stdout);
2928 printf (_(" Section header string table index: %ld"),
2929 (long) elf_header.e_shstrndx);
2930 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2931 printf (" (%ld)", (long) section_headers[0].sh_link);
2932 putc ('\n', stdout);
2935 if (section_headers != NULL)
2937 if (elf_header.e_shnum == 0)
2938 elf_header.e_shnum = section_headers[0].sh_size;
2939 if (elf_header.e_shstrndx == SHN_XINDEX)
2940 elf_header.e_shstrndx = section_headers[0].sh_link;
2941 free (section_headers);
2942 section_headers = NULL;
2945 return 1;
2949 static int
2950 get_32bit_program_headers (file, program_headers)
2951 FILE *file;
2952 Elf_Internal_Phdr *program_headers;
2954 Elf32_External_Phdr *phdrs;
2955 Elf32_External_Phdr *external;
2956 Elf_Internal_Phdr *internal;
2957 unsigned int i;
2959 phdrs = ((Elf32_External_Phdr *)
2960 get_data (NULL, file, elf_header.e_phoff,
2961 elf_header.e_phentsize * elf_header.e_phnum,
2962 _("program headers")));
2963 if (!phdrs)
2964 return 0;
2966 for (i = 0, internal = program_headers, external = phdrs;
2967 i < elf_header.e_phnum;
2968 i++, internal++, external++)
2970 internal->p_type = BYTE_GET (external->p_type);
2971 internal->p_offset = BYTE_GET (external->p_offset);
2972 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2973 internal->p_paddr = BYTE_GET (external->p_paddr);
2974 internal->p_filesz = BYTE_GET (external->p_filesz);
2975 internal->p_memsz = BYTE_GET (external->p_memsz);
2976 internal->p_flags = BYTE_GET (external->p_flags);
2977 internal->p_align = BYTE_GET (external->p_align);
2980 free (phdrs);
2982 return 1;
2985 static int
2986 get_64bit_program_headers (file, program_headers)
2987 FILE *file;
2988 Elf_Internal_Phdr *program_headers;
2990 Elf64_External_Phdr *phdrs;
2991 Elf64_External_Phdr *external;
2992 Elf_Internal_Phdr *internal;
2993 unsigned int i;
2995 phdrs = ((Elf64_External_Phdr *)
2996 get_data (NULL, file, elf_header.e_phoff,
2997 elf_header.e_phentsize * elf_header.e_phnum,
2998 _("program headers")));
2999 if (!phdrs)
3000 return 0;
3002 for (i = 0, internal = program_headers, external = phdrs;
3003 i < elf_header.e_phnum;
3004 i++, internal++, external++)
3006 internal->p_type = BYTE_GET (external->p_type);
3007 internal->p_flags = BYTE_GET (external->p_flags);
3008 internal->p_offset = BYTE_GET8 (external->p_offset);
3009 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
3010 internal->p_paddr = BYTE_GET8 (external->p_paddr);
3011 internal->p_filesz = BYTE_GET8 (external->p_filesz);
3012 internal->p_memsz = BYTE_GET8 (external->p_memsz);
3013 internal->p_align = BYTE_GET8 (external->p_align);
3016 free (phdrs);
3018 return 1;
3021 /* Returns 1 if the program headers were loaded. */
3023 static int
3024 process_program_headers (file)
3025 FILE *file;
3027 Elf_Internal_Phdr *program_headers;
3028 Elf_Internal_Phdr *segment;
3029 unsigned int i;
3031 if (elf_header.e_phnum == 0)
3033 if (do_segments)
3034 printf (_("\nThere are no program headers in this file.\n"));
3035 return 0;
3038 if (do_segments && !do_header)
3040 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3041 printf (_("Entry point "));
3042 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3043 printf (_("\nThere are %d program headers, starting at offset "),
3044 elf_header.e_phnum);
3045 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3046 printf ("\n");
3049 program_headers = (Elf_Internal_Phdr *) malloc
3050 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3052 if (program_headers == NULL)
3054 error (_("Out of memory\n"));
3055 return 0;
3058 if (is_32bit_elf)
3059 i = get_32bit_program_headers (file, program_headers);
3060 else
3061 i = get_64bit_program_headers (file, program_headers);
3063 if (i == 0)
3065 free (program_headers);
3066 return 0;
3069 if (do_segments)
3071 if (elf_header.e_phnum > 1)
3072 printf (_("\nProgram Headers:\n"));
3073 else
3074 printf (_("\nProgram Headers:\n"));
3076 if (is_32bit_elf)
3077 printf
3078 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3079 else if (do_wide)
3080 printf
3081 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3082 else
3084 printf
3085 (_(" Type Offset VirtAddr PhysAddr\n"));
3086 printf
3087 (_(" FileSiz MemSiz Flags Align\n"));
3091 loadaddr = -1;
3092 dynamic_addr = 0;
3093 dynamic_size = 0;
3095 for (i = 0, segment = program_headers;
3096 i < elf_header.e_phnum;
3097 i++, segment++)
3099 if (do_segments)
3101 printf (" %-14.14s ", get_segment_type (segment->p_type));
3103 if (is_32bit_elf)
3105 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3106 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3107 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3108 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3109 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3110 printf ("%c%c%c ",
3111 (segment->p_flags & PF_R ? 'R' : ' '),
3112 (segment->p_flags & PF_W ? 'W' : ' '),
3113 (segment->p_flags & PF_X ? 'E' : ' '));
3114 printf ("%#lx", (unsigned long) segment->p_align);
3116 else if (do_wide)
3118 if ((unsigned long) segment->p_offset == segment->p_offset)
3119 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3120 else
3122 print_vma (segment->p_offset, FULL_HEX);
3123 putchar (' ');
3126 print_vma (segment->p_vaddr, FULL_HEX);
3127 putchar (' ');
3128 print_vma (segment->p_paddr, FULL_HEX);
3129 putchar (' ');
3131 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3132 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3133 else
3135 print_vma (segment->p_filesz, FULL_HEX);
3136 putchar (' ');
3139 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3140 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3141 else
3143 print_vma (segment->p_offset, FULL_HEX);
3146 printf (" %c%c%c ",
3147 (segment->p_flags & PF_R ? 'R' : ' '),
3148 (segment->p_flags & PF_W ? 'W' : ' '),
3149 (segment->p_flags & PF_X ? 'E' : ' '));
3151 if ((unsigned long) segment->p_align == segment->p_align)
3152 printf ("%#lx", (unsigned long) segment->p_align);
3153 else
3155 print_vma (segment->p_align, PREFIX_HEX);
3158 else
3160 print_vma (segment->p_offset, FULL_HEX);
3161 putchar (' ');
3162 print_vma (segment->p_vaddr, FULL_HEX);
3163 putchar (' ');
3164 print_vma (segment->p_paddr, FULL_HEX);
3165 printf ("\n ");
3166 print_vma (segment->p_filesz, FULL_HEX);
3167 putchar (' ');
3168 print_vma (segment->p_memsz, FULL_HEX);
3169 printf (" %c%c%c ",
3170 (segment->p_flags & PF_R ? 'R' : ' '),
3171 (segment->p_flags & PF_W ? 'W' : ' '),
3172 (segment->p_flags & PF_X ? 'E' : ' '));
3173 print_vma (segment->p_align, HEX);
3177 switch (segment->p_type)
3179 case PT_LOAD:
3180 if (loadaddr == -1)
3182 unsigned long align_mask = -segment->p_align;
3184 if (align_mask == 0)
3185 --align_mask;
3186 loadaddr = ((segment->p_vaddr & align_mask)
3187 - (segment->p_offset & align_mask));
3189 break;
3191 case PT_DYNAMIC:
3192 if (dynamic_addr)
3193 error (_("more than one dynamic segment\n"));
3195 dynamic_addr = segment->p_offset;
3196 dynamic_size = segment->p_filesz;
3197 break;
3199 case PT_INTERP:
3200 if (fseek (file, (long) segment->p_offset, SEEK_SET))
3201 error (_("Unable to find program interpreter name\n"));
3202 else
3204 program_interpreter[0] = 0;
3205 fscanf (file, "%63s", program_interpreter);
3207 if (do_segments)
3208 printf (_("\n [Requesting program interpreter: %s]"),
3209 program_interpreter);
3211 break;
3214 if (do_segments)
3215 putc ('\n', stdout);
3218 if (loadaddr == -1)
3220 /* Very strange. */
3221 loadaddr = 0;
3224 if (do_segments && section_headers != NULL)
3226 printf (_("\n Section to Segment mapping:\n"));
3227 printf (_(" Segment Sections...\n"));
3229 assert (string_table != NULL);
3231 for (i = 0; i < elf_header.e_phnum; i++)
3233 unsigned int j;
3234 Elf_Internal_Shdr *section;
3236 segment = program_headers + i;
3237 section = section_headers;
3239 printf (" %2.2d ", i);
3241 for (j = 1; j < elf_header.e_shnum; j++, section++)
3243 if (section->sh_size > 0
3244 /* Compare allocated sections by VMA, unallocated
3245 sections by file offset. */
3246 && (section->sh_flags & SHF_ALLOC
3247 ? (section->sh_addr >= segment->p_vaddr
3248 && section->sh_addr + section->sh_size
3249 <= segment->p_vaddr + segment->p_memsz)
3250 : ((bfd_vma) section->sh_offset >= segment->p_offset
3251 && (section->sh_offset + section->sh_size
3252 <= segment->p_offset + segment->p_filesz))))
3253 printf ("%s ", SECTION_NAME (section));
3256 putc ('\n',stdout);
3260 free (program_headers);
3262 return 1;
3266 static int
3267 get_32bit_section_headers (file, num)
3268 FILE *file;
3269 unsigned int num;
3271 Elf32_External_Shdr *shdrs;
3272 Elf_Internal_Shdr *internal;
3273 unsigned int i;
3275 shdrs = ((Elf32_External_Shdr *)
3276 get_data (NULL, file, elf_header.e_shoff,
3277 elf_header.e_shentsize * num,
3278 _("section headers")));
3279 if (!shdrs)
3280 return 0;
3282 section_headers = ((Elf_Internal_Shdr *)
3283 malloc (num * sizeof (Elf_Internal_Shdr)));
3285 if (section_headers == NULL)
3287 error (_("Out of memory\n"));
3288 return 0;
3291 for (i = 0, internal = section_headers;
3292 i < num;
3293 i++, internal++)
3295 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3296 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3297 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3298 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3299 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3300 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3301 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3302 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3303 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3304 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3307 free (shdrs);
3309 return 1;
3312 static int
3313 get_64bit_section_headers (file, num)
3314 FILE *file;
3315 unsigned int num;
3317 Elf64_External_Shdr *shdrs;
3318 Elf_Internal_Shdr *internal;
3319 unsigned int i;
3321 shdrs = ((Elf64_External_Shdr *)
3322 get_data (NULL, file, elf_header.e_shoff,
3323 elf_header.e_shentsize * num,
3324 _("section headers")));
3325 if (!shdrs)
3326 return 0;
3328 section_headers = ((Elf_Internal_Shdr *)
3329 malloc (num * sizeof (Elf_Internal_Shdr)));
3331 if (section_headers == NULL)
3333 error (_("Out of memory\n"));
3334 return 0;
3337 for (i = 0, internal = section_headers;
3338 i < num;
3339 i++, internal++)
3341 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3342 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3343 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3344 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3345 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3346 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3347 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3348 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3349 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3350 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3353 free (shdrs);
3355 return 1;
3358 static Elf_Internal_Sym *
3359 get_32bit_elf_symbols (file, section)
3360 FILE *file;
3361 Elf_Internal_Shdr *section;
3363 unsigned long number;
3364 Elf32_External_Sym *esyms;
3365 Elf_External_Sym_Shndx *shndx;
3366 Elf_Internal_Sym *isyms;
3367 Elf_Internal_Sym *psym;
3368 unsigned int j;
3370 esyms = ((Elf32_External_Sym *)
3371 get_data (NULL, file, section->sh_offset,
3372 section->sh_size, _("symbols")));
3373 if (!esyms)
3374 return NULL;
3376 shndx = NULL;
3377 if (symtab_shndx_hdr != NULL
3378 && (symtab_shndx_hdr->sh_link
3379 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3381 shndx = ((Elf_External_Sym_Shndx *)
3382 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3383 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3384 if (!shndx)
3386 free (esyms);
3387 return NULL;
3391 number = section->sh_size / section->sh_entsize;
3392 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3394 if (isyms == NULL)
3396 error (_("Out of memory\n"));
3397 if (shndx)
3398 free (shndx);
3399 free (esyms);
3400 return NULL;
3403 for (j = 0, psym = isyms;
3404 j < number;
3405 j++, psym++)
3407 psym->st_name = BYTE_GET (esyms[j].st_name);
3408 psym->st_value = BYTE_GET (esyms[j].st_value);
3409 psym->st_size = BYTE_GET (esyms[j].st_size);
3410 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3411 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3412 psym->st_shndx
3413 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3414 psym->st_info = BYTE_GET (esyms[j].st_info);
3415 psym->st_other = BYTE_GET (esyms[j].st_other);
3418 if (shndx)
3419 free (shndx);
3420 free (esyms);
3422 return isyms;
3425 static Elf_Internal_Sym *
3426 get_64bit_elf_symbols (file, section)
3427 FILE *file;
3428 Elf_Internal_Shdr *section;
3430 unsigned long number;
3431 Elf64_External_Sym *esyms;
3432 Elf_External_Sym_Shndx *shndx;
3433 Elf_Internal_Sym *isyms;
3434 Elf_Internal_Sym *psym;
3435 unsigned int j;
3437 esyms = ((Elf64_External_Sym *)
3438 get_data (NULL, file, section->sh_offset,
3439 section->sh_size, _("symbols")));
3440 if (!esyms)
3441 return NULL;
3443 shndx = NULL;
3444 if (symtab_shndx_hdr != NULL
3445 && (symtab_shndx_hdr->sh_link
3446 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3448 shndx = ((Elf_External_Sym_Shndx *)
3449 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3450 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3451 if (!shndx)
3453 free (esyms);
3454 return NULL;
3458 number = section->sh_size / section->sh_entsize;
3459 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3461 if (isyms == NULL)
3463 error (_("Out of memory\n"));
3464 if (shndx)
3465 free (shndx);
3466 free (esyms);
3467 return NULL;
3470 for (j = 0, psym = isyms;
3471 j < number;
3472 j++, psym++)
3474 psym->st_name = BYTE_GET (esyms[j].st_name);
3475 psym->st_info = BYTE_GET (esyms[j].st_info);
3476 psym->st_other = BYTE_GET (esyms[j].st_other);
3477 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3478 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3479 psym->st_shndx
3480 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3481 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3482 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3485 if (shndx)
3486 free (shndx);
3487 free (esyms);
3489 return isyms;
3492 static const char *
3493 get_elf_section_flags (sh_flags)
3494 bfd_vma sh_flags;
3496 static char buff[32];
3498 *buff = 0;
3500 while (sh_flags)
3502 bfd_vma flag;
3504 flag = sh_flags & - sh_flags;
3505 sh_flags &= ~ flag;
3507 switch (flag)
3509 case SHF_WRITE: strcat (buff, "W"); break;
3510 case SHF_ALLOC: strcat (buff, "A"); break;
3511 case SHF_EXECINSTR: strcat (buff, "X"); break;
3512 case SHF_MERGE: strcat (buff, "M"); break;
3513 case SHF_STRINGS: strcat (buff, "S"); break;
3514 case SHF_INFO_LINK: strcat (buff, "I"); break;
3515 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3516 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3517 case SHF_GROUP: strcat (buff, "G"); break;
3518 case SHF_TLS: strcat (buff, "T"); break;
3520 default:
3521 if (flag & SHF_MASKOS)
3523 strcat (buff, "o");
3524 sh_flags &= ~ SHF_MASKOS;
3526 else if (flag & SHF_MASKPROC)
3528 strcat (buff, "p");
3529 sh_flags &= ~ SHF_MASKPROC;
3531 else
3532 strcat (buff, "x");
3533 break;
3537 return buff;
3540 static int
3541 process_section_headers (file)
3542 FILE *file;
3544 Elf_Internal_Shdr *section;
3545 unsigned int i;
3547 section_headers = NULL;
3549 if (elf_header.e_shnum == 0)
3551 if (do_sections)
3552 printf (_("\nThere are no sections in this file.\n"));
3554 return 1;
3557 if (do_sections && !do_header)
3558 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3559 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3561 if (is_32bit_elf)
3563 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3564 return 0;
3566 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3567 return 0;
3569 /* Read in the string table, so that we have names to display. */
3570 section = SECTION_HEADER (elf_header.e_shstrndx);
3572 if (section->sh_size != 0)
3574 string_table = (char *) get_data (NULL, file, section->sh_offset,
3575 section->sh_size, _("string table"));
3577 string_table_length = section->sh_size;
3580 /* Scan the sections for the dynamic symbol table
3581 and dynamic string table and debug sections. */
3582 dynamic_symbols = NULL;
3583 dynamic_strings = NULL;
3584 dynamic_syminfo = NULL;
3585 symtab_shndx_hdr = NULL;
3587 for (i = 0, section = section_headers;
3588 i < elf_header.e_shnum;
3589 i++, section++)
3591 char *name = SECTION_NAME (section);
3593 if (section->sh_type == SHT_DYNSYM)
3595 if (dynamic_symbols != NULL)
3597 error (_("File contains multiple dynamic symbol tables\n"));
3598 continue;
3601 num_dynamic_syms = section->sh_size / section->sh_entsize;
3602 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3604 else if (section->sh_type == SHT_STRTAB
3605 && strcmp (name, ".dynstr") == 0)
3607 if (dynamic_strings != NULL)
3609 error (_("File contains multiple dynamic string tables\n"));
3610 continue;
3613 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3614 section->sh_size,
3615 _("dynamic strings"));
3617 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3619 if (symtab_shndx_hdr != NULL)
3621 error (_("File contains multiple symtab shndx tables\n"));
3622 continue;
3624 symtab_shndx_hdr = section;
3626 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3627 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3628 || do_debug_frames || do_debug_macinfo || do_debug_str
3629 || do_debug_loc)
3630 && strncmp (name, ".debug_", 7) == 0)
3632 name += 7;
3634 if (do_debugging
3635 || (do_debug_info && (strcmp (name, "info") == 0))
3636 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3637 || (do_debug_lines && (strcmp (name, "line") == 0))
3638 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3639 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3640 || (do_debug_frames && (strcmp (name, "frame") == 0))
3641 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3642 || (do_debug_str && (strcmp (name, "str") == 0))
3643 || (do_debug_loc && (strcmp (name, "loc") == 0))
3645 request_dump (i, DEBUG_DUMP);
3647 /* linkonce section to be combined with .debug_info at link time. */
3648 else if ((do_debugging || do_debug_info)
3649 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3650 request_dump (i, DEBUG_DUMP);
3651 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3652 request_dump (i, DEBUG_DUMP);
3655 if (! do_sections)
3656 return 1;
3658 if (elf_header.e_shnum > 1)
3659 printf (_("\nSection Headers:\n"));
3660 else
3661 printf (_("\nSection Header:\n"));
3663 if (is_32bit_elf)
3664 printf
3665 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3666 else if (do_wide)
3667 printf
3668 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3669 else
3671 printf (_(" [Nr] Name Type Address Offset\n"));
3672 printf (_(" Size EntSize Flags Link Info Align\n"));
3675 for (i = 0, section = section_headers;
3676 i < elf_header.e_shnum;
3677 i++, section++)
3679 printf (" [%2u] %-17.17s %-15.15s ",
3680 SECTION_HEADER_NUM (i),
3681 SECTION_NAME (section),
3682 get_section_type_name (section->sh_type));
3684 if (is_32bit_elf)
3686 print_vma (section->sh_addr, LONG_HEX);
3688 printf ( " %6.6lx %6.6lx %2.2lx",
3689 (unsigned long) section->sh_offset,
3690 (unsigned long) section->sh_size,
3691 (unsigned long) section->sh_entsize);
3693 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3695 printf ("%2ld %3lx %2ld\n",
3696 (unsigned long) section->sh_link,
3697 (unsigned long) section->sh_info,
3698 (unsigned long) section->sh_addralign);
3700 else if (do_wide)
3702 print_vma (section->sh_addr, LONG_HEX);
3704 if ((long) section->sh_offset == section->sh_offset)
3705 printf (" %6.6lx", (unsigned long) section->sh_offset);
3706 else
3708 putchar (' ');
3709 print_vma (section->sh_offset, LONG_HEX);
3712 if ((unsigned long) section->sh_size == section->sh_size)
3713 printf (" %6.6lx", (unsigned long) section->sh_size);
3714 else
3716 putchar (' ');
3717 print_vma (section->sh_size, LONG_HEX);
3720 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3721 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3722 else
3724 putchar (' ');
3725 print_vma (section->sh_entsize, LONG_HEX);
3728 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3730 printf ("%2ld %3lx ",
3731 (unsigned long) section->sh_link,
3732 (unsigned long) section->sh_info);
3734 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3735 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3736 else
3738 print_vma (section->sh_addralign, DEC);
3739 putchar ('\n');
3742 else
3744 putchar (' ');
3745 print_vma (section->sh_addr, LONG_HEX);
3746 if ((long) section->sh_offset == section->sh_offset)
3747 printf (" %8.8lx", (unsigned long) section->sh_offset);
3748 else
3750 printf (" ");
3751 print_vma (section->sh_offset, LONG_HEX);
3753 printf ("\n ");
3754 print_vma (section->sh_size, LONG_HEX);
3755 printf (" ");
3756 print_vma (section->sh_entsize, LONG_HEX);
3758 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3760 printf (" %2ld %3lx %ld\n",
3761 (unsigned long) section->sh_link,
3762 (unsigned long) section->sh_info,
3763 (unsigned long) section->sh_addralign);
3767 printf (_("Key to Flags:\n\
3768 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3769 I (info), L (link order), G (group), x (unknown)\n\
3770 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3772 return 1;
3775 /* Process the reloc section. */
3776 static int
3777 process_relocs (file)
3778 FILE *file;
3780 unsigned long rel_size;
3781 unsigned long rel_offset;
3784 if (!do_reloc)
3785 return 1;
3787 if (do_using_dynamic)
3789 int is_rela = FALSE;
3791 rel_size = 0;
3792 rel_offset = 0;
3794 if (dynamic_info[DT_REL])
3796 rel_offset = dynamic_info[DT_REL];
3797 rel_size = dynamic_info[DT_RELSZ];
3798 is_rela = FALSE;
3800 else if (dynamic_info[DT_RELA])
3802 rel_offset = dynamic_info[DT_RELA];
3803 rel_size = dynamic_info[DT_RELASZ];
3804 is_rela = TRUE;
3806 else if (dynamic_info[DT_JMPREL])
3808 rel_offset = dynamic_info[DT_JMPREL];
3809 rel_size = dynamic_info[DT_PLTRELSZ];
3811 switch (dynamic_info[DT_PLTREL])
3813 case DT_REL:
3814 is_rela = FALSE;
3815 break;
3816 case DT_RELA:
3817 is_rela = TRUE;
3818 break;
3819 default:
3820 is_rela = UNKNOWN;
3821 break;
3825 if (rel_size)
3827 printf
3828 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3829 rel_offset, rel_size);
3831 dump_relocations (file, rel_offset - loadaddr, rel_size,
3832 dynamic_symbols, num_dynamic_syms, dynamic_strings,
3833 is_rela);
3835 else
3836 printf (_("\nThere are no dynamic relocations in this file.\n"));
3838 else
3840 Elf_Internal_Shdr *section;
3841 unsigned long i;
3842 int found = 0;
3844 for (i = 0, section = section_headers;
3845 i < elf_header.e_shnum;
3846 i++, section++)
3848 if ( section->sh_type != SHT_RELA
3849 && section->sh_type != SHT_REL)
3850 continue;
3852 rel_offset = section->sh_offset;
3853 rel_size = section->sh_size;
3855 if (rel_size)
3857 Elf_Internal_Shdr *strsec;
3858 Elf_Internal_Sym *symtab;
3859 char *strtab;
3860 int is_rela;
3861 unsigned long nsyms;
3863 printf (_("\nRelocation section "));
3865 if (string_table == NULL)
3866 printf ("%d", section->sh_name);
3867 else
3868 printf (_("'%s'"), SECTION_NAME (section));
3870 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3871 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3873 symtab = NULL;
3874 strtab = NULL;
3875 nsyms = 0;
3876 if (section->sh_link)
3878 Elf_Internal_Shdr *symsec;
3880 symsec = SECTION_HEADER (section->sh_link);
3881 nsyms = symsec->sh_size / symsec->sh_entsize;
3882 symtab = GET_ELF_SYMBOLS (file, symsec);
3884 if (symtab == NULL)
3885 continue;
3887 strsec = SECTION_HEADER (symsec->sh_link);
3889 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3890 strsec->sh_size,
3891 _("string table"));
3893 is_rela = section->sh_type == SHT_RELA;
3895 dump_relocations (file, rel_offset, rel_size,
3896 symtab, nsyms, strtab, is_rela);
3898 if (strtab)
3899 free (strtab);
3900 if (symtab)
3901 free (symtab);
3903 found = 1;
3907 if (! found)
3908 printf (_("\nThere are no relocations in this file.\n"));
3911 return 1;
3914 #include "unwind-ia64.h"
3916 /* An absolute address consists of a section and an offset. If the
3917 section is NULL, the offset itself is the address, otherwise, the
3918 address equals to LOAD_ADDRESS(section) + offset. */
3920 struct absaddr
3922 unsigned short section;
3923 bfd_vma offset;
3926 struct unw_aux_info
3928 struct unw_table_entry
3930 struct absaddr start;
3931 struct absaddr end;
3932 struct absaddr info;
3934 *table; /* Unwind table. */
3935 unsigned long table_len; /* Length of unwind table. */
3936 unsigned char *info; /* Unwind info. */
3937 unsigned long info_size; /* Size of unwind info. */
3938 bfd_vma info_addr; /* starting address of unwind info. */
3939 bfd_vma seg_base; /* Starting address of segment. */
3940 Elf_Internal_Sym *symtab; /* The symbol table. */
3941 unsigned long nsyms; /* Number of symbols. */
3942 char *strtab; /* The string table. */
3943 unsigned long strtab_size; /* Size of string table. */
3946 static void find_symbol_for_address
3947 PARAMS ((struct unw_aux_info *, struct absaddr, const char **, bfd_vma *));
3948 static void dump_ia64_unwind
3949 PARAMS ((struct unw_aux_info *));
3950 static int slurp_ia64_unwind_table
3951 PARAMS ((FILE *, struct unw_aux_info *, Elf_Internal_Shdr *));
3953 static void
3954 find_symbol_for_address (aux, addr, symname, offset)
3955 struct unw_aux_info *aux;
3956 struct absaddr addr;
3957 const char **symname;
3958 bfd_vma *offset;
3960 bfd_vma dist = (bfd_vma) 0x100000;
3961 Elf_Internal_Sym *sym, *best = NULL;
3962 unsigned long i;
3964 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3966 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3967 && sym->st_name != 0
3968 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3969 && addr.offset >= sym->st_value
3970 && addr.offset - sym->st_value < dist)
3972 best = sym;
3973 dist = addr.offset - sym->st_value;
3974 if (!dist)
3975 break;
3978 if (best)
3980 *symname = (best->st_name >= aux->strtab_size
3981 ? "<corrupt>" : aux->strtab + best->st_name);
3982 *offset = dist;
3983 return;
3985 *symname = NULL;
3986 *offset = addr.offset;
3989 static void
3990 dump_ia64_unwind (aux)
3991 struct unw_aux_info *aux;
3993 bfd_vma addr_size;
3994 struct unw_table_entry *tp;
3995 int in_body;
3997 addr_size = is_32bit_elf ? 4 : 8;
3999 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4001 bfd_vma stamp;
4002 bfd_vma offset;
4003 const unsigned char *dp;
4004 const unsigned char *head;
4005 const char *procname;
4007 find_symbol_for_address (aux, tp->start, &procname, &offset);
4009 fputs ("\n<", stdout);
4011 if (procname)
4013 fputs (procname, stdout);
4015 if (offset)
4016 printf ("+%lx", (unsigned long) offset);
4019 fputs (">: [", stdout);
4020 print_vma (tp->start.offset, PREFIX_HEX);
4021 fputc ('-', stdout);
4022 print_vma (tp->end.offset, PREFIX_HEX);
4023 printf ("], info at +0x%lx\n",
4024 (unsigned long) (tp->info.offset - aux->seg_base));
4026 head = aux->info + (tp->info.offset - aux->info_addr);
4027 stamp = BYTE_GET8 ((unsigned char *) head);
4029 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4030 (unsigned) UNW_VER (stamp),
4031 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4032 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4033 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4034 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
4036 if (UNW_VER (stamp) != 1)
4038 printf ("\tUnknown version.\n");
4039 continue;
4042 in_body = 0;
4043 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
4044 dp = unw_decode (dp, in_body, & in_body);
4048 static int
4049 slurp_ia64_unwind_table (file, aux, sec)
4050 FILE *file;
4051 struct unw_aux_info *aux;
4052 Elf_Internal_Shdr *sec;
4054 unsigned long size, addr_size, nrelas, i;
4055 Elf_Internal_Phdr *prog_hdrs, *seg;
4056 struct unw_table_entry *tep;
4057 Elf_Internal_Shdr *relsec;
4058 Elf_Internal_Rela *rela, *rp;
4059 unsigned char *table, *tp;
4060 Elf_Internal_Sym *sym;
4061 const char *relname;
4062 int result;
4064 addr_size = is_32bit_elf ? 4 : 8;
4066 /* First, find the starting address of the segment that includes
4067 this section: */
4069 if (elf_header.e_phnum)
4071 prog_hdrs = (Elf_Internal_Phdr *)
4072 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
4074 if (is_32bit_elf)
4075 result = get_32bit_program_headers (file, prog_hdrs);
4076 else
4077 result = get_64bit_program_headers (file, prog_hdrs);
4079 if (!result)
4081 free (prog_hdrs);
4082 return 0;
4085 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
4087 if (seg->p_type != PT_LOAD)
4088 continue;
4090 if (sec->sh_addr >= seg->p_vaddr
4091 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4093 aux->seg_base = seg->p_vaddr;
4094 break;
4098 free (prog_hdrs);
4101 /* Second, build the unwind table from the contents of the unwind section: */
4102 size = sec->sh_size;
4103 table = (char *) get_data (NULL, file, sec->sh_offset,
4104 size, _("unwind table"));
4105 if (!table)
4106 return 0;
4108 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
4109 for (tp = table; tp < table + size; tp += 3 * addr_size, ++tep)
4111 tep->start.section = SHN_UNDEF;
4112 tep->end.section = SHN_UNDEF;
4113 tep->info.section = SHN_UNDEF;
4114 if (is_32bit_elf)
4116 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4117 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4118 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4120 else
4122 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4123 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4124 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
4126 tep->start.offset += aux->seg_base;
4127 tep->end.offset += aux->seg_base;
4128 tep->info.offset += aux->seg_base;
4130 free (table);
4132 /* Third, apply any relocations to the unwind table: */
4134 for (relsec = section_headers;
4135 relsec < section_headers + elf_header.e_shnum;
4136 ++relsec)
4138 if (relsec->sh_type != SHT_RELA
4139 || SECTION_HEADER (relsec->sh_info) != sec)
4140 continue;
4142 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4143 & rela, & nrelas))
4144 return 0;
4146 for (rp = rela; rp < rela + nrelas; ++rp)
4148 if (is_32bit_elf)
4150 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4151 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4153 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
4155 warn (_("Skipping unexpected symbol type %u\n"),
4156 ELF32_ST_TYPE (sym->st_info));
4157 continue;
4160 else
4162 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4163 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4165 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
4167 warn (_("Skipping unexpected symbol type %u\n"),
4168 ELF64_ST_TYPE (sym->st_info));
4169 continue;
4173 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
4175 warn (_("Skipping unexpected relocation type %s\n"), relname);
4176 continue;
4179 i = rp->r_offset / (3 * addr_size);
4181 switch (rp->r_offset/addr_size % 3)
4183 case 0:
4184 aux->table[i].start.section = sym->st_shndx;
4185 aux->table[i].start.offset += rp->r_addend;
4186 break;
4187 case 1:
4188 aux->table[i].end.section = sym->st_shndx;
4189 aux->table[i].end.offset += rp->r_addend;
4190 break;
4191 case 2:
4192 aux->table[i].info.section = sym->st_shndx;
4193 aux->table[i].info.offset += rp->r_addend;
4194 break;
4195 default:
4196 break;
4200 free (rela);
4203 aux->table_len = size / (3 * addr_size);
4204 return 1;
4207 static int
4208 process_unwind (file)
4209 FILE *file;
4211 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4212 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4213 struct unw_aux_info aux;
4215 if (!do_unwind)
4216 return 1;
4218 if (elf_header.e_machine != EM_IA_64)
4220 printf (_("\nThere are no unwind sections in this file.\n"));
4221 return 1;
4224 memset (& aux, 0, sizeof (aux));
4226 addr_size = is_32bit_elf ? 4 : 8;
4228 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4230 if (sec->sh_type == SHT_SYMTAB)
4232 aux.nsyms = sec->sh_size / sec->sh_entsize;
4233 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4235 strsec = SECTION_HEADER (sec->sh_link);
4236 aux.strtab_size = strsec->sh_size;
4237 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
4238 aux.strtab_size, _("string table"));
4240 else if (sec->sh_type == SHT_IA_64_UNWIND)
4241 unwcount++;
4244 if (!unwcount)
4245 printf (_("\nThere are no unwind sections in this file.\n"));
4247 while (unwcount-- > 0)
4249 char *suffix;
4250 size_t len, len2;
4252 for (i = unwstart, sec = section_headers + unwstart;
4253 i < elf_header.e_shnum; ++i, ++sec)
4254 if (sec->sh_type == SHT_IA_64_UNWIND)
4256 unwsec = sec;
4257 break;
4260 unwstart = i + 1;
4261 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4263 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
4264 len) == 0)
4266 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4267 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4268 suffix = SECTION_NAME (unwsec) + len;
4269 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4270 ++i, ++sec)
4271 if (strncmp (SECTION_NAME (sec),
4272 ELF_STRING_ia64_unwind_info_once, len2) == 0
4273 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4274 break;
4276 else
4278 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4279 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4280 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4281 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4282 suffix = "";
4283 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
4284 len) == 0)
4285 suffix = SECTION_NAME (unwsec) + len;
4286 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4287 ++i, ++sec)
4288 if (strncmp (SECTION_NAME (sec),
4289 ELF_STRING_ia64_unwind_info, len2) == 0
4290 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4291 break;
4294 if (i == elf_header.e_shnum)
4296 printf (_("\nCould not find unwind info section for "));
4298 if (string_table == NULL)
4299 printf ("%d", unwsec->sh_name);
4300 else
4301 printf (_("'%s'"), SECTION_NAME (unwsec));
4303 else
4305 aux.info_size = sec->sh_size;
4306 aux.info_addr = sec->sh_addr;
4307 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
4308 aux.info_size, _("unwind info"));
4310 printf (_("\nUnwind section "));
4312 if (string_table == NULL)
4313 printf ("%d", unwsec->sh_name);
4314 else
4315 printf (_("'%s'"), SECTION_NAME (unwsec));
4317 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4318 (unsigned long) unwsec->sh_offset,
4319 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4321 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4323 if (aux.table_len > 0)
4324 dump_ia64_unwind (& aux);
4326 if (aux.table)
4327 free ((char *) aux.table);
4328 if (aux.info)
4329 free ((char *) aux.info);
4330 aux.table = NULL;
4331 aux.info = NULL;
4335 if (aux.symtab)
4336 free (aux.symtab);
4337 if (aux.strtab)
4338 free ((char *) aux.strtab);
4340 return 1;
4343 static void
4344 dynamic_segment_mips_val (entry)
4345 Elf_Internal_Dyn *entry;
4347 switch (entry->d_tag)
4349 case DT_MIPS_FLAGS:
4350 if (entry->d_un.d_val == 0)
4351 printf ("NONE\n");
4352 else
4354 static const char * opts[] =
4356 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4357 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4358 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4359 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4360 "RLD_ORDER_SAFE"
4362 unsigned int cnt;
4363 int first = 1;
4364 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
4365 if (entry->d_un.d_val & (1 << cnt))
4367 printf ("%s%s", first ? "" : " ", opts[cnt]);
4368 first = 0;
4370 puts ("");
4372 break;
4374 case DT_MIPS_IVERSION:
4375 if (dynamic_strings != NULL)
4376 printf ("Interface Version: %s\n",
4377 dynamic_strings + entry->d_un.d_val);
4378 else
4379 printf ("%ld\n", (long) entry->d_un.d_ptr);
4380 break;
4382 case DT_MIPS_TIME_STAMP:
4384 char timebuf[20];
4385 struct tm *tmp;
4387 time_t time = entry->d_un.d_val;
4388 tmp = gmtime (&time);
4389 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4390 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4391 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4392 printf ("Time Stamp: %s\n", timebuf);
4394 break;
4396 case DT_MIPS_RLD_VERSION:
4397 case DT_MIPS_LOCAL_GOTNO:
4398 case DT_MIPS_CONFLICTNO:
4399 case DT_MIPS_LIBLISTNO:
4400 case DT_MIPS_SYMTABNO:
4401 case DT_MIPS_UNREFEXTNO:
4402 case DT_MIPS_HIPAGENO:
4403 case DT_MIPS_DELTA_CLASS_NO:
4404 case DT_MIPS_DELTA_INSTANCE_NO:
4405 case DT_MIPS_DELTA_RELOC_NO:
4406 case DT_MIPS_DELTA_SYM_NO:
4407 case DT_MIPS_DELTA_CLASSSYM_NO:
4408 case DT_MIPS_COMPACT_SIZE:
4409 printf ("%ld\n", (long) entry->d_un.d_ptr);
4410 break;
4412 default:
4413 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4418 static void
4419 dynamic_segment_parisc_val (entry)
4420 Elf_Internal_Dyn *entry;
4422 switch (entry->d_tag)
4424 case DT_HP_DLD_FLAGS:
4426 static struct
4428 long int bit;
4429 const char *str;
4431 flags[] =
4433 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4434 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4435 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4436 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4437 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4438 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4439 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4440 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4441 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4442 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4443 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4445 int first = 1;
4446 size_t cnt;
4447 bfd_vma val = entry->d_un.d_val;
4449 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4450 if (val & flags[cnt].bit)
4452 if (! first)
4453 putchar (' ');
4454 fputs (flags[cnt].str, stdout);
4455 first = 0;
4456 val ^= flags[cnt].bit;
4459 if (val != 0 || first)
4461 if (! first)
4462 putchar (' ');
4463 print_vma (val, HEX);
4466 break;
4468 default:
4469 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4470 break;
4472 putchar ('\n');
4475 static int
4476 get_32bit_dynamic_segment (file)
4477 FILE *file;
4479 Elf32_External_Dyn *edyn;
4480 Elf_Internal_Dyn *entry;
4481 bfd_size_type i;
4483 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4484 dynamic_size, _("dynamic segment"));
4485 if (!edyn)
4486 return 0;
4488 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4489 how large this .dynamic is now. We can do this even before the byte
4490 swapping since the DT_NULL tag is recognizable. */
4491 dynamic_size = 0;
4492 while (*(Elf32_Word *) edyn[dynamic_size++].d_tag != DT_NULL)
4495 dynamic_segment = (Elf_Internal_Dyn *)
4496 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4498 if (dynamic_segment == NULL)
4500 error (_("Out of memory\n"));
4501 free (edyn);
4502 return 0;
4505 for (i = 0, entry = dynamic_segment;
4506 i < dynamic_size;
4507 i++, entry++)
4509 entry->d_tag = BYTE_GET (edyn[i].d_tag);
4510 entry->d_un.d_val = BYTE_GET (edyn[i].d_un.d_val);
4513 free (edyn);
4515 return 1;
4518 static int
4519 get_64bit_dynamic_segment (file)
4520 FILE *file;
4522 Elf64_External_Dyn *edyn;
4523 Elf_Internal_Dyn *entry;
4524 bfd_size_type i;
4526 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4527 dynamic_size, _("dynamic segment"));
4528 if (!edyn)
4529 return 0;
4531 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4532 how large this .dynamic is now. We can do this even before the byte
4533 swapping since the DT_NULL tag is recognizable. */
4534 dynamic_size = 0;
4535 while (*(bfd_vma *) edyn[dynamic_size++].d_tag != DT_NULL)
4538 dynamic_segment = (Elf_Internal_Dyn *)
4539 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4541 if (dynamic_segment == NULL)
4543 error (_("Out of memory\n"));
4544 free (edyn);
4545 return 0;
4548 for (i = 0, entry = dynamic_segment;
4549 i < dynamic_size;
4550 i++, entry++)
4552 entry->d_tag = BYTE_GET8 (edyn[i].d_tag);
4553 entry->d_un.d_val = BYTE_GET8 (edyn[i].d_un.d_val);
4556 free (edyn);
4558 return 1;
4561 static const char *
4562 get_dynamic_flags (flags)
4563 bfd_vma flags;
4565 static char buff[128];
4566 char *p = buff;
4568 *p = '\0';
4569 while (flags)
4571 bfd_vma flag;
4573 flag = flags & - flags;
4574 flags &= ~ flag;
4576 if (p != buff)
4577 *p++ = ' ';
4579 switch (flag)
4581 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4582 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4583 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4584 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4585 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4586 default: strcpy (p, "unknown"); break;
4589 p = strchr (p, '\0');
4591 return buff;
4594 /* Parse and display the contents of the dynamic segment. */
4595 static int
4596 process_dynamic_segment (file)
4597 FILE *file;
4599 Elf_Internal_Dyn *entry;
4600 bfd_size_type i;
4602 if (dynamic_size == 0)
4604 if (do_dynamic)
4605 printf (_("\nThere is no dynamic segment in this file.\n"));
4607 return 1;
4610 if (is_32bit_elf)
4612 if (! get_32bit_dynamic_segment (file))
4613 return 0;
4615 else if (! get_64bit_dynamic_segment (file))
4616 return 0;
4618 /* Find the appropriate symbol table. */
4619 if (dynamic_symbols == NULL)
4621 for (i = 0, entry = dynamic_segment;
4622 i < dynamic_size;
4623 ++i, ++entry)
4625 Elf_Internal_Shdr section;
4627 if (entry->d_tag != DT_SYMTAB)
4628 continue;
4630 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4632 /* Since we do not know how big the symbol table is,
4633 we default to reading in the entire file (!) and
4634 processing that. This is overkill, I know, but it
4635 should work. */
4636 section.sh_offset = entry->d_un.d_val - loadaddr;
4638 if (fseek (file, 0, SEEK_END))
4639 error (_("Unable to seek to end of file!"));
4641 section.sh_size = ftell (file) - section.sh_offset;
4642 if (is_32bit_elf)
4643 section.sh_entsize = sizeof (Elf32_External_Sym);
4644 else
4645 section.sh_entsize = sizeof (Elf64_External_Sym);
4647 num_dynamic_syms = section.sh_size / section.sh_entsize;
4648 if (num_dynamic_syms < 1)
4650 error (_("Unable to determine the number of symbols to load\n"));
4651 continue;
4654 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
4658 /* Similarly find a string table. */
4659 if (dynamic_strings == NULL)
4661 for (i = 0, entry = dynamic_segment;
4662 i < dynamic_size;
4663 ++i, ++entry)
4665 unsigned long offset;
4666 long str_tab_len;
4668 if (entry->d_tag != DT_STRTAB)
4669 continue;
4671 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4673 /* Since we do not know how big the string table is,
4674 we default to reading in the entire file (!) and
4675 processing that. This is overkill, I know, but it
4676 should work. */
4678 offset = entry->d_un.d_val - loadaddr;
4679 if (fseek (file, 0, SEEK_END))
4680 error (_("Unable to seek to end of file\n"));
4681 str_tab_len = ftell (file) - offset;
4683 if (str_tab_len < 1)
4685 error
4686 (_("Unable to determine the length of the dynamic string table\n"));
4687 continue;
4690 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4691 _("dynamic string table"));
4692 break;
4696 /* And find the syminfo section if available. */
4697 if (dynamic_syminfo == NULL)
4699 unsigned long syminsz = 0;
4701 for (i = 0, entry = dynamic_segment;
4702 i < dynamic_size;
4703 ++i, ++entry)
4705 if (entry->d_tag == DT_SYMINENT)
4707 /* Note: these braces are necessary to avoid a syntax
4708 error from the SunOS4 C compiler. */
4709 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4711 else if (entry->d_tag == DT_SYMINSZ)
4712 syminsz = entry->d_un.d_val;
4713 else if (entry->d_tag == DT_SYMINFO)
4714 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4717 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4719 Elf_External_Syminfo *extsyminfo;
4720 Elf_Internal_Syminfo *syminfo;
4722 /* There is a syminfo section. Read the data. */
4723 extsyminfo = ((Elf_External_Syminfo *)
4724 get_data (NULL, file, dynamic_syminfo_offset,
4725 syminsz, _("symbol information")));
4726 if (!extsyminfo)
4727 return 0;
4729 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4730 if (dynamic_syminfo == NULL)
4732 error (_("Out of memory\n"));
4733 return 0;
4736 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4737 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4738 ++i, ++syminfo)
4740 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4741 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4744 free (extsyminfo);
4748 if (do_dynamic && dynamic_addr)
4749 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4750 dynamic_addr, (long) dynamic_size);
4751 if (do_dynamic)
4752 printf (_(" Tag Type Name/Value\n"));
4754 for (i = 0, entry = dynamic_segment;
4755 i < dynamic_size;
4756 i++, entry++)
4758 if (do_dynamic)
4760 const char *dtype;
4762 putchar (' ');
4763 print_vma (entry->d_tag, FULL_HEX);
4764 dtype = get_dynamic_type (entry->d_tag);
4765 printf (" (%s)%*s", dtype,
4766 ((is_32bit_elf ? 27 : 19)
4767 - (int) strlen (dtype)),
4768 " ");
4771 switch (entry->d_tag)
4773 case DT_FLAGS:
4774 if (do_dynamic)
4775 puts (get_dynamic_flags (entry->d_un.d_val));
4776 break;
4778 case DT_AUXILIARY:
4779 case DT_FILTER:
4780 case DT_CONFIG:
4781 case DT_DEPAUDIT:
4782 case DT_AUDIT:
4783 if (do_dynamic)
4785 switch (entry->d_tag)
4787 case DT_AUXILIARY:
4788 printf (_("Auxiliary library"));
4789 break;
4791 case DT_FILTER:
4792 printf (_("Filter library"));
4793 break;
4795 case DT_CONFIG:
4796 printf (_("Configuration file"));
4797 break;
4799 case DT_DEPAUDIT:
4800 printf (_("Dependency audit library"));
4801 break;
4803 case DT_AUDIT:
4804 printf (_("Audit library"));
4805 break;
4808 if (dynamic_strings)
4809 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4810 else
4812 printf (": ");
4813 print_vma (entry->d_un.d_val, PREFIX_HEX);
4814 putchar ('\n');
4817 break;
4819 case DT_FEATURE:
4820 if (do_dynamic)
4822 printf (_("Flags:"));
4824 if (entry->d_un.d_val == 0)
4825 printf (_(" None\n"));
4826 else
4828 unsigned long int val = entry->d_un.d_val;
4830 if (val & DTF_1_PARINIT)
4832 printf (" PARINIT");
4833 val ^= DTF_1_PARINIT;
4835 if (val & DTF_1_CONFEXP)
4837 printf (" CONFEXP");
4838 val ^= DTF_1_CONFEXP;
4840 if (val != 0)
4841 printf (" %lx", val);
4842 puts ("");
4845 break;
4847 case DT_POSFLAG_1:
4848 if (do_dynamic)
4850 printf (_("Flags:"));
4852 if (entry->d_un.d_val == 0)
4853 printf (_(" None\n"));
4854 else
4856 unsigned long int val = entry->d_un.d_val;
4858 if (val & DF_P1_LAZYLOAD)
4860 printf (" LAZYLOAD");
4861 val ^= DF_P1_LAZYLOAD;
4863 if (val & DF_P1_GROUPPERM)
4865 printf (" GROUPPERM");
4866 val ^= DF_P1_GROUPPERM;
4868 if (val != 0)
4869 printf (" %lx", val);
4870 puts ("");
4873 break;
4875 case DT_FLAGS_1:
4876 if (do_dynamic)
4878 printf (_("Flags:"));
4879 if (entry->d_un.d_val == 0)
4880 printf (_(" None\n"));
4881 else
4883 unsigned long int val = entry->d_un.d_val;
4885 if (val & DF_1_NOW)
4887 printf (" NOW");
4888 val ^= DF_1_NOW;
4890 if (val & DF_1_GLOBAL)
4892 printf (" GLOBAL");
4893 val ^= DF_1_GLOBAL;
4895 if (val & DF_1_GROUP)
4897 printf (" GROUP");
4898 val ^= DF_1_GROUP;
4900 if (val & DF_1_NODELETE)
4902 printf (" NODELETE");
4903 val ^= DF_1_NODELETE;
4905 if (val & DF_1_LOADFLTR)
4907 printf (" LOADFLTR");
4908 val ^= DF_1_LOADFLTR;
4910 if (val & DF_1_INITFIRST)
4912 printf (" INITFIRST");
4913 val ^= DF_1_INITFIRST;
4915 if (val & DF_1_NOOPEN)
4917 printf (" NOOPEN");
4918 val ^= DF_1_NOOPEN;
4920 if (val & DF_1_ORIGIN)
4922 printf (" ORIGIN");
4923 val ^= DF_1_ORIGIN;
4925 if (val & DF_1_DIRECT)
4927 printf (" DIRECT");
4928 val ^= DF_1_DIRECT;
4930 if (val & DF_1_TRANS)
4932 printf (" TRANS");
4933 val ^= DF_1_TRANS;
4935 if (val & DF_1_INTERPOSE)
4937 printf (" INTERPOSE");
4938 val ^= DF_1_INTERPOSE;
4940 if (val & DF_1_NODEFLIB)
4942 printf (" NODEFLIB");
4943 val ^= DF_1_NODEFLIB;
4945 if (val & DF_1_NODUMP)
4947 printf (" NODUMP");
4948 val ^= DF_1_NODUMP;
4950 if (val & DF_1_CONLFAT)
4952 printf (" CONLFAT");
4953 val ^= DF_1_CONLFAT;
4955 if (val != 0)
4956 printf (" %lx", val);
4957 puts ("");
4960 break;
4962 case DT_PLTREL:
4963 if (do_dynamic)
4964 puts (get_dynamic_type (entry->d_un.d_val));
4965 break;
4967 case DT_NULL :
4968 case DT_NEEDED :
4969 case DT_PLTGOT :
4970 case DT_HASH :
4971 case DT_STRTAB :
4972 case DT_SYMTAB :
4973 case DT_RELA :
4974 case DT_INIT :
4975 case DT_FINI :
4976 case DT_SONAME :
4977 case DT_RPATH :
4978 case DT_SYMBOLIC:
4979 case DT_REL :
4980 case DT_DEBUG :
4981 case DT_TEXTREL :
4982 case DT_JMPREL :
4983 case DT_RUNPATH :
4984 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4986 if (do_dynamic)
4988 char *name;
4990 if (dynamic_strings == NULL)
4991 name = NULL;
4992 else
4993 name = dynamic_strings + entry->d_un.d_val;
4995 if (name)
4997 switch (entry->d_tag)
4999 case DT_NEEDED:
5000 printf (_("Shared library: [%s]"), name);
5002 if (strcmp (name, program_interpreter) == 0)
5003 printf (_(" program interpreter"));
5004 break;
5006 case DT_SONAME:
5007 printf (_("Library soname: [%s]"), name);
5008 break;
5010 case DT_RPATH:
5011 printf (_("Library rpath: [%s]"), name);
5012 break;
5014 case DT_RUNPATH:
5015 printf (_("Library runpath: [%s]"), name);
5016 break;
5018 default:
5019 print_vma (entry->d_un.d_val, PREFIX_HEX);
5020 break;
5023 else
5024 print_vma (entry->d_un.d_val, PREFIX_HEX);
5026 putchar ('\n');
5028 break;
5030 case DT_PLTRELSZ:
5031 case DT_RELASZ :
5032 case DT_STRSZ :
5033 case DT_RELSZ :
5034 case DT_RELAENT :
5035 case DT_SYMENT :
5036 case DT_RELENT :
5037 case DT_PLTPADSZ:
5038 case DT_MOVEENT :
5039 case DT_MOVESZ :
5040 case DT_INIT_ARRAYSZ:
5041 case DT_FINI_ARRAYSZ:
5042 case DT_GNU_CONFLICTSZ:
5043 case DT_GNU_LIBLISTSZ:
5044 if (do_dynamic)
5046 print_vma (entry->d_un.d_val, UNSIGNED);
5047 printf (" (bytes)\n");
5049 break;
5051 case DT_VERDEFNUM:
5052 case DT_VERNEEDNUM:
5053 case DT_RELACOUNT:
5054 case DT_RELCOUNT:
5055 if (do_dynamic)
5057 print_vma (entry->d_un.d_val, UNSIGNED);
5058 putchar ('\n');
5060 break;
5062 case DT_SYMINSZ:
5063 case DT_SYMINENT:
5064 case DT_SYMINFO:
5065 case DT_USED:
5066 case DT_INIT_ARRAY:
5067 case DT_FINI_ARRAY:
5068 if (do_dynamic)
5070 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
5072 char *name;
5074 name = dynamic_strings + entry->d_un.d_val;
5076 if (*name)
5078 printf (_("Not needed object: [%s]\n"), name);
5079 break;
5083 print_vma (entry->d_un.d_val, PREFIX_HEX);
5084 putchar ('\n');
5086 break;
5088 case DT_BIND_NOW:
5089 /* The value of this entry is ignored. */
5090 if (do_dynamic)
5091 putchar ('\n');
5092 break;
5094 case DT_GNU_PRELINKED:
5095 if (do_dynamic)
5097 struct tm *tmp;
5098 time_t time = entry->d_un.d_val;
5100 tmp = gmtime (&time);
5101 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5102 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5103 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5106 break;
5108 default:
5109 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5110 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5111 entry->d_un.d_val;
5113 if (do_dynamic)
5115 switch (elf_header.e_machine)
5117 case EM_MIPS:
5118 case EM_MIPS_RS3_LE:
5119 dynamic_segment_mips_val (entry);
5120 break;
5121 case EM_PARISC:
5122 dynamic_segment_parisc_val (entry);
5123 break;
5124 default:
5125 print_vma (entry->d_un.d_val, PREFIX_HEX);
5126 putchar ('\n');
5129 break;
5133 return 1;
5136 static char *
5137 get_ver_flags (flags)
5138 unsigned int flags;
5140 static char buff[32];
5142 buff[0] = 0;
5144 if (flags == 0)
5145 return _("none");
5147 if (flags & VER_FLG_BASE)
5148 strcat (buff, "BASE ");
5150 if (flags & VER_FLG_WEAK)
5152 if (flags & VER_FLG_BASE)
5153 strcat (buff, "| ");
5155 strcat (buff, "WEAK ");
5158 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5159 strcat (buff, "| <unknown>");
5161 return buff;
5164 /* Display the contents of the version sections. */
5165 static int
5166 process_version_sections (file)
5167 FILE *file;
5169 Elf_Internal_Shdr *section;
5170 unsigned i;
5171 int found = 0;
5173 if (! do_version)
5174 return 1;
5176 for (i = 0, section = section_headers;
5177 i < elf_header.e_shnum;
5178 i++, section++)
5180 switch (section->sh_type)
5182 case SHT_GNU_verdef:
5184 Elf_External_Verdef *edefs;
5185 unsigned int idx;
5186 unsigned int cnt;
5188 found = 1;
5190 printf
5191 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5192 SECTION_NAME (section), section->sh_info);
5194 printf (_(" Addr: 0x"));
5195 printf_vma (section->sh_addr);
5196 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5197 (unsigned long) section->sh_offset, section->sh_link,
5198 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5200 edefs = ((Elf_External_Verdef *)
5201 get_data (NULL, file, section->sh_offset,
5202 section->sh_size,
5203 _("version definition section")));
5204 if (!edefs)
5205 break;
5207 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5209 char *vstart;
5210 Elf_External_Verdef *edef;
5211 Elf_Internal_Verdef ent;
5212 Elf_External_Verdaux *eaux;
5213 Elf_Internal_Verdaux aux;
5214 int j;
5215 int isum;
5217 vstart = ((char *) edefs) + idx;
5219 edef = (Elf_External_Verdef *) vstart;
5221 ent.vd_version = BYTE_GET (edef->vd_version);
5222 ent.vd_flags = BYTE_GET (edef->vd_flags);
5223 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5224 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5225 ent.vd_hash = BYTE_GET (edef->vd_hash);
5226 ent.vd_aux = BYTE_GET (edef->vd_aux);
5227 ent.vd_next = BYTE_GET (edef->vd_next);
5229 printf (_(" %#06x: Rev: %d Flags: %s"),
5230 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5232 printf (_(" Index: %d Cnt: %d "),
5233 ent.vd_ndx, ent.vd_cnt);
5235 vstart += ent.vd_aux;
5237 eaux = (Elf_External_Verdaux *) vstart;
5239 aux.vda_name = BYTE_GET (eaux->vda_name);
5240 aux.vda_next = BYTE_GET (eaux->vda_next);
5242 if (dynamic_strings)
5243 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
5244 else
5245 printf (_("Name index: %ld\n"), aux.vda_name);
5247 isum = idx + ent.vd_aux;
5249 for (j = 1; j < ent.vd_cnt; j++)
5251 isum += aux.vda_next;
5252 vstart += aux.vda_next;
5254 eaux = (Elf_External_Verdaux *) vstart;
5256 aux.vda_name = BYTE_GET (eaux->vda_name);
5257 aux.vda_next = BYTE_GET (eaux->vda_next);
5259 if (dynamic_strings)
5260 printf (_(" %#06x: Parent %d: %s\n"),
5261 isum, j, dynamic_strings + aux.vda_name);
5262 else
5263 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5264 isum, j, aux.vda_name);
5267 idx += ent.vd_next;
5270 free (edefs);
5272 break;
5274 case SHT_GNU_verneed:
5276 Elf_External_Verneed *eneed;
5277 unsigned int idx;
5278 unsigned int cnt;
5280 found = 1;
5282 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5283 SECTION_NAME (section), section->sh_info);
5285 printf (_(" Addr: 0x"));
5286 printf_vma (section->sh_addr);
5287 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5288 (unsigned long) section->sh_offset, section->sh_link,
5289 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5291 eneed = ((Elf_External_Verneed *)
5292 get_data (NULL, file, section->sh_offset,
5293 section->sh_size, _("version need section")));
5294 if (!eneed)
5295 break;
5297 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5299 Elf_External_Verneed *entry;
5300 Elf_Internal_Verneed ent;
5301 int j;
5302 int isum;
5303 char *vstart;
5305 vstart = ((char *) eneed) + idx;
5307 entry = (Elf_External_Verneed *) vstart;
5309 ent.vn_version = BYTE_GET (entry->vn_version);
5310 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5311 ent.vn_file = BYTE_GET (entry->vn_file);
5312 ent.vn_aux = BYTE_GET (entry->vn_aux);
5313 ent.vn_next = BYTE_GET (entry->vn_next);
5315 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
5317 if (dynamic_strings)
5318 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
5319 else
5320 printf (_(" File: %lx"), ent.vn_file);
5322 printf (_(" Cnt: %d\n"), ent.vn_cnt);
5324 vstart += ent.vn_aux;
5326 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
5328 Elf_External_Vernaux *eaux;
5329 Elf_Internal_Vernaux aux;
5331 eaux = (Elf_External_Vernaux *) vstart;
5333 aux.vna_hash = BYTE_GET (eaux->vna_hash);
5334 aux.vna_flags = BYTE_GET (eaux->vna_flags);
5335 aux.vna_other = BYTE_GET (eaux->vna_other);
5336 aux.vna_name = BYTE_GET (eaux->vna_name);
5337 aux.vna_next = BYTE_GET (eaux->vna_next);
5339 if (dynamic_strings)
5340 printf (_(" %#06x: Name: %s"),
5341 isum, dynamic_strings + aux.vna_name);
5342 else
5343 printf (_(" %#06x: Name index: %lx"),
5344 isum, aux.vna_name);
5346 printf (_(" Flags: %s Version: %d\n"),
5347 get_ver_flags (aux.vna_flags), aux.vna_other);
5349 isum += aux.vna_next;
5350 vstart += aux.vna_next;
5353 idx += ent.vn_next;
5356 free (eneed);
5358 break;
5360 case SHT_GNU_versym:
5362 Elf_Internal_Shdr *link_section;
5363 int total;
5364 int cnt;
5365 unsigned char *edata;
5366 unsigned short *data;
5367 char *strtab;
5368 Elf_Internal_Sym *symbols;
5369 Elf_Internal_Shdr *string_sec;
5371 link_section = SECTION_HEADER (section->sh_link);
5372 total = section->sh_size / section->sh_entsize;
5374 found = 1;
5376 symbols = GET_ELF_SYMBOLS (file, link_section);
5378 string_sec = SECTION_HEADER (link_section->sh_link);
5380 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5381 string_sec->sh_size,
5382 _("version string table"));
5383 if (!strtab)
5384 break;
5386 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5387 SECTION_NAME (section), total);
5389 printf (_(" Addr: "));
5390 printf_vma (section->sh_addr);
5391 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5392 (unsigned long) section->sh_offset, section->sh_link,
5393 SECTION_NAME (link_section));
5395 edata =
5396 ((unsigned char *)
5397 get_data (NULL, file,
5398 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5399 total * sizeof (short), _("version symbol data")));
5400 if (!edata)
5402 free (strtab);
5403 break;
5406 data = (unsigned short *) malloc (total * sizeof (short));
5408 for (cnt = total; cnt --;)
5409 data[cnt] = byte_get (edata + cnt * sizeof (short),
5410 sizeof (short));
5412 free (edata);
5414 for (cnt = 0; cnt < total; cnt += 4)
5416 int j, nn;
5417 int check_def, check_need;
5418 char *name;
5420 printf (" %03x:", cnt);
5422 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5423 switch (data[cnt + j])
5425 case 0:
5426 fputs (_(" 0 (*local*) "), stdout);
5427 break;
5429 case 1:
5430 fputs (_(" 1 (*global*) "), stdout);
5431 break;
5433 default:
5434 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
5435 data[cnt + j] & 0x8000 ? 'h' : ' ');
5437 check_def = 1;
5438 check_need = 1;
5439 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
5440 != SHT_NOBITS)
5442 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
5443 check_def = 0;
5444 else
5445 check_need = 0;
5448 if (check_need
5449 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
5451 Elf_Internal_Verneed ivn;
5452 unsigned long offset;
5454 offset = version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5455 - loadaddr;
5459 Elf_Internal_Vernaux ivna;
5460 Elf_External_Verneed evn;
5461 Elf_External_Vernaux evna;
5462 unsigned long a_off;
5464 get_data (&evn, file, offset, sizeof (evn),
5465 _("version need"));
5467 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5468 ivn.vn_next = BYTE_GET (evn.vn_next);
5470 a_off = offset + ivn.vn_aux;
5474 get_data (&evna, file, a_off, sizeof (evna),
5475 _("version need aux (2)"));
5477 ivna.vna_next = BYTE_GET (evna.vna_next);
5478 ivna.vna_other = BYTE_GET (evna.vna_other);
5480 a_off += ivna.vna_next;
5482 while (ivna.vna_other != data[cnt + j]
5483 && ivna.vna_next != 0);
5485 if (ivna.vna_other == data[cnt + j])
5487 ivna.vna_name = BYTE_GET (evna.vna_name);
5489 name = strtab + ivna.vna_name;
5490 nn += printf ("(%s%-*s",
5491 name,
5492 12 - (int) strlen (name),
5493 ")");
5494 check_def = 0;
5495 break;
5498 offset += ivn.vn_next;
5500 while (ivn.vn_next);
5503 if (check_def && data[cnt + j] != 0x8001
5504 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5506 Elf_Internal_Verdef ivd;
5507 Elf_External_Verdef evd;
5508 unsigned long offset;
5510 offset = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5511 - loadaddr);
5515 get_data (&evd, file, offset, sizeof (evd),
5516 _("version def"));
5518 ivd.vd_next = BYTE_GET (evd.vd_next);
5519 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5521 offset += ivd.vd_next;
5523 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
5524 && ivd.vd_next != 0);
5526 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
5528 Elf_External_Verdaux evda;
5529 Elf_Internal_Verdaux ivda;
5531 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5533 get_data (&evda, file,
5534 offset - ivd.vd_next + ivd.vd_aux,
5535 sizeof (evda), _("version def aux"));
5537 ivda.vda_name = BYTE_GET (evda.vda_name);
5539 name = strtab + ivda.vda_name;
5540 nn += printf ("(%s%-*s",
5541 name,
5542 12 - (int) strlen (name),
5543 ")");
5547 if (nn < 18)
5548 printf ("%*c", 18 - nn, ' ');
5551 putchar ('\n');
5554 free (data);
5555 free (strtab);
5556 free (symbols);
5558 break;
5560 default:
5561 break;
5565 if (! found)
5566 printf (_("\nNo version information found in this file.\n"));
5568 return 1;
5571 static const char *
5572 get_symbol_binding (binding)
5573 unsigned int binding;
5575 static char buff[32];
5577 switch (binding)
5579 case STB_LOCAL: return "LOCAL";
5580 case STB_GLOBAL: return "GLOBAL";
5581 case STB_WEAK: return "WEAK";
5582 default:
5583 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5584 sprintf (buff, _("<processor specific>: %d"), binding);
5585 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5586 sprintf (buff, _("<OS specific>: %d"), binding);
5587 else
5588 sprintf (buff, _("<unknown>: %d"), binding);
5589 return buff;
5593 static const char *
5594 get_symbol_type (type)
5595 unsigned int type;
5597 static char buff[32];
5599 switch (type)
5601 case STT_NOTYPE: return "NOTYPE";
5602 case STT_OBJECT: return "OBJECT";
5603 case STT_FUNC: return "FUNC";
5604 case STT_SECTION: return "SECTION";
5605 case STT_FILE: return "FILE";
5606 case STT_COMMON: return "COMMON";
5607 case STT_TLS: return "TLS";
5608 default:
5609 if (type >= STT_LOPROC && type <= STT_HIPROC)
5611 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5612 return "THUMB_FUNC";
5614 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5615 return "REGISTER";
5617 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5618 return "PARISC_MILLI";
5620 sprintf (buff, _("<processor specific>: %d"), type);
5622 else if (type >= STT_LOOS && type <= STT_HIOS)
5624 if (elf_header.e_machine == EM_PARISC)
5626 if (type == STT_HP_OPAQUE)
5627 return "HP_OPAQUE";
5628 if (type == STT_HP_STUB)
5629 return "HP_STUB";
5632 sprintf (buff, _("<OS specific>: %d"), type);
5634 else
5635 sprintf (buff, _("<unknown>: %d"), type);
5636 return buff;
5640 static const char *
5641 get_symbol_visibility (visibility)
5642 unsigned int visibility;
5644 switch (visibility)
5646 case STV_DEFAULT: return "DEFAULT";
5647 case STV_INTERNAL: return "INTERNAL";
5648 case STV_HIDDEN: return "HIDDEN";
5649 case STV_PROTECTED: return "PROTECTED";
5650 default: abort ();
5654 static const char *
5655 get_symbol_index_type (type)
5656 unsigned int type;
5658 static char buff[32];
5660 switch (type)
5662 case SHN_UNDEF: return "UND";
5663 case SHN_ABS: return "ABS";
5664 case SHN_COMMON: return "COM";
5665 default:
5666 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5667 sprintf (buff, "PRC[0x%04x]", type);
5668 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5669 sprintf (buff, "OS [0x%04x]", type);
5670 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5671 sprintf (buff, "RSV[0x%04x]", type);
5672 else
5673 sprintf (buff, "%3d", type);
5674 break;
5677 return buff;
5680 static int *
5681 get_dynamic_data (file, number)
5682 FILE *file;
5683 unsigned int number;
5685 unsigned char *e_data;
5686 int *i_data;
5688 e_data = (unsigned char *) malloc (number * 4);
5690 if (e_data == NULL)
5692 error (_("Out of memory\n"));
5693 return NULL;
5696 if (fread (e_data, 4, number, file) != number)
5698 error (_("Unable to read in dynamic data\n"));
5699 return NULL;
5702 i_data = (int *) malloc (number * sizeof (*i_data));
5704 if (i_data == NULL)
5706 error (_("Out of memory\n"));
5707 free (e_data);
5708 return NULL;
5711 while (number--)
5712 i_data[number] = byte_get (e_data + number * 4, 4);
5714 free (e_data);
5716 return i_data;
5719 /* Dump the symbol table. */
5720 static int
5721 process_symbol_table (file)
5722 FILE *file;
5724 Elf_Internal_Shdr *section;
5725 unsigned char nb[4];
5726 unsigned char nc[4];
5727 int nbuckets = 0;
5728 int nchains = 0;
5729 int *buckets = NULL;
5730 int *chains = NULL;
5732 if (! do_syms && !do_histogram)
5733 return 1;
5735 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5736 || do_histogram))
5738 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5740 error (_("Unable to seek to start of dynamic information"));
5741 return 0;
5744 if (fread (nb, sizeof (nb), 1, file) != 1)
5746 error (_("Failed to read in number of buckets\n"));
5747 return 0;
5750 if (fread (nc, sizeof (nc), 1, file) != 1)
5752 error (_("Failed to read in number of chains\n"));
5753 return 0;
5756 nbuckets = byte_get (nb, 4);
5757 nchains = byte_get (nc, 4);
5759 buckets = get_dynamic_data (file, nbuckets);
5760 chains = get_dynamic_data (file, nchains);
5762 if (buckets == NULL || chains == NULL)
5763 return 0;
5766 if (do_syms
5767 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5769 int hn;
5770 int si;
5772 printf (_("\nSymbol table for image:\n"));
5773 if (is_32bit_elf)
5774 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5775 else
5776 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5778 for (hn = 0; hn < nbuckets; hn++)
5780 if (! buckets[hn])
5781 continue;
5783 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
5785 Elf_Internal_Sym *psym;
5787 psym = dynamic_symbols + si;
5789 printf (" %3d %3d: ", si, hn);
5790 print_vma (psym->st_value, LONG_HEX);
5791 putchar (' ' );
5792 print_vma (psym->st_size, DEC_5);
5794 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5795 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5796 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5797 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5798 print_symbol (25, dynamic_strings + psym->st_name);
5799 putchar ('\n');
5803 else if (do_syms && !do_using_dynamic)
5805 unsigned int i;
5807 for (i = 0, section = section_headers;
5808 i < elf_header.e_shnum;
5809 i++, section++)
5811 unsigned int si;
5812 char *strtab;
5813 Elf_Internal_Sym *symtab;
5814 Elf_Internal_Sym *psym;
5817 if ( section->sh_type != SHT_SYMTAB
5818 && section->sh_type != SHT_DYNSYM)
5819 continue;
5821 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5822 SECTION_NAME (section),
5823 (unsigned long) (section->sh_size / section->sh_entsize));
5824 if (is_32bit_elf)
5825 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5826 else
5827 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5829 symtab = GET_ELF_SYMBOLS (file, section);
5830 if (symtab == NULL)
5831 continue;
5833 if (section->sh_link == elf_header.e_shstrndx)
5834 strtab = string_table;
5835 else
5837 Elf_Internal_Shdr *string_sec;
5839 string_sec = SECTION_HEADER (section->sh_link);
5841 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5842 string_sec->sh_size,
5843 _("string table"));
5846 for (si = 0, psym = symtab;
5847 si < section->sh_size / section->sh_entsize;
5848 si++, psym++)
5850 printf ("%6d: ", si);
5851 print_vma (psym->st_value, LONG_HEX);
5852 putchar (' ');
5853 print_vma (psym->st_size, DEC_5);
5854 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5855 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5856 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5857 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5858 print_symbol (25, strtab + psym->st_name);
5860 if (section->sh_type == SHT_DYNSYM &&
5861 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5863 unsigned char data[2];
5864 unsigned short vers_data;
5865 unsigned long offset;
5866 int is_nobits;
5867 int check_def;
5869 offset = version_info[DT_VERSIONTAGIDX (DT_VERSYM)]
5870 - loadaddr;
5872 get_data (&data, file, offset + si * sizeof (vers_data),
5873 sizeof (data), _("version data"));
5875 vers_data = byte_get (data, 2);
5877 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5878 == SHT_NOBITS);
5880 check_def = (psym->st_shndx != SHN_UNDEF);
5882 if ((vers_data & 0x8000) || vers_data > 1)
5884 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5885 && (is_nobits || ! check_def))
5887 Elf_External_Verneed evn;
5888 Elf_Internal_Verneed ivn;
5889 Elf_Internal_Vernaux ivna;
5891 /* We must test both. */
5892 offset = (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5893 - loadaddr);
5897 unsigned long vna_off;
5899 get_data (&evn, file, offset, sizeof (evn),
5900 _("version need"));
5902 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5903 ivn.vn_next = BYTE_GET (evn.vn_next);
5905 vna_off = offset + ivn.vn_aux;
5909 Elf_External_Vernaux evna;
5911 get_data (&evna, file, vna_off,
5912 sizeof (evna),
5913 _("version need aux (3)"));
5915 ivna.vna_other = BYTE_GET (evna.vna_other);
5916 ivna.vna_next = BYTE_GET (evna.vna_next);
5917 ivna.vna_name = BYTE_GET (evna.vna_name);
5919 vna_off += ivna.vna_next;
5921 while (ivna.vna_other != vers_data
5922 && ivna.vna_next != 0);
5924 if (ivna.vna_other == vers_data)
5925 break;
5927 offset += ivn.vn_next;
5929 while (ivn.vn_next != 0);
5931 if (ivna.vna_other == vers_data)
5933 printf ("@%s (%d)",
5934 strtab + ivna.vna_name, ivna.vna_other);
5935 check_def = 0;
5937 else if (! is_nobits)
5938 error (_("bad dynamic symbol"));
5939 else
5940 check_def = 1;
5943 if (check_def)
5945 if (vers_data != 0x8001
5946 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5948 Elf_Internal_Verdef ivd;
5949 Elf_Internal_Verdaux ivda;
5950 Elf_External_Verdaux evda;
5951 unsigned long offset;
5953 offset
5954 = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5955 - loadaddr);
5959 Elf_External_Verdef evd;
5961 get_data (&evd, file, offset, sizeof (evd),
5962 _("version def"));
5964 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5965 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5966 ivd.vd_next = BYTE_GET (evd.vd_next);
5968 offset += ivd.vd_next;
5970 while (ivd.vd_ndx != (vers_data & 0x7fff)
5971 && ivd.vd_next != 0);
5973 offset -= ivd.vd_next;
5974 offset += ivd.vd_aux;
5976 get_data (&evda, file, offset, sizeof (evda),
5977 _("version def aux"));
5979 ivda.vda_name = BYTE_GET (evda.vda_name);
5981 if (psym->st_name != ivda.vda_name)
5982 printf ((vers_data & 0x8000)
5983 ? "@%s" : "@@%s",
5984 strtab + ivda.vda_name);
5990 putchar ('\n');
5993 free (symtab);
5994 if (strtab != string_table)
5995 free (strtab);
5998 else if (do_syms)
5999 printf
6000 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6002 if (do_histogram && buckets != NULL)
6004 int *lengths;
6005 int *counts;
6006 int hn;
6007 int si;
6008 int maxlength = 0;
6009 int nzero_counts = 0;
6010 int nsyms = 0;
6012 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6013 nbuckets);
6014 printf (_(" Length Number %% of total Coverage\n"));
6016 lengths = (int *) calloc (nbuckets, sizeof (int));
6017 if (lengths == NULL)
6019 error (_("Out of memory"));
6020 return 0;
6022 for (hn = 0; hn < nbuckets; ++hn)
6024 if (! buckets[hn])
6025 continue;
6027 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
6029 ++nsyms;
6030 if (maxlength < ++lengths[hn])
6031 ++maxlength;
6035 counts = (int *) calloc (maxlength + 1, sizeof (int));
6036 if (counts == NULL)
6038 error (_("Out of memory"));
6039 return 0;
6042 for (hn = 0; hn < nbuckets; ++hn)
6043 ++counts[lengths[hn]];
6045 if (nbuckets > 0)
6047 printf (" 0 %-10d (%5.1f%%)\n",
6048 counts[0], (counts[0] * 100.0) / nbuckets);
6049 for (si = 1; si <= maxlength; ++si)
6051 nzero_counts += counts[si] * si;
6052 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6053 si, counts[si], (counts[si] * 100.0) / nbuckets,
6054 (nzero_counts * 100.0) / nsyms);
6058 free (counts);
6059 free (lengths);
6062 if (buckets != NULL)
6064 free (buckets);
6065 free (chains);
6068 return 1;
6071 static int
6072 process_syminfo (file)
6073 FILE *file ATTRIBUTE_UNUSED;
6075 unsigned int i;
6077 if (dynamic_syminfo == NULL
6078 || !do_dynamic)
6079 /* No syminfo, this is ok. */
6080 return 1;
6082 /* There better should be a dynamic symbol section. */
6083 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6084 return 0;
6086 if (dynamic_addr)
6087 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6088 dynamic_syminfo_offset, dynamic_syminfo_nent);
6090 printf (_(" Num: Name BoundTo Flags\n"));
6091 for (i = 0; i < dynamic_syminfo_nent; ++i)
6093 unsigned short int flags = dynamic_syminfo[i].si_flags;
6095 printf ("%4d: ", i);
6096 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
6097 putchar (' ');
6099 switch (dynamic_syminfo[i].si_boundto)
6101 case SYMINFO_BT_SELF:
6102 fputs ("SELF ", stdout);
6103 break;
6104 case SYMINFO_BT_PARENT:
6105 fputs ("PARENT ", stdout);
6106 break;
6107 default:
6108 if (dynamic_syminfo[i].si_boundto > 0
6109 && dynamic_syminfo[i].si_boundto < dynamic_size)
6111 print_symbol (10,
6112 dynamic_strings
6113 + (dynamic_segment
6114 [dynamic_syminfo[i].si_boundto].d_un.d_val));
6115 putchar (' ' );
6117 else
6118 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6119 break;
6122 if (flags & SYMINFO_FLG_DIRECT)
6123 printf (" DIRECT");
6124 if (flags & SYMINFO_FLG_PASSTHRU)
6125 printf (" PASSTHRU");
6126 if (flags & SYMINFO_FLG_COPY)
6127 printf (" COPY");
6128 if (flags & SYMINFO_FLG_LAZYLOAD)
6129 printf (" LAZYLOAD");
6131 puts ("");
6134 return 1;
6137 #ifdef SUPPORT_DISASSEMBLY
6138 static void
6139 disassemble_section (section, file)
6140 Elf_Internal_Shdr *section;
6141 FILE *file;
6143 printf (_("\nAssembly dump of section %s\n"),
6144 SECTION_NAME (section));
6146 /* XXX -- to be done --- XXX */
6148 return 1;
6150 #endif
6152 static int
6153 dump_section (section, file)
6154 Elf_Internal_Shdr *section;
6155 FILE *file;
6157 bfd_size_type bytes;
6158 bfd_vma addr;
6159 unsigned char *data;
6160 unsigned char *start;
6162 bytes = section->sh_size;
6164 if (bytes == 0)
6166 printf (_("\nSection '%s' has no data to dump.\n"),
6167 SECTION_NAME (section));
6168 return 0;
6170 else
6171 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6173 addr = section->sh_addr;
6175 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
6176 _("section data"));
6177 if (!start)
6178 return 0;
6180 data = start;
6182 while (bytes)
6184 int j;
6185 int k;
6186 int lbytes;
6188 lbytes = (bytes > 16 ? 16 : bytes);
6190 printf (" 0x%8.8lx ", (unsigned long) addr);
6192 switch (elf_header.e_ident[EI_DATA])
6194 default:
6195 case ELFDATA2LSB:
6196 for (j = 15; j >= 0; j --)
6198 if (j < lbytes)
6199 printf ("%2.2x", data[j]);
6200 else
6201 printf (" ");
6203 if (!(j & 0x3))
6204 printf (" ");
6206 break;
6208 case ELFDATA2MSB:
6209 for (j = 0; j < 16; j++)
6211 if (j < lbytes)
6212 printf ("%2.2x", data[j]);
6213 else
6214 printf (" ");
6216 if ((j & 3) == 3)
6217 printf (" ");
6219 break;
6222 for (j = 0; j < lbytes; j++)
6224 k = data[j];
6225 if (k >= ' ' && k < 0x80)
6226 printf ("%c", k);
6227 else
6228 printf (".");
6231 putchar ('\n');
6233 data += lbytes;
6234 addr += lbytes;
6235 bytes -= lbytes;
6238 free (start);
6240 return 1;
6244 static unsigned long int
6245 read_leb128 (data, length_return, sign)
6246 unsigned char *data;
6247 int *length_return;
6248 int sign;
6250 unsigned long int result = 0;
6251 unsigned int num_read = 0;
6252 int shift = 0;
6253 unsigned char byte;
6257 byte = *data++;
6258 num_read++;
6260 result |= (byte & 0x7f) << shift;
6262 shift += 7;
6265 while (byte & 0x80);
6267 if (length_return != NULL)
6268 *length_return = num_read;
6270 if (sign && (shift < 32) && (byte & 0x40))
6271 result |= -1 << shift;
6273 return result;
6276 typedef struct State_Machine_Registers
6278 unsigned long address;
6279 unsigned int file;
6280 unsigned int line;
6281 unsigned int column;
6282 int is_stmt;
6283 int basic_block;
6284 int end_sequence;
6285 /* This variable hold the number of the last entry seen
6286 in the File Table. */
6287 unsigned int last_file_entry;
6288 } SMR;
6290 static SMR state_machine_regs;
6292 static void
6293 reset_state_machine (is_stmt)
6294 int is_stmt;
6296 state_machine_regs.address = 0;
6297 state_machine_regs.file = 1;
6298 state_machine_regs.line = 1;
6299 state_machine_regs.column = 0;
6300 state_machine_regs.is_stmt = is_stmt;
6301 state_machine_regs.basic_block = 0;
6302 state_machine_regs.end_sequence = 0;
6303 state_machine_regs.last_file_entry = 0;
6306 /* Handled an extend line op. Returns true if this is the end
6307 of sequence. */
6308 static int
6309 process_extended_line_op (data, is_stmt, pointer_size)
6310 unsigned char *data;
6311 int is_stmt;
6312 int pointer_size;
6314 unsigned char op_code;
6315 int bytes_read;
6316 unsigned int len;
6317 unsigned char *name;
6318 unsigned long adr;
6320 len = read_leb128 (data, & bytes_read, 0);
6321 data += bytes_read;
6323 if (len == 0)
6325 warn (_("badly formed extended line op encountered!\n"));
6326 return bytes_read;
6329 len += bytes_read;
6330 op_code = *data++;
6332 printf (_(" Extended opcode %d: "), op_code);
6334 switch (op_code)
6336 case DW_LNE_end_sequence:
6337 printf (_("End of Sequence\n\n"));
6338 reset_state_machine (is_stmt);
6339 break;
6341 case DW_LNE_set_address:
6342 adr = byte_get (data, pointer_size);
6343 printf (_("set Address to 0x%lx\n"), adr);
6344 state_machine_regs.address = adr;
6345 break;
6347 case DW_LNE_define_file:
6348 printf (_(" define new File Table entry\n"));
6349 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6351 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6352 name = data;
6353 data += strlen ((char *) data) + 1;
6354 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6355 data += bytes_read;
6356 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6357 data += bytes_read;
6358 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6359 printf (_("%s\n\n"), name);
6360 break;
6362 default:
6363 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6364 break;
6367 return len;
6370 /* Size of pointers in the .debug_line section. This information is not
6371 really present in that section. It's obtained before dumping the debug
6372 sections by doing some pre-scan of the .debug_info section. */
6373 static int debug_line_pointer_size = 4;
6375 static int
6376 display_debug_lines (section, start, file)
6377 Elf_Internal_Shdr *section;
6378 unsigned char * start;
6379 FILE *file ATTRIBUTE_UNUSED;
6381 DWARF2_External_LineInfo *external;
6382 DWARF2_Internal_LineInfo info;
6383 unsigned char *standard_opcodes;
6384 unsigned char *data = start;
6385 unsigned char *end = start + section->sh_size;
6386 unsigned char *end_of_sequence;
6387 int i;
6389 printf (_("\nDump of debug contents of section %s:\n\n"),
6390 SECTION_NAME (section));
6392 while (data < end)
6394 external = (DWARF2_External_LineInfo *) data;
6396 /* Check the length of the block. */
6397 info.li_length = BYTE_GET (external->li_length);
6399 if (info.li_length == 0xffffffff)
6401 warn (_("64-bit DWARF line info is not supported yet.\n"));
6402 break;
6405 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6407 warn
6408 (_("The line info appears to be corrupt - the section is too small\n"));
6409 return 0;
6412 /* Check its version number. */
6413 info.li_version = BYTE_GET (external->li_version);
6414 if (info.li_version != 2)
6416 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6417 return 0;
6420 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6421 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6422 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6423 info.li_line_base = BYTE_GET (external->li_line_base);
6424 info.li_line_range = BYTE_GET (external->li_line_range);
6425 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6427 /* Sign extend the line base field. */
6428 info.li_line_base <<= 24;
6429 info.li_line_base >>= 24;
6431 printf (_(" Length: %ld\n"), info.li_length);
6432 printf (_(" DWARF Version: %d\n"), info.li_version);
6433 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6434 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6435 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6436 printf (_(" Line Base: %d\n"), info.li_line_base);
6437 printf (_(" Line Range: %d\n"), info.li_line_range);
6438 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6440 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6442 reset_state_machine (info.li_default_is_stmt);
6444 /* Display the contents of the Opcodes table. */
6445 standard_opcodes = data + sizeof (*external);
6447 printf (_("\n Opcodes:\n"));
6449 for (i = 1; i < info.li_opcode_base; i++)
6450 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6452 /* Display the contents of the Directory table. */
6453 data = standard_opcodes + info.li_opcode_base - 1;
6455 if (*data == 0)
6456 printf (_("\n The Directory Table is empty.\n"));
6457 else
6459 printf (_("\n The Directory Table:\n"));
6461 while (*data != 0)
6463 printf (_(" %s\n"), data);
6465 data += strlen ((char *) data) + 1;
6469 /* Skip the NUL at the end of the table. */
6470 data++;
6472 /* Display the contents of the File Name table. */
6473 if (*data == 0)
6474 printf (_("\n The File Name Table is empty.\n"));
6475 else
6477 printf (_("\n The File Name Table:\n"));
6478 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6480 while (*data != 0)
6482 unsigned char *name;
6483 int bytes_read;
6485 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6486 name = data;
6488 data += strlen ((char *) data) + 1;
6490 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6491 data += bytes_read;
6492 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6493 data += bytes_read;
6494 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6495 data += bytes_read;
6496 printf (_("%s\n"), name);
6500 /* Skip the NUL at the end of the table. */
6501 data++;
6503 /* Now display the statements. */
6504 printf (_("\n Line Number Statements:\n"));
6507 while (data < end_of_sequence)
6509 unsigned char op_code;
6510 int adv;
6511 int bytes_read;
6513 op_code = *data++;
6515 if (op_code >= info.li_opcode_base)
6517 op_code -= info.li_opcode_base;
6518 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6519 state_machine_regs.address += adv;
6520 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6521 op_code, adv, state_machine_regs.address);
6522 adv = (op_code % info.li_line_range) + info.li_line_base;
6523 state_machine_regs.line += adv;
6524 printf (_(" and Line by %d to %d\n"),
6525 adv, state_machine_regs.line);
6527 else switch (op_code)
6529 case DW_LNS_extended_op:
6530 data += process_extended_line_op (data, info.li_default_is_stmt,
6531 debug_line_pointer_size);
6532 break;
6534 case DW_LNS_copy:
6535 printf (_(" Copy\n"));
6536 break;
6538 case DW_LNS_advance_pc:
6539 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6540 data += bytes_read;
6541 state_machine_regs.address += adv;
6542 printf (_(" Advance PC by %d to %lx\n"), adv,
6543 state_machine_regs.address);
6544 break;
6546 case DW_LNS_advance_line:
6547 adv = read_leb128 (data, & bytes_read, 1);
6548 data += bytes_read;
6549 state_machine_regs.line += adv;
6550 printf (_(" Advance Line by %d to %d\n"), adv,
6551 state_machine_regs.line);
6552 break;
6554 case DW_LNS_set_file:
6555 adv = read_leb128 (data, & bytes_read, 0);
6556 data += bytes_read;
6557 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6558 adv);
6559 state_machine_regs.file = adv;
6560 break;
6562 case DW_LNS_set_column:
6563 adv = read_leb128 (data, & bytes_read, 0);
6564 data += bytes_read;
6565 printf (_(" Set column to %d\n"), adv);
6566 state_machine_regs.column = adv;
6567 break;
6569 case DW_LNS_negate_stmt:
6570 adv = state_machine_regs.is_stmt;
6571 adv = ! adv;
6572 printf (_(" Set is_stmt to %d\n"), adv);
6573 state_machine_regs.is_stmt = adv;
6574 break;
6576 case DW_LNS_set_basic_block:
6577 printf (_(" Set basic block\n"));
6578 state_machine_regs.basic_block = 1;
6579 break;
6581 case DW_LNS_const_add_pc:
6582 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6583 * info.li_min_insn_length);
6584 state_machine_regs.address += adv;
6585 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6586 state_machine_regs.address);
6587 break;
6589 case DW_LNS_fixed_advance_pc:
6590 adv = byte_get (data, 2);
6591 data += 2;
6592 state_machine_regs.address += adv;
6593 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6594 adv, state_machine_regs.address);
6595 break;
6597 case DW_LNS_set_prologue_end:
6598 printf (_(" Set prologue_end to true\n"));
6599 break;
6601 case DW_LNS_set_epilogue_begin:
6602 printf (_(" Set epilogue_begin to true\n"));
6603 break;
6605 case DW_LNS_set_isa:
6606 adv = read_leb128 (data, & bytes_read, 0);
6607 data += bytes_read;
6608 printf (_(" Set ISA to %d\n"), adv);
6609 break;
6611 default:
6612 printf (_(" Unknown opcode %d with operands: "), op_code);
6614 int i;
6615 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6617 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6618 i == 1 ? "" : ", ");
6619 data += bytes_read;
6621 putchar ('\n');
6623 break;
6626 putchar ('\n');
6629 return 1;
6632 static int
6633 display_debug_pubnames (section, start, file)
6634 Elf_Internal_Shdr *section;
6635 unsigned char *start;
6636 FILE *file ATTRIBUTE_UNUSED;
6638 DWARF2_External_PubNames *external;
6639 DWARF2_Internal_PubNames pubnames;
6640 unsigned char *end;
6642 end = start + section->sh_size;
6644 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6646 while (start < end)
6648 unsigned char *data;
6649 unsigned long offset;
6651 external = (DWARF2_External_PubNames *) start;
6653 pubnames.pn_length = BYTE_GET (external->pn_length);
6654 pubnames.pn_version = BYTE_GET (external->pn_version);
6655 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6656 pubnames.pn_size = BYTE_GET (external->pn_size);
6658 data = start + sizeof (*external);
6659 start += pubnames.pn_length + sizeof (external->pn_length);
6661 if (pubnames.pn_length == 0xffffffff)
6663 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6664 break;
6667 if (pubnames.pn_version != 2)
6669 static int warned = 0;
6671 if (! warned)
6673 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6674 warned = 1;
6677 continue;
6680 printf (_(" Length: %ld\n"),
6681 pubnames.pn_length);
6682 printf (_(" Version: %d\n"),
6683 pubnames.pn_version);
6684 printf (_(" Offset into .debug_info section: %ld\n"),
6685 pubnames.pn_offset);
6686 printf (_(" Size of area in .debug_info section: %ld\n"),
6687 pubnames.pn_size);
6689 printf (_("\n Offset\tName\n"));
6693 offset = byte_get (data, 4);
6695 if (offset != 0)
6697 data += 4;
6698 printf (" %ld\t\t%s\n", offset, data);
6699 data += strlen ((char *) data) + 1;
6702 while (offset != 0);
6705 printf ("\n");
6706 return 1;
6709 static char *
6710 get_TAG_name (tag)
6711 unsigned long tag;
6713 switch (tag)
6715 case DW_TAG_padding: return "DW_TAG_padding";
6716 case DW_TAG_array_type: return "DW_TAG_array_type";
6717 case DW_TAG_class_type: return "DW_TAG_class_type";
6718 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6719 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6720 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6721 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6722 case DW_TAG_label: return "DW_TAG_label";
6723 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6724 case DW_TAG_member: return "DW_TAG_member";
6725 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6726 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6727 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6728 case DW_TAG_string_type: return "DW_TAG_string_type";
6729 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6730 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6731 case DW_TAG_typedef: return "DW_TAG_typedef";
6732 case DW_TAG_union_type: return "DW_TAG_union_type";
6733 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6734 case DW_TAG_variant: return "DW_TAG_variant";
6735 case DW_TAG_common_block: return "DW_TAG_common_block";
6736 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6737 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6738 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6739 case DW_TAG_module: return "DW_TAG_module";
6740 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6741 case DW_TAG_set_type: return "DW_TAG_set_type";
6742 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6743 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6744 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6745 case DW_TAG_base_type: return "DW_TAG_base_type";
6746 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6747 case DW_TAG_const_type: return "DW_TAG_const_type";
6748 case DW_TAG_constant: return "DW_TAG_constant";
6749 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6750 case DW_TAG_file_type: return "DW_TAG_file_type";
6751 case DW_TAG_friend: return "DW_TAG_friend";
6752 case DW_TAG_namelist: return "DW_TAG_namelist";
6753 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6754 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6755 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6756 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6757 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6758 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6759 case DW_TAG_try_block: return "DW_TAG_try_block";
6760 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6761 case DW_TAG_variable: return "DW_TAG_variable";
6762 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6763 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6764 case DW_TAG_format_label: return "DW_TAG_format_label";
6765 case DW_TAG_function_template: return "DW_TAG_function_template";
6766 case DW_TAG_class_template: return "DW_TAG_class_template";
6767 /* DWARF 2.1 values. */
6768 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6769 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6770 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6771 case DW_TAG_namespace: return "DW_TAG_namespace";
6772 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6773 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6774 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6775 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6776 /* UPC values. */
6777 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
6778 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
6779 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
6780 default:
6782 static char buffer[100];
6784 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6785 return buffer;
6790 static char *
6791 get_AT_name (attribute)
6792 unsigned long attribute;
6794 switch (attribute)
6796 case DW_AT_sibling: return "DW_AT_sibling";
6797 case DW_AT_location: return "DW_AT_location";
6798 case DW_AT_name: return "DW_AT_name";
6799 case DW_AT_ordering: return "DW_AT_ordering";
6800 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6801 case DW_AT_byte_size: return "DW_AT_byte_size";
6802 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6803 case DW_AT_bit_size: return "DW_AT_bit_size";
6804 case DW_AT_element_list: return "DW_AT_element_list";
6805 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6806 case DW_AT_low_pc: return "DW_AT_low_pc";
6807 case DW_AT_high_pc: return "DW_AT_high_pc";
6808 case DW_AT_language: return "DW_AT_language";
6809 case DW_AT_member: return "DW_AT_member";
6810 case DW_AT_discr: return "DW_AT_discr";
6811 case DW_AT_discr_value: return "DW_AT_discr_value";
6812 case DW_AT_visibility: return "DW_AT_visibility";
6813 case DW_AT_import: return "DW_AT_import";
6814 case DW_AT_string_length: return "DW_AT_string_length";
6815 case DW_AT_common_reference: return "DW_AT_common_reference";
6816 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6817 case DW_AT_const_value: return "DW_AT_const_value";
6818 case DW_AT_containing_type: return "DW_AT_containing_type";
6819 case DW_AT_default_value: return "DW_AT_default_value";
6820 case DW_AT_inline: return "DW_AT_inline";
6821 case DW_AT_is_optional: return "DW_AT_is_optional";
6822 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6823 case DW_AT_producer: return "DW_AT_producer";
6824 case DW_AT_prototyped: return "DW_AT_prototyped";
6825 case DW_AT_return_addr: return "DW_AT_return_addr";
6826 case DW_AT_start_scope: return "DW_AT_start_scope";
6827 case DW_AT_stride_size: return "DW_AT_stride_size";
6828 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6829 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6830 case DW_AT_accessibility: return "DW_AT_accessibility";
6831 case DW_AT_address_class: return "DW_AT_address_class";
6832 case DW_AT_artificial: return "DW_AT_artificial";
6833 case DW_AT_base_types: return "DW_AT_base_types";
6834 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6835 case DW_AT_count: return "DW_AT_count";
6836 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6837 case DW_AT_decl_column: return "DW_AT_decl_column";
6838 case DW_AT_decl_file: return "DW_AT_decl_file";
6839 case DW_AT_decl_line: return "DW_AT_decl_line";
6840 case DW_AT_declaration: return "DW_AT_declaration";
6841 case DW_AT_discr_list: return "DW_AT_discr_list";
6842 case DW_AT_encoding: return "DW_AT_encoding";
6843 case DW_AT_external: return "DW_AT_external";
6844 case DW_AT_frame_base: return "DW_AT_frame_base";
6845 case DW_AT_friend: return "DW_AT_friend";
6846 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6847 case DW_AT_macro_info: return "DW_AT_macro_info";
6848 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6849 case DW_AT_priority: return "DW_AT_priority";
6850 case DW_AT_segment: return "DW_AT_segment";
6851 case DW_AT_specification: return "DW_AT_specification";
6852 case DW_AT_static_link: return "DW_AT_static_link";
6853 case DW_AT_type: return "DW_AT_type";
6854 case DW_AT_use_location: return "DW_AT_use_location";
6855 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6856 case DW_AT_virtuality: return "DW_AT_virtuality";
6857 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6858 /* DWARF 2.1 values. */
6859 case DW_AT_allocated: return "DW_AT_allocated";
6860 case DW_AT_associated: return "DW_AT_associated";
6861 case DW_AT_data_location: return "DW_AT_data_location";
6862 case DW_AT_stride: return "DW_AT_stride";
6863 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6864 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6865 case DW_AT_extension: return "DW_AT_extension";
6866 case DW_AT_ranges: return "DW_AT_ranges";
6867 case DW_AT_trampoline: return "DW_AT_trampoline";
6868 case DW_AT_call_column: return "DW_AT_call_column";
6869 case DW_AT_call_file: return "DW_AT_call_file";
6870 case DW_AT_call_line: return "DW_AT_call_line";
6871 /* SGI/MIPS extensions. */
6872 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6873 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6874 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6875 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6876 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6877 case DW_AT_MIPS_software_pipeline_depth:
6878 return "DW_AT_MIPS_software_pipeline_depth";
6879 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6880 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6881 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6882 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6883 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6884 /* GNU extensions. */
6885 case DW_AT_sf_names: return "DW_AT_sf_names";
6886 case DW_AT_src_info: return "DW_AT_src_info";
6887 case DW_AT_mac_info: return "DW_AT_mac_info";
6888 case DW_AT_src_coords: return "DW_AT_src_coords";
6889 case DW_AT_body_begin: return "DW_AT_body_begin";
6890 case DW_AT_body_end: return "DW_AT_body_end";
6891 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
6892 /* UPC extension. */
6893 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
6894 default:
6896 static char buffer[100];
6898 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6899 return buffer;
6904 static char *
6905 get_FORM_name (form)
6906 unsigned long form;
6908 switch (form)
6910 case DW_FORM_addr: return "DW_FORM_addr";
6911 case DW_FORM_block2: return "DW_FORM_block2";
6912 case DW_FORM_block4: return "DW_FORM_block4";
6913 case DW_FORM_data2: return "DW_FORM_data2";
6914 case DW_FORM_data4: return "DW_FORM_data4";
6915 case DW_FORM_data8: return "DW_FORM_data8";
6916 case DW_FORM_string: return "DW_FORM_string";
6917 case DW_FORM_block: return "DW_FORM_block";
6918 case DW_FORM_block1: return "DW_FORM_block1";
6919 case DW_FORM_data1: return "DW_FORM_data1";
6920 case DW_FORM_flag: return "DW_FORM_flag";
6921 case DW_FORM_sdata: return "DW_FORM_sdata";
6922 case DW_FORM_strp: return "DW_FORM_strp";
6923 case DW_FORM_udata: return "DW_FORM_udata";
6924 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6925 case DW_FORM_ref1: return "DW_FORM_ref1";
6926 case DW_FORM_ref2: return "DW_FORM_ref2";
6927 case DW_FORM_ref4: return "DW_FORM_ref4";
6928 case DW_FORM_ref8: return "DW_FORM_ref8";
6929 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6930 case DW_FORM_indirect: return "DW_FORM_indirect";
6931 default:
6933 static char buffer[100];
6935 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6936 return buffer;
6941 /* FIXME: There are better and more effiecint ways to handle
6942 these structures. For now though, I just want something that
6943 is simple to implement. */
6944 typedef struct abbrev_attr
6946 unsigned long attribute;
6947 unsigned long form;
6948 struct abbrev_attr *next;
6950 abbrev_attr;
6952 typedef struct abbrev_entry
6954 unsigned long entry;
6955 unsigned long tag;
6956 int children;
6957 struct abbrev_attr *first_attr;
6958 struct abbrev_attr *last_attr;
6959 struct abbrev_entry *next;
6961 abbrev_entry;
6963 static abbrev_entry *first_abbrev = NULL;
6964 static abbrev_entry *last_abbrev = NULL;
6966 static void
6967 free_abbrevs ()
6969 abbrev_entry *abbrev;
6971 for (abbrev = first_abbrev; abbrev;)
6973 abbrev_entry *next = abbrev->next;
6974 abbrev_attr *attr;
6976 for (attr = abbrev->first_attr; attr;)
6978 abbrev_attr *next = attr->next;
6980 free (attr);
6981 attr = next;
6984 free (abbrev);
6985 abbrev = next;
6988 last_abbrev = first_abbrev = NULL;
6991 static void
6992 add_abbrev (number, tag, children)
6993 unsigned long number;
6994 unsigned long tag;
6995 int children;
6997 abbrev_entry *entry;
6999 entry = (abbrev_entry *) malloc (sizeof (*entry));
7001 if (entry == NULL)
7002 /* ugg */
7003 return;
7005 entry->entry = number;
7006 entry->tag = tag;
7007 entry->children = children;
7008 entry->first_attr = NULL;
7009 entry->last_attr = NULL;
7010 entry->next = NULL;
7012 if (first_abbrev == NULL)
7013 first_abbrev = entry;
7014 else
7015 last_abbrev->next = entry;
7017 last_abbrev = entry;
7020 static void
7021 add_abbrev_attr (attribute, form)
7022 unsigned long attribute;
7023 unsigned long form;
7025 abbrev_attr *attr;
7027 attr = (abbrev_attr *) malloc (sizeof (*attr));
7029 if (attr == NULL)
7030 /* ugg */
7031 return;
7033 attr->attribute = attribute;
7034 attr->form = form;
7035 attr->next = NULL;
7037 if (last_abbrev->first_attr == NULL)
7038 last_abbrev->first_attr = attr;
7039 else
7040 last_abbrev->last_attr->next = attr;
7042 last_abbrev->last_attr = attr;
7045 /* Processes the (partial) contents of a .debug_abbrev section.
7046 Returns NULL if the end of the section was encountered.
7047 Returns the address after the last byte read if the end of
7048 an abbreviation set was found. */
7050 static unsigned char *
7051 process_abbrev_section (start, end)
7052 unsigned char *start;
7053 unsigned char *end;
7055 if (first_abbrev != NULL)
7056 return NULL;
7058 while (start < end)
7060 int bytes_read;
7061 unsigned long entry;
7062 unsigned long tag;
7063 unsigned long attribute;
7064 int children;
7066 entry = read_leb128 (start, & bytes_read, 0);
7067 start += bytes_read;
7069 /* A single zero is supposed to end the section according
7070 to the standard. If there's more, then signal that to
7071 the caller. */
7072 if (entry == 0)
7073 return start == end ? NULL : start;
7075 tag = read_leb128 (start, & bytes_read, 0);
7076 start += bytes_read;
7078 children = *start++;
7080 add_abbrev (entry, tag, children);
7084 unsigned long form;
7086 attribute = read_leb128 (start, & bytes_read, 0);
7087 start += bytes_read;
7089 form = read_leb128 (start, & bytes_read, 0);
7090 start += bytes_read;
7092 if (attribute != 0)
7093 add_abbrev_attr (attribute, form);
7095 while (attribute != 0);
7098 return NULL;
7102 static int
7103 display_debug_macinfo (section, start, file)
7104 Elf_Internal_Shdr *section;
7105 unsigned char *start;
7106 FILE *file ATTRIBUTE_UNUSED;
7108 unsigned char *end = start + section->sh_size;
7109 unsigned char *curr = start;
7110 unsigned int bytes_read;
7111 enum dwarf_macinfo_record_type op;
7113 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7115 while (curr < end)
7117 unsigned int lineno;
7118 const char *string;
7120 op = *curr;
7121 curr++;
7123 switch (op)
7125 case DW_MACINFO_start_file:
7127 unsigned int filenum;
7129 lineno = read_leb128 (curr, & bytes_read, 0);
7130 curr += bytes_read;
7131 filenum = read_leb128 (curr, & bytes_read, 0);
7132 curr += bytes_read;
7134 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
7136 break;
7138 case DW_MACINFO_end_file:
7139 printf (_(" DW_MACINFO_end_file\n"));
7140 break;
7142 case DW_MACINFO_define:
7143 lineno = read_leb128 (curr, & bytes_read, 0);
7144 curr += bytes_read;
7145 string = curr;
7146 curr += strlen (string) + 1;
7147 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
7148 break;
7150 case DW_MACINFO_undef:
7151 lineno = read_leb128 (curr, & bytes_read, 0);
7152 curr += bytes_read;
7153 string = curr;
7154 curr += strlen (string) + 1;
7155 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
7156 break;
7158 case DW_MACINFO_vendor_ext:
7160 unsigned int constant;
7162 constant = read_leb128 (curr, & bytes_read, 0);
7163 curr += bytes_read;
7164 string = curr;
7165 curr += strlen (string) + 1;
7166 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
7168 break;
7172 return 1;
7176 static int
7177 display_debug_abbrev (section, start, file)
7178 Elf_Internal_Shdr *section;
7179 unsigned char *start;
7180 FILE *file ATTRIBUTE_UNUSED;
7182 abbrev_entry *entry;
7183 unsigned char *end = start + section->sh_size;
7185 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7189 start = process_abbrev_section (start, end);
7191 if (first_abbrev == NULL)
7192 continue;
7194 printf (_(" Number TAG\n"));
7196 for (entry = first_abbrev; entry; entry = entry->next)
7198 abbrev_attr *attr;
7200 printf (_(" %ld %s [%s]\n"),
7201 entry->entry,
7202 get_TAG_name (entry->tag),
7203 entry->children ? _("has children") : _("no children"));
7205 for (attr = entry->first_attr; attr; attr = attr->next)
7207 printf (_(" %-18s %s\n"),
7208 get_AT_name (attr->attribute),
7209 get_FORM_name (attr->form));
7213 free_abbrevs ();
7215 while (start);
7217 printf ("\n");
7219 return 1;
7223 static unsigned char *
7224 display_block (data, length)
7225 unsigned char *data;
7226 unsigned long length;
7228 printf (_(" %lu byte block: "), length);
7230 while (length --)
7231 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7233 return data;
7236 static void
7237 decode_location_expression (data, pointer_size, length)
7238 unsigned char * data;
7239 unsigned int pointer_size;
7240 unsigned long length;
7242 unsigned op;
7243 int bytes_read;
7244 unsigned long uvalue;
7245 unsigned char *end = data + length;
7247 while (data < end)
7249 op = *data++;
7251 switch (op)
7253 case DW_OP_addr:
7254 printf ("DW_OP_addr: %lx",
7255 (unsigned long) byte_get (data, pointer_size));
7256 data += pointer_size;
7257 break;
7258 case DW_OP_deref:
7259 printf ("DW_OP_deref");
7260 break;
7261 case DW_OP_const1u:
7262 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7263 break;
7264 case DW_OP_const1s:
7265 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
7266 break;
7267 case DW_OP_const2u:
7268 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7269 data += 2;
7270 break;
7271 case DW_OP_const2s:
7272 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
7273 data += 2;
7274 break;
7275 case DW_OP_const4u:
7276 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7277 data += 4;
7278 break;
7279 case DW_OP_const4s:
7280 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
7281 data += 4;
7282 break;
7283 case DW_OP_const8u:
7284 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7285 (unsigned long) byte_get (data + 4, 4));
7286 data += 8;
7287 break;
7288 case DW_OP_const8s:
7289 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7290 (long) byte_get (data + 4, 4));
7291 data += 8;
7292 break;
7293 case DW_OP_constu:
7294 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7295 data += bytes_read;
7296 break;
7297 case DW_OP_consts:
7298 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7299 data += bytes_read;
7300 break;
7301 case DW_OP_dup:
7302 printf ("DW_OP_dup");
7303 break;
7304 case DW_OP_drop:
7305 printf ("DW_OP_drop");
7306 break;
7307 case DW_OP_over:
7308 printf ("DW_OP_over");
7309 break;
7310 case DW_OP_pick:
7311 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7312 break;
7313 case DW_OP_swap:
7314 printf ("DW_OP_swap");
7315 break;
7316 case DW_OP_rot:
7317 printf ("DW_OP_rot");
7318 break;
7319 case DW_OP_xderef:
7320 printf ("DW_OP_xderef");
7321 break;
7322 case DW_OP_abs:
7323 printf ("DW_OP_abs");
7324 break;
7325 case DW_OP_and:
7326 printf ("DW_OP_and");
7327 break;
7328 case DW_OP_div:
7329 printf ("DW_OP_div");
7330 break;
7331 case DW_OP_minus:
7332 printf ("DW_OP_minus");
7333 break;
7334 case DW_OP_mod:
7335 printf ("DW_OP_mod");
7336 break;
7337 case DW_OP_mul:
7338 printf ("DW_OP_mul");
7339 break;
7340 case DW_OP_neg:
7341 printf ("DW_OP_neg");
7342 break;
7343 case DW_OP_not:
7344 printf ("DW_OP_not");
7345 break;
7346 case DW_OP_or:
7347 printf ("DW_OP_or");
7348 break;
7349 case DW_OP_plus:
7350 printf ("DW_OP_plus");
7351 break;
7352 case DW_OP_plus_uconst:
7353 printf ("DW_OP_plus_uconst: %lu",
7354 read_leb128 (data, &bytes_read, 0));
7355 data += bytes_read;
7356 break;
7357 case DW_OP_shl:
7358 printf ("DW_OP_shl");
7359 break;
7360 case DW_OP_shr:
7361 printf ("DW_OP_shr");
7362 break;
7363 case DW_OP_shra:
7364 printf ("DW_OP_shra");
7365 break;
7366 case DW_OP_xor:
7367 printf ("DW_OP_xor");
7368 break;
7369 case DW_OP_bra:
7370 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7371 data += 2;
7372 break;
7373 case DW_OP_eq:
7374 printf ("DW_OP_eq");
7375 break;
7376 case DW_OP_ge:
7377 printf ("DW_OP_ge");
7378 break;
7379 case DW_OP_gt:
7380 printf ("DW_OP_gt");
7381 break;
7382 case DW_OP_le:
7383 printf ("DW_OP_le");
7384 break;
7385 case DW_OP_lt:
7386 printf ("DW_OP_lt");
7387 break;
7388 case DW_OP_ne:
7389 printf ("DW_OP_ne");
7390 break;
7391 case DW_OP_skip:
7392 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7393 data += 2;
7394 break;
7396 case DW_OP_lit0:
7397 case DW_OP_lit1:
7398 case DW_OP_lit2:
7399 case DW_OP_lit3:
7400 case DW_OP_lit4:
7401 case DW_OP_lit5:
7402 case DW_OP_lit6:
7403 case DW_OP_lit7:
7404 case DW_OP_lit8:
7405 case DW_OP_lit9:
7406 case DW_OP_lit10:
7407 case DW_OP_lit11:
7408 case DW_OP_lit12:
7409 case DW_OP_lit13:
7410 case DW_OP_lit14:
7411 case DW_OP_lit15:
7412 case DW_OP_lit16:
7413 case DW_OP_lit17:
7414 case DW_OP_lit18:
7415 case DW_OP_lit19:
7416 case DW_OP_lit20:
7417 case DW_OP_lit21:
7418 case DW_OP_lit22:
7419 case DW_OP_lit23:
7420 case DW_OP_lit24:
7421 case DW_OP_lit25:
7422 case DW_OP_lit26:
7423 case DW_OP_lit27:
7424 case DW_OP_lit28:
7425 case DW_OP_lit29:
7426 case DW_OP_lit30:
7427 case DW_OP_lit31:
7428 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7429 break;
7431 case DW_OP_reg0:
7432 case DW_OP_reg1:
7433 case DW_OP_reg2:
7434 case DW_OP_reg3:
7435 case DW_OP_reg4:
7436 case DW_OP_reg5:
7437 case DW_OP_reg6:
7438 case DW_OP_reg7:
7439 case DW_OP_reg8:
7440 case DW_OP_reg9:
7441 case DW_OP_reg10:
7442 case DW_OP_reg11:
7443 case DW_OP_reg12:
7444 case DW_OP_reg13:
7445 case DW_OP_reg14:
7446 case DW_OP_reg15:
7447 case DW_OP_reg16:
7448 case DW_OP_reg17:
7449 case DW_OP_reg18:
7450 case DW_OP_reg19:
7451 case DW_OP_reg20:
7452 case DW_OP_reg21:
7453 case DW_OP_reg22:
7454 case DW_OP_reg23:
7455 case DW_OP_reg24:
7456 case DW_OP_reg25:
7457 case DW_OP_reg26:
7458 case DW_OP_reg27:
7459 case DW_OP_reg28:
7460 case DW_OP_reg29:
7461 case DW_OP_reg30:
7462 case DW_OP_reg31:
7463 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7464 break;
7466 case DW_OP_breg0:
7467 case DW_OP_breg1:
7468 case DW_OP_breg2:
7469 case DW_OP_breg3:
7470 case DW_OP_breg4:
7471 case DW_OP_breg5:
7472 case DW_OP_breg6:
7473 case DW_OP_breg7:
7474 case DW_OP_breg8:
7475 case DW_OP_breg9:
7476 case DW_OP_breg10:
7477 case DW_OP_breg11:
7478 case DW_OP_breg12:
7479 case DW_OP_breg13:
7480 case DW_OP_breg14:
7481 case DW_OP_breg15:
7482 case DW_OP_breg16:
7483 case DW_OP_breg17:
7484 case DW_OP_breg18:
7485 case DW_OP_breg19:
7486 case DW_OP_breg20:
7487 case DW_OP_breg21:
7488 case DW_OP_breg22:
7489 case DW_OP_breg23:
7490 case DW_OP_breg24:
7491 case DW_OP_breg25:
7492 case DW_OP_breg26:
7493 case DW_OP_breg27:
7494 case DW_OP_breg28:
7495 case DW_OP_breg29:
7496 case DW_OP_breg30:
7497 case DW_OP_breg31:
7498 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7499 read_leb128 (data, &bytes_read, 1));
7500 data += bytes_read;
7501 break;
7503 case DW_OP_regx:
7504 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7505 data += bytes_read;
7506 break;
7507 case DW_OP_fbreg:
7508 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7509 data += bytes_read;
7510 break;
7511 case DW_OP_bregx:
7512 uvalue = read_leb128 (data, &bytes_read, 0);
7513 data += bytes_read;
7514 printf ("DW_OP_bregx: %lu %ld", uvalue,
7515 read_leb128 (data, &bytes_read, 1));
7516 data += bytes_read;
7517 break;
7518 case DW_OP_piece:
7519 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7520 data += bytes_read;
7521 break;
7522 case DW_OP_deref_size:
7523 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7524 break;
7525 case DW_OP_xderef_size:
7526 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7527 break;
7528 case DW_OP_nop:
7529 printf ("DW_OP_nop");
7530 break;
7532 /* DWARF 3 extensions. */
7533 case DW_OP_push_object_address:
7534 printf ("DW_OP_push_object_address");
7535 break;
7536 case DW_OP_call2:
7537 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7538 data += 2;
7539 break;
7540 case DW_OP_call4:
7541 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7542 data += 4;
7543 break;
7544 case DW_OP_call_ref:
7545 printf ("DW_OP_call_ref");
7546 break;
7548 /* GNU extensions. */
7549 case DW_OP_GNU_push_tls_address:
7550 printf ("DW_OP_GNU_push_tls_address");
7551 break;
7553 default:
7554 if (op >= DW_OP_lo_user
7555 && op <= DW_OP_hi_user)
7556 printf (_("(User defined location op)"));
7557 else
7558 printf (_("(Unknown location op)"));
7559 /* No way to tell where the next op is, so just bail. */
7560 return;
7563 /* Separate the ops. */
7564 printf ("; ");
7568 static const char *debug_loc_contents;
7569 static bfd_vma debug_loc_size;
7571 static void
7572 load_debug_loc (file)
7573 FILE *file;
7575 Elf_Internal_Shdr *sec;
7576 unsigned int i;
7578 /* If it is already loaded, do nothing. */
7579 if (debug_loc_contents != NULL)
7580 return;
7582 /* Locate the .debug_loc section. */
7583 for (i = 0, sec = section_headers;
7584 i < elf_header.e_shnum;
7585 i++, sec++)
7586 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7587 break;
7589 if (i == elf_header.e_shnum || sec->sh_size == 0)
7590 return;
7592 debug_loc_size = sec->sh_size;
7594 debug_loc_contents = ((char *)
7595 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7596 _("debug_loc section data")));
7599 static void
7600 free_debug_loc ()
7602 if (debug_loc_contents == NULL)
7603 return;
7605 free ((char *) debug_loc_contents);
7606 debug_loc_contents = NULL;
7607 debug_loc_size = 0;
7611 static int
7612 display_debug_loc (section, start, file)
7613 Elf_Internal_Shdr *section;
7614 unsigned char *start;
7615 FILE *file ATTRIBUTE_UNUSED;
7617 unsigned char *section_end;
7618 unsigned long bytes;
7619 unsigned char *section_begin = start;
7620 bfd_vma addr;
7622 addr = section->sh_addr;
7623 bytes = section->sh_size;
7624 section_end = start + bytes;
7626 if (bytes == 0)
7628 printf (_("\nThe .debug_loc section is empty.\n"));
7629 return 0;
7632 printf (_("Contents of the .debug_loc section:\n\n"));
7633 printf (_("\n Offset Begin End Expression\n"));
7635 while (start < section_end)
7637 unsigned long begin;
7638 unsigned long end;
7639 unsigned short length;
7640 unsigned long offset;
7642 offset = start - section_begin;
7644 while (1)
7646 /* Normally, the lists in the debug_loc section are related to a
7647 given compilation unit, and thus, we would use the pointer size
7648 of that compilation unit. However, since we are displaying it
7649 seperately here, we either have to store pointer sizes of all
7650 compilation units, or assume they don't change. We assume,
7651 like the debug_line display, that it doesn't change. */
7652 begin = byte_get (start, debug_line_pointer_size);
7653 start += debug_line_pointer_size;
7654 end = byte_get (start, debug_line_pointer_size);
7655 start += debug_line_pointer_size;
7657 if (begin == 0 && end == 0)
7658 break;
7660 /* For now, skip any base address specifiers. */
7661 if (begin == 0xffffffff)
7662 continue;
7664 begin += addr;
7665 end += addr;
7667 length = byte_get (start, 2);
7668 start += 2;
7670 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7671 decode_location_expression (start, debug_line_pointer_size, length);
7672 printf (")\n");
7674 start += length;
7676 printf ("\n");
7678 return 1;
7681 static const char *debug_str_contents;
7682 static bfd_vma debug_str_size;
7684 static void
7685 load_debug_str (file)
7686 FILE *file;
7688 Elf_Internal_Shdr *sec;
7689 unsigned int i;
7691 /* If it is already loaded, do nothing. */
7692 if (debug_str_contents != NULL)
7693 return;
7695 /* Locate the .debug_str section. */
7696 for (i = 0, sec = section_headers;
7697 i < elf_header.e_shnum;
7698 i++, sec++)
7699 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7700 break;
7702 if (i == elf_header.e_shnum || sec->sh_size == 0)
7703 return;
7705 debug_str_size = sec->sh_size;
7707 debug_str_contents = ((char *)
7708 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7709 _("debug_str section data")));
7712 static void
7713 free_debug_str ()
7715 if (debug_str_contents == NULL)
7716 return;
7718 free ((char *) debug_str_contents);
7719 debug_str_contents = NULL;
7720 debug_str_size = 0;
7723 static const char *
7724 fetch_indirect_string (offset)
7725 unsigned long offset;
7727 if (debug_str_contents == NULL)
7728 return _("<no .debug_str section>");
7730 if (offset > debug_str_size)
7731 return _("<offset is too big>");
7733 return debug_str_contents + offset;
7736 static int
7737 display_debug_str (section, start, file)
7738 Elf_Internal_Shdr *section;
7739 unsigned char *start;
7740 FILE *file ATTRIBUTE_UNUSED;
7742 unsigned long bytes;
7743 bfd_vma addr;
7745 addr = section->sh_addr;
7746 bytes = section->sh_size;
7748 if (bytes == 0)
7750 printf (_("\nThe .debug_str section is empty.\n"));
7751 return 0;
7754 printf (_("Contents of the .debug_str section:\n\n"));
7756 while (bytes)
7758 int j;
7759 int k;
7760 int lbytes;
7762 lbytes = (bytes > 16 ? 16 : bytes);
7764 printf (" 0x%8.8lx ", (unsigned long) addr);
7766 for (j = 0; j < 16; j++)
7768 if (j < lbytes)
7769 printf ("%2.2x", start[j]);
7770 else
7771 printf (" ");
7773 if ((j & 3) == 3)
7774 printf (" ");
7777 for (j = 0; j < lbytes; j++)
7779 k = start[j];
7780 if (k >= ' ' && k < 0x80)
7781 printf ("%c", k);
7782 else
7783 printf (".");
7786 putchar ('\n');
7788 start += lbytes;
7789 addr += lbytes;
7790 bytes -= lbytes;
7793 return 1;
7796 static unsigned char *
7797 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7798 unsigned long attribute;
7799 unsigned long form;
7800 unsigned char *data;
7801 unsigned long cu_offset;
7802 unsigned long pointer_size;
7804 unsigned long uvalue = 0;
7805 unsigned char *block_start = NULL;
7806 int bytes_read;
7808 switch (form)
7810 default:
7811 break;
7813 case DW_FORM_ref_addr:
7814 case DW_FORM_addr:
7815 uvalue = byte_get (data, pointer_size);
7816 data += pointer_size;
7817 break;
7819 case DW_FORM_strp:
7820 uvalue = byte_get (data, /* offset_size */ 4);
7821 data += /* offset_size */ 4;
7822 break;
7824 case DW_FORM_ref1:
7825 case DW_FORM_flag:
7826 case DW_FORM_data1:
7827 uvalue = byte_get (data++, 1);
7828 break;
7830 case DW_FORM_ref2:
7831 case DW_FORM_data2:
7832 uvalue = byte_get (data, 2);
7833 data += 2;
7834 break;
7836 case DW_FORM_ref4:
7837 case DW_FORM_data4:
7838 uvalue = byte_get (data, 4);
7839 data += 4;
7840 break;
7842 case DW_FORM_sdata:
7843 uvalue = read_leb128 (data, & bytes_read, 1);
7844 data += bytes_read;
7845 break;
7847 case DW_FORM_ref_udata:
7848 case DW_FORM_udata:
7849 uvalue = read_leb128 (data, & bytes_read, 0);
7850 data += bytes_read;
7851 break;
7853 case DW_FORM_indirect:
7854 form = read_leb128 (data, & bytes_read, 0);
7855 data += bytes_read;
7856 printf (" %s", get_FORM_name (form));
7857 return read_and_display_attr_value (attribute, form, data, cu_offset,
7858 pointer_size);
7861 switch (form)
7863 case DW_FORM_ref_addr:
7864 printf (" <#%lx>", uvalue);
7865 break;
7867 case DW_FORM_ref1:
7868 case DW_FORM_ref2:
7869 case DW_FORM_ref4:
7870 case DW_FORM_ref_udata:
7871 printf (" <%lx>", uvalue + cu_offset);
7872 break;
7874 case DW_FORM_addr:
7875 printf (" %#lx", uvalue);
7877 case DW_FORM_flag:
7878 case DW_FORM_data1:
7879 case DW_FORM_data2:
7880 case DW_FORM_data4:
7881 case DW_FORM_sdata:
7882 case DW_FORM_udata:
7883 printf (" %ld", uvalue);
7884 break;
7886 case DW_FORM_ref8:
7887 case DW_FORM_data8:
7888 uvalue = byte_get (data, 4);
7889 printf (" %lx", uvalue);
7890 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7891 data += 8;
7892 break;
7894 case DW_FORM_string:
7895 printf (" %s", data);
7896 data += strlen ((char *) data) + 1;
7897 break;
7899 case DW_FORM_block:
7900 uvalue = read_leb128 (data, & bytes_read, 0);
7901 block_start = data + bytes_read;
7902 data = display_block (block_start, uvalue);
7903 break;
7905 case DW_FORM_block1:
7906 uvalue = byte_get (data, 1);
7907 block_start = data + 1;
7908 data = display_block (block_start, uvalue);
7909 break;
7911 case DW_FORM_block2:
7912 uvalue = byte_get (data, 2);
7913 block_start = data + 2;
7914 data = display_block (block_start, uvalue);
7915 break;
7917 case DW_FORM_block4:
7918 uvalue = byte_get (data, 4);
7919 block_start = data + 4;
7920 data = display_block (block_start, uvalue);
7921 break;
7923 case DW_FORM_strp:
7924 printf (_(" (indirect string, offset: 0x%lx): %s"),
7925 uvalue, fetch_indirect_string (uvalue));
7926 break;
7928 case DW_FORM_indirect:
7929 /* Handled above. */
7930 break;
7932 default:
7933 warn (_("Unrecognized form: %d\n"), form);
7934 break;
7937 /* For some attributes we can display futher information. */
7939 printf ("\t");
7941 switch (attribute)
7943 case DW_AT_inline:
7944 switch (uvalue)
7946 case DW_INL_not_inlined:
7947 printf (_("(not inlined)"));
7948 break;
7949 case DW_INL_inlined:
7950 printf (_("(inlined)"));
7951 break;
7952 case DW_INL_declared_not_inlined:
7953 printf (_("(declared as inline but ignored)"));
7954 break;
7955 case DW_INL_declared_inlined:
7956 printf (_("(declared as inline and inlined)"));
7957 break;
7958 default:
7959 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
7960 break;
7962 break;
7964 case DW_AT_language:
7965 switch (uvalue)
7967 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7968 case DW_LANG_C89: printf ("(ANSI C)"); break;
7969 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7970 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7971 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7972 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7973 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7974 case DW_LANG_Ada83: printf ("(Ada)"); break;
7975 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7976 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7977 /* DWARF 2.1 values. */
7978 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7979 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7980 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7981 /* MIPS extension. */
7982 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7983 /* UPC extension. */
7984 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
7985 default:
7986 printf ("(Unknown: %lx)", uvalue);
7987 break;
7989 break;
7991 case DW_AT_encoding:
7992 switch (uvalue)
7994 case DW_ATE_void: printf ("(void)"); break;
7995 case DW_ATE_address: printf ("(machine address)"); break;
7996 case DW_ATE_boolean: printf ("(boolean)"); break;
7997 case DW_ATE_complex_float: printf ("(complex float)"); break;
7998 case DW_ATE_float: printf ("(float)"); break;
7999 case DW_ATE_signed: printf ("(signed)"); break;
8000 case DW_ATE_signed_char: printf ("(signed char)"); break;
8001 case DW_ATE_unsigned: printf ("(unsigned)"); break;
8002 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
8003 /* DWARF 2.1 value. */
8004 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
8005 default:
8006 if (uvalue >= DW_ATE_lo_user
8007 && uvalue <= DW_ATE_hi_user)
8008 printf ("(user defined type)");
8009 else
8010 printf ("(unknown type)");
8011 break;
8013 break;
8015 case DW_AT_accessibility:
8016 switch (uvalue)
8018 case DW_ACCESS_public: printf ("(public)"); break;
8019 case DW_ACCESS_protected: printf ("(protected)"); break;
8020 case DW_ACCESS_private: printf ("(private)"); break;
8021 default:
8022 printf ("(unknown accessibility)");
8023 break;
8025 break;
8027 case DW_AT_visibility:
8028 switch (uvalue)
8030 case DW_VIS_local: printf ("(local)"); break;
8031 case DW_VIS_exported: printf ("(exported)"); break;
8032 case DW_VIS_qualified: printf ("(qualified)"); break;
8033 default: printf ("(unknown visibility)"); break;
8035 break;
8037 case DW_AT_virtuality:
8038 switch (uvalue)
8040 case DW_VIRTUALITY_none: printf ("(none)"); break;
8041 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8042 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8043 default: printf ("(unknown virtuality)"); break;
8045 break;
8047 case DW_AT_identifier_case:
8048 switch (uvalue)
8050 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8051 case DW_ID_up_case: printf ("(up_case)"); break;
8052 case DW_ID_down_case: printf ("(down_case)"); break;
8053 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8054 default: printf ("(unknown case)"); break;
8056 break;
8058 case DW_AT_calling_convention:
8059 switch (uvalue)
8061 case DW_CC_normal: printf ("(normal)"); break;
8062 case DW_CC_program: printf ("(program)"); break;
8063 case DW_CC_nocall: printf ("(nocall)"); break;
8064 default:
8065 if (uvalue >= DW_CC_lo_user
8066 && uvalue <= DW_CC_hi_user)
8067 printf ("(user defined)");
8068 else
8069 printf ("(unknown convention)");
8071 break;
8073 case DW_AT_ordering:
8074 switch (uvalue)
8076 case -1: printf ("(undefined)"); break;
8077 case 0: printf ("(row major)"); break;
8078 case 1: printf ("(column major)"); break;
8080 break;
8082 case DW_AT_frame_base:
8083 case DW_AT_location:
8084 case DW_AT_data_member_location:
8085 case DW_AT_vtable_elem_location:
8086 case DW_AT_allocated:
8087 case DW_AT_associated:
8088 case DW_AT_data_location:
8089 case DW_AT_stride:
8090 case DW_AT_upper_bound:
8091 case DW_AT_lower_bound:
8092 if (block_start)
8094 printf ("(");
8095 decode_location_expression (block_start, pointer_size, uvalue);
8096 printf (")");
8098 else if (form == DW_FORM_data4)
8100 printf ("(");
8101 printf ("location list");
8102 printf (")");
8104 break;
8106 default:
8107 break;
8110 return data;
8113 static unsigned char *
8114 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
8115 unsigned long attribute;
8116 unsigned long form;
8117 unsigned char *data;
8118 unsigned long cu_offset;
8119 unsigned long pointer_size;
8121 printf (" %-18s:", get_AT_name (attribute));
8122 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8123 pointer_size);
8124 printf ("\n");
8125 return data;
8128 static int
8129 display_debug_info (section, start, file)
8130 Elf_Internal_Shdr *section;
8131 unsigned char *start;
8132 FILE *file;
8134 unsigned char *end = start + section->sh_size;
8135 unsigned char *section_begin = start;
8137 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8139 load_debug_str (file);
8140 load_debug_loc (file);
8142 while (start < end)
8144 DWARF2_External_CompUnit *external;
8145 DWARF2_Internal_CompUnit compunit;
8146 Elf_Internal_Shdr *relsec;
8147 unsigned char *tags;
8148 unsigned int i;
8149 int level;
8150 unsigned long cu_offset;
8152 external = (DWARF2_External_CompUnit *) start;
8154 compunit.cu_length = BYTE_GET (external->cu_length);
8155 compunit.cu_version = BYTE_GET (external->cu_version);
8156 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
8157 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
8159 if (compunit.cu_length == 0xffffffff)
8161 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8162 break;
8165 /* Check for RELA relocations in the
8166 abbrev_offset address, and apply them. */
8167 for (relsec = section_headers;
8168 relsec < section_headers + elf_header.e_shnum;
8169 ++relsec)
8171 unsigned long nrelas;
8172 Elf_Internal_Rela *rela, *rp;
8173 Elf_Internal_Shdr *symsec;
8174 Elf_Internal_Sym *symtab;
8175 Elf_Internal_Sym *sym;
8177 if (relsec->sh_type != SHT_RELA
8178 || SECTION_HEADER (relsec->sh_info) != section
8179 || relsec->sh_size == 0)
8180 continue;
8182 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8183 & rela, & nrelas))
8184 return 0;
8186 symsec = SECTION_HEADER (relsec->sh_link);
8187 symtab = GET_ELF_SYMBOLS (file, symsec);
8189 for (rp = rela; rp < rela + nrelas; ++rp)
8191 if (rp->r_offset
8192 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
8193 - section_begin))
8194 continue;
8196 if (is_32bit_elf)
8198 sym = symtab + ELF32_R_SYM (rp->r_info);
8200 if (ELF32_R_SYM (rp->r_info) != 0
8201 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
8203 warn (_("Skipping unexpected symbol type %u\n"),
8204 ELF32_ST_TYPE (sym->st_info));
8205 continue;
8208 else
8210 sym = symtab + ELF64_R_SYM (rp->r_info);
8212 if (ELF64_R_SYM (rp->r_info) != 0
8213 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
8215 warn (_("Skipping unexpected symbol type %u\n"),
8216 ELF64_ST_TYPE (sym->st_info));
8217 continue;
8221 compunit.cu_abbrev_offset = rp->r_addend;
8222 break;
8225 free (rela);
8226 break;
8229 tags = start + sizeof (*external);
8230 cu_offset = start - section_begin;
8231 start += compunit.cu_length + sizeof (external->cu_length);
8233 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8234 printf (_(" Length: %ld\n"), compunit.cu_length);
8235 printf (_(" Version: %d\n"), compunit.cu_version);
8236 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8237 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8239 if (compunit.cu_version != 2)
8241 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8242 continue;
8245 free_abbrevs ();
8247 /* Read in the abbrevs used by this compilation unit. */
8249 Elf_Internal_Shdr *sec;
8250 unsigned char *begin;
8252 /* Locate the .debug_abbrev section and process it. */
8253 for (i = 0, sec = section_headers;
8254 i < elf_header.e_shnum;
8255 i++, sec++)
8256 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
8257 break;
8259 if (i == elf_header.e_shnum || sec->sh_size == 0)
8261 warn (_("Unable to locate .debug_abbrev section!\n"));
8262 return 0;
8265 begin = ((unsigned char *)
8266 get_data (NULL, file, sec->sh_offset, sec->sh_size,
8267 _("debug_abbrev section data")));
8268 if (!begin)
8269 return 0;
8271 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8272 begin + sec->sh_size);
8274 free (begin);
8277 level = 0;
8278 while (tags < start)
8280 int bytes_read;
8281 unsigned long abbrev_number;
8282 abbrev_entry *entry;
8283 abbrev_attr *attr;
8285 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8286 tags += bytes_read;
8288 /* A null DIE marks the end of a list of children. */
8289 if (abbrev_number == 0)
8291 --level;
8292 continue;
8295 /* Scan through the abbreviation list until we reach the
8296 correct entry. */
8297 for (entry = first_abbrev;
8298 entry && entry->entry != abbrev_number;
8299 entry = entry->next)
8300 continue;
8302 if (entry == NULL)
8304 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8305 abbrev_number);
8306 return 0;
8309 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8310 level,
8311 (unsigned long) (tags - section_begin - bytes_read),
8312 abbrev_number,
8313 get_TAG_name (entry->tag));
8315 for (attr = entry->first_attr; attr; attr = attr->next)
8316 tags = read_and_display_attr (attr->attribute,
8317 attr->form,
8318 tags, cu_offset,
8319 compunit.cu_pointer_size);
8321 if (entry->children)
8322 ++level;
8326 free_debug_str ();
8327 free_debug_loc ();
8329 printf ("\n");
8331 return 1;
8334 static int
8335 display_debug_aranges (section, start, file)
8336 Elf_Internal_Shdr *section;
8337 unsigned char *start;
8338 FILE *file ATTRIBUTE_UNUSED;
8340 unsigned char *end = start + section->sh_size;
8342 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8344 while (start < end)
8346 DWARF2_External_ARange *external;
8347 DWARF2_Internal_ARange arange;
8348 unsigned char *ranges;
8349 unsigned long length;
8350 unsigned long address;
8351 int excess;
8353 external = (DWARF2_External_ARange *) start;
8355 arange.ar_length = BYTE_GET (external->ar_length);
8356 arange.ar_version = BYTE_GET (external->ar_version);
8357 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
8358 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
8359 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
8361 if (arange.ar_length == 0xffffffff)
8363 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8364 break;
8367 if (arange.ar_version != 2)
8369 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8370 break;
8373 printf (_(" Length: %ld\n"), arange.ar_length);
8374 printf (_(" Version: %d\n"), arange.ar_version);
8375 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8376 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8377 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8379 printf (_("\n Address Length\n"));
8381 ranges = start + sizeof (*external);
8383 /* Must pad to an alignment boundary that is twice the pointer size. */
8384 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
8385 if (excess)
8386 ranges += (2 * arange.ar_pointer_size) - excess;
8388 for (;;)
8390 address = byte_get (ranges, arange.ar_pointer_size);
8392 ranges += arange.ar_pointer_size;
8394 length = byte_get (ranges, arange.ar_pointer_size);
8396 ranges += arange.ar_pointer_size;
8398 /* A pair of zeros marks the end of the list. */
8399 if (address == 0 && length == 0)
8400 break;
8402 printf (" %8.8lx %lu\n", address, length);
8405 start += arange.ar_length + sizeof (external->ar_length);
8408 printf ("\n");
8410 return 1;
8413 typedef struct Frame_Chunk
8415 struct Frame_Chunk *next;
8416 unsigned char *chunk_start;
8417 int ncols;
8418 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8419 short int *col_type;
8420 int *col_offset;
8421 char *augmentation;
8422 unsigned int code_factor;
8423 int data_factor;
8424 unsigned long pc_begin;
8425 unsigned long pc_range;
8426 int cfa_reg;
8427 int cfa_offset;
8428 int ra;
8429 unsigned char fde_encoding;
8431 Frame_Chunk;
8433 /* A marker for a col_type that means this column was never referenced
8434 in the frame info. */
8435 #define DW_CFA_unreferenced (-1)
8437 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8438 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8439 static int size_of_encoded_value PARAMS ((int));
8441 static void
8442 frame_need_space (fc, reg)
8443 Frame_Chunk *fc;
8444 int reg;
8446 int prev = fc->ncols;
8448 if (reg < fc->ncols)
8449 return;
8451 fc->ncols = reg + 1;
8452 fc->col_type = (short int *) xrealloc (fc->col_type,
8453 fc->ncols * sizeof (short int));
8454 fc->col_offset = (int *) xrealloc (fc->col_offset,
8455 fc->ncols * sizeof (int));
8457 while (prev < fc->ncols)
8459 fc->col_type[prev] = DW_CFA_unreferenced;
8460 fc->col_offset[prev] = 0;
8461 prev++;
8465 static void
8466 frame_display_row (fc, need_col_headers, max_regs)
8467 Frame_Chunk *fc;
8468 int *need_col_headers;
8469 int *max_regs;
8471 int r;
8472 char tmp[100];
8474 if (*max_regs < fc->ncols)
8475 *max_regs = fc->ncols;
8477 if (*need_col_headers)
8479 *need_col_headers = 0;
8481 printf (" LOC CFA ");
8483 for (r = 0; r < *max_regs; r++)
8484 if (fc->col_type[r] != DW_CFA_unreferenced)
8486 if (r == fc->ra)
8487 printf ("ra ");
8488 else
8489 printf ("r%-4d", r);
8492 printf ("\n");
8495 printf ("%08lx ", fc->pc_begin);
8496 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8497 printf ("%-8s ", tmp);
8499 for (r = 0; r < fc->ncols; r++)
8501 if (fc->col_type[r] != DW_CFA_unreferenced)
8503 switch (fc->col_type[r])
8505 case DW_CFA_undefined:
8506 strcpy (tmp, "u");
8507 break;
8508 case DW_CFA_same_value:
8509 strcpy (tmp, "s");
8510 break;
8511 case DW_CFA_offset:
8512 sprintf (tmp, "c%+d", fc->col_offset[r]);
8513 break;
8514 case DW_CFA_register:
8515 sprintf (tmp, "r%d", fc->col_offset[r]);
8516 break;
8517 default:
8518 strcpy (tmp, "n/a");
8519 break;
8521 printf ("%-5s", tmp);
8524 printf ("\n");
8527 static int
8528 size_of_encoded_value (encoding)
8529 int encoding;
8531 switch (encoding & 0x7)
8533 default: /* ??? */
8534 case 0: return is_32bit_elf ? 4 : 8;
8535 case 2: return 2;
8536 case 3: return 4;
8537 case 4: return 8;
8541 #define GET(N) byte_get (start, N); start += N
8542 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8543 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8545 static int
8546 display_debug_frames (section, start, file)
8547 Elf_Internal_Shdr *section;
8548 unsigned char *start;
8549 FILE *file ATTRIBUTE_UNUSED;
8551 unsigned char *end = start + section->sh_size;
8552 unsigned char *section_start = start;
8553 Frame_Chunk *chunks = 0;
8554 Frame_Chunk *remembered_state = 0;
8555 Frame_Chunk *rs;
8556 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8557 int length_return;
8558 int max_regs = 0;
8559 int addr_size = is_32bit_elf ? 4 : 8;
8561 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8563 while (start < end)
8565 unsigned char *saved_start;
8566 unsigned char *block_end;
8567 unsigned long length;
8568 unsigned long cie_id;
8569 Frame_Chunk *fc;
8570 Frame_Chunk *cie;
8571 int need_col_headers = 1;
8572 unsigned char *augmentation_data = NULL;
8573 unsigned long augmentation_data_len = 0;
8574 int encoded_ptr_size = addr_size;
8576 saved_start = start;
8577 length = byte_get (start, 4); start += 4;
8579 if (length == 0)
8581 printf ("\n%08lx ZERO terminator\n\n",
8582 (unsigned long)(saved_start - section_start));
8583 return 1;
8586 if (length == 0xffffffff)
8588 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8589 break;
8592 block_end = saved_start + length + 4;
8593 cie_id = byte_get (start, 4); start += 4;
8595 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8597 int version;
8599 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8600 memset (fc, 0, sizeof (Frame_Chunk));
8602 fc->next = chunks;
8603 chunks = fc;
8604 fc->chunk_start = saved_start;
8605 fc->ncols = 0;
8606 fc->col_type = (short int *) xmalloc (sizeof (short int));
8607 fc->col_offset = (int *) xmalloc (sizeof (int));
8608 frame_need_space (fc, max_regs-1);
8610 version = *start++;
8612 fc->augmentation = start;
8613 start = strchr (start, '\0') + 1;
8615 if (fc->augmentation[0] == 'z')
8617 fc->code_factor = LEB ();
8618 fc->data_factor = SLEB ();
8619 fc->ra = byte_get (start, 1); start += 1;
8620 augmentation_data_len = LEB ();
8621 augmentation_data = start;
8622 start += augmentation_data_len;
8624 else if (strcmp (fc->augmentation, "eh") == 0)
8626 start += addr_size;
8627 fc->code_factor = LEB ();
8628 fc->data_factor = SLEB ();
8629 fc->ra = byte_get (start, 1); start += 1;
8631 else
8633 fc->code_factor = LEB ();
8634 fc->data_factor = SLEB ();
8635 fc->ra = byte_get (start, 1); start += 1;
8637 cie = fc;
8639 if (do_debug_frames_interp)
8640 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8641 (unsigned long)(saved_start - section_start), length, cie_id,
8642 fc->augmentation, fc->code_factor, fc->data_factor,
8643 fc->ra);
8644 else
8646 printf ("\n%08lx %08lx %08lx CIE\n",
8647 (unsigned long)(saved_start - section_start), length, cie_id);
8648 printf (" Version: %d\n", version);
8649 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8650 printf (" Code alignment factor: %u\n", fc->code_factor);
8651 printf (" Data alignment factor: %d\n", fc->data_factor);
8652 printf (" Return address column: %d\n", fc->ra);
8654 if (augmentation_data_len)
8656 unsigned long i;
8657 printf (" Augmentation data: ");
8658 for (i = 0; i < augmentation_data_len; ++i)
8659 printf (" %02x", augmentation_data[i]);
8660 putchar ('\n');
8662 putchar ('\n');
8665 if (augmentation_data_len)
8667 unsigned char *p, *q;
8668 p = fc->augmentation + 1;
8669 q = augmentation_data;
8671 while (1)
8673 if (*p == 'L')
8674 q++;
8675 else if (*p == 'P')
8676 q += 1 + size_of_encoded_value (*q);
8677 else if (*p == 'R')
8678 fc->fde_encoding = *q++;
8679 else
8680 break;
8681 p++;
8684 if (fc->fde_encoding)
8685 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8688 frame_need_space (fc, fc->ra);
8690 else
8692 unsigned char *look_for;
8693 static Frame_Chunk fde_fc;
8695 fc = & fde_fc;
8696 memset (fc, 0, sizeof (Frame_Chunk));
8698 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8700 for (cie = chunks; cie ; cie = cie->next)
8701 if (cie->chunk_start == look_for)
8702 break;
8704 if (!cie)
8706 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8707 cie_id, saved_start);
8708 start = block_end;
8709 fc->ncols = 0;
8710 fc->col_type = (short int *) xmalloc (sizeof (short int));
8711 fc->col_offset = (int *) xmalloc (sizeof (int));
8712 frame_need_space (fc, max_regs - 1);
8713 cie = fc;
8714 fc->augmentation = "";
8715 fc->fde_encoding = 0;
8717 else
8719 fc->ncols = cie->ncols;
8720 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8721 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8722 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8723 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8724 fc->augmentation = cie->augmentation;
8725 fc->code_factor = cie->code_factor;
8726 fc->data_factor = cie->data_factor;
8727 fc->cfa_reg = cie->cfa_reg;
8728 fc->cfa_offset = cie->cfa_offset;
8729 fc->ra = cie->ra;
8730 frame_need_space (fc, max_regs-1);
8731 fc->fde_encoding = cie->fde_encoding;
8734 if (fc->fde_encoding)
8735 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8737 fc->pc_begin = byte_get (start, encoded_ptr_size);
8738 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8739 fc->pc_begin += section->sh_addr + (start - section_start);
8740 start += encoded_ptr_size;
8741 fc->pc_range = byte_get (start, encoded_ptr_size);
8742 start += encoded_ptr_size;
8744 if (cie->augmentation[0] == 'z')
8746 augmentation_data_len = LEB ();
8747 augmentation_data = start;
8748 start += augmentation_data_len;
8751 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8752 (unsigned long)(saved_start - section_start), length, cie_id,
8753 (unsigned long)(cie->chunk_start - section_start),
8754 fc->pc_begin, fc->pc_begin + fc->pc_range);
8755 if (! do_debug_frames_interp && augmentation_data_len)
8757 unsigned long i;
8758 printf (" Augmentation data: ");
8759 for (i = 0; i < augmentation_data_len; ++i)
8760 printf (" %02x", augmentation_data[i]);
8761 putchar ('\n');
8762 putchar ('\n');
8766 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8767 about to interpret instructions for the chunk. */
8769 if (do_debug_frames_interp)
8771 /* Start by making a pass over the chunk, allocating storage
8772 and taking note of what registers are used. */
8773 unsigned char *tmp = start;
8775 while (start < block_end)
8777 unsigned op, opa;
8778 unsigned long reg;
8780 op = *start++;
8781 opa = op & 0x3f;
8782 if (op & 0xc0)
8783 op &= 0xc0;
8785 /* Warning: if you add any more cases to this switch, be
8786 sure to add them to the corresponding switch below. */
8787 switch (op)
8789 case DW_CFA_advance_loc:
8790 break;
8791 case DW_CFA_offset:
8792 LEB ();
8793 frame_need_space (fc, opa);
8794 fc->col_type[opa] = DW_CFA_undefined;
8795 break;
8796 case DW_CFA_restore:
8797 frame_need_space (fc, opa);
8798 fc->col_type[opa] = DW_CFA_undefined;
8799 break;
8800 case DW_CFA_set_loc:
8801 start += encoded_ptr_size;
8802 break;
8803 case DW_CFA_advance_loc1:
8804 start += 1;
8805 break;
8806 case DW_CFA_advance_loc2:
8807 start += 2;
8808 break;
8809 case DW_CFA_advance_loc4:
8810 start += 4;
8811 break;
8812 case DW_CFA_offset_extended:
8813 reg = LEB (); LEB ();
8814 frame_need_space (fc, reg);
8815 fc->col_type[reg] = DW_CFA_undefined;
8816 break;
8817 case DW_CFA_restore_extended:
8818 reg = LEB ();
8819 frame_need_space (fc, reg);
8820 fc->col_type[reg] = DW_CFA_undefined;
8821 break;
8822 case DW_CFA_undefined:
8823 reg = LEB ();
8824 frame_need_space (fc, reg);
8825 fc->col_type[reg] = DW_CFA_undefined;
8826 break;
8827 case DW_CFA_same_value:
8828 reg = LEB ();
8829 frame_need_space (fc, reg);
8830 fc->col_type[reg] = DW_CFA_undefined;
8831 break;
8832 case DW_CFA_register:
8833 reg = LEB (); LEB ();
8834 frame_need_space (fc, reg);
8835 fc->col_type[reg] = DW_CFA_undefined;
8836 break;
8837 case DW_CFA_def_cfa:
8838 LEB (); LEB ();
8839 break;
8840 case DW_CFA_def_cfa_register:
8841 LEB ();
8842 break;
8843 case DW_CFA_def_cfa_offset:
8844 LEB ();
8845 break;
8846 case DW_CFA_offset_extended_sf:
8847 reg = LEB (); SLEB ();
8848 frame_need_space (fc, reg);
8849 fc->col_type[reg] = DW_CFA_undefined;
8850 break;
8851 case DW_CFA_def_cfa_sf:
8852 LEB (); SLEB ();
8853 break;
8854 case DW_CFA_def_cfa_offset_sf:
8855 SLEB ();
8856 break;
8857 case DW_CFA_GNU_args_size:
8858 LEB ();
8859 break;
8860 case DW_CFA_GNU_negative_offset_extended:
8861 reg = LEB (); LEB ();
8862 frame_need_space (fc, reg);
8863 fc->col_type[reg] = DW_CFA_undefined;
8865 default:
8866 break;
8869 start = tmp;
8872 /* Now we know what registers are used, make a second pass over
8873 the chunk, this time actually printing out the info. */
8875 while (start < block_end)
8877 unsigned op, opa;
8878 unsigned long ul, reg, roffs;
8879 long l, ofs;
8880 bfd_vma vma;
8882 op = *start++;
8883 opa = op & 0x3f;
8884 if (op & 0xc0)
8885 op &= 0xc0;
8887 /* Warning: if you add any more cases to this switch, be
8888 sure to add them to the corresponding switch above. */
8889 switch (op)
8891 case DW_CFA_advance_loc:
8892 if (do_debug_frames_interp)
8893 frame_display_row (fc, &need_col_headers, &max_regs);
8894 else
8895 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8896 opa * fc->code_factor,
8897 fc->pc_begin + opa * fc->code_factor);
8898 fc->pc_begin += opa * fc->code_factor;
8899 break;
8901 case DW_CFA_offset:
8902 roffs = LEB ();
8903 if (! do_debug_frames_interp)
8904 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8905 opa, roffs * fc->data_factor);
8906 fc->col_type[opa] = DW_CFA_offset;
8907 fc->col_offset[opa] = roffs * fc->data_factor;
8908 break;
8910 case DW_CFA_restore:
8911 if (! do_debug_frames_interp)
8912 printf (" DW_CFA_restore: r%d\n", opa);
8913 fc->col_type[opa] = cie->col_type[opa];
8914 fc->col_offset[opa] = cie->col_offset[opa];
8915 break;
8917 case DW_CFA_set_loc:
8918 vma = byte_get (start, encoded_ptr_size);
8919 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8920 vma += section->sh_addr + (start - section_start);
8921 start += encoded_ptr_size;
8922 if (do_debug_frames_interp)
8923 frame_display_row (fc, &need_col_headers, &max_regs);
8924 else
8925 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8926 fc->pc_begin = vma;
8927 break;
8929 case DW_CFA_advance_loc1:
8930 ofs = byte_get (start, 1); start += 1;
8931 if (do_debug_frames_interp)
8932 frame_display_row (fc, &need_col_headers, &max_regs);
8933 else
8934 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8935 ofs * fc->code_factor,
8936 fc->pc_begin + ofs * fc->code_factor);
8937 fc->pc_begin += ofs * fc->code_factor;
8938 break;
8940 case DW_CFA_advance_loc2:
8941 ofs = byte_get (start, 2); start += 2;
8942 if (do_debug_frames_interp)
8943 frame_display_row (fc, &need_col_headers, &max_regs);
8944 else
8945 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8946 ofs * fc->code_factor,
8947 fc->pc_begin + ofs * fc->code_factor);
8948 fc->pc_begin += ofs * fc->code_factor;
8949 break;
8951 case DW_CFA_advance_loc4:
8952 ofs = byte_get (start, 4); start += 4;
8953 if (do_debug_frames_interp)
8954 frame_display_row (fc, &need_col_headers, &max_regs);
8955 else
8956 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8957 ofs * fc->code_factor,
8958 fc->pc_begin + ofs * fc->code_factor);
8959 fc->pc_begin += ofs * fc->code_factor;
8960 break;
8962 case DW_CFA_offset_extended:
8963 reg = LEB ();
8964 roffs = LEB ();
8965 if (! do_debug_frames_interp)
8966 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8967 reg, roffs * fc->data_factor);
8968 fc->col_type[reg] = DW_CFA_offset;
8969 fc->col_offset[reg] = roffs * fc->data_factor;
8970 break;
8972 case DW_CFA_restore_extended:
8973 reg = LEB ();
8974 if (! do_debug_frames_interp)
8975 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8976 fc->col_type[reg] = cie->col_type[reg];
8977 fc->col_offset[reg] = cie->col_offset[reg];
8978 break;
8980 case DW_CFA_undefined:
8981 reg = LEB ();
8982 if (! do_debug_frames_interp)
8983 printf (" DW_CFA_undefined: r%ld\n", reg);
8984 fc->col_type[reg] = DW_CFA_undefined;
8985 fc->col_offset[reg] = 0;
8986 break;
8988 case DW_CFA_same_value:
8989 reg = LEB ();
8990 if (! do_debug_frames_interp)
8991 printf (" DW_CFA_same_value: r%ld\n", reg);
8992 fc->col_type[reg] = DW_CFA_same_value;
8993 fc->col_offset[reg] = 0;
8994 break;
8996 case DW_CFA_register:
8997 reg = LEB ();
8998 roffs = LEB ();
8999 if (! do_debug_frames_interp)
9000 printf (" DW_CFA_register: r%ld\n", reg);
9001 fc->col_type[reg] = DW_CFA_register;
9002 fc->col_offset[reg] = roffs;
9003 break;
9005 case DW_CFA_remember_state:
9006 if (! do_debug_frames_interp)
9007 printf (" DW_CFA_remember_state\n");
9008 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
9009 rs->ncols = fc->ncols;
9010 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
9011 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
9012 memcpy (rs->col_type, fc->col_type, rs->ncols);
9013 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
9014 rs->next = remembered_state;
9015 remembered_state = rs;
9016 break;
9018 case DW_CFA_restore_state:
9019 if (! do_debug_frames_interp)
9020 printf (" DW_CFA_restore_state\n");
9021 rs = remembered_state;
9022 remembered_state = rs->next;
9023 frame_need_space (fc, rs->ncols-1);
9024 memcpy (fc->col_type, rs->col_type, rs->ncols);
9025 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
9026 free (rs->col_type);
9027 free (rs->col_offset);
9028 free (rs);
9029 break;
9031 case DW_CFA_def_cfa:
9032 fc->cfa_reg = LEB ();
9033 fc->cfa_offset = LEB ();
9034 if (! do_debug_frames_interp)
9035 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9036 fc->cfa_reg, fc->cfa_offset);
9037 break;
9039 case DW_CFA_def_cfa_register:
9040 fc->cfa_reg = LEB ();
9041 if (! do_debug_frames_interp)
9042 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
9043 break;
9045 case DW_CFA_def_cfa_offset:
9046 fc->cfa_offset = LEB ();
9047 if (! do_debug_frames_interp)
9048 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
9049 break;
9051 case DW_CFA_nop:
9052 if (! do_debug_frames_interp)
9053 printf (" DW_CFA_nop\n");
9054 break;
9056 case DW_CFA_offset_extended_sf:
9057 reg = LEB ();
9058 l = SLEB ();
9059 frame_need_space (fc, reg);
9060 if (! do_debug_frames_interp)
9061 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9062 reg, l * fc->data_factor);
9063 fc->col_type[reg] = DW_CFA_offset;
9064 fc->col_offset[reg] = l * fc->data_factor;
9065 break;
9067 case DW_CFA_def_cfa_sf:
9068 fc->cfa_reg = LEB ();
9069 fc->cfa_offset = SLEB ();
9070 if (! do_debug_frames_interp)
9071 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9072 fc->cfa_reg, fc->cfa_offset);
9073 break;
9075 case DW_CFA_def_cfa_offset_sf:
9076 fc->cfa_offset = SLEB ();
9077 if (! do_debug_frames_interp)
9078 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
9079 break;
9081 case DW_CFA_GNU_window_save:
9082 if (! do_debug_frames_interp)
9083 printf (" DW_CFA_GNU_window_save\n");
9084 break;
9086 case DW_CFA_GNU_args_size:
9087 ul = LEB ();
9088 if (! do_debug_frames_interp)
9089 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
9090 break;
9092 case DW_CFA_GNU_negative_offset_extended:
9093 reg = LEB ();
9094 l = - LEB ();
9095 frame_need_space (fc, reg);
9096 if (! do_debug_frames_interp)
9097 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9098 reg, l * fc->data_factor);
9099 fc->col_type[reg] = DW_CFA_offset;
9100 fc->col_offset[reg] = l * fc->data_factor;
9101 break;
9103 /* FIXME: How do we handle these? */
9104 case DW_CFA_def_cfa_expression:
9105 fprintf (stderr, "unsupported DW_CFA_def_cfa_expression\n");
9106 start = block_end;
9107 break;
9109 case DW_CFA_expression:
9110 fprintf (stderr, "unsupported DW_CFA_expression\n");
9111 start = block_end;
9112 break;
9114 default:
9115 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
9116 start = block_end;
9120 if (do_debug_frames_interp)
9121 frame_display_row (fc, &need_col_headers, &max_regs);
9123 start = block_end;
9126 printf ("\n");
9128 return 1;
9131 #undef GET
9132 #undef LEB
9133 #undef SLEB
9135 static int
9136 display_debug_not_supported (section, start, file)
9137 Elf_Internal_Shdr *section;
9138 unsigned char *start ATTRIBUTE_UNUSED;
9139 FILE *file ATTRIBUTE_UNUSED;
9141 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9142 SECTION_NAME (section));
9144 return 1;
9147 /* Pre-scan the .debug_info section to record the size of address.
9148 When dumping the .debug_line, we use that size information, assuming
9149 that all compilation units have the same address size. */
9150 static int
9151 prescan_debug_info (section, start, file)
9152 Elf_Internal_Shdr *section ATTRIBUTE_UNUSED;
9153 unsigned char *start;
9154 FILE *file ATTRIBUTE_UNUSED;
9156 DWARF2_External_CompUnit *external;
9158 external = (DWARF2_External_CompUnit *) start;
9160 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
9161 return 0;
9164 /* A structure containing the name of a debug section and a pointer
9165 to a function that can decode it. The third field is a prescan
9166 function to be run over the section before displaying any of the
9167 sections. */
9168 struct
9170 const char *const name;
9171 int (*display) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9172 int (*prescan) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9174 debug_displays[] =
9176 { ".debug_abbrev", display_debug_abbrev, NULL },
9177 { ".debug_aranges", display_debug_aranges, NULL },
9178 { ".debug_frame", display_debug_frames, NULL },
9179 { ".debug_info", display_debug_info, prescan_debug_info },
9180 { ".debug_line", display_debug_lines, NULL },
9181 { ".debug_pubnames", display_debug_pubnames, NULL },
9182 { ".eh_frame", display_debug_frames, NULL },
9183 { ".debug_macinfo", display_debug_macinfo, NULL },
9184 { ".debug_str", display_debug_str, NULL },
9185 { ".debug_loc", display_debug_loc, NULL },
9186 { ".debug_pubtypes", display_debug_not_supported, NULL },
9187 { ".debug_ranges", display_debug_not_supported, NULL },
9188 { ".debug_static_func", display_debug_not_supported, NULL },
9189 { ".debug_static_vars", display_debug_not_supported, NULL },
9190 { ".debug_types", display_debug_not_supported, NULL },
9191 { ".debug_weaknames", display_debug_not_supported, NULL }
9194 static int
9195 display_debug_section (section, file)
9196 Elf_Internal_Shdr *section;
9197 FILE *file;
9199 char *name = SECTION_NAME (section);
9200 bfd_size_type length;
9201 unsigned char *start;
9202 int i;
9204 length = section->sh_size;
9205 if (length == 0)
9207 printf (_("\nSection '%s' has no debugging data.\n"), name);
9208 return 0;
9211 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
9212 _("debug section data"));
9213 if (!start)
9214 return 0;
9216 /* See if we know how to display the contents of this section. */
9217 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
9218 name = ".debug_info";
9220 for (i = NUM_ELEM (debug_displays); i--;)
9221 if (strcmp (debug_displays[i].name, name) == 0)
9223 debug_displays[i].display (section, start, file);
9224 break;
9227 if (i == -1)
9228 printf (_("Unrecognized debug section: %s\n"), name);
9230 free (start);
9232 /* If we loaded in the abbrev section at some point,
9233 we must release it here. */
9234 free_abbrevs ();
9236 return 1;
9239 static int
9240 process_section_contents (file)
9241 FILE *file;
9243 Elf_Internal_Shdr *section;
9244 unsigned int i;
9246 if (! do_dump)
9247 return 1;
9249 /* Pre-scan the debug sections to find some debug information not
9250 present in some of them. For the .debug_line, we must find out the
9251 size of address (specified in .debug_info and .debug_aranges). */
9252 for (i = 0, section = section_headers;
9253 i < elf_header.e_shnum && i < num_dump_sects;
9254 i++, section++)
9256 char *name = SECTION_NAME (section);
9257 int j;
9259 if (section->sh_size == 0)
9260 continue;
9262 /* See if there is some pre-scan operation for this section. */
9263 for (j = NUM_ELEM (debug_displays); j--;)
9264 if (strcmp (debug_displays[j].name, name) == 0)
9266 if (debug_displays[j].prescan != NULL)
9268 bfd_size_type length;
9269 unsigned char *start;
9271 length = section->sh_size;
9272 start = ((unsigned char *)
9273 get_data (NULL, file, section->sh_offset, length,
9274 _("debug section data")));
9275 if (!start)
9276 return 0;
9278 debug_displays[j].prescan (section, start, file);
9279 free (start);
9282 break;
9286 for (i = 0, section = section_headers;
9287 i < elf_header.e_shnum && i < num_dump_sects;
9288 i++, section++)
9290 #ifdef SUPPORT_DISASSEMBLY
9291 if (dump_sects[i] & DISASS_DUMP)
9292 disassemble_section (section, file);
9293 #endif
9294 if (dump_sects[i] & HEX_DUMP)
9295 dump_section (section, file);
9297 if (dump_sects[i] & DEBUG_DUMP)
9298 display_debug_section (section, file);
9301 if (i < num_dump_sects)
9302 warn (_("Some sections were not dumped because they do not exist!\n"));
9304 return 1;
9307 static void
9308 process_mips_fpe_exception (mask)
9309 int mask;
9311 if (mask)
9313 int first = 1;
9314 if (mask & OEX_FPU_INEX)
9315 fputs ("INEX", stdout), first = 0;
9316 if (mask & OEX_FPU_UFLO)
9317 printf ("%sUFLO", first ? "" : "|"), first = 0;
9318 if (mask & OEX_FPU_OFLO)
9319 printf ("%sOFLO", first ? "" : "|"), first = 0;
9320 if (mask & OEX_FPU_DIV0)
9321 printf ("%sDIV0", first ? "" : "|"), first = 0;
9322 if (mask & OEX_FPU_INVAL)
9323 printf ("%sINVAL", first ? "" : "|");
9325 else
9326 fputs ("0", stdout);
9329 static int
9330 process_mips_specific (file)
9331 FILE *file;
9333 Elf_Internal_Dyn *entry;
9334 size_t liblist_offset = 0;
9335 size_t liblistno = 0;
9336 size_t conflictsno = 0;
9337 size_t options_offset = 0;
9338 size_t conflicts_offset = 0;
9340 /* We have a lot of special sections. Thanks SGI! */
9341 if (dynamic_segment == NULL)
9342 /* No information available. */
9343 return 0;
9345 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
9346 switch (entry->d_tag)
9348 case DT_MIPS_LIBLIST:
9349 liblist_offset = entry->d_un.d_val - loadaddr;
9350 break;
9351 case DT_MIPS_LIBLISTNO:
9352 liblistno = entry->d_un.d_val;
9353 break;
9354 case DT_MIPS_OPTIONS:
9355 options_offset = entry->d_un.d_val - loadaddr;
9356 break;
9357 case DT_MIPS_CONFLICT:
9358 conflicts_offset = entry->d_un.d_val - loadaddr;
9359 break;
9360 case DT_MIPS_CONFLICTNO:
9361 conflictsno = entry->d_un.d_val;
9362 break;
9363 default:
9364 break;
9367 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9369 Elf32_External_Lib *elib;
9370 size_t cnt;
9372 elib = ((Elf32_External_Lib *)
9373 get_data (NULL, file, liblist_offset,
9374 liblistno * sizeof (Elf32_External_Lib),
9375 _("liblist")));
9376 if (elib)
9378 printf ("\nSection '.liblist' contains %lu entries:\n",
9379 (unsigned long) liblistno);
9380 fputs (" Library Time Stamp Checksum Version Flags\n",
9381 stdout);
9383 for (cnt = 0; cnt < liblistno; ++cnt)
9385 Elf32_Lib liblist;
9386 time_t time;
9387 char timebuf[20];
9388 struct tm *tmp;
9390 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9391 time = BYTE_GET (elib[cnt].l_time_stamp);
9392 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9393 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9394 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9396 tmp = gmtime (&time);
9397 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9398 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9399 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9401 printf ("%3lu: ", (unsigned long) cnt);
9402 print_symbol (20, dynamic_strings + liblist.l_name);
9403 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9404 liblist.l_version);
9406 if (liblist.l_flags == 0)
9407 puts (" NONE");
9408 else
9410 static const struct
9412 const char *name;
9413 int bit;
9415 l_flags_vals[] =
9417 { " EXACT_MATCH", LL_EXACT_MATCH },
9418 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9419 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9420 { " EXPORTS", LL_EXPORTS },
9421 { " DELAY_LOAD", LL_DELAY_LOAD },
9422 { " DELTA", LL_DELTA }
9424 int flags = liblist.l_flags;
9425 size_t fcnt;
9427 for (fcnt = 0;
9428 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9429 ++fcnt)
9430 if ((flags & l_flags_vals[fcnt].bit) != 0)
9432 fputs (l_flags_vals[fcnt].name, stdout);
9433 flags ^= l_flags_vals[fcnt].bit;
9435 if (flags != 0)
9436 printf (" %#x", (unsigned int) flags);
9438 puts ("");
9442 free (elib);
9446 if (options_offset != 0)
9448 Elf_External_Options *eopt;
9449 Elf_Internal_Shdr *sect = section_headers;
9450 Elf_Internal_Options *iopt;
9451 Elf_Internal_Options *option;
9452 size_t offset;
9453 int cnt;
9455 /* Find the section header so that we get the size. */
9456 while (sect->sh_type != SHT_MIPS_OPTIONS)
9457 ++sect;
9459 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9460 sect->sh_size, _("options"));
9461 if (eopt)
9463 iopt = ((Elf_Internal_Options *)
9464 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt)));
9465 if (iopt == NULL)
9467 error (_("Out of memory"));
9468 return 0;
9471 offset = cnt = 0;
9472 option = iopt;
9474 while (offset < sect->sh_size)
9476 Elf_External_Options *eoption;
9478 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9480 option->kind = BYTE_GET (eoption->kind);
9481 option->size = BYTE_GET (eoption->size);
9482 option->section = BYTE_GET (eoption->section);
9483 option->info = BYTE_GET (eoption->info);
9485 offset += option->size;
9487 ++option;
9488 ++cnt;
9491 printf (_("\nSection '%s' contains %d entries:\n"),
9492 SECTION_NAME (sect), cnt);
9494 option = iopt;
9496 while (cnt-- > 0)
9498 size_t len;
9500 switch (option->kind)
9502 case ODK_NULL:
9503 /* This shouldn't happen. */
9504 printf (" NULL %d %lx", option->section, option->info);
9505 break;
9506 case ODK_REGINFO:
9507 printf (" REGINFO ");
9508 if (elf_header.e_machine == EM_MIPS)
9510 /* 32bit form. */
9511 Elf32_External_RegInfo *ereg;
9512 Elf32_RegInfo reginfo;
9514 ereg = (Elf32_External_RegInfo *) (option + 1);
9515 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9516 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9517 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9518 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9519 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9520 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9522 printf ("GPR %08lx GP 0x%lx\n",
9523 reginfo.ri_gprmask,
9524 (unsigned long) reginfo.ri_gp_value);
9525 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9526 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9527 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9529 else
9531 /* 64 bit form. */
9532 Elf64_External_RegInfo *ereg;
9533 Elf64_Internal_RegInfo reginfo;
9535 ereg = (Elf64_External_RegInfo *) (option + 1);
9536 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9537 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9538 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9539 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9540 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9541 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9543 printf ("GPR %08lx GP 0x",
9544 reginfo.ri_gprmask);
9545 printf_vma (reginfo.ri_gp_value);
9546 printf ("\n");
9548 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9549 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9550 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9552 ++option;
9553 continue;
9554 case ODK_EXCEPTIONS:
9555 fputs (" EXCEPTIONS fpe_min(", stdout);
9556 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9557 fputs (") fpe_max(", stdout);
9558 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9559 fputs (")", stdout);
9561 if (option->info & OEX_PAGE0)
9562 fputs (" PAGE0", stdout);
9563 if (option->info & OEX_SMM)
9564 fputs (" SMM", stdout);
9565 if (option->info & OEX_FPDBUG)
9566 fputs (" FPDBUG", stdout);
9567 if (option->info & OEX_DISMISS)
9568 fputs (" DISMISS", stdout);
9569 break;
9570 case ODK_PAD:
9571 fputs (" PAD ", stdout);
9572 if (option->info & OPAD_PREFIX)
9573 fputs (" PREFIX", stdout);
9574 if (option->info & OPAD_POSTFIX)
9575 fputs (" POSTFIX", stdout);
9576 if (option->info & OPAD_SYMBOL)
9577 fputs (" SYMBOL", stdout);
9578 break;
9579 case ODK_HWPATCH:
9580 fputs (" HWPATCH ", stdout);
9581 if (option->info & OHW_R4KEOP)
9582 fputs (" R4KEOP", stdout);
9583 if (option->info & OHW_R8KPFETCH)
9584 fputs (" R8KPFETCH", stdout);
9585 if (option->info & OHW_R5KEOP)
9586 fputs (" R5KEOP", stdout);
9587 if (option->info & OHW_R5KCVTL)
9588 fputs (" R5KCVTL", stdout);
9589 break;
9590 case ODK_FILL:
9591 fputs (" FILL ", stdout);
9592 /* XXX Print content of info word? */
9593 break;
9594 case ODK_TAGS:
9595 fputs (" TAGS ", stdout);
9596 /* XXX Print content of info word? */
9597 break;
9598 case ODK_HWAND:
9599 fputs (" HWAND ", stdout);
9600 if (option->info & OHWA0_R4KEOP_CHECKED)
9601 fputs (" R4KEOP_CHECKED", stdout);
9602 if (option->info & OHWA0_R4KEOP_CLEAN)
9603 fputs (" R4KEOP_CLEAN", stdout);
9604 break;
9605 case ODK_HWOR:
9606 fputs (" HWOR ", stdout);
9607 if (option->info & OHWA0_R4KEOP_CHECKED)
9608 fputs (" R4KEOP_CHECKED", stdout);
9609 if (option->info & OHWA0_R4KEOP_CLEAN)
9610 fputs (" R4KEOP_CLEAN", stdout);
9611 break;
9612 case ODK_GP_GROUP:
9613 printf (" GP_GROUP %#06lx self-contained %#06lx",
9614 option->info & OGP_GROUP,
9615 (option->info & OGP_SELF) >> 16);
9616 break;
9617 case ODK_IDENT:
9618 printf (" IDENT %#06lx self-contained %#06lx",
9619 option->info & OGP_GROUP,
9620 (option->info & OGP_SELF) >> 16);
9621 break;
9622 default:
9623 /* This shouldn't happen. */
9624 printf (" %3d ??? %d %lx",
9625 option->kind, option->section, option->info);
9626 break;
9629 len = sizeof (*eopt);
9630 while (len < option->size)
9631 if (((char *) option)[len] >= ' '
9632 && ((char *) option)[len] < 0x7f)
9633 printf ("%c", ((char *) option)[len++]);
9634 else
9635 printf ("\\%03o", ((char *) option)[len++]);
9637 fputs ("\n", stdout);
9638 ++option;
9641 free (eopt);
9645 if (conflicts_offset != 0 && conflictsno != 0)
9647 Elf32_Conflict *iconf;
9648 size_t cnt;
9650 if (dynamic_symbols == NULL)
9652 error (_("conflict list found without a dynamic symbol table"));
9653 return 0;
9656 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
9657 if (iconf == NULL)
9659 error (_("Out of memory"));
9660 return 0;
9663 if (is_32bit_elf)
9665 Elf32_External_Conflict *econf32;
9667 econf32 = ((Elf32_External_Conflict *)
9668 get_data (NULL, file, conflicts_offset,
9669 conflictsno * sizeof (*econf32),
9670 _("conflict")));
9671 if (!econf32)
9672 return 0;
9674 for (cnt = 0; cnt < conflictsno; ++cnt)
9675 iconf[cnt] = BYTE_GET (econf32[cnt]);
9677 free (econf32);
9679 else
9681 Elf64_External_Conflict *econf64;
9683 econf64 = ((Elf64_External_Conflict *)
9684 get_data (NULL, file, conflicts_offset,
9685 conflictsno * sizeof (*econf64),
9686 _("conflict")));
9687 if (!econf64)
9688 return 0;
9690 for (cnt = 0; cnt < conflictsno; ++cnt)
9691 iconf[cnt] = BYTE_GET (econf64[cnt]);
9693 free (econf64);
9696 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9697 (long) conflictsno);
9698 puts (_(" Num: Index Value Name"));
9700 for (cnt = 0; cnt < conflictsno; ++cnt)
9702 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
9704 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
9705 print_vma (psym->st_value, FULL_HEX);
9706 putchar (' ');
9707 print_symbol (25, dynamic_strings + psym->st_name);
9708 putchar ('\n');
9711 free (iconf);
9714 return 1;
9717 static int
9718 process_gnu_liblist (file)
9719 FILE *file;
9721 Elf_Internal_Shdr *section, *string_sec;
9722 Elf32_External_Lib *elib;
9723 char *strtab;
9724 size_t cnt;
9725 unsigned i;
9727 if (! do_arch)
9728 return 0;
9730 for (i = 0, section = section_headers;
9731 i < elf_header.e_shnum;
9732 i++, section++)
9734 switch (section->sh_type)
9736 case SHT_GNU_LIBLIST:
9737 elib = ((Elf32_External_Lib *)
9738 get_data (NULL, file, section->sh_offset, section->sh_size,
9739 _("liblist")));
9741 if (elib == NULL)
9742 break;
9743 string_sec = SECTION_HEADER (section->sh_link);
9745 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9746 string_sec->sh_size,
9747 _("liblist string table"));
9749 if (strtab == NULL
9750 || section->sh_entsize != sizeof (Elf32_External_Lib))
9752 free (elib);
9753 break;
9756 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9757 SECTION_NAME (section),
9758 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9760 puts (" Library Time Stamp Checksum Version Flags");
9762 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9763 ++cnt)
9765 Elf32_Lib liblist;
9766 time_t time;
9767 char timebuf[20];
9768 struct tm *tmp;
9770 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9771 time = BYTE_GET (elib[cnt].l_time_stamp);
9772 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9773 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9774 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9776 tmp = gmtime (&time);
9777 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9778 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9779 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9781 printf ("%3lu: ", (unsigned long) cnt);
9782 if (do_wide)
9783 printf ("%-20s", strtab + liblist.l_name);
9784 else
9785 printf ("%-20.20s", strtab + liblist.l_name);
9786 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9787 liblist.l_version, liblist.l_flags);
9790 free (elib);
9794 return 1;
9797 static const char *
9798 get_note_type (e_type)
9799 unsigned e_type;
9801 static char buff[64];
9803 switch (e_type)
9805 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9806 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9807 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9808 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9809 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9810 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9811 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9812 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9813 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9814 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9815 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9816 default:
9817 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9818 return buff;
9822 static const char *
9823 get_netbsd_elfcore_note_type (e_type)
9824 unsigned e_type;
9826 static char buff[64];
9828 if (e_type == NT_NETBSDCORE_PROCINFO)
9830 /* NetBSD core "procinfo" structure. */
9831 return _("NetBSD procinfo structure");
9834 /* As of Jan 2002 there are no other machine-independent notes
9835 defined for NetBSD core files. If the note type is less
9836 than the start of the machine-dependent note types, we don't
9837 understand it. */
9839 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9841 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9842 return buff;
9845 switch (elf_header.e_machine)
9847 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9848 and PT_GETFPREGS == mach+2. */
9850 case EM_OLD_ALPHA:
9851 case EM_ALPHA:
9852 case EM_SPARC:
9853 case EM_SPARC32PLUS:
9854 case EM_SPARCV9:
9855 switch (e_type)
9857 case NT_NETBSDCORE_FIRSTMACH+0:
9858 return _("PT_GETREGS (reg structure)");
9859 case NT_NETBSDCORE_FIRSTMACH+2:
9860 return _("PT_GETFPREGS (fpreg structure)");
9861 default:
9862 break;
9864 break;
9866 /* On all other arch's, PT_GETREGS == mach+1 and
9867 PT_GETFPREGS == mach+3. */
9868 default:
9869 switch (e_type)
9871 case NT_NETBSDCORE_FIRSTMACH+1:
9872 return _("PT_GETREGS (reg structure)");
9873 case NT_NETBSDCORE_FIRSTMACH+3:
9874 return _("PT_GETFPREGS (fpreg structure)");
9875 default:
9876 break;
9880 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9881 return buff;
9884 /* Note that by the ELF standard, the name field is already null byte
9885 terminated, and namesz includes the terminating null byte.
9886 I.E. the value of namesz for the name "FSF" is 4.
9888 If the value of namesz is zero, there is no name present. */
9889 static int
9890 process_note (pnote)
9891 Elf_Internal_Note *pnote;
9893 const char *nt;
9895 if (pnote->namesz == 0)
9897 /* If there is no note name, then use the default set of
9898 note type strings. */
9899 nt = get_note_type (pnote->type);
9901 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9903 /* NetBSD-specific core file notes. */
9904 nt = get_netbsd_elfcore_note_type (pnote->type);
9906 else
9908 /* Don't recognize this note name; just use the default set of
9909 note type strings. */
9910 nt = get_note_type (pnote->type);
9913 printf (" %s\t\t0x%08lx\t%s\n",
9914 pnote->namesz ? pnote->namedata : "(NONE)",
9915 pnote->descsz, nt);
9916 return 1;
9920 static int
9921 process_corefile_note_segment (file, offset, length)
9922 FILE *file;
9923 bfd_vma offset;
9924 bfd_vma length;
9926 Elf_External_Note *pnotes;
9927 Elf_External_Note *external;
9928 int res = 1;
9930 if (length <= 0)
9931 return 0;
9933 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9934 _("notes"));
9935 if (!pnotes)
9936 return 0;
9938 external = pnotes;
9940 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9941 (unsigned long) offset, (unsigned long) length);
9942 printf (_(" Owner\t\tData size\tDescription\n"));
9944 while (external < (Elf_External_Note *)((char *) pnotes + length))
9946 Elf_External_Note *next;
9947 Elf_Internal_Note inote;
9948 char *temp = NULL;
9950 inote.type = BYTE_GET (external->type);
9951 inote.namesz = BYTE_GET (external->namesz);
9952 inote.namedata = external->name;
9953 inote.descsz = BYTE_GET (external->descsz);
9954 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9955 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9957 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9959 if (((char *) next) > (((char *) pnotes) + length))
9961 warn (_("corrupt note found at offset %x into core notes\n"),
9962 ((char *) external) - ((char *) pnotes));
9963 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9964 inote.type, inote.namesz, inote.descsz);
9965 break;
9968 external = next;
9970 /* Verify that name is null terminated. It appears that at least
9971 one version of Linux (RedHat 6.0) generates corefiles that don't
9972 comply with the ELF spec by failing to include the null byte in
9973 namesz. */
9974 if (inote.namedata[inote.namesz] != '\0')
9976 temp = malloc (inote.namesz + 1);
9978 if (temp == NULL)
9980 error (_("Out of memory\n"));
9981 res = 0;
9982 break;
9985 strncpy (temp, inote.namedata, inote.namesz);
9986 temp[inote.namesz] = 0;
9988 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9989 inote.namedata = temp;
9992 res &= process_note (& inote);
9994 if (temp != NULL)
9996 free (temp);
9997 temp = NULL;
10001 free (pnotes);
10003 return res;
10006 static int
10007 process_corefile_note_segments (file)
10008 FILE *file;
10010 Elf_Internal_Phdr *program_headers;
10011 Elf_Internal_Phdr *segment;
10012 unsigned int i;
10013 int res = 1;
10015 program_headers = (Elf_Internal_Phdr *) malloc
10016 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
10018 if (program_headers == NULL)
10020 error (_("Out of memory\n"));
10021 return 0;
10024 if (is_32bit_elf)
10025 i = get_32bit_program_headers (file, program_headers);
10026 else
10027 i = get_64bit_program_headers (file, program_headers);
10029 if (i == 0)
10031 free (program_headers);
10032 return 0;
10035 for (i = 0, segment = program_headers;
10036 i < elf_header.e_phnum;
10037 i++, segment++)
10039 if (segment->p_type == PT_NOTE)
10040 res &= process_corefile_note_segment (file,
10041 (bfd_vma) segment->p_offset,
10042 (bfd_vma) segment->p_filesz);
10045 free (program_headers);
10047 return res;
10050 static int
10051 process_corefile_contents (file)
10052 FILE *file;
10054 /* If we have not been asked to display the notes then do nothing. */
10055 if (! do_notes)
10056 return 1;
10058 /* If file is not a core file then exit. */
10059 if (elf_header.e_type != ET_CORE)
10060 return 1;
10062 /* No program headers means no NOTE segment. */
10063 if (elf_header.e_phnum == 0)
10065 printf (_("No note segments present in the core file.\n"));
10066 return 1;
10069 return process_corefile_note_segments (file);
10072 static int
10073 process_arch_specific (file)
10074 FILE *file;
10076 if (! do_arch)
10077 return 1;
10079 switch (elf_header.e_machine)
10081 case EM_MIPS:
10082 case EM_MIPS_RS3_LE:
10083 return process_mips_specific (file);
10084 break;
10085 default:
10086 break;
10088 return 1;
10091 static int
10092 get_file_header (file)
10093 FILE *file;
10095 /* Read in the identity array. */
10096 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
10097 return 0;
10099 /* Determine how to read the rest of the header. */
10100 switch (elf_header.e_ident[EI_DATA])
10102 default: /* fall through */
10103 case ELFDATANONE: /* fall through */
10104 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
10105 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
10108 /* For now we only support 32 bit and 64 bit ELF files. */
10109 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
10111 /* Read in the rest of the header. */
10112 if (is_32bit_elf)
10114 Elf32_External_Ehdr ehdr32;
10116 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
10117 return 0;
10119 elf_header.e_type = BYTE_GET (ehdr32.e_type);
10120 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
10121 elf_header.e_version = BYTE_GET (ehdr32.e_version);
10122 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
10123 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
10124 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
10125 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
10126 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
10127 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
10128 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
10129 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
10130 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
10131 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
10133 else
10135 Elf64_External_Ehdr ehdr64;
10137 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10138 we will not be able to cope with the 64bit data found in
10139 64 ELF files. Detect this now and abort before we start
10140 overwritting things. */
10141 if (sizeof (bfd_vma) < 8)
10143 error (_("This instance of readelf has been built without support for a\n\
10144 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10145 return 0;
10148 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
10149 return 0;
10151 elf_header.e_type = BYTE_GET (ehdr64.e_type);
10152 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
10153 elf_header.e_version = BYTE_GET (ehdr64.e_version);
10154 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
10155 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
10156 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
10157 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
10158 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
10159 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
10160 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
10161 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
10162 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
10163 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
10166 if (elf_header.e_shoff)
10168 /* There may be some extensions in the first section header. Don't
10169 bomb if we can't read it. */
10170 if (is_32bit_elf)
10171 get_32bit_section_headers (file, 1);
10172 else
10173 get_64bit_section_headers (file, 1);
10176 return 1;
10179 static int
10180 process_file (file_name)
10181 char *file_name;
10183 FILE *file;
10184 struct stat statbuf;
10185 unsigned int i;
10187 if (stat (file_name, & statbuf) < 0)
10189 error (_("Cannot stat input file %s.\n"), file_name);
10190 return 1;
10193 file = fopen (file_name, "rb");
10194 if (file == NULL)
10196 error (_("Input file %s not found.\n"), file_name);
10197 return 1;
10200 if (! get_file_header (file))
10202 error (_("%s: Failed to read file header\n"), file_name);
10203 fclose (file);
10204 return 1;
10207 /* Initialise per file variables. */
10208 for (i = NUM_ELEM (version_info); i--;)
10209 version_info[i] = 0;
10211 for (i = NUM_ELEM (dynamic_info); i--;)
10212 dynamic_info[i] = 0;
10214 /* Process the file. */
10215 if (show_name)
10216 printf (_("\nFile: %s\n"), file_name);
10218 if (! process_file_header ())
10220 fclose (file);
10221 return 1;
10224 if (! process_section_headers (file))
10226 /* Without loaded section headers we
10227 cannot process lots of things. */
10228 do_unwind = do_version = do_dump = do_arch = 0;
10230 if (! do_using_dynamic)
10231 do_syms = do_reloc = 0;
10234 if (process_program_headers (file))
10235 process_dynamic_segment (file);
10237 process_relocs (file);
10239 process_unwind (file);
10241 process_symbol_table (file);
10243 process_syminfo (file);
10245 process_version_sections (file);
10247 process_section_contents (file);
10249 process_corefile_contents (file);
10251 process_gnu_liblist (file);
10253 process_arch_specific (file);
10255 fclose (file);
10257 if (section_headers)
10259 free (section_headers);
10260 section_headers = NULL;
10263 if (string_table)
10265 free (string_table);
10266 string_table = NULL;
10267 string_table_length = 0;
10270 if (dynamic_strings)
10272 free (dynamic_strings);
10273 dynamic_strings = NULL;
10276 if (dynamic_symbols)
10278 free (dynamic_symbols);
10279 dynamic_symbols = NULL;
10280 num_dynamic_syms = 0;
10283 if (dynamic_syminfo)
10285 free (dynamic_syminfo);
10286 dynamic_syminfo = NULL;
10289 return 0;
10292 #ifdef SUPPORT_DISASSEMBLY
10293 /* Needed by the i386 disassembler. For extra credit, someone could
10294 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10295 symbols. */
10297 void
10298 print_address (unsigned int addr, FILE *outfile)
10300 fprintf (outfile,"0x%8.8x", addr);
10303 /* Needed by the i386 disassembler. */
10304 void
10305 db_task_printsym (unsigned int addr)
10307 print_address (addr, stderr);
10309 #endif
10311 int main PARAMS ((int, char **));
10314 main (argc, argv)
10315 int argc;
10316 char **argv;
10318 int err;
10319 char *cmdline_dump_sects = NULL;
10320 unsigned num_cmdline_dump_sects = 0;
10322 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10323 setlocale (LC_MESSAGES, "");
10324 #endif
10325 #if defined (HAVE_SETLOCALE)
10326 setlocale (LC_CTYPE, "");
10327 #endif
10328 bindtextdomain (PACKAGE, LOCALEDIR);
10329 textdomain (PACKAGE);
10331 parse_args (argc, argv);
10333 if (optind < (argc - 1))
10334 show_name = 1;
10336 /* When processing more than one file remember the dump requests
10337 issued on command line to reset them after each file. */
10338 if (optind + 1 < argc && dump_sects != NULL)
10340 cmdline_dump_sects = malloc (num_dump_sects);
10341 if (cmdline_dump_sects == NULL)
10342 error (_("Out of memory allocating dump request table."));
10343 else
10345 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
10346 num_cmdline_dump_sects = num_dump_sects;
10350 err = 0;
10351 while (optind < argc)
10353 err |= process_file (argv[optind++]);
10355 /* Reset dump requests. */
10356 if (optind < argc && dump_sects != NULL)
10358 num_dump_sects = num_cmdline_dump_sects;
10359 if (num_cmdline_dump_sects > 0)
10360 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
10364 if (dump_sects != NULL)
10365 free (dump_sects);
10366 if (cmdline_dump_sects != NULL)
10367 free (cmdline_dump_sects);
10369 return err;