* readelf.c (process_program_headers): When setting loadaddr, don't
[binutils.git] / binutils / readelf.c
blob6a5732a0a588067c597b9a9b49b1c55f8c9255a4
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002 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/or32.h"
79 #include "elf/pj.h"
80 #include "elf/ppc.h"
81 #include "elf/s390.h"
82 #include "elf/sh.h"
83 #include "elf/sparc.h"
84 #include "elf/v850.h"
85 #include "elf/vax.h"
86 #include "elf/x86-64.h"
87 #include "elf/xstormy16.h"
89 #include "bucomm.h"
90 #include "getopt.h"
92 char *program_name = "readelf";
93 unsigned long dynamic_addr;
94 bfd_size_type dynamic_size;
95 char *dynamic_strings;
96 char *string_table;
97 unsigned long string_table_length;
98 unsigned long num_dynamic_syms;
99 Elf_Internal_Sym *dynamic_symbols;
100 Elf_Internal_Syminfo *dynamic_syminfo;
101 unsigned long dynamic_syminfo_offset;
102 unsigned int dynamic_syminfo_nent;
103 char program_interpreter[64];
104 long dynamic_info[DT_JMPREL + 1];
105 long version_info[16];
106 long loadaddr = 0;
107 Elf_Internal_Ehdr elf_header;
108 Elf_Internal_Shdr *section_headers;
109 Elf_Internal_Dyn *dynamic_segment;
110 Elf_Internal_Shdr *symtab_shndx_hdr;
111 int show_name;
112 int do_dynamic;
113 int do_syms;
114 int do_reloc;
115 int do_sections;
116 int do_segments;
117 int do_unwind;
118 int do_using_dynamic;
119 int do_header;
120 int do_dump;
121 int do_version;
122 int do_wide;
123 int do_histogram;
124 int do_debugging;
125 int do_debug_info;
126 int do_debug_abbrevs;
127 int do_debug_lines;
128 int do_debug_pubnames;
129 int do_debug_aranges;
130 int do_debug_frames;
131 int do_debug_frames_interp;
132 int do_debug_macinfo;
133 int do_debug_str;
134 int do_debug_loc;
135 int do_arch;
136 int do_notes;
137 int is_32bit_elf;
139 /* A dynamic array of flags indicating which sections require dumping. */
140 char *dump_sects = NULL;
141 unsigned int num_dump_sects = 0;
143 #define HEX_DUMP (1 << 0)
144 #define DISASS_DUMP (1 << 1)
145 #define DEBUG_DUMP (1 << 2)
147 /* How to rpint a vma value. */
148 typedef enum print_mode
150 HEX,
151 DEC,
152 DEC_5,
153 UNSIGNED,
154 PREFIX_HEX,
155 FULL_HEX,
156 LONG_HEX
158 print_mode;
160 /* Forward declarations for dumb compilers. */
161 static void print_vma
162 PARAMS ((bfd_vma, print_mode));
163 static void print_symbol
164 PARAMS ((int, const char *));
165 static bfd_vma (*byte_get)
166 PARAMS ((unsigned char *, int));
167 static bfd_vma byte_get_little_endian
168 PARAMS ((unsigned char *, int));
169 static bfd_vma byte_get_big_endian
170 PARAMS ((unsigned char *, int));
171 static const char *get_mips_dynamic_type
172 PARAMS ((unsigned long));
173 static const char *get_sparc64_dynamic_type
174 PARAMS ((unsigned long));
175 static const char *get_ppc64_dynamic_type
176 PARAMS ((unsigned long));
177 static const char *get_parisc_dynamic_type
178 PARAMS ((unsigned long));
179 static const char *get_dynamic_type
180 PARAMS ((unsigned long));
181 static int slurp_rela_relocs
182 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
183 unsigned long *));
184 static int slurp_rel_relocs
185 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
186 unsigned long *));
187 static int dump_relocations
188 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *,
189 unsigned long, char *, int));
190 static char *get_file_type
191 PARAMS ((unsigned));
192 static char *get_machine_name
193 PARAMS ((unsigned));
194 static void decode_ARM_machine_flags
195 PARAMS ((unsigned, char[]));
196 static char *get_machine_flags
197 PARAMS ((unsigned, unsigned));
198 static const char *get_mips_segment_type
199 PARAMS ((unsigned long));
200 static const char *get_parisc_segment_type
201 PARAMS ((unsigned long));
202 static const char *get_ia64_segment_type
203 PARAMS ((unsigned long));
204 static const char *get_segment_type
205 PARAMS ((unsigned long));
206 static const char *get_mips_section_type_name
207 PARAMS ((unsigned int));
208 static const char *get_parisc_section_type_name
209 PARAMS ((unsigned int));
210 static const char *get_ia64_section_type_name
211 PARAMS ((unsigned int));
212 static const char *get_section_type_name
213 PARAMS ((unsigned int));
214 static const char *get_symbol_binding
215 PARAMS ((unsigned int));
216 static const char *get_symbol_type
217 PARAMS ((unsigned int));
218 static const char *get_symbol_visibility
219 PARAMS ((unsigned int));
220 static const char *get_symbol_index_type
221 PARAMS ((unsigned int));
222 static const char *get_dynamic_flags
223 PARAMS ((bfd_vma));
224 static void usage
225 PARAMS ((void));
226 static void parse_args
227 PARAMS ((int, char **));
228 static int process_file_header
229 PARAMS ((void));
230 static int process_program_headers
231 PARAMS ((FILE *));
232 static int process_section_headers
233 PARAMS ((FILE *));
234 static int process_unwind
235 PARAMS ((FILE *));
236 static void dynamic_segment_mips_val
237 PARAMS ((Elf_Internal_Dyn *));
238 static void dynamic_segment_parisc_val
239 PARAMS ((Elf_Internal_Dyn *));
240 static int process_dynamic_segment
241 PARAMS ((FILE *));
242 static int process_symbol_table
243 PARAMS ((FILE *));
244 static int process_syminfo
245 PARAMS ((FILE *));
246 static int process_section_contents
247 PARAMS ((FILE *));
248 static void process_mips_fpe_exception
249 PARAMS ((int));
250 static int process_mips_specific
251 PARAMS ((FILE *));
252 static int process_file
253 PARAMS ((char *));
254 static int process_relocs
255 PARAMS ((FILE *));
256 static int process_version_sections
257 PARAMS ((FILE *));
258 static char *get_ver_flags
259 PARAMS ((unsigned int));
260 static int get_32bit_section_headers
261 PARAMS ((FILE *, unsigned int));
262 static int get_64bit_section_headers
263 PARAMS ((FILE *, unsigned int));
264 static int get_32bit_program_headers
265 PARAMS ((FILE *, Elf_Internal_Phdr *));
266 static int get_64bit_program_headers
267 PARAMS ((FILE *, Elf_Internal_Phdr *));
268 static int get_file_header
269 PARAMS ((FILE *));
270 static Elf_Internal_Sym *get_32bit_elf_symbols
271 PARAMS ((FILE *, Elf_Internal_Shdr *));
272 static Elf_Internal_Sym *get_64bit_elf_symbols
273 PARAMS ((FILE *, Elf_Internal_Shdr *));
274 static const char *get_elf_section_flags
275 PARAMS ((bfd_vma));
276 static int *get_dynamic_data
277 PARAMS ((FILE *, unsigned int));
278 static int get_32bit_dynamic_segment
279 PARAMS ((FILE *));
280 static int get_64bit_dynamic_segment
281 PARAMS ((FILE *));
282 #ifdef SUPPORT_DISASSEMBLY
283 static int disassemble_section
284 PARAMS ((Elf_Internal_Shdr *, FILE *));
285 #endif
286 static int dump_section
287 PARAMS ((Elf_Internal_Shdr *, FILE *));
288 static int display_debug_section
289 PARAMS ((Elf_Internal_Shdr *, FILE *));
290 static int display_debug_info
291 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
292 static int display_debug_not_supported
293 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
294 static int prescan_debug_info
295 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
296 static int display_debug_lines
297 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
298 static int display_debug_pubnames
299 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
300 static int display_debug_abbrev
301 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
302 static int display_debug_aranges
303 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
304 static int display_debug_frames
305 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
306 static int display_debug_macinfo
307 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
308 static int display_debug_str
309 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
310 static int display_debug_loc
311 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
312 static unsigned char *process_abbrev_section
313 PARAMS ((unsigned char *, unsigned char *));
314 static void load_debug_str
315 PARAMS ((FILE *));
316 static void free_debug_str
317 PARAMS ((void));
318 static const char *fetch_indirect_string
319 PARAMS ((unsigned long));
320 static void load_debug_loc
321 PARAMS ((FILE *));
322 static void free_debug_loc
323 PARAMS ((void));
324 static unsigned long read_leb128
325 PARAMS ((unsigned char *, int *, int));
326 static int process_extended_line_op
327 PARAMS ((unsigned char *, int, int));
328 static void reset_state_machine
329 PARAMS ((int));
330 static char *get_TAG_name
331 PARAMS ((unsigned long));
332 static char *get_AT_name
333 PARAMS ((unsigned long));
334 static char *get_FORM_name
335 PARAMS ((unsigned long));
336 static void free_abbrevs
337 PARAMS ((void));
338 static void add_abbrev
339 PARAMS ((unsigned long, unsigned long, int));
340 static void add_abbrev_attr
341 PARAMS ((unsigned long, unsigned long));
342 static unsigned char *read_and_display_attr
343 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
344 unsigned long));
345 static unsigned char *read_and_display_attr_value
346 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
347 unsigned long));
348 static unsigned char *display_block
349 PARAMS ((unsigned char *, unsigned long));
350 static void decode_location_expression
351 PARAMS ((unsigned char *, unsigned int, unsigned long));
352 static void request_dump
353 PARAMS ((unsigned int, int));
354 static const char *get_elf_class
355 PARAMS ((unsigned int));
356 static const char *get_data_encoding
357 PARAMS ((unsigned int));
358 static const char *get_osabi_name
359 PARAMS ((unsigned int));
360 static int guess_is_rela
361 PARAMS ((unsigned long));
362 static const char *get_note_type
363 PARAMS ((unsigned int));
364 static const char *get_netbsd_elfcore_note_type
365 PARAMS ((unsigned int));
366 static int process_note
367 PARAMS ((Elf_Internal_Note *));
368 static int process_corefile_note_segment
369 PARAMS ((FILE *, bfd_vma, bfd_vma));
370 static int process_corefile_note_segments
371 PARAMS ((FILE *));
372 static int process_corefile_contents
373 PARAMS ((FILE *));
374 static int process_arch_specific
375 PARAMS ((FILE *));
376 static int process_gnu_liblist
377 PARAMS ((FILE *));
379 typedef int Elf32_Word;
381 #define UNKNOWN -1
383 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
384 ((X)->sh_name >= string_table_length \
385 ? "<corrupt>" : string_table + (X)->sh_name))
387 /* Given st_shndx I, map to section_headers index. */
388 #define SECTION_HEADER_INDEX(I) \
389 ((I) < SHN_LORESERVE \
390 ? (I) \
391 : ((I) <= SHN_HIRESERVE \
392 ? 0 \
393 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
395 /* Reverse of the above. */
396 #define SECTION_HEADER_NUM(N) \
397 ((N) < SHN_LORESERVE \
398 ? (N) \
399 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
401 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
403 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
405 #define BYTE_GET(field) byte_get (field, sizeof (field))
407 /* If we can support a 64 bit data type then BFD64 should be defined
408 and sizeof (bfd_vma) == 8. In this case when translating from an
409 external 8 byte field to an internal field, we can assume that the
410 internal field is also 8 bytes wide and so we can extract all the data.
411 If, however, BFD64 is not defined, then we must assume that the
412 internal data structure only has 4 byte wide fields that are the
413 equivalent of the 8 byte wide external counterparts, and so we must
414 truncate the data. */
415 #ifdef BFD64
416 #define BYTE_GET8(field) byte_get (field, -8)
417 #else
418 #define BYTE_GET8(field) byte_get (field, 8)
419 #endif
421 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
423 #define GET_ELF_SYMBOLS(file, section) \
424 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
425 : get_64bit_elf_symbols (file, section))
428 static void
429 error VPARAMS ((const char *message, ...))
431 VA_OPEN (args, message);
432 VA_FIXEDARG (args, const char *, message);
434 fprintf (stderr, _("%s: Error: "), program_name);
435 vfprintf (stderr, message, args);
436 VA_CLOSE (args);
439 static void
440 warn VPARAMS ((const char *message, ...))
442 VA_OPEN (args, message);
443 VA_FIXEDARG (args, const char *, message);
445 fprintf (stderr, _("%s: Warning: "), program_name);
446 vfprintf (stderr, message, args);
447 VA_CLOSE (args);
450 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
452 static PTR
453 get_data (var, file, offset, size, reason)
454 PTR var;
455 FILE *file;
456 long offset;
457 size_t size;
458 const char *reason;
460 PTR mvar;
462 if (size == 0)
463 return NULL;
465 if (fseek (file, offset, SEEK_SET))
467 error (_("Unable to seek to %x for %s\n"), offset, reason);
468 return NULL;
471 mvar = var;
472 if (mvar == NULL)
474 mvar = (PTR) malloc (size);
476 if (mvar == NULL)
478 error (_("Out of memory allocating %d bytes for %s\n"),
479 size, reason);
480 return NULL;
484 if (fread (mvar, size, 1, file) != 1)
486 error (_("Unable to read in %d bytes of %s\n"), size, reason);
487 if (mvar != var)
488 free (mvar);
489 return NULL;
492 return mvar;
495 static bfd_vma
496 byte_get_little_endian (field, size)
497 unsigned char *field;
498 int size;
500 switch (size)
502 case 1:
503 return *field;
505 case 2:
506 return ((unsigned int) (field[0]))
507 | (((unsigned int) (field[1])) << 8);
509 #ifndef BFD64
510 case 8:
511 /* We want to extract data from an 8 byte wide field and
512 place it into a 4 byte wide field. Since this is a little
513 endian source we can just use the 4 byte extraction code. */
514 /* Fall through. */
515 #endif
516 case 4:
517 return ((unsigned long) (field[0]))
518 | (((unsigned long) (field[1])) << 8)
519 | (((unsigned long) (field[2])) << 16)
520 | (((unsigned long) (field[3])) << 24);
522 #ifdef BFD64
523 case 8:
524 case -8:
525 /* This is a special case, generated by the BYTE_GET8 macro.
526 It means that we are loading an 8 byte value from a field
527 in an external structure into an 8 byte value in a field
528 in an internal strcuture. */
529 return ((bfd_vma) (field[0]))
530 | (((bfd_vma) (field[1])) << 8)
531 | (((bfd_vma) (field[2])) << 16)
532 | (((bfd_vma) (field[3])) << 24)
533 | (((bfd_vma) (field[4])) << 32)
534 | (((bfd_vma) (field[5])) << 40)
535 | (((bfd_vma) (field[6])) << 48)
536 | (((bfd_vma) (field[7])) << 56);
537 #endif
538 default:
539 error (_("Unhandled data length: %d\n"), size);
540 abort ();
544 /* Print a VMA value. */
545 static void
546 print_vma (vma, mode)
547 bfd_vma vma;
548 print_mode mode;
550 #ifdef BFD64
551 if (is_32bit_elf)
552 #endif
554 switch (mode)
556 case FULL_HEX: printf ("0x"); /* drop through */
557 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
558 case PREFIX_HEX: printf ("0x"); /* drop through */
559 case HEX: printf ("%lx", (unsigned long) vma); break;
560 case DEC: printf ("%ld", (unsigned long) vma); break;
561 case DEC_5: printf ("%5ld", (long) vma); break;
562 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
565 #ifdef BFD64
566 else
568 switch (mode)
570 case FULL_HEX:
571 printf ("0x");
572 /* drop through */
574 case LONG_HEX:
575 printf_vma (vma);
576 break;
578 case PREFIX_HEX:
579 printf ("0x");
580 /* drop through */
582 case HEX:
583 #if BFD_HOST_64BIT_LONG
584 printf ("%lx", vma);
585 #else
586 if (_bfd_int64_high (vma))
587 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
588 else
589 printf ("%lx", _bfd_int64_low (vma));
590 #endif
591 break;
593 case DEC:
594 #if BFD_HOST_64BIT_LONG
595 printf ("%ld", vma);
596 #else
597 if (_bfd_int64_high (vma))
598 /* ugg */
599 printf ("++%ld", _bfd_int64_low (vma));
600 else
601 printf ("%ld", _bfd_int64_low (vma));
602 #endif
603 break;
605 case DEC_5:
606 #if BFD_HOST_64BIT_LONG
607 printf ("%5ld", vma);
608 #else
609 if (_bfd_int64_high (vma))
610 /* ugg */
611 printf ("++%ld", _bfd_int64_low (vma));
612 else
613 printf ("%5ld", _bfd_int64_low (vma));
614 #endif
615 break;
617 case UNSIGNED:
618 #if BFD_HOST_64BIT_LONG
619 printf ("%lu", vma);
620 #else
621 if (_bfd_int64_high (vma))
622 /* ugg */
623 printf ("++%lu", _bfd_int64_low (vma));
624 else
625 printf ("%lu", _bfd_int64_low (vma));
626 #endif
627 break;
630 #endif
633 /* Display a symbol on stdout. If do_wide is not true then
634 format the symbol to be at most WIDTH characters,
635 truncating as necessary. If WIDTH is negative then
636 format the string to be exactly - WIDTH characters,
637 truncating or padding as necessary. */
639 static void
640 print_symbol (width, symbol)
641 int width;
642 const char *symbol;
644 if (do_wide)
645 printf ("%s", symbol);
646 else if (width < 0)
647 printf ("%-*.*s", width, width, symbol);
648 else
649 printf ("%-.*s", width, symbol);
652 static bfd_vma
653 byte_get_big_endian (field, size)
654 unsigned char *field;
655 int size;
657 switch (size)
659 case 1:
660 return *field;
662 case 2:
663 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
665 case 4:
666 return ((unsigned long) (field[3]))
667 | (((unsigned long) (field[2])) << 8)
668 | (((unsigned long) (field[1])) << 16)
669 | (((unsigned long) (field[0])) << 24);
671 #ifndef BFD64
672 case 8:
673 /* Although we are extracing data from an 8 byte wide field, we
674 are returning only 4 bytes of data. */
675 return ((unsigned long) (field[7]))
676 | (((unsigned long) (field[6])) << 8)
677 | (((unsigned long) (field[5])) << 16)
678 | (((unsigned long) (field[4])) << 24);
679 #else
680 case 8:
681 case -8:
682 /* This is a special case, generated by the BYTE_GET8 macro.
683 It means that we are loading an 8 byte value from a field
684 in an external structure into an 8 byte value in a field
685 in an internal strcuture. */
686 return ((bfd_vma) (field[7]))
687 | (((bfd_vma) (field[6])) << 8)
688 | (((bfd_vma) (field[5])) << 16)
689 | (((bfd_vma) (field[4])) << 24)
690 | (((bfd_vma) (field[3])) << 32)
691 | (((bfd_vma) (field[2])) << 40)
692 | (((bfd_vma) (field[1])) << 48)
693 | (((bfd_vma) (field[0])) << 56);
694 #endif
696 default:
697 error (_("Unhandled data length: %d\n"), size);
698 abort ();
702 /* Guess the relocation size commonly used by the specific machines. */
704 static int
705 guess_is_rela (e_machine)
706 unsigned long e_machine;
708 switch (e_machine)
710 /* Targets that use REL relocations. */
711 case EM_ARM:
712 case EM_386:
713 case EM_486:
714 case EM_960:
715 case EM_DLX:
716 case EM_OPENRISC:
717 case EM_OR32:
718 case EM_M32R:
719 case EM_CYGNUS_M32R:
720 case EM_D10V:
721 case EM_CYGNUS_D10V:
722 case EM_MIPS:
723 case EM_MIPS_RS3_LE:
724 return FALSE;
726 /* Targets that use RELA relocations. */
727 case EM_68K:
728 case EM_H8_300:
729 case EM_H8_300H:
730 case EM_H8S:
731 case EM_SPARC32PLUS:
732 case EM_SPARCV9:
733 case EM_SPARC:
734 case EM_PPC:
735 case EM_PPC64:
736 case EM_V850:
737 case EM_CYGNUS_V850:
738 case EM_D30V:
739 case EM_CYGNUS_D30V:
740 case EM_MN10200:
741 case EM_CYGNUS_MN10200:
742 case EM_MN10300:
743 case EM_CYGNUS_MN10300:
744 case EM_FR30:
745 case EM_CYGNUS_FR30:
746 case EM_CYGNUS_FRV:
747 case EM_SH:
748 case EM_ALPHA:
749 case EM_MCORE:
750 case EM_IA_64:
751 case EM_AVR:
752 case EM_AVR_OLD:
753 case EM_CRIS:
754 case EM_860:
755 case EM_X86_64:
756 case EM_S390:
757 case EM_S390_OLD:
758 case EM_MMIX:
759 case EM_XSTORMY16:
760 case EM_VAX:
761 case EM_IP2K:
762 case EM_IP2K_OLD:
763 return TRUE;
765 case EM_MMA:
766 case EM_PCP:
767 case EM_NCPU:
768 case EM_NDR1:
769 case EM_STARCORE:
770 case EM_ME16:
771 case EM_ST100:
772 case EM_TINYJ:
773 case EM_FX66:
774 case EM_ST9PLUS:
775 case EM_ST7:
776 case EM_68HC16:
777 case EM_68HC11:
778 case EM_68HC08:
779 case EM_68HC05:
780 case EM_SVX:
781 case EM_ST19:
782 default:
783 warn (_("Don't know about relocations on this machine architecture\n"));
784 return FALSE;
788 static int
789 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
790 FILE *file;
791 unsigned long rel_offset;
792 unsigned long rel_size;
793 Elf_Internal_Rela **relasp;
794 unsigned long *nrelasp;
796 Elf_Internal_Rela *relas;
797 unsigned long nrelas;
798 unsigned int i;
800 if (is_32bit_elf)
802 Elf32_External_Rela *erelas;
804 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
805 rel_size, _("relocs"));
806 if (!erelas)
807 return 0;
809 nrelas = rel_size / sizeof (Elf32_External_Rela);
811 relas = (Elf_Internal_Rela *)
812 malloc (nrelas * sizeof (Elf_Internal_Rela));
814 if (relas == NULL)
816 error(_("out of memory parsing relocs"));
817 return 0;
820 for (i = 0; i < nrelas; i++)
822 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
823 relas[i].r_info = BYTE_GET (erelas[i].r_info);
824 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
827 free (erelas);
829 else
831 Elf64_External_Rela *erelas;
833 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
834 rel_size, _("relocs"));
835 if (!erelas)
836 return 0;
838 nrelas = rel_size / sizeof (Elf64_External_Rela);
840 relas = (Elf_Internal_Rela *)
841 malloc (nrelas * sizeof (Elf_Internal_Rela));
843 if (relas == NULL)
845 error(_("out of memory parsing relocs"));
846 return 0;
849 for (i = 0; i < nrelas; i++)
851 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
852 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
853 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
856 free (erelas);
858 *relasp = relas;
859 *nrelasp = nrelas;
860 return 1;
863 static int
864 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
865 FILE *file;
866 unsigned long rel_offset;
867 unsigned long rel_size;
868 Elf_Internal_Rela **relsp;
869 unsigned long *nrelsp;
871 Elf_Internal_Rela *rels;
872 unsigned long nrels;
873 unsigned int i;
875 if (is_32bit_elf)
877 Elf32_External_Rel *erels;
879 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
880 rel_size, _("relocs"));
881 if (!erels)
882 return 0;
884 nrels = rel_size / sizeof (Elf32_External_Rel);
886 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
888 if (rels == NULL)
890 error(_("out of memory parsing relocs"));
891 return 0;
894 for (i = 0; i < nrels; i++)
896 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
897 rels[i].r_info = BYTE_GET (erels[i].r_info);
898 rels[i].r_addend = 0;
901 free (erels);
903 else
905 Elf64_External_Rel *erels;
907 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
908 rel_size, _("relocs"));
909 if (!erels)
910 return 0;
912 nrels = rel_size / sizeof (Elf64_External_Rel);
914 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
916 if (rels == NULL)
918 error(_("out of memory parsing relocs"));
919 return 0;
922 for (i = 0; i < nrels; i++)
924 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
925 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
926 rels[i].r_addend = 0;
929 free (erels);
931 *relsp = rels;
932 *nrelsp = nrels;
933 return 1;
936 /* Display the contents of the relocation data found at the specified offset. */
937 static int
938 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
939 FILE *file;
940 unsigned long rel_offset;
941 unsigned long rel_size;
942 Elf_Internal_Sym *symtab;
943 unsigned long nsyms;
944 char *strtab;
945 int is_rela;
947 unsigned int i;
948 Elf_Internal_Rela *rels;
951 if (is_rela == UNKNOWN)
952 is_rela = guess_is_rela (elf_header.e_machine);
954 if (is_rela)
956 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
957 return 0;
959 else
961 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
962 return 0;
965 if (is_32bit_elf)
967 if (is_rela)
969 if (do_wide)
970 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
971 else
972 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
974 else
976 if (do_wide)
977 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
978 else
979 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
982 else
984 if (is_rela)
986 if (do_wide)
987 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
988 else
989 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
991 else
993 if (do_wide)
994 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
995 else
996 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1000 for (i = 0; i < rel_size; i++)
1002 const char *rtype;
1003 const char *rtype2 = NULL;
1004 const char *rtype3 = NULL;
1005 bfd_vma offset;
1006 bfd_vma info;
1007 bfd_vma symtab_index;
1008 bfd_vma type;
1009 bfd_vma type2 = (bfd_vma) NULL;
1010 bfd_vma type3 = (bfd_vma) NULL;
1012 offset = rels[i].r_offset;
1013 info = rels[i].r_info;
1015 if (is_32bit_elf)
1017 type = ELF32_R_TYPE (info);
1018 symtab_index = ELF32_R_SYM (info);
1020 else
1022 if (elf_header.e_machine == EM_MIPS)
1024 type = ELF64_MIPS_R_TYPE (info);
1025 type2 = ELF64_MIPS_R_TYPE2 (info);
1026 type3 = ELF64_MIPS_R_TYPE3 (info);
1028 else if (elf_header.e_machine == EM_SPARCV9)
1029 type = ELF64_R_TYPE_ID (info);
1030 else
1031 type = ELF64_R_TYPE (info);
1032 /* The #ifdef BFD64 below is to prevent a compile time warning.
1033 We know that if we do not have a 64 bit data type that we
1034 will never execute this code anyway. */
1035 #ifdef BFD64
1036 symtab_index = ELF64_R_SYM (info);
1037 #endif
1040 if (is_32bit_elf)
1042 #ifdef _bfd_int64_low
1043 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
1044 #else
1045 printf ("%8.8lx %8.8lx ", offset, info);
1046 #endif
1048 else
1050 #ifdef _bfd_int64_low
1051 printf (do_wide
1052 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1053 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1054 _bfd_int64_high (offset),
1055 _bfd_int64_low (offset),
1056 _bfd_int64_high (info),
1057 _bfd_int64_low (info));
1058 #else
1059 printf (do_wide
1060 ? "%16.16lx %16.16lx "
1061 : "%12.12lx %12.12lx ",
1062 offset, info);
1063 #endif
1066 switch (elf_header.e_machine)
1068 default:
1069 rtype = NULL;
1070 break;
1072 case EM_M32R:
1073 case EM_CYGNUS_M32R:
1074 rtype = elf_m32r_reloc_type (type);
1075 break;
1077 case EM_386:
1078 case EM_486:
1079 rtype = elf_i386_reloc_type (type);
1080 break;
1082 case EM_68HC11:
1083 case EM_68HC12:
1084 rtype = elf_m68hc11_reloc_type (type);
1085 break;
1087 case EM_68K:
1088 rtype = elf_m68k_reloc_type (type);
1089 break;
1091 case EM_960:
1092 rtype = elf_i960_reloc_type (type);
1093 break;
1095 case EM_AVR:
1096 case EM_AVR_OLD:
1097 rtype = elf_avr_reloc_type (type);
1098 break;
1100 case EM_OLD_SPARCV9:
1101 case EM_SPARC32PLUS:
1102 case EM_SPARCV9:
1103 case EM_SPARC:
1104 rtype = elf_sparc_reloc_type (type);
1105 break;
1107 case EM_V850:
1108 case EM_CYGNUS_V850:
1109 rtype = v850_reloc_type (type);
1110 break;
1112 case EM_D10V:
1113 case EM_CYGNUS_D10V:
1114 rtype = elf_d10v_reloc_type (type);
1115 break;
1117 case EM_D30V:
1118 case EM_CYGNUS_D30V:
1119 rtype = elf_d30v_reloc_type (type);
1120 break;
1122 case EM_DLX:
1123 rtype = elf_dlx_reloc_type (type);
1124 break;
1126 case EM_SH:
1127 rtype = elf_sh_reloc_type (type);
1128 break;
1130 case EM_MN10300:
1131 case EM_CYGNUS_MN10300:
1132 rtype = elf_mn10300_reloc_type (type);
1133 break;
1135 case EM_MN10200:
1136 case EM_CYGNUS_MN10200:
1137 rtype = elf_mn10200_reloc_type (type);
1138 break;
1140 case EM_FR30:
1141 case EM_CYGNUS_FR30:
1142 rtype = elf_fr30_reloc_type (type);
1143 break;
1145 case EM_CYGNUS_FRV:
1146 rtype = elf_frv_reloc_type (type);
1147 break;
1149 case EM_MCORE:
1150 rtype = elf_mcore_reloc_type (type);
1151 break;
1153 case EM_MMIX:
1154 rtype = elf_mmix_reloc_type (type);
1155 break;
1157 case EM_PPC:
1158 case EM_PPC64:
1159 rtype = elf_ppc_reloc_type (type);
1160 break;
1162 case EM_MIPS:
1163 case EM_MIPS_RS3_LE:
1164 rtype = elf_mips_reloc_type (type);
1165 if (!is_32bit_elf)
1167 rtype2 = elf_mips_reloc_type (type2);
1168 rtype3 = elf_mips_reloc_type (type3);
1170 break;
1172 case EM_ALPHA:
1173 rtype = elf_alpha_reloc_type (type);
1174 break;
1176 case EM_ARM:
1177 rtype = elf_arm_reloc_type (type);
1178 break;
1180 case EM_ARC:
1181 rtype = elf_arc_reloc_type (type);
1182 break;
1184 case EM_PARISC:
1185 rtype = elf_hppa_reloc_type (type);
1186 break;
1188 case EM_H8_300:
1189 case EM_H8_300H:
1190 case EM_H8S:
1191 rtype = elf_h8_reloc_type (type);
1192 break;
1194 case EM_OPENRISC:
1195 case EM_OR32:
1196 rtype = elf_or32_reloc_type (type);
1197 break;
1199 case EM_PJ:
1200 case EM_PJ_OLD:
1201 rtype = elf_pj_reloc_type (type);
1202 break;
1203 case EM_IA_64:
1204 rtype = elf_ia64_reloc_type (type);
1205 break;
1207 case EM_CRIS:
1208 rtype = elf_cris_reloc_type (type);
1209 break;
1211 case EM_860:
1212 rtype = elf_i860_reloc_type (type);
1213 break;
1215 case EM_X86_64:
1216 rtype = elf_x86_64_reloc_type (type);
1217 break;
1219 case EM_S370:
1220 rtype = i370_reloc_type (type);
1221 break;
1223 case EM_S390_OLD:
1224 case EM_S390:
1225 rtype = elf_s390_reloc_type (type);
1226 break;
1228 case EM_XSTORMY16:
1229 rtype = elf_xstormy16_reloc_type (type);
1230 break;
1232 case EM_VAX:
1233 rtype = elf_vax_reloc_type (type);
1234 break;
1236 case EM_IP2K:
1237 case EM_IP2K_OLD:
1238 rtype = elf_ip2k_reloc_type (type);
1239 break;
1242 if (rtype == NULL)
1243 #ifdef _bfd_int64_low
1244 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1245 #else
1246 printf (_("unrecognized: %-7lx"), type);
1247 #endif
1248 else
1249 printf (do_wide ? "%-21.21s" : "%-17.17s", rtype);
1251 if (symtab_index)
1253 if (symtab == NULL || symtab_index >= nsyms)
1254 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1255 else
1257 Elf_Internal_Sym *psym;
1259 psym = symtab + symtab_index;
1261 printf (" ");
1262 print_vma (psym->st_value, LONG_HEX);
1263 printf (is_32bit_elf ? " " : " ");
1265 if (psym->st_name == 0)
1267 const char *sec_name = "<null>";
1268 char name_buf[40];
1270 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1272 bfd_vma sec_index = (bfd_vma) -1;
1274 if (psym->st_shndx < SHN_LORESERVE)
1275 sec_index = psym->st_shndx;
1276 else if (psym->st_shndx > SHN_LORESERVE)
1277 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1278 - SHN_LORESERVE);
1280 if (sec_index != (bfd_vma) -1)
1281 sec_name = SECTION_NAME (section_headers + sec_index);
1282 else if (psym->st_shndx == SHN_ABS)
1283 sec_name = "ABS";
1284 else if (psym->st_shndx == SHN_COMMON)
1285 sec_name = "COMMON";
1286 else
1288 sprintf (name_buf, "<section 0x%x>",
1289 (unsigned int) psym->st_shndx);
1290 sec_name = name_buf;
1293 print_symbol (22, sec_name);
1295 else if (strtab == NULL)
1296 printf (_("<string table index %3ld>"), psym->st_name);
1297 else
1298 print_symbol (22, strtab + psym->st_name);
1300 if (is_rela)
1301 printf (" + %lx", (unsigned long) rels[i].r_addend);
1304 else if (is_rela)
1306 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1307 print_vma (rels[i].r_addend, LONG_HEX);
1310 if (elf_header.e_machine == EM_SPARCV9
1311 && !strcmp (rtype, "R_SPARC_OLO10"))
1312 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1314 putchar ('\n');
1316 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1318 printf (" Type2: ");
1320 if (rtype2 == NULL)
1321 #ifdef _bfd_int64_low
1322 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1323 #else
1324 printf (_("unrecognized: %-7lx"), type2);
1325 #endif
1326 else
1327 printf ("%-17.17s", rtype2);
1329 printf("\n Type3: ");
1331 if (rtype3 == NULL)
1332 #ifdef _bfd_int64_low
1333 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1334 #else
1335 printf (_("unrecognized: %-7lx"), type3);
1336 #endif
1337 else
1338 printf ("%-17.17s", rtype3);
1340 putchar ('\n');
1344 free (rels);
1346 return 1;
1349 static const char *
1350 get_mips_dynamic_type (type)
1351 unsigned long type;
1353 switch (type)
1355 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1356 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1357 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1358 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1359 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1360 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1361 case DT_MIPS_MSYM: return "MIPS_MSYM";
1362 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1363 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1364 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1365 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1366 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1367 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1368 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1369 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1370 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1371 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1372 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1373 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1374 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1375 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1376 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1377 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1378 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1379 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1380 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1381 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1382 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1383 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1384 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1385 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1386 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1387 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1388 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1389 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1390 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1391 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1392 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1393 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1394 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1395 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1396 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1397 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1398 default:
1399 return NULL;
1403 static const char *
1404 get_sparc64_dynamic_type (type)
1405 unsigned long type;
1407 switch (type)
1409 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1410 default:
1411 return NULL;
1415 static const char *
1416 get_ppc64_dynamic_type (type)
1417 unsigned long type;
1419 switch (type)
1421 case DT_PPC64_GLINK: return "PPC64_GLINK";
1422 case DT_PPC64_OPD: return "PPC64_OPD";
1423 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1424 default:
1425 return NULL;
1429 static const char *
1430 get_parisc_dynamic_type (type)
1431 unsigned long type;
1433 switch (type)
1435 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1436 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1437 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1438 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1439 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1440 case DT_HP_PREINIT: return "HP_PREINIT";
1441 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1442 case DT_HP_NEEDED: return "HP_NEEDED";
1443 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1444 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1445 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1446 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1447 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1448 default:
1449 return NULL;
1453 static const char *
1454 get_dynamic_type (type)
1455 unsigned long type;
1457 static char buff[32];
1459 switch (type)
1461 case DT_NULL: return "NULL";
1462 case DT_NEEDED: return "NEEDED";
1463 case DT_PLTRELSZ: return "PLTRELSZ";
1464 case DT_PLTGOT: return "PLTGOT";
1465 case DT_HASH: return "HASH";
1466 case DT_STRTAB: return "STRTAB";
1467 case DT_SYMTAB: return "SYMTAB";
1468 case DT_RELA: return "RELA";
1469 case DT_RELASZ: return "RELASZ";
1470 case DT_RELAENT: return "RELAENT";
1471 case DT_STRSZ: return "STRSZ";
1472 case DT_SYMENT: return "SYMENT";
1473 case DT_INIT: return "INIT";
1474 case DT_FINI: return "FINI";
1475 case DT_SONAME: return "SONAME";
1476 case DT_RPATH: return "RPATH";
1477 case DT_SYMBOLIC: return "SYMBOLIC";
1478 case DT_REL: return "REL";
1479 case DT_RELSZ: return "RELSZ";
1480 case DT_RELENT: return "RELENT";
1481 case DT_PLTREL: return "PLTREL";
1482 case DT_DEBUG: return "DEBUG";
1483 case DT_TEXTREL: return "TEXTREL";
1484 case DT_JMPREL: return "JMPREL";
1485 case DT_BIND_NOW: return "BIND_NOW";
1486 case DT_INIT_ARRAY: return "INIT_ARRAY";
1487 case DT_FINI_ARRAY: return "FINI_ARRAY";
1488 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1489 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1490 case DT_RUNPATH: return "RUNPATH";
1491 case DT_FLAGS: return "FLAGS";
1493 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1494 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1496 case DT_CHECKSUM: return "CHECKSUM";
1497 case DT_PLTPADSZ: return "PLTPADSZ";
1498 case DT_MOVEENT: return "MOVEENT";
1499 case DT_MOVESZ: return "MOVESZ";
1500 case DT_FEATURE: return "FEATURE";
1501 case DT_POSFLAG_1: return "POSFLAG_1";
1502 case DT_SYMINSZ: return "SYMINSZ";
1503 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1505 case DT_ADDRRNGLO: return "ADDRRNGLO";
1506 case DT_CONFIG: return "CONFIG";
1507 case DT_DEPAUDIT: return "DEPAUDIT";
1508 case DT_AUDIT: return "AUDIT";
1509 case DT_PLTPAD: return "PLTPAD";
1510 case DT_MOVETAB: return "MOVETAB";
1511 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1513 case DT_VERSYM: return "VERSYM";
1515 case DT_RELACOUNT: return "RELACOUNT";
1516 case DT_RELCOUNT: return "RELCOUNT";
1517 case DT_FLAGS_1: return "FLAGS_1";
1518 case DT_VERDEF: return "VERDEF";
1519 case DT_VERDEFNUM: return "VERDEFNUM";
1520 case DT_VERNEED: return "VERNEED";
1521 case DT_VERNEEDNUM: return "VERNEEDNUM";
1523 case DT_AUXILIARY: return "AUXILIARY";
1524 case DT_USED: return "USED";
1525 case DT_FILTER: return "FILTER";
1527 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1528 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1529 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1530 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1531 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1533 default:
1534 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1536 const char *result;
1538 switch (elf_header.e_machine)
1540 case EM_MIPS:
1541 case EM_MIPS_RS3_LE:
1542 result = get_mips_dynamic_type (type);
1543 break;
1544 case EM_SPARCV9:
1545 result = get_sparc64_dynamic_type (type);
1546 break;
1547 case EM_PPC64:
1548 result = get_ppc64_dynamic_type (type);
1549 break;
1550 default:
1551 result = NULL;
1552 break;
1555 if (result != NULL)
1556 return result;
1558 sprintf (buff, _("Processor Specific: %lx"), type);
1560 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1562 const char *result;
1564 switch (elf_header.e_machine)
1566 case EM_PARISC:
1567 result = get_parisc_dynamic_type (type);
1568 break;
1569 default:
1570 result = NULL;
1571 break;
1574 if (result != NULL)
1575 return result;
1577 sprintf (buff, _("Operating System specific: %lx"), type);
1579 else
1580 sprintf (buff, _("<unknown>: %lx"), type);
1582 return buff;
1586 static char *
1587 get_file_type (e_type)
1588 unsigned e_type;
1590 static char buff[32];
1592 switch (e_type)
1594 case ET_NONE: return _("NONE (None)");
1595 case ET_REL: return _("REL (Relocatable file)");
1596 case ET_EXEC: return _("EXEC (Executable file)");
1597 case ET_DYN: return _("DYN (Shared object file)");
1598 case ET_CORE: return _("CORE (Core file)");
1600 default:
1601 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1602 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1603 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1604 sprintf (buff, _("OS Specific: (%x)"), e_type);
1605 else
1606 sprintf (buff, _("<unknown>: %x"), e_type);
1607 return buff;
1611 static char *
1612 get_machine_name (e_machine)
1613 unsigned e_machine;
1615 static char buff[64]; /* XXX */
1617 switch (e_machine)
1619 case EM_NONE: return _("None");
1620 case EM_M32: return "WE32100";
1621 case EM_SPARC: return "Sparc";
1622 case EM_386: return "Intel 80386";
1623 case EM_68K: return "MC68000";
1624 case EM_88K: return "MC88000";
1625 case EM_486: return "Intel 80486";
1626 case EM_860: return "Intel 80860";
1627 case EM_MIPS: return "MIPS R3000";
1628 case EM_S370: return "IBM System/370";
1629 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1630 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1631 case EM_PARISC: return "HPPA";
1632 case EM_PPC_OLD: return "Power PC (old)";
1633 case EM_SPARC32PLUS: return "Sparc v8+" ;
1634 case EM_960: return "Intel 90860";
1635 case EM_PPC: return "PowerPC";
1636 case EM_PPC64: return "PowerPC64";
1637 case EM_V800: return "NEC V800";
1638 case EM_FR20: return "Fujitsu FR20";
1639 case EM_RH32: return "TRW RH32";
1640 case EM_MCORE: return "MCORE";
1641 case EM_ARM: return "ARM";
1642 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1643 case EM_SH: return "Hitachi SH";
1644 case EM_SPARCV9: return "Sparc v9";
1645 case EM_TRICORE: return "Siemens Tricore";
1646 case EM_ARC: return "ARC";
1647 case EM_H8_300: return "Hitachi H8/300";
1648 case EM_H8_300H: return "Hitachi H8/300H";
1649 case EM_H8S: return "Hitachi H8S";
1650 case EM_H8_500: return "Hitachi H8/500";
1651 case EM_IA_64: return "Intel IA-64";
1652 case EM_MIPS_X: return "Stanford MIPS-X";
1653 case EM_COLDFIRE: return "Motorola Coldfire";
1654 case EM_68HC12: return "Motorola M68HC12";
1655 case EM_ALPHA: return "Alpha";
1656 case EM_CYGNUS_D10V:
1657 case EM_D10V: return "d10v";
1658 case EM_CYGNUS_D30V:
1659 case EM_D30V: return "d30v";
1660 case EM_CYGNUS_M32R:
1661 case EM_M32R: return "Mitsubishi M32r";
1662 case EM_CYGNUS_V850:
1663 case EM_V850: return "NEC v850";
1664 case EM_CYGNUS_MN10300:
1665 case EM_MN10300: return "mn10300";
1666 case EM_CYGNUS_MN10200:
1667 case EM_MN10200: return "mn10200";
1668 case EM_CYGNUS_FR30:
1669 case EM_FR30: return "Fujitsu FR30";
1670 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1671 case EM_PJ_OLD:
1672 case EM_PJ: return "picoJava";
1673 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1674 case EM_PCP: return "Siemens PCP";
1675 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1676 case EM_NDR1: return "Denso NDR1 microprocesspr";
1677 case EM_STARCORE: return "Motorola Star*Core processor";
1678 case EM_ME16: return "Toyota ME16 processor";
1679 case EM_ST100: return "STMicroelectronics ST100 processor";
1680 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1681 case EM_FX66: return "Siemens FX66 microcontroller";
1682 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1683 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1684 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1685 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1686 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1687 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1688 case EM_SVX: return "Silicon Graphics SVx";
1689 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1690 case EM_VAX: return "Digital VAX";
1691 case EM_AVR_OLD:
1692 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1693 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1694 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1695 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1696 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1697 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1698 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1699 case EM_PRISM: return "SiTera Prism";
1700 case EM_X86_64: return "Advanced Micro Devices X86-64";
1701 case EM_S390_OLD:
1702 case EM_S390: return "IBM S/390";
1703 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1704 case EM_OPENRISC:
1705 case EM_OR32: return "OpenRISC";
1706 case EM_DLX: return "OpenDLX";
1707 case EM_IP2K_OLD:
1708 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1709 default:
1710 sprintf (buff, _("<unknown>: %x"), e_machine);
1711 return buff;
1715 static void
1716 decode_ARM_machine_flags (e_flags, buf)
1717 unsigned e_flags;
1718 char buf[];
1720 unsigned eabi;
1721 int unknown = 0;
1723 eabi = EF_ARM_EABI_VERSION (e_flags);
1724 e_flags &= ~ EF_ARM_EABIMASK;
1726 /* Handle "generic" ARM flags. */
1727 if (e_flags & EF_ARM_RELEXEC)
1729 strcat (buf, ", relocatable executable");
1730 e_flags &= ~ EF_ARM_RELEXEC;
1733 if (e_flags & EF_ARM_HASENTRY)
1735 strcat (buf, ", has entry point");
1736 e_flags &= ~ EF_ARM_HASENTRY;
1739 /* Now handle EABI specific flags. */
1740 switch (eabi)
1742 default:
1743 strcat (buf, ", <unrecognized EABI>");
1744 if (e_flags)
1745 unknown = 1;
1746 break;
1748 case EF_ARM_EABI_VER1:
1749 strcat (buf, ", Version1 EABI");
1750 while (e_flags)
1752 unsigned flag;
1754 /* Process flags one bit at a time. */
1755 flag = e_flags & - e_flags;
1756 e_flags &= ~ flag;
1758 switch (flag)
1760 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1761 strcat (buf, ", sorted symbol tables");
1762 break;
1764 default:
1765 unknown = 1;
1766 break;
1769 break;
1771 case EF_ARM_EABI_VER2:
1772 strcat (buf, ", Version2 EABI");
1773 while (e_flags)
1775 unsigned flag;
1777 /* Process flags one bit at a time. */
1778 flag = e_flags & - e_flags;
1779 e_flags &= ~ flag;
1781 switch (flag)
1783 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1784 strcat (buf, ", sorted symbol tables");
1785 break;
1787 case EF_ARM_DYNSYMSUSESEGIDX:
1788 strcat (buf, ", dynamic symbols use segment index");
1789 break;
1791 case EF_ARM_MAPSYMSFIRST:
1792 strcat (buf, ", mapping symbols precede others");
1793 break;
1795 default:
1796 unknown = 1;
1797 break;
1800 break;
1802 case EF_ARM_EABI_UNKNOWN:
1803 strcat (buf, ", GNU EABI");
1804 while (e_flags)
1806 unsigned flag;
1808 /* Process flags one bit at a time. */
1809 flag = e_flags & - e_flags;
1810 e_flags &= ~ flag;
1812 switch (flag)
1814 case EF_ARM_INTERWORK:
1815 strcat (buf, ", interworking enabled");
1816 break;
1818 case EF_ARM_APCS_26:
1819 strcat (buf, ", uses APCS/26");
1820 break;
1822 case EF_ARM_APCS_FLOAT:
1823 strcat (buf, ", uses APCS/float");
1824 break;
1826 case EF_ARM_PIC:
1827 strcat (buf, ", position independent");
1828 break;
1830 case EF_ARM_ALIGN8:
1831 strcat (buf, ", 8 bit structure alignment");
1832 break;
1834 case EF_ARM_NEW_ABI:
1835 strcat (buf, ", uses new ABI");
1836 break;
1838 case EF_ARM_OLD_ABI:
1839 strcat (buf, ", uses old ABI");
1840 break;
1842 case EF_ARM_SOFT_FLOAT:
1843 strcat (buf, ", software FP");
1844 break;
1846 default:
1847 unknown = 1;
1848 break;
1853 if (unknown)
1854 strcat (buf,", <unknown>");
1857 static char *
1858 get_machine_flags (e_flags, e_machine)
1859 unsigned e_flags;
1860 unsigned e_machine;
1862 static char buf[1024];
1864 buf[0] = '\0';
1866 if (e_flags)
1868 switch (e_machine)
1870 default:
1871 break;
1873 case EM_ARM:
1874 decode_ARM_machine_flags (e_flags, buf);
1875 break;
1877 case EM_68K:
1878 if (e_flags & EF_CPU32)
1879 strcat (buf, ", cpu32");
1880 if (e_flags & EF_M68000)
1881 strcat (buf, ", m68000");
1882 break;
1884 case EM_PPC:
1885 if (e_flags & EF_PPC_EMB)
1886 strcat (buf, ", emb");
1888 if (e_flags & EF_PPC_RELOCATABLE)
1889 strcat (buf, ", relocatable");
1891 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1892 strcat (buf, ", relocatable-lib");
1893 break;
1895 case EM_V850:
1896 case EM_CYGNUS_V850:
1897 switch (e_flags & EF_V850_ARCH)
1899 case E_V850E_ARCH:
1900 strcat (buf, ", v850e");
1901 break;
1902 case E_V850_ARCH:
1903 strcat (buf, ", v850");
1904 break;
1905 default:
1906 strcat (buf, ", unknown v850 architecture variant");
1907 break;
1909 break;
1911 case EM_M32R:
1912 case EM_CYGNUS_M32R:
1913 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1914 strcat (buf, ", m32r");
1916 break;
1918 case EM_MIPS:
1919 case EM_MIPS_RS3_LE:
1920 if (e_flags & EF_MIPS_NOREORDER)
1921 strcat (buf, ", noreorder");
1923 if (e_flags & EF_MIPS_PIC)
1924 strcat (buf, ", pic");
1926 if (e_flags & EF_MIPS_CPIC)
1927 strcat (buf, ", cpic");
1929 if (e_flags & EF_MIPS_UCODE)
1930 strcat (buf, ", ugen_reserved");
1932 if (e_flags & EF_MIPS_ABI2)
1933 strcat (buf, ", abi2");
1935 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1936 strcat (buf, ", odk first");
1938 if (e_flags & EF_MIPS_32BITMODE)
1939 strcat (buf, ", 32bitmode");
1941 switch ((e_flags & EF_MIPS_MACH))
1943 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1944 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1945 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1946 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1947 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
1948 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1949 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
1950 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
1951 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1952 case 0:
1953 /* We simply ignore the field in this case to avoid confusion:
1954 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1955 extension. */
1956 break;
1957 default: strcat (buf, ", unknown CPU"); break;
1960 switch ((e_flags & EF_MIPS_ABI))
1962 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1963 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1964 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1965 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1966 case 0:
1967 /* We simply ignore the field in this case to avoid confusion:
1968 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1969 This means it is likely to be an o32 file, but not for
1970 sure. */
1971 break;
1972 default: strcat (buf, ", unknown ABI"); break;
1975 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1976 strcat (buf, ", mdmx");
1978 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1979 strcat (buf, ", mips16");
1981 switch ((e_flags & EF_MIPS_ARCH))
1983 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1984 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1985 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1986 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1987 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1988 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1989 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1990 default: strcat (buf, ", unknown ISA"); break;
1993 break;
1995 case EM_SPARCV9:
1996 if (e_flags & EF_SPARC_32PLUS)
1997 strcat (buf, ", v8+");
1999 if (e_flags & EF_SPARC_SUN_US1)
2000 strcat (buf, ", ultrasparcI");
2002 if (e_flags & EF_SPARC_SUN_US3)
2003 strcat (buf, ", ultrasparcIII");
2005 if (e_flags & EF_SPARC_HAL_R1)
2006 strcat (buf, ", halr1");
2008 if (e_flags & EF_SPARC_LEDATA)
2009 strcat (buf, ", ledata");
2011 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2012 strcat (buf, ", tso");
2014 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2015 strcat (buf, ", pso");
2017 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2018 strcat (buf, ", rmo");
2019 break;
2021 case EM_PARISC:
2022 switch (e_flags & EF_PARISC_ARCH)
2024 case EFA_PARISC_1_0:
2025 strcpy (buf, ", PA-RISC 1.0");
2026 break;
2027 case EFA_PARISC_1_1:
2028 strcpy (buf, ", PA-RISC 1.1");
2029 break;
2030 case EFA_PARISC_2_0:
2031 strcpy (buf, ", PA-RISC 2.0");
2032 break;
2033 default:
2034 break;
2036 if (e_flags & EF_PARISC_TRAPNIL)
2037 strcat (buf, ", trapnil");
2038 if (e_flags & EF_PARISC_EXT)
2039 strcat (buf, ", ext");
2040 if (e_flags & EF_PARISC_LSB)
2041 strcat (buf, ", lsb");
2042 if (e_flags & EF_PARISC_WIDE)
2043 strcat (buf, ", wide");
2044 if (e_flags & EF_PARISC_NO_KABP)
2045 strcat (buf, ", no kabp");
2046 if (e_flags & EF_PARISC_LAZYSWAP)
2047 strcat (buf, ", lazyswap");
2048 break;
2050 case EM_PJ:
2051 case EM_PJ_OLD:
2052 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2053 strcat (buf, ", new calling convention");
2055 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2056 strcat (buf, ", gnu calling convention");
2057 break;
2059 case EM_IA_64:
2060 if ((e_flags & EF_IA_64_ABI64))
2061 strcat (buf, ", 64-bit");
2062 else
2063 strcat (buf, ", 32-bit");
2064 if ((e_flags & EF_IA_64_REDUCEDFP))
2065 strcat (buf, ", reduced fp model");
2066 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2067 strcat (buf, ", no function descriptors, constant gp");
2068 else if ((e_flags & EF_IA_64_CONS_GP))
2069 strcat (buf, ", constant gp");
2070 if ((e_flags & EF_IA_64_ABSOLUTE))
2071 strcat (buf, ", absolute");
2072 break;
2074 case EM_VAX:
2075 if ((e_flags & EF_VAX_NONPIC))
2076 strcat (buf, ", non-PIC");
2077 if ((e_flags & EF_VAX_DFLOAT))
2078 strcat (buf, ", D-Float");
2079 if ((e_flags & EF_VAX_GFLOAT))
2080 strcat (buf, ", G-Float");
2081 break;
2085 return buf;
2088 static const char *
2089 get_mips_segment_type (type)
2090 unsigned long type;
2092 switch (type)
2094 case PT_MIPS_REGINFO:
2095 return "REGINFO";
2096 case PT_MIPS_RTPROC:
2097 return "RTPROC";
2098 case PT_MIPS_OPTIONS:
2099 return "OPTIONS";
2100 default:
2101 break;
2104 return NULL;
2107 static const char *
2108 get_parisc_segment_type (type)
2109 unsigned long type;
2111 switch (type)
2113 case PT_HP_TLS: return "HP_TLS";
2114 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2115 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2116 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2117 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2118 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2119 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2120 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2121 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2122 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2123 case PT_HP_PARALLEL: return "HP_PARALLEL";
2124 case PT_HP_FASTBIND: return "HP_FASTBIND";
2125 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2126 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2127 default:
2128 break;
2131 return NULL;
2134 static const char *
2135 get_ia64_segment_type (type)
2136 unsigned long type;
2138 switch (type)
2140 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2141 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2142 case PT_HP_TLS: return "HP_TLS";
2143 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2144 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2145 case PT_IA_64_HP_STACK: return "HP_STACK";
2146 default:
2147 break;
2150 return NULL;
2153 static const char *
2154 get_segment_type (p_type)
2155 unsigned long p_type;
2157 static char buff[32];
2159 switch (p_type)
2161 case PT_NULL: return "NULL";
2162 case PT_LOAD: return "LOAD";
2163 case PT_DYNAMIC: return "DYNAMIC";
2164 case PT_INTERP: return "INTERP";
2165 case PT_NOTE: return "NOTE";
2166 case PT_SHLIB: return "SHLIB";
2167 case PT_PHDR: return "PHDR";
2168 case PT_TLS: return "TLS";
2170 case PT_GNU_EH_FRAME:
2171 return "GNU_EH_FRAME";
2173 default:
2174 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2176 const char *result;
2178 switch (elf_header.e_machine)
2180 case EM_MIPS:
2181 case EM_MIPS_RS3_LE:
2182 result = get_mips_segment_type (p_type);
2183 break;
2184 case EM_PARISC:
2185 result = get_parisc_segment_type (p_type);
2186 break;
2187 case EM_IA_64:
2188 result = get_ia64_segment_type (p_type);
2189 break;
2190 default:
2191 result = NULL;
2192 break;
2195 if (result != NULL)
2196 return result;
2198 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2200 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2202 const char *result;
2204 switch (elf_header.e_machine)
2206 case EM_PARISC:
2207 result = get_parisc_segment_type (p_type);
2208 break;
2209 case EM_IA_64:
2210 result = get_ia64_segment_type (p_type);
2211 break;
2212 default:
2213 result = NULL;
2214 break;
2217 if (result != NULL)
2218 return result;
2220 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2222 else
2223 sprintf (buff, _("<unknown>: %lx"), p_type);
2225 return buff;
2229 static const char *
2230 get_mips_section_type_name (sh_type)
2231 unsigned int sh_type;
2233 switch (sh_type)
2235 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2236 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2237 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2238 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2239 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2240 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2241 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2242 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2243 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2244 case SHT_MIPS_RELD: return "MIPS_RELD";
2245 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2246 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2247 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2248 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2249 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2250 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2251 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2252 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2253 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2254 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2255 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2256 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2257 case SHT_MIPS_LINE: return "MIPS_LINE";
2258 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2259 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2260 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2261 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2262 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2263 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2264 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2265 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2266 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2267 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2268 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2269 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2270 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2271 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2272 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2273 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2274 default:
2275 break;
2277 return NULL;
2280 static const char *
2281 get_parisc_section_type_name (sh_type)
2282 unsigned int sh_type;
2284 switch (sh_type)
2286 case SHT_PARISC_EXT: return "PARISC_EXT";
2287 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2288 case SHT_PARISC_DOC: return "PARISC_DOC";
2289 default:
2290 break;
2292 return NULL;
2295 static const char *
2296 get_ia64_section_type_name (sh_type)
2297 unsigned int sh_type;
2299 switch (sh_type)
2301 case SHT_IA_64_EXT: return "IA_64_EXT";
2302 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2303 default:
2304 break;
2306 return NULL;
2309 static const char *
2310 get_section_type_name (sh_type)
2311 unsigned int sh_type;
2313 static char buff[32];
2315 switch (sh_type)
2317 case SHT_NULL: return "NULL";
2318 case SHT_PROGBITS: return "PROGBITS";
2319 case SHT_SYMTAB: return "SYMTAB";
2320 case SHT_STRTAB: return "STRTAB";
2321 case SHT_RELA: return "RELA";
2322 case SHT_HASH: return "HASH";
2323 case SHT_DYNAMIC: return "DYNAMIC";
2324 case SHT_NOTE: return "NOTE";
2325 case SHT_NOBITS: return "NOBITS";
2326 case SHT_REL: return "REL";
2327 case SHT_SHLIB: return "SHLIB";
2328 case SHT_DYNSYM: return "DYNSYM";
2329 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2330 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2331 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2332 case SHT_GROUP: return "GROUP";
2333 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2334 case SHT_GNU_verdef: return "VERDEF";
2335 case SHT_GNU_verneed: return "VERNEED";
2336 case SHT_GNU_versym: return "VERSYM";
2337 case 0x6ffffff0: return "VERSYM";
2338 case 0x6ffffffc: return "VERDEF";
2339 case 0x7ffffffd: return "AUXILIARY";
2340 case 0x7fffffff: return "FILTER";
2341 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2343 default:
2344 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2346 const char *result;
2348 switch (elf_header.e_machine)
2350 case EM_MIPS:
2351 case EM_MIPS_RS3_LE:
2352 result = get_mips_section_type_name (sh_type);
2353 break;
2354 case EM_PARISC:
2355 result = get_parisc_section_type_name (sh_type);
2356 break;
2357 case EM_IA_64:
2358 result = get_ia64_section_type_name (sh_type);
2359 break;
2360 default:
2361 result = NULL;
2362 break;
2365 if (result != NULL)
2366 return result;
2368 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2370 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2371 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2372 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2373 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2374 else
2375 sprintf (buff, _("<unknown>: %x"), sh_type);
2377 return buff;
2381 #define OPTION_DEBUG_DUMP 512
2383 struct option options[] =
2385 {"all", no_argument, 0, 'a'},
2386 {"file-header", no_argument, 0, 'h'},
2387 {"program-headers", no_argument, 0, 'l'},
2388 {"headers", no_argument, 0, 'e'},
2389 {"histogram", no_argument, 0, 'I'},
2390 {"segments", no_argument, 0, 'l'},
2391 {"sections", no_argument, 0, 'S'},
2392 {"section-headers", no_argument, 0, 'S'},
2393 {"symbols", no_argument, 0, 's'},
2394 {"syms", no_argument, 0, 's'},
2395 {"relocs", no_argument, 0, 'r'},
2396 {"notes", no_argument, 0, 'n'},
2397 {"dynamic", no_argument, 0, 'd'},
2398 {"arch-specific", no_argument, 0, 'A'},
2399 {"version-info", no_argument, 0, 'V'},
2400 {"use-dynamic", no_argument, 0, 'D'},
2401 {"hex-dump", required_argument, 0, 'x'},
2402 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2403 {"unwind", no_argument, 0, 'u'},
2404 #ifdef SUPPORT_DISASSEMBLY
2405 {"instruction-dump", required_argument, 0, 'i'},
2406 #endif
2408 {"version", no_argument, 0, 'v'},
2409 {"wide", no_argument, 0, 'W'},
2410 {"help", no_argument, 0, 'H'},
2411 {0, no_argument, 0, 0}
2414 static void
2415 usage ()
2417 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2418 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2419 fprintf (stdout, _(" Options are:\n\
2420 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2421 -h --file-header Display the ELF file header\n\
2422 -l --program-headers Display the program headers\n\
2423 --segments An alias for --program-headers\n\
2424 -S --section-headers Display the sections' header\n\
2425 --sections An alias for --section-headers\n\
2426 -e --headers Equivalent to: -h -l -S\n\
2427 -s --syms Display the symbol table\n\
2428 --symbols An alias for --syms\n\
2429 -n --notes Display the core notes (if present)\n\
2430 -r --relocs Display the relocations (if present)\n\
2431 -u --unwind Display the unwind info (if present)\n\
2432 -d --dynamic Display the dynamic segment (if present)\n\
2433 -V --version-info Display the version sections (if present)\n\
2434 -A --arch-specific Display architecture specific information (if any).\n\
2435 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2436 -x --hex-dump=<number> Dump the contents of section <number>\n\
2437 -w[liaprmfFso] or\n\
2438 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2439 Display the contents of DWARF2 debug sections\n"));
2440 #ifdef SUPPORT_DISASSEMBLY
2441 fprintf (stdout, _("\
2442 -i --instruction-dump=<number>\n\
2443 Disassemble the contents of section <number>\n"));
2444 #endif
2445 fprintf (stdout, _("\
2446 -I --histogram Display histogram of bucket list lengths\n\
2447 -W --wide Allow output width to exceed 80 characters\n\
2448 -H --help Display this information\n\
2449 -v --version Display the version number of readelf\n"));
2450 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2452 exit (0);
2455 static void
2456 request_dump (section, type)
2457 unsigned int section;
2458 int type;
2460 if (section >= num_dump_sects)
2462 char *new_dump_sects;
2464 new_dump_sects = (char *) calloc (section + 1, 1);
2466 if (new_dump_sects == NULL)
2467 error (_("Out of memory allocating dump request table."));
2468 else
2470 /* Copy current flag settings. */
2471 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2473 free (dump_sects);
2475 dump_sects = new_dump_sects;
2476 num_dump_sects = section + 1;
2480 if (dump_sects)
2481 dump_sects[section] |= type;
2483 return;
2486 static void
2487 parse_args (argc, argv)
2488 int argc;
2489 char **argv;
2491 int c;
2493 if (argc < 2)
2494 usage ();
2496 while ((c = getopt_long
2497 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2499 char *cp;
2500 int section;
2502 switch (c)
2504 case 0:
2505 /* Long options. */
2506 break;
2507 case 'H':
2508 usage ();
2509 break;
2511 case 'a':
2512 do_syms++;
2513 do_reloc++;
2514 do_unwind++;
2515 do_dynamic++;
2516 do_header++;
2517 do_sections++;
2518 do_segments++;
2519 do_version++;
2520 do_histogram++;
2521 do_arch++;
2522 do_notes++;
2523 break;
2524 case 'e':
2525 do_header++;
2526 do_sections++;
2527 do_segments++;
2528 break;
2529 case 'A':
2530 do_arch++;
2531 break;
2532 case 'D':
2533 do_using_dynamic++;
2534 break;
2535 case 'r':
2536 do_reloc++;
2537 break;
2538 case 'u':
2539 do_unwind++;
2540 break;
2541 case 'h':
2542 do_header++;
2543 break;
2544 case 'l':
2545 do_segments++;
2546 break;
2547 case 's':
2548 do_syms++;
2549 break;
2550 case 'S':
2551 do_sections++;
2552 break;
2553 case 'd':
2554 do_dynamic++;
2555 break;
2556 case 'I':
2557 do_histogram++;
2558 break;
2559 case 'n':
2560 do_notes++;
2561 break;
2562 case 'x':
2563 do_dump++;
2564 section = strtoul (optarg, & cp, 0);
2565 if (! *cp && section >= 0)
2567 request_dump (section, HEX_DUMP);
2568 break;
2570 goto oops;
2571 case 'w':
2572 do_dump++;
2573 if (optarg == 0)
2574 do_debugging = 1;
2575 else
2577 unsigned int index = 0;
2579 do_debugging = 0;
2581 while (optarg[index])
2582 switch (optarg[index++])
2584 case 'i':
2585 case 'I':
2586 do_debug_info = 1;
2587 break;
2589 case 'a':
2590 case 'A':
2591 do_debug_abbrevs = 1;
2592 break;
2594 case 'l':
2595 case 'L':
2596 do_debug_lines = 1;
2597 break;
2599 case 'p':
2600 case 'P':
2601 do_debug_pubnames = 1;
2602 break;
2604 case 'r':
2605 case 'R':
2606 do_debug_aranges = 1;
2607 break;
2609 case 'F':
2610 do_debug_frames_interp = 1;
2611 case 'f':
2612 do_debug_frames = 1;
2613 break;
2615 case 'm':
2616 case 'M':
2617 do_debug_macinfo = 1;
2618 break;
2620 case 's':
2621 case 'S':
2622 do_debug_str = 1;
2623 break;
2625 case 'o':
2626 case 'O':
2627 do_debug_loc = 1;
2628 break;
2630 default:
2631 warn (_("Unrecognized debug option '%s'\n"), optarg);
2632 break;
2635 break;
2636 case OPTION_DEBUG_DUMP:
2637 do_dump++;
2638 if (optarg == 0)
2639 do_debugging = 1;
2640 else
2642 static const char *debug_dump_opt[]
2643 = { "line", "info", "abbrev", "pubnames", "ranges",
2644 "macro", "frames", "frames-interp", "str", "loc", NULL };
2645 unsigned int index;
2646 const char *p;
2648 do_debugging = 0;
2650 p = optarg;
2651 while (*p)
2653 for (index = 0; debug_dump_opt[index]; index++)
2655 size_t len = strlen (debug_dump_opt[index]);
2657 if (strncmp (p, debug_dump_opt[index], len) == 0
2658 && (p[len] == ',' || p[len] == '\0'))
2660 switch (p[0])
2662 case 'i':
2663 do_debug_info = 1;
2664 break;
2666 case 'a':
2667 do_debug_abbrevs = 1;
2668 break;
2670 case 'l':
2671 if (p[1] == 'i')
2672 do_debug_lines = 1;
2673 else
2674 do_debug_loc = 1;
2675 break;
2677 case 'p':
2678 do_debug_pubnames = 1;
2679 break;
2681 case 'r':
2682 do_debug_aranges = 1;
2683 break;
2685 case 'f':
2686 if (len > 6)
2687 do_debug_frames_interp = 1;
2688 do_debug_frames = 1;
2689 break;
2691 case 'm':
2692 do_debug_macinfo = 1;
2693 break;
2695 case 's':
2696 do_debug_str = 1;
2697 break;
2700 p += len;
2701 break;
2705 if (debug_dump_opt[index] == NULL)
2707 warn (_("Unrecognized debug option '%s'\n"), p);
2708 p = strchr (p, ',');
2709 if (p == NULL)
2710 break;
2713 if (*p == ',')
2714 p++;
2717 break;
2718 #ifdef SUPPORT_DISASSEMBLY
2719 case 'i':
2720 do_dump++;
2721 section = strtoul (optarg, & cp, 0);
2722 if (! *cp && section >= 0)
2724 request_dump (section, DISASS_DUMP);
2725 break;
2727 goto oops;
2728 #endif
2729 case 'v':
2730 print_version (program_name);
2731 break;
2732 case 'V':
2733 do_version++;
2734 break;
2735 case 'W':
2736 do_wide++;
2737 break;
2738 default:
2739 oops:
2740 /* xgettext:c-format */
2741 error (_("Invalid option '-%c'\n"), c);
2742 /* Drop through. */
2743 case '?':
2744 usage ();
2748 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2749 && !do_segments && !do_header && !do_dump && !do_version
2750 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2751 usage ();
2752 else if (argc < 3)
2754 warn (_("Nothing to do.\n"));
2755 usage();
2759 static const char *
2760 get_elf_class (elf_class)
2761 unsigned int elf_class;
2763 static char buff[32];
2765 switch (elf_class)
2767 case ELFCLASSNONE: return _("none");
2768 case ELFCLASS32: return "ELF32";
2769 case ELFCLASS64: return "ELF64";
2770 default:
2771 sprintf (buff, _("<unknown: %x>"), elf_class);
2772 return buff;
2776 static const char *
2777 get_data_encoding (encoding)
2778 unsigned int encoding;
2780 static char buff[32];
2782 switch (encoding)
2784 case ELFDATANONE: return _("none");
2785 case ELFDATA2LSB: return _("2's complement, little endian");
2786 case ELFDATA2MSB: return _("2's complement, big endian");
2787 default:
2788 sprintf (buff, _("<unknown: %x>"), encoding);
2789 return buff;
2793 static const char *
2794 get_osabi_name (osabi)
2795 unsigned int osabi;
2797 static char buff[32];
2799 switch (osabi)
2801 case ELFOSABI_NONE: return "UNIX - System V";
2802 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2803 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2804 case ELFOSABI_LINUX: return "UNIX - Linux";
2805 case ELFOSABI_HURD: return "GNU/Hurd";
2806 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2807 case ELFOSABI_AIX: return "UNIX - AIX";
2808 case ELFOSABI_IRIX: return "UNIX - IRIX";
2809 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2810 case ELFOSABI_TRU64: return "UNIX - TRU64";
2811 case ELFOSABI_MODESTO: return "Novell - Modesto";
2812 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2813 case ELFOSABI_STANDALONE: return _("Standalone App");
2814 case ELFOSABI_ARM: return "ARM";
2815 default:
2816 sprintf (buff, _("<unknown: %x>"), osabi);
2817 return buff;
2821 /* Decode the data held in 'elf_header'. */
2822 static int
2823 process_file_header ()
2825 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
2826 || elf_header.e_ident[EI_MAG1] != ELFMAG1
2827 || elf_header.e_ident[EI_MAG2] != ELFMAG2
2828 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
2830 error
2831 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2832 return 0;
2835 if (do_header)
2837 int i;
2839 printf (_("ELF Header:\n"));
2840 printf (_(" Magic: "));
2841 for (i = 0; i < EI_NIDENT; i++)
2842 printf ("%2.2x ", elf_header.e_ident[i]);
2843 printf ("\n");
2844 printf (_(" Class: %s\n"),
2845 get_elf_class (elf_header.e_ident[EI_CLASS]));
2846 printf (_(" Data: %s\n"),
2847 get_data_encoding (elf_header.e_ident[EI_DATA]));
2848 printf (_(" Version: %d %s\n"),
2849 elf_header.e_ident[EI_VERSION],
2850 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
2851 ? "(current)"
2852 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2853 ? "<unknown: %lx>"
2854 : "")));
2855 printf (_(" OS/ABI: %s\n"),
2856 get_osabi_name (elf_header.e_ident[EI_OSABI]));
2857 printf (_(" ABI Version: %d\n"),
2858 elf_header.e_ident[EI_ABIVERSION]);
2859 printf (_(" Type: %s\n"),
2860 get_file_type (elf_header.e_type));
2861 printf (_(" Machine: %s\n"),
2862 get_machine_name (elf_header.e_machine));
2863 printf (_(" Version: 0x%lx\n"),
2864 (unsigned long) elf_header.e_version);
2866 printf (_(" Entry point address: "));
2867 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2868 printf (_("\n Start of program headers: "));
2869 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2870 printf (_(" (bytes into file)\n Start of section headers: "));
2871 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2872 printf (_(" (bytes into file)\n"));
2874 printf (_(" Flags: 0x%lx%s\n"),
2875 (unsigned long) elf_header.e_flags,
2876 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2877 printf (_(" Size of this header: %ld (bytes)\n"),
2878 (long) elf_header.e_ehsize);
2879 printf (_(" Size of program headers: %ld (bytes)\n"),
2880 (long) elf_header.e_phentsize);
2881 printf (_(" Number of program headers: %ld\n"),
2882 (long) elf_header.e_phnum);
2883 printf (_(" Size of section headers: %ld (bytes)\n"),
2884 (long) elf_header.e_shentsize);
2885 printf (_(" Number of section headers: %ld"),
2886 (long) elf_header.e_shnum);
2887 if (section_headers != NULL && elf_header.e_shnum == 0)
2888 printf (" (%ld)", (long) section_headers[0].sh_size);
2889 putc ('\n', stdout);
2890 printf (_(" Section header string table index: %ld"),
2891 (long) elf_header.e_shstrndx);
2892 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2893 printf (" (%ld)", (long) section_headers[0].sh_link);
2894 putc ('\n', stdout);
2897 if (section_headers != NULL)
2899 if (elf_header.e_shnum == 0)
2900 elf_header.e_shnum = section_headers[0].sh_size;
2901 if (elf_header.e_shstrndx == SHN_XINDEX)
2902 elf_header.e_shstrndx = section_headers[0].sh_link;
2903 free (section_headers);
2904 section_headers = NULL;
2907 return 1;
2911 static int
2912 get_32bit_program_headers (file, program_headers)
2913 FILE *file;
2914 Elf_Internal_Phdr *program_headers;
2916 Elf32_External_Phdr *phdrs;
2917 Elf32_External_Phdr *external;
2918 Elf_Internal_Phdr *internal;
2919 unsigned int i;
2921 phdrs = ((Elf32_External_Phdr *)
2922 get_data (NULL, file, elf_header.e_phoff,
2923 elf_header.e_phentsize * elf_header.e_phnum,
2924 _("program headers")));
2925 if (!phdrs)
2926 return 0;
2928 for (i = 0, internal = program_headers, external = phdrs;
2929 i < elf_header.e_phnum;
2930 i++, internal++, external++)
2932 internal->p_type = BYTE_GET (external->p_type);
2933 internal->p_offset = BYTE_GET (external->p_offset);
2934 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2935 internal->p_paddr = BYTE_GET (external->p_paddr);
2936 internal->p_filesz = BYTE_GET (external->p_filesz);
2937 internal->p_memsz = BYTE_GET (external->p_memsz);
2938 internal->p_flags = BYTE_GET (external->p_flags);
2939 internal->p_align = BYTE_GET (external->p_align);
2942 free (phdrs);
2944 return 1;
2947 static int
2948 get_64bit_program_headers (file, program_headers)
2949 FILE *file;
2950 Elf_Internal_Phdr *program_headers;
2952 Elf64_External_Phdr *phdrs;
2953 Elf64_External_Phdr *external;
2954 Elf_Internal_Phdr *internal;
2955 unsigned int i;
2957 phdrs = ((Elf64_External_Phdr *)
2958 get_data (NULL, file, elf_header.e_phoff,
2959 elf_header.e_phentsize * elf_header.e_phnum,
2960 _("program headers")));
2961 if (!phdrs)
2962 return 0;
2964 for (i = 0, internal = program_headers, external = phdrs;
2965 i < elf_header.e_phnum;
2966 i++, internal++, external++)
2968 internal->p_type = BYTE_GET (external->p_type);
2969 internal->p_flags = BYTE_GET (external->p_flags);
2970 internal->p_offset = BYTE_GET8 (external->p_offset);
2971 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2972 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2973 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2974 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2975 internal->p_align = BYTE_GET8 (external->p_align);
2978 free (phdrs);
2980 return 1;
2983 /* Returns 1 if the program headers were loaded. */
2985 static int
2986 process_program_headers (file)
2987 FILE *file;
2989 Elf_Internal_Phdr *program_headers;
2990 Elf_Internal_Phdr *segment;
2991 unsigned int i;
2993 if (elf_header.e_phnum == 0)
2995 if (do_segments)
2996 printf (_("\nThere are no program headers in this file.\n"));
2997 return 0;
3000 if (do_segments && !do_header)
3002 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3003 printf (_("Entry point "));
3004 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3005 printf (_("\nThere are %d program headers, starting at offset "),
3006 elf_header.e_phnum);
3007 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3008 printf ("\n");
3011 program_headers = (Elf_Internal_Phdr *) malloc
3012 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3014 if (program_headers == NULL)
3016 error (_("Out of memory\n"));
3017 return 0;
3020 if (is_32bit_elf)
3021 i = get_32bit_program_headers (file, program_headers);
3022 else
3023 i = get_64bit_program_headers (file, program_headers);
3025 if (i == 0)
3027 free (program_headers);
3028 return 0;
3031 if (do_segments)
3033 if (elf_header.e_phnum > 1)
3034 printf (_("\nProgram Headers:\n"));
3035 else
3036 printf (_("\nProgram Headers:\n"));
3038 if (is_32bit_elf)
3039 printf
3040 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3041 else if (do_wide)
3042 printf
3043 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3044 else
3046 printf
3047 (_(" Type Offset VirtAddr PhysAddr\n"));
3048 printf
3049 (_(" FileSiz MemSiz Flags Align\n"));
3053 loadaddr = -1;
3054 dynamic_addr = 0;
3055 dynamic_size = 0;
3057 for (i = 0, segment = program_headers;
3058 i < elf_header.e_phnum;
3059 i++, segment++)
3061 if (do_segments)
3063 printf (" %-14.14s ", get_segment_type (segment->p_type));
3065 if (is_32bit_elf)
3067 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3068 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3069 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3070 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3071 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3072 printf ("%c%c%c ",
3073 (segment->p_flags & PF_R ? 'R' : ' '),
3074 (segment->p_flags & PF_W ? 'W' : ' '),
3075 (segment->p_flags & PF_X ? 'E' : ' '));
3076 printf ("%#lx", (unsigned long) segment->p_align);
3078 else if (do_wide)
3080 if ((unsigned long) segment->p_offset == segment->p_offset)
3081 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3082 else
3084 print_vma (segment->p_offset, FULL_HEX);
3085 putchar (' ');
3088 print_vma (segment->p_vaddr, FULL_HEX);
3089 putchar (' ');
3090 print_vma (segment->p_paddr, FULL_HEX);
3091 putchar (' ');
3093 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3094 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3095 else
3097 print_vma (segment->p_filesz, FULL_HEX);
3098 putchar (' ');
3101 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3102 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3103 else
3105 print_vma (segment->p_offset, FULL_HEX);
3108 printf (" %c%c%c ",
3109 (segment->p_flags & PF_R ? 'R' : ' '),
3110 (segment->p_flags & PF_W ? 'W' : ' '),
3111 (segment->p_flags & PF_X ? 'E' : ' '));
3113 if ((unsigned long) segment->p_align == segment->p_align)
3114 printf ("%#lx", (unsigned long) segment->p_align);
3115 else
3117 print_vma (segment->p_align, PREFIX_HEX);
3120 else
3122 print_vma (segment->p_offset, FULL_HEX);
3123 putchar (' ');
3124 print_vma (segment->p_vaddr, FULL_HEX);
3125 putchar (' ');
3126 print_vma (segment->p_paddr, FULL_HEX);
3127 printf ("\n ");
3128 print_vma (segment->p_filesz, FULL_HEX);
3129 putchar (' ');
3130 print_vma (segment->p_memsz, FULL_HEX);
3131 printf (" %c%c%c ",
3132 (segment->p_flags & PF_R ? 'R' : ' '),
3133 (segment->p_flags & PF_W ? 'W' : ' '),
3134 (segment->p_flags & PF_X ? 'E' : ' '));
3135 print_vma (segment->p_align, HEX);
3139 switch (segment->p_type)
3141 case PT_LOAD:
3142 if (loadaddr == -1)
3144 unsigned long align_mask = -segment->p_align;
3146 if (align_mask == 0)
3147 --align_mask;
3148 loadaddr = ((segment->p_vaddr & align_mask)
3149 - (segment->p_offset & align_mask));
3151 break;
3153 case PT_DYNAMIC:
3154 if (dynamic_addr)
3155 error (_("more than one dynamic segment\n"));
3157 dynamic_addr = segment->p_offset;
3158 dynamic_size = segment->p_filesz;
3159 break;
3161 case PT_INTERP:
3162 if (fseek (file, (long) segment->p_offset, SEEK_SET))
3163 error (_("Unable to find program interpreter name\n"));
3164 else
3166 program_interpreter[0] = 0;
3167 fscanf (file, "%63s", program_interpreter);
3169 if (do_segments)
3170 printf (_("\n [Requesting program interpreter: %s]"),
3171 program_interpreter);
3173 break;
3176 if (do_segments)
3177 putc ('\n', stdout);
3180 if (loadaddr == -1)
3182 /* Very strange. */
3183 loadaddr = 0;
3186 if (do_segments && section_headers != NULL)
3188 printf (_("\n Section to Segment mapping:\n"));
3189 printf (_(" Segment Sections...\n"));
3191 assert (string_table != NULL);
3193 for (i = 0; i < elf_header.e_phnum; i++)
3195 unsigned int j;
3196 Elf_Internal_Shdr *section;
3198 segment = program_headers + i;
3199 section = section_headers;
3201 printf (" %2.2d ", i);
3203 for (j = 1; j < elf_header.e_shnum; j++, section++)
3205 if (section->sh_size > 0
3206 /* Compare allocated sections by VMA, unallocated
3207 sections by file offset. */
3208 && (section->sh_flags & SHF_ALLOC
3209 ? (section->sh_addr >= segment->p_vaddr
3210 && section->sh_addr + section->sh_size
3211 <= segment->p_vaddr + segment->p_memsz)
3212 : ((bfd_vma) section->sh_offset >= segment->p_offset
3213 && (section->sh_offset + section->sh_size
3214 <= segment->p_offset + segment->p_filesz))))
3215 printf ("%s ", SECTION_NAME (section));
3218 putc ('\n',stdout);
3222 free (program_headers);
3224 return 1;
3228 static int
3229 get_32bit_section_headers (file, num)
3230 FILE *file;
3231 unsigned int num;
3233 Elf32_External_Shdr *shdrs;
3234 Elf_Internal_Shdr *internal;
3235 unsigned int i;
3237 shdrs = ((Elf32_External_Shdr *)
3238 get_data (NULL, file, elf_header.e_shoff,
3239 elf_header.e_shentsize * num,
3240 _("section headers")));
3241 if (!shdrs)
3242 return 0;
3244 section_headers = ((Elf_Internal_Shdr *)
3245 malloc (num * sizeof (Elf_Internal_Shdr)));
3247 if (section_headers == NULL)
3249 error (_("Out of memory\n"));
3250 return 0;
3253 for (i = 0, internal = section_headers;
3254 i < num;
3255 i++, internal++)
3257 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3258 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3259 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3260 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3261 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3262 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3263 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3264 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3265 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3266 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3269 free (shdrs);
3271 return 1;
3274 static int
3275 get_64bit_section_headers (file, num)
3276 FILE *file;
3277 unsigned int num;
3279 Elf64_External_Shdr *shdrs;
3280 Elf_Internal_Shdr *internal;
3281 unsigned int i;
3283 shdrs = ((Elf64_External_Shdr *)
3284 get_data (NULL, file, elf_header.e_shoff,
3285 elf_header.e_shentsize * num,
3286 _("section headers")));
3287 if (!shdrs)
3288 return 0;
3290 section_headers = ((Elf_Internal_Shdr *)
3291 malloc (num * sizeof (Elf_Internal_Shdr)));
3293 if (section_headers == NULL)
3295 error (_("Out of memory\n"));
3296 return 0;
3299 for (i = 0, internal = section_headers;
3300 i < num;
3301 i++, internal++)
3303 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3304 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3305 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3306 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3307 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3308 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3309 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3310 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3311 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3312 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3315 free (shdrs);
3317 return 1;
3320 static Elf_Internal_Sym *
3321 get_32bit_elf_symbols (file, section)
3322 FILE *file;
3323 Elf_Internal_Shdr *section;
3325 unsigned long number;
3326 Elf32_External_Sym *esyms;
3327 Elf_External_Sym_Shndx *shndx;
3328 Elf_Internal_Sym *isyms;
3329 Elf_Internal_Sym *psym;
3330 unsigned int j;
3332 esyms = ((Elf32_External_Sym *)
3333 get_data (NULL, file, section->sh_offset,
3334 section->sh_size, _("symbols")));
3335 if (!esyms)
3336 return NULL;
3338 shndx = NULL;
3339 if (symtab_shndx_hdr != NULL
3340 && (symtab_shndx_hdr->sh_link
3341 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3343 shndx = ((Elf_External_Sym_Shndx *)
3344 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3345 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3346 if (!shndx)
3348 free (esyms);
3349 return NULL;
3353 number = section->sh_size / section->sh_entsize;
3354 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3356 if (isyms == NULL)
3358 error (_("Out of memory\n"));
3359 if (shndx)
3360 free (shndx);
3361 free (esyms);
3362 return NULL;
3365 for (j = 0, psym = isyms;
3366 j < number;
3367 j++, psym++)
3369 psym->st_name = BYTE_GET (esyms[j].st_name);
3370 psym->st_value = BYTE_GET (esyms[j].st_value);
3371 psym->st_size = BYTE_GET (esyms[j].st_size);
3372 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3373 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3374 psym->st_shndx
3375 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3376 psym->st_info = BYTE_GET (esyms[j].st_info);
3377 psym->st_other = BYTE_GET (esyms[j].st_other);
3380 if (shndx)
3381 free (shndx);
3382 free (esyms);
3384 return isyms;
3387 static Elf_Internal_Sym *
3388 get_64bit_elf_symbols (file, section)
3389 FILE *file;
3390 Elf_Internal_Shdr *section;
3392 unsigned long number;
3393 Elf64_External_Sym *esyms;
3394 Elf_External_Sym_Shndx *shndx;
3395 Elf_Internal_Sym *isyms;
3396 Elf_Internal_Sym *psym;
3397 unsigned int j;
3399 esyms = ((Elf64_External_Sym *)
3400 get_data (NULL, file, section->sh_offset,
3401 section->sh_size, _("symbols")));
3402 if (!esyms)
3403 return NULL;
3405 shndx = NULL;
3406 if (symtab_shndx_hdr != NULL
3407 && (symtab_shndx_hdr->sh_link
3408 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3410 shndx = ((Elf_External_Sym_Shndx *)
3411 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3412 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3413 if (!shndx)
3415 free (esyms);
3416 return NULL;
3420 number = section->sh_size / section->sh_entsize;
3421 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3423 if (isyms == NULL)
3425 error (_("Out of memory\n"));
3426 if (shndx)
3427 free (shndx);
3428 free (esyms);
3429 return NULL;
3432 for (j = 0, psym = isyms;
3433 j < number;
3434 j++, psym++)
3436 psym->st_name = BYTE_GET (esyms[j].st_name);
3437 psym->st_info = BYTE_GET (esyms[j].st_info);
3438 psym->st_other = BYTE_GET (esyms[j].st_other);
3439 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3440 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3441 psym->st_shndx
3442 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3443 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3444 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3447 if (shndx)
3448 free (shndx);
3449 free (esyms);
3451 return isyms;
3454 static const char *
3455 get_elf_section_flags (sh_flags)
3456 bfd_vma sh_flags;
3458 static char buff[32];
3460 *buff = 0;
3462 while (sh_flags)
3464 bfd_vma flag;
3466 flag = sh_flags & - sh_flags;
3467 sh_flags &= ~ flag;
3469 switch (flag)
3471 case SHF_WRITE: strcat (buff, "W"); break;
3472 case SHF_ALLOC: strcat (buff, "A"); break;
3473 case SHF_EXECINSTR: strcat (buff, "X"); break;
3474 case SHF_MERGE: strcat (buff, "M"); break;
3475 case SHF_STRINGS: strcat (buff, "S"); break;
3476 case SHF_INFO_LINK: strcat (buff, "I"); break;
3477 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3478 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3479 case SHF_GROUP: strcat (buff, "G"); break;
3480 case SHF_TLS: strcat (buff, "T"); break;
3482 default:
3483 if (flag & SHF_MASKOS)
3485 strcat (buff, "o");
3486 sh_flags &= ~ SHF_MASKOS;
3488 else if (flag & SHF_MASKPROC)
3490 strcat (buff, "p");
3491 sh_flags &= ~ SHF_MASKPROC;
3493 else
3494 strcat (buff, "x");
3495 break;
3499 return buff;
3502 static int
3503 process_section_headers (file)
3504 FILE *file;
3506 Elf_Internal_Shdr *section;
3507 unsigned int i;
3509 section_headers = NULL;
3511 if (elf_header.e_shnum == 0)
3513 if (do_sections)
3514 printf (_("\nThere are no sections in this file.\n"));
3516 return 1;
3519 if (do_sections && !do_header)
3520 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3521 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3523 if (is_32bit_elf)
3525 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3526 return 0;
3528 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3529 return 0;
3531 /* Read in the string table, so that we have names to display. */
3532 section = SECTION_HEADER (elf_header.e_shstrndx);
3534 if (section->sh_size != 0)
3536 string_table = (char *) get_data (NULL, file, section->sh_offset,
3537 section->sh_size, _("string table"));
3539 string_table_length = section->sh_size;
3542 /* Scan the sections for the dynamic symbol table
3543 and dynamic string table and debug sections. */
3544 dynamic_symbols = NULL;
3545 dynamic_strings = NULL;
3546 dynamic_syminfo = NULL;
3547 symtab_shndx_hdr = NULL;
3549 for (i = 0, section = section_headers;
3550 i < elf_header.e_shnum;
3551 i++, section++)
3553 char *name = SECTION_NAME (section);
3555 if (section->sh_type == SHT_DYNSYM)
3557 if (dynamic_symbols != NULL)
3559 error (_("File contains multiple dynamic symbol tables\n"));
3560 continue;
3563 num_dynamic_syms = section->sh_size / section->sh_entsize;
3564 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3566 else if (section->sh_type == SHT_STRTAB
3567 && strcmp (name, ".dynstr") == 0)
3569 if (dynamic_strings != NULL)
3571 error (_("File contains multiple dynamic string tables\n"));
3572 continue;
3575 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3576 section->sh_size,
3577 _("dynamic strings"));
3579 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3581 if (symtab_shndx_hdr != NULL)
3583 error (_("File contains multiple symtab shndx tables\n"));
3584 continue;
3586 symtab_shndx_hdr = section;
3588 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3589 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3590 || do_debug_frames || do_debug_macinfo || do_debug_str
3591 || do_debug_loc)
3592 && strncmp (name, ".debug_", 7) == 0)
3594 name += 7;
3596 if (do_debugging
3597 || (do_debug_info && (strcmp (name, "info") == 0))
3598 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3599 || (do_debug_lines && (strcmp (name, "line") == 0))
3600 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3601 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3602 || (do_debug_frames && (strcmp (name, "frame") == 0))
3603 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3604 || (do_debug_str && (strcmp (name, "str") == 0))
3605 || (do_debug_loc && (strcmp (name, "loc") == 0))
3607 request_dump (i, DEBUG_DUMP);
3609 /* linkonce section to be combined with .debug_info at link time. */
3610 else if ((do_debugging || do_debug_info)
3611 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3612 request_dump (i, DEBUG_DUMP);
3613 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3614 request_dump (i, DEBUG_DUMP);
3617 if (! do_sections)
3618 return 1;
3620 if (elf_header.e_shnum > 1)
3621 printf (_("\nSection Headers:\n"));
3622 else
3623 printf (_("\nSection Header:\n"));
3625 if (is_32bit_elf)
3626 printf
3627 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3628 else if (do_wide)
3629 printf
3630 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3631 else
3633 printf (_(" [Nr] Name Type Address Offset\n"));
3634 printf (_(" Size EntSize Flags Link Info Align\n"));
3637 for (i = 0, section = section_headers;
3638 i < elf_header.e_shnum;
3639 i++, section++)
3641 printf (" [%2u] %-17.17s %-15.15s ",
3642 SECTION_HEADER_NUM (i),
3643 SECTION_NAME (section),
3644 get_section_type_name (section->sh_type));
3646 if (is_32bit_elf)
3648 print_vma (section->sh_addr, LONG_HEX);
3650 printf ( " %6.6lx %6.6lx %2.2lx",
3651 (unsigned long) section->sh_offset,
3652 (unsigned long) section->sh_size,
3653 (unsigned long) section->sh_entsize);
3655 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3657 printf ("%2ld %3lx %2ld\n",
3658 (unsigned long) section->sh_link,
3659 (unsigned long) section->sh_info,
3660 (unsigned long) section->sh_addralign);
3662 else if (do_wide)
3664 print_vma (section->sh_addr, LONG_HEX);
3666 if ((long) section->sh_offset == section->sh_offset)
3667 printf (" %6.6lx", (unsigned long) section->sh_offset);
3668 else
3670 putchar (' ');
3671 print_vma (section->sh_offset, LONG_HEX);
3674 if ((unsigned long) section->sh_size == section->sh_size)
3675 printf (" %6.6lx", (unsigned long) section->sh_size);
3676 else
3678 putchar (' ');
3679 print_vma (section->sh_size, LONG_HEX);
3682 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3683 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3684 else
3686 putchar (' ');
3687 print_vma (section->sh_entsize, LONG_HEX);
3690 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3692 printf ("%2ld %3lx ",
3693 (unsigned long) section->sh_link,
3694 (unsigned long) section->sh_info);
3696 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3697 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3698 else
3700 print_vma (section->sh_addralign, DEC);
3701 putchar ('\n');
3704 else
3706 putchar (' ');
3707 print_vma (section->sh_addr, LONG_HEX);
3708 if ((long) section->sh_offset == section->sh_offset)
3709 printf (" %8.8lx", (unsigned long) section->sh_offset);
3710 else
3712 printf (" ");
3713 print_vma (section->sh_offset, LONG_HEX);
3715 printf ("\n ");
3716 print_vma (section->sh_size, LONG_HEX);
3717 printf (" ");
3718 print_vma (section->sh_entsize, LONG_HEX);
3720 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3722 printf (" %2ld %3lx %ld\n",
3723 (unsigned long) section->sh_link,
3724 (unsigned long) section->sh_info,
3725 (unsigned long) section->sh_addralign);
3729 printf (_("Key to Flags:\n\
3730 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3731 I (info), L (link order), G (group), x (unknown)\n\
3732 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3734 return 1;
3737 /* Process the reloc section. */
3738 static int
3739 process_relocs (file)
3740 FILE *file;
3742 unsigned long rel_size;
3743 unsigned long rel_offset;
3746 if (!do_reloc)
3747 return 1;
3749 if (do_using_dynamic)
3751 int is_rela = FALSE;
3753 rel_size = 0;
3754 rel_offset = 0;
3756 if (dynamic_info[DT_REL])
3758 rel_offset = dynamic_info[DT_REL];
3759 rel_size = dynamic_info[DT_RELSZ];
3760 is_rela = FALSE;
3762 else if (dynamic_info[DT_RELA])
3764 rel_offset = dynamic_info[DT_RELA];
3765 rel_size = dynamic_info[DT_RELASZ];
3766 is_rela = TRUE;
3768 else if (dynamic_info[DT_JMPREL])
3770 rel_offset = dynamic_info[DT_JMPREL];
3771 rel_size = dynamic_info[DT_PLTRELSZ];
3773 switch (dynamic_info[DT_PLTREL])
3775 case DT_REL:
3776 is_rela = FALSE;
3777 break;
3778 case DT_RELA:
3779 is_rela = TRUE;
3780 break;
3781 default:
3782 is_rela = UNKNOWN;
3783 break;
3787 if (rel_size)
3789 printf
3790 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3791 rel_offset, rel_size);
3793 dump_relocations (file, rel_offset - loadaddr, rel_size,
3794 dynamic_symbols, num_dynamic_syms, dynamic_strings,
3795 is_rela);
3797 else
3798 printf (_("\nThere are no dynamic relocations in this file.\n"));
3800 else
3802 Elf_Internal_Shdr *section;
3803 unsigned long i;
3804 int found = 0;
3806 for (i = 0, section = section_headers;
3807 i < elf_header.e_shnum;
3808 i++, section++)
3810 if ( section->sh_type != SHT_RELA
3811 && section->sh_type != SHT_REL)
3812 continue;
3814 rel_offset = section->sh_offset;
3815 rel_size = section->sh_size;
3817 if (rel_size)
3819 Elf_Internal_Shdr *strsec;
3820 Elf_Internal_Sym *symtab;
3821 char *strtab;
3822 int is_rela;
3823 unsigned long nsyms;
3825 printf (_("\nRelocation section "));
3827 if (string_table == NULL)
3828 printf ("%d", section->sh_name);
3829 else
3830 printf (_("'%s'"), SECTION_NAME (section));
3832 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3833 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3835 symtab = NULL;
3836 strtab = NULL;
3837 nsyms = 0;
3838 if (section->sh_link)
3840 Elf_Internal_Shdr *symsec;
3842 symsec = SECTION_HEADER (section->sh_link);
3843 nsyms = symsec->sh_size / symsec->sh_entsize;
3844 symtab = GET_ELF_SYMBOLS (file, symsec);
3846 if (symtab == NULL)
3847 continue;
3849 strsec = SECTION_HEADER (symsec->sh_link);
3851 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3852 strsec->sh_size,
3853 _("string table"));
3855 is_rela = section->sh_type == SHT_RELA;
3857 dump_relocations (file, rel_offset, rel_size,
3858 symtab, nsyms, strtab, is_rela);
3860 if (strtab)
3861 free (strtab);
3862 if (symtab)
3863 free (symtab);
3865 found = 1;
3869 if (! found)
3870 printf (_("\nThere are no relocations in this file.\n"));
3873 return 1;
3876 #include "unwind-ia64.h"
3878 /* An absolute address consists of a section and an offset. If the
3879 section is NULL, the offset itself is the address, otherwise, the
3880 address equals to LOAD_ADDRESS(section) + offset. */
3882 struct absaddr
3884 unsigned short section;
3885 bfd_vma offset;
3888 struct unw_aux_info
3890 struct unw_table_entry
3892 struct absaddr start;
3893 struct absaddr end;
3894 struct absaddr info;
3896 *table; /* Unwind table. */
3897 unsigned long table_len; /* Length of unwind table. */
3898 unsigned char *info; /* Unwind info. */
3899 unsigned long info_size; /* Size of unwind info. */
3900 bfd_vma info_addr; /* starting address of unwind info. */
3901 bfd_vma seg_base; /* Starting address of segment. */
3902 Elf_Internal_Sym *symtab; /* The symbol table. */
3903 unsigned long nsyms; /* Number of symbols. */
3904 char *strtab; /* The string table. */
3905 unsigned long strtab_size; /* Size of string table. */
3908 static void find_symbol_for_address
3909 PARAMS ((struct unw_aux_info *, struct absaddr, const char **, bfd_vma *));
3910 static void dump_ia64_unwind
3911 PARAMS ((struct unw_aux_info *));
3912 static int slurp_ia64_unwind_table
3913 PARAMS ((FILE *, struct unw_aux_info *, Elf_Internal_Shdr *));
3915 static void
3916 find_symbol_for_address (aux, addr, symname, offset)
3917 struct unw_aux_info *aux;
3918 struct absaddr addr;
3919 const char **symname;
3920 bfd_vma *offset;
3922 bfd_vma dist = (bfd_vma) 0x100000;
3923 Elf_Internal_Sym *sym, *best = NULL;
3924 unsigned long i;
3926 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3928 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3929 && sym->st_name != 0
3930 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3931 && addr.offset >= sym->st_value
3932 && addr.offset - sym->st_value < dist)
3934 best = sym;
3935 dist = addr.offset - sym->st_value;
3936 if (!dist)
3937 break;
3940 if (best)
3942 *symname = (best->st_name >= aux->strtab_size
3943 ? "<corrupt>" : aux->strtab + best->st_name);
3944 *offset = dist;
3945 return;
3947 *symname = NULL;
3948 *offset = addr.offset;
3951 static void
3952 dump_ia64_unwind (aux)
3953 struct unw_aux_info *aux;
3955 bfd_vma addr_size;
3956 struct unw_table_entry *tp;
3957 int in_body;
3959 addr_size = is_32bit_elf ? 4 : 8;
3961 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3963 bfd_vma stamp;
3964 bfd_vma offset;
3965 const unsigned char *dp;
3966 const unsigned char *head;
3967 const char *procname;
3969 find_symbol_for_address (aux, tp->start, &procname, &offset);
3971 fputs ("\n<", stdout);
3973 if (procname)
3975 fputs (procname, stdout);
3977 if (offset)
3978 printf ("+%lx", (unsigned long) offset);
3981 fputs (">: [", stdout);
3982 print_vma (tp->start.offset, PREFIX_HEX);
3983 fputc ('-', stdout);
3984 print_vma (tp->end.offset, PREFIX_HEX);
3985 printf ("], info at +0x%lx\n",
3986 (unsigned long) (tp->info.offset - aux->seg_base));
3988 head = aux->info + (tp->info.offset - aux->info_addr);
3989 stamp = BYTE_GET8 ((unsigned char *) head);
3991 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
3992 (unsigned) UNW_VER (stamp),
3993 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3994 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3995 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3996 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3998 if (UNW_VER (stamp) != 1)
4000 printf ("\tUnknown version.\n");
4001 continue;
4004 in_body = 0;
4005 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
4006 dp = unw_decode (dp, in_body, & in_body);
4010 static int
4011 slurp_ia64_unwind_table (file, aux, sec)
4012 FILE *file;
4013 struct unw_aux_info *aux;
4014 Elf_Internal_Shdr *sec;
4016 unsigned long size, addr_size, nrelas, i;
4017 Elf_Internal_Phdr *prog_hdrs, *seg;
4018 struct unw_table_entry *tep;
4019 Elf_Internal_Shdr *relsec;
4020 Elf_Internal_Rela *rela, *rp;
4021 unsigned char *table, *tp;
4022 Elf_Internal_Sym *sym;
4023 const char *relname;
4024 int result;
4026 addr_size = is_32bit_elf ? 4 : 8;
4028 /* First, find the starting address of the segment that includes
4029 this section: */
4031 if (elf_header.e_phnum)
4033 prog_hdrs = (Elf_Internal_Phdr *)
4034 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
4036 if (is_32bit_elf)
4037 result = get_32bit_program_headers (file, prog_hdrs);
4038 else
4039 result = get_64bit_program_headers (file, prog_hdrs);
4041 if (!result)
4043 free (prog_hdrs);
4044 return 0;
4047 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
4049 if (seg->p_type != PT_LOAD)
4050 continue;
4052 if (sec->sh_addr >= seg->p_vaddr
4053 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4055 aux->seg_base = seg->p_vaddr;
4056 break;
4060 free (prog_hdrs);
4063 /* Second, build the unwind table from the contents of the unwind section: */
4064 size = sec->sh_size;
4065 table = (char *) get_data (NULL, file, sec->sh_offset,
4066 size, _("unwind table"));
4067 if (!table)
4068 return 0;
4070 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
4071 for (tp = table; tp < table + size; tp += 3 * addr_size, ++tep)
4073 tep->start.section = SHN_UNDEF;
4074 tep->end.section = SHN_UNDEF;
4075 tep->info.section = SHN_UNDEF;
4076 if (is_32bit_elf)
4078 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4079 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4080 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4082 else
4084 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4085 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4086 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
4088 tep->start.offset += aux->seg_base;
4089 tep->end.offset += aux->seg_base;
4090 tep->info.offset += aux->seg_base;
4092 free (table);
4094 /* Third, apply any relocations to the unwind table: */
4096 for (relsec = section_headers;
4097 relsec < section_headers + elf_header.e_shnum;
4098 ++relsec)
4100 if (relsec->sh_type != SHT_RELA
4101 || SECTION_HEADER (relsec->sh_info) != sec)
4102 continue;
4104 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4105 & rela, & nrelas))
4106 return 0;
4108 for (rp = rela; rp < rela + nrelas; ++rp)
4110 if (is_32bit_elf)
4112 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4113 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4115 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
4117 warn (_("Skipping unexpected symbol type %u\n"),
4118 ELF32_ST_TYPE (sym->st_info));
4119 continue;
4122 else
4124 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4125 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4127 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
4129 warn (_("Skipping unexpected symbol type %u\n"),
4130 ELF64_ST_TYPE (sym->st_info));
4131 continue;
4135 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
4137 warn (_("Skipping unexpected relocation type %s\n"), relname);
4138 continue;
4141 i = rp->r_offset / (3 * addr_size);
4143 switch (rp->r_offset/addr_size % 3)
4145 case 0:
4146 aux->table[i].start.section = sym->st_shndx;
4147 aux->table[i].start.offset += rp->r_addend;
4148 break;
4149 case 1:
4150 aux->table[i].end.section = sym->st_shndx;
4151 aux->table[i].end.offset += rp->r_addend;
4152 break;
4153 case 2:
4154 aux->table[i].info.section = sym->st_shndx;
4155 aux->table[i].info.offset += rp->r_addend;
4156 break;
4157 default:
4158 break;
4162 free (rela);
4165 aux->table_len = size / (3 * addr_size);
4166 return 1;
4169 static int
4170 process_unwind (file)
4171 FILE *file;
4173 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4174 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4175 struct unw_aux_info aux;
4177 if (!do_unwind)
4178 return 1;
4180 if (elf_header.e_machine != EM_IA_64)
4182 printf (_("\nThere are no unwind sections in this file.\n"));
4183 return 1;
4186 memset (& aux, 0, sizeof (aux));
4188 addr_size = is_32bit_elf ? 4 : 8;
4190 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4192 if (sec->sh_type == SHT_SYMTAB)
4194 aux.nsyms = sec->sh_size / sec->sh_entsize;
4195 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4197 strsec = SECTION_HEADER (sec->sh_link);
4198 aux.strtab_size = strsec->sh_size;
4199 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
4200 aux.strtab_size, _("string table"));
4202 else if (sec->sh_type == SHT_IA_64_UNWIND)
4203 unwcount++;
4206 if (!unwcount)
4207 printf (_("\nThere are no unwind sections in this file.\n"));
4209 while (unwcount-- > 0)
4211 char *suffix;
4212 size_t len, len2;
4214 for (i = unwstart, sec = section_headers + unwstart;
4215 i < elf_header.e_shnum; ++i, ++sec)
4216 if (sec->sh_type == SHT_IA_64_UNWIND)
4218 unwsec = sec;
4219 break;
4222 unwstart = i + 1;
4223 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4225 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
4226 len) == 0)
4228 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4229 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4230 suffix = SECTION_NAME (unwsec) + len;
4231 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4232 ++i, ++sec)
4233 if (strncmp (SECTION_NAME (sec),
4234 ELF_STRING_ia64_unwind_info_once, len2) == 0
4235 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4236 break;
4238 else
4240 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4241 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4242 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4243 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4244 suffix = "";
4245 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
4246 len) == 0)
4247 suffix = SECTION_NAME (unwsec) + len;
4248 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4249 ++i, ++sec)
4250 if (strncmp (SECTION_NAME (sec),
4251 ELF_STRING_ia64_unwind_info, len2) == 0
4252 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4253 break;
4256 if (i == elf_header.e_shnum)
4258 printf (_("\nCould not find unwind info section for "));
4260 if (string_table == NULL)
4261 printf ("%d", unwsec->sh_name);
4262 else
4263 printf (_("'%s'"), SECTION_NAME (unwsec));
4265 else
4267 aux.info_size = sec->sh_size;
4268 aux.info_addr = sec->sh_addr;
4269 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
4270 aux.info_size, _("unwind info"));
4272 printf (_("\nUnwind section "));
4274 if (string_table == NULL)
4275 printf ("%d", unwsec->sh_name);
4276 else
4277 printf (_("'%s'"), SECTION_NAME (unwsec));
4279 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4280 (unsigned long) unwsec->sh_offset,
4281 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4283 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4285 if (aux.table_len > 0)
4286 dump_ia64_unwind (& aux);
4288 if (aux.table)
4289 free ((char *) aux.table);
4290 if (aux.info)
4291 free ((char *) aux.info);
4292 aux.table = NULL;
4293 aux.info = NULL;
4297 if (aux.symtab)
4298 free (aux.symtab);
4299 if (aux.strtab)
4300 free ((char *) aux.strtab);
4302 return 1;
4305 static void
4306 dynamic_segment_mips_val (entry)
4307 Elf_Internal_Dyn *entry;
4309 switch (entry->d_tag)
4311 case DT_MIPS_FLAGS:
4312 if (entry->d_un.d_val == 0)
4313 printf ("NONE\n");
4314 else
4316 static const char * opts[] =
4318 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4319 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4320 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4321 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4322 "RLD_ORDER_SAFE"
4324 unsigned int cnt;
4325 int first = 1;
4326 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
4327 if (entry->d_un.d_val & (1 << cnt))
4329 printf ("%s%s", first ? "" : " ", opts[cnt]);
4330 first = 0;
4332 puts ("");
4334 break;
4336 case DT_MIPS_IVERSION:
4337 if (dynamic_strings != NULL)
4338 printf ("Interface Version: %s\n",
4339 dynamic_strings + entry->d_un.d_val);
4340 else
4341 printf ("%ld\n", (long) entry->d_un.d_ptr);
4342 break;
4344 case DT_MIPS_TIME_STAMP:
4346 char timebuf[20];
4347 struct tm *tmp;
4349 time_t time = entry->d_un.d_val;
4350 tmp = gmtime (&time);
4351 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4352 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4353 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4354 printf ("Time Stamp: %s\n", timebuf);
4356 break;
4358 case DT_MIPS_RLD_VERSION:
4359 case DT_MIPS_LOCAL_GOTNO:
4360 case DT_MIPS_CONFLICTNO:
4361 case DT_MIPS_LIBLISTNO:
4362 case DT_MIPS_SYMTABNO:
4363 case DT_MIPS_UNREFEXTNO:
4364 case DT_MIPS_HIPAGENO:
4365 case DT_MIPS_DELTA_CLASS_NO:
4366 case DT_MIPS_DELTA_INSTANCE_NO:
4367 case DT_MIPS_DELTA_RELOC_NO:
4368 case DT_MIPS_DELTA_SYM_NO:
4369 case DT_MIPS_DELTA_CLASSSYM_NO:
4370 case DT_MIPS_COMPACT_SIZE:
4371 printf ("%ld\n", (long) entry->d_un.d_ptr);
4372 break;
4374 default:
4375 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4380 static void
4381 dynamic_segment_parisc_val (entry)
4382 Elf_Internal_Dyn *entry;
4384 switch (entry->d_tag)
4386 case DT_HP_DLD_FLAGS:
4388 static struct
4390 long int bit;
4391 const char *str;
4393 flags[] =
4395 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4396 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4397 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4398 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4399 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4400 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4401 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4402 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4403 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4404 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4405 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4407 int first = 1;
4408 size_t cnt;
4409 bfd_vma val = entry->d_un.d_val;
4411 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4412 if (val & flags[cnt].bit)
4414 if (! first)
4415 putchar (' ');
4416 fputs (flags[cnt].str, stdout);
4417 first = 0;
4418 val ^= flags[cnt].bit;
4421 if (val != 0 || first)
4423 if (! first)
4424 putchar (' ');
4425 print_vma (val, HEX);
4428 break;
4430 default:
4431 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4432 break;
4434 putchar ('\n');
4437 static int
4438 get_32bit_dynamic_segment (file)
4439 FILE *file;
4441 Elf32_External_Dyn *edyn;
4442 Elf_Internal_Dyn *entry;
4443 bfd_size_type i;
4445 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4446 dynamic_size, _("dynamic segment"));
4447 if (!edyn)
4448 return 0;
4450 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4451 how large this .dynamic is now. We can do this even before the byte
4452 swapping since the DT_NULL tag is recognizable. */
4453 dynamic_size = 0;
4454 while (*(Elf32_Word *) edyn[dynamic_size++].d_tag != DT_NULL)
4457 dynamic_segment = (Elf_Internal_Dyn *)
4458 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4460 if (dynamic_segment == NULL)
4462 error (_("Out of memory\n"));
4463 free (edyn);
4464 return 0;
4467 for (i = 0, entry = dynamic_segment;
4468 i < dynamic_size;
4469 i++, entry++)
4471 entry->d_tag = BYTE_GET (edyn[i].d_tag);
4472 entry->d_un.d_val = BYTE_GET (edyn[i].d_un.d_val);
4475 free (edyn);
4477 return 1;
4480 static int
4481 get_64bit_dynamic_segment (file)
4482 FILE *file;
4484 Elf64_External_Dyn *edyn;
4485 Elf_Internal_Dyn *entry;
4486 bfd_size_type i;
4488 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4489 dynamic_size, _("dynamic segment"));
4490 if (!edyn)
4491 return 0;
4493 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4494 how large this .dynamic is now. We can do this even before the byte
4495 swapping since the DT_NULL tag is recognizable. */
4496 dynamic_size = 0;
4497 while (*(bfd_vma *) edyn[dynamic_size++].d_tag != DT_NULL)
4500 dynamic_segment = (Elf_Internal_Dyn *)
4501 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4503 if (dynamic_segment == NULL)
4505 error (_("Out of memory\n"));
4506 free (edyn);
4507 return 0;
4510 for (i = 0, entry = dynamic_segment;
4511 i < dynamic_size;
4512 i++, entry++)
4514 entry->d_tag = BYTE_GET8 (edyn[i].d_tag);
4515 entry->d_un.d_val = BYTE_GET8 (edyn[i].d_un.d_val);
4518 free (edyn);
4520 return 1;
4523 static const char *
4524 get_dynamic_flags (flags)
4525 bfd_vma flags;
4527 static char buff[128];
4528 char *p = buff;
4530 *p = '\0';
4531 while (flags)
4533 bfd_vma flag;
4535 flag = flags & - flags;
4536 flags &= ~ flag;
4538 if (p != buff)
4539 *p++ = ' ';
4541 switch (flag)
4543 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4544 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4545 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4546 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4547 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4548 default: strcpy (p, "unknown"); break;
4551 p = strchr (p, '\0');
4553 return buff;
4556 /* Parse and display the contents of the dynamic segment. */
4557 static int
4558 process_dynamic_segment (file)
4559 FILE *file;
4561 Elf_Internal_Dyn *entry;
4562 bfd_size_type i;
4564 if (dynamic_size == 0)
4566 if (do_dynamic)
4567 printf (_("\nThere is no dynamic segment in this file.\n"));
4569 return 1;
4572 if (is_32bit_elf)
4574 if (! get_32bit_dynamic_segment (file))
4575 return 0;
4577 else if (! get_64bit_dynamic_segment (file))
4578 return 0;
4580 /* Find the appropriate symbol table. */
4581 if (dynamic_symbols == NULL)
4583 for (i = 0, entry = dynamic_segment;
4584 i < dynamic_size;
4585 ++i, ++entry)
4587 Elf_Internal_Shdr section;
4589 if (entry->d_tag != DT_SYMTAB)
4590 continue;
4592 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4594 /* Since we do not know how big the symbol table is,
4595 we default to reading in the entire file (!) and
4596 processing that. This is overkill, I know, but it
4597 should work. */
4598 section.sh_offset = entry->d_un.d_val - loadaddr;
4600 if (fseek (file, 0, SEEK_END))
4601 error (_("Unable to seek to end of file!"));
4603 section.sh_size = ftell (file) - section.sh_offset;
4604 if (is_32bit_elf)
4605 section.sh_entsize = sizeof (Elf32_External_Sym);
4606 else
4607 section.sh_entsize = sizeof (Elf64_External_Sym);
4609 num_dynamic_syms = section.sh_size / section.sh_entsize;
4610 if (num_dynamic_syms < 1)
4612 error (_("Unable to determine the number of symbols to load\n"));
4613 continue;
4616 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
4620 /* Similarly find a string table. */
4621 if (dynamic_strings == NULL)
4623 for (i = 0, entry = dynamic_segment;
4624 i < dynamic_size;
4625 ++i, ++entry)
4627 unsigned long offset;
4628 long str_tab_len;
4630 if (entry->d_tag != DT_STRTAB)
4631 continue;
4633 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4635 /* Since we do not know how big the string table is,
4636 we default to reading in the entire file (!) and
4637 processing that. This is overkill, I know, but it
4638 should work. */
4640 offset = entry->d_un.d_val - loadaddr;
4641 if (fseek (file, 0, SEEK_END))
4642 error (_("Unable to seek to end of file\n"));
4643 str_tab_len = ftell (file) - offset;
4645 if (str_tab_len < 1)
4647 error
4648 (_("Unable to determine the length of the dynamic string table\n"));
4649 continue;
4652 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4653 _("dynamic string table"));
4654 break;
4658 /* And find the syminfo section if available. */
4659 if (dynamic_syminfo == NULL)
4661 unsigned long syminsz = 0;
4663 for (i = 0, entry = dynamic_segment;
4664 i < dynamic_size;
4665 ++i, ++entry)
4667 if (entry->d_tag == DT_SYMINENT)
4669 /* Note: these braces are necessary to avoid a syntax
4670 error from the SunOS4 C compiler. */
4671 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4673 else if (entry->d_tag == DT_SYMINSZ)
4674 syminsz = entry->d_un.d_val;
4675 else if (entry->d_tag == DT_SYMINFO)
4676 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4679 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4681 Elf_External_Syminfo *extsyminfo;
4682 Elf_Internal_Syminfo *syminfo;
4684 /* There is a syminfo section. Read the data. */
4685 extsyminfo = ((Elf_External_Syminfo *)
4686 get_data (NULL, file, dynamic_syminfo_offset,
4687 syminsz, _("symbol information")));
4688 if (!extsyminfo)
4689 return 0;
4691 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4692 if (dynamic_syminfo == NULL)
4694 error (_("Out of memory\n"));
4695 return 0;
4698 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4699 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4700 ++i, ++syminfo)
4702 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4703 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4706 free (extsyminfo);
4710 if (do_dynamic && dynamic_addr)
4711 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4712 dynamic_addr, (long) dynamic_size);
4713 if (do_dynamic)
4714 printf (_(" Tag Type Name/Value\n"));
4716 for (i = 0, entry = dynamic_segment;
4717 i < dynamic_size;
4718 i++, entry++)
4720 if (do_dynamic)
4722 const char *dtype;
4724 putchar (' ');
4725 print_vma (entry->d_tag, FULL_HEX);
4726 dtype = get_dynamic_type (entry->d_tag);
4727 printf (" (%s)%*s", dtype,
4728 ((is_32bit_elf ? 27 : 19)
4729 - (int) strlen (dtype)),
4730 " ");
4733 switch (entry->d_tag)
4735 case DT_FLAGS:
4736 if (do_dynamic)
4737 puts (get_dynamic_flags (entry->d_un.d_val));
4738 break;
4740 case DT_AUXILIARY:
4741 case DT_FILTER:
4742 case DT_CONFIG:
4743 case DT_DEPAUDIT:
4744 case DT_AUDIT:
4745 if (do_dynamic)
4747 switch (entry->d_tag)
4749 case DT_AUXILIARY:
4750 printf (_("Auxiliary library"));
4751 break;
4753 case DT_FILTER:
4754 printf (_("Filter library"));
4755 break;
4757 case DT_CONFIG:
4758 printf (_("Configuration file"));
4759 break;
4761 case DT_DEPAUDIT:
4762 printf (_("Dependency audit library"));
4763 break;
4765 case DT_AUDIT:
4766 printf (_("Audit library"));
4767 break;
4770 if (dynamic_strings)
4771 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4772 else
4774 printf (": ");
4775 print_vma (entry->d_un.d_val, PREFIX_HEX);
4776 putchar ('\n');
4779 break;
4781 case DT_FEATURE:
4782 if (do_dynamic)
4784 printf (_("Flags:"));
4786 if (entry->d_un.d_val == 0)
4787 printf (_(" None\n"));
4788 else
4790 unsigned long int val = entry->d_un.d_val;
4792 if (val & DTF_1_PARINIT)
4794 printf (" PARINIT");
4795 val ^= DTF_1_PARINIT;
4797 if (val & DTF_1_CONFEXP)
4799 printf (" CONFEXP");
4800 val ^= DTF_1_CONFEXP;
4802 if (val != 0)
4803 printf (" %lx", val);
4804 puts ("");
4807 break;
4809 case DT_POSFLAG_1:
4810 if (do_dynamic)
4812 printf (_("Flags:"));
4814 if (entry->d_un.d_val == 0)
4815 printf (_(" None\n"));
4816 else
4818 unsigned long int val = entry->d_un.d_val;
4820 if (val & DF_P1_LAZYLOAD)
4822 printf (" LAZYLOAD");
4823 val ^= DF_P1_LAZYLOAD;
4825 if (val & DF_P1_GROUPPERM)
4827 printf (" GROUPPERM");
4828 val ^= DF_P1_GROUPPERM;
4830 if (val != 0)
4831 printf (" %lx", val);
4832 puts ("");
4835 break;
4837 case DT_FLAGS_1:
4838 if (do_dynamic)
4840 printf (_("Flags:"));
4841 if (entry->d_un.d_val == 0)
4842 printf (_(" None\n"));
4843 else
4845 unsigned long int val = entry->d_un.d_val;
4847 if (val & DF_1_NOW)
4849 printf (" NOW");
4850 val ^= DF_1_NOW;
4852 if (val & DF_1_GLOBAL)
4854 printf (" GLOBAL");
4855 val ^= DF_1_GLOBAL;
4857 if (val & DF_1_GROUP)
4859 printf (" GROUP");
4860 val ^= DF_1_GROUP;
4862 if (val & DF_1_NODELETE)
4864 printf (" NODELETE");
4865 val ^= DF_1_NODELETE;
4867 if (val & DF_1_LOADFLTR)
4869 printf (" LOADFLTR");
4870 val ^= DF_1_LOADFLTR;
4872 if (val & DF_1_INITFIRST)
4874 printf (" INITFIRST");
4875 val ^= DF_1_INITFIRST;
4877 if (val & DF_1_NOOPEN)
4879 printf (" NOOPEN");
4880 val ^= DF_1_NOOPEN;
4882 if (val & DF_1_ORIGIN)
4884 printf (" ORIGIN");
4885 val ^= DF_1_ORIGIN;
4887 if (val & DF_1_DIRECT)
4889 printf (" DIRECT");
4890 val ^= DF_1_DIRECT;
4892 if (val & DF_1_TRANS)
4894 printf (" TRANS");
4895 val ^= DF_1_TRANS;
4897 if (val & DF_1_INTERPOSE)
4899 printf (" INTERPOSE");
4900 val ^= DF_1_INTERPOSE;
4902 if (val & DF_1_NODEFLIB)
4904 printf (" NODEFLIB");
4905 val ^= DF_1_NODEFLIB;
4907 if (val & DF_1_NODUMP)
4909 printf (" NODUMP");
4910 val ^= DF_1_NODUMP;
4912 if (val & DF_1_CONLFAT)
4914 printf (" CONLFAT");
4915 val ^= DF_1_CONLFAT;
4917 if (val != 0)
4918 printf (" %lx", val);
4919 puts ("");
4922 break;
4924 case DT_PLTREL:
4925 if (do_dynamic)
4926 puts (get_dynamic_type (entry->d_un.d_val));
4927 break;
4929 case DT_NULL :
4930 case DT_NEEDED :
4931 case DT_PLTGOT :
4932 case DT_HASH :
4933 case DT_STRTAB :
4934 case DT_SYMTAB :
4935 case DT_RELA :
4936 case DT_INIT :
4937 case DT_FINI :
4938 case DT_SONAME :
4939 case DT_RPATH :
4940 case DT_SYMBOLIC:
4941 case DT_REL :
4942 case DT_DEBUG :
4943 case DT_TEXTREL :
4944 case DT_JMPREL :
4945 case DT_RUNPATH :
4946 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4948 if (do_dynamic)
4950 char *name;
4952 if (dynamic_strings == NULL)
4953 name = NULL;
4954 else
4955 name = dynamic_strings + entry->d_un.d_val;
4957 if (name)
4959 switch (entry->d_tag)
4961 case DT_NEEDED:
4962 printf (_("Shared library: [%s]"), name);
4964 if (strcmp (name, program_interpreter) == 0)
4965 printf (_(" program interpreter"));
4966 break;
4968 case DT_SONAME:
4969 printf (_("Library soname: [%s]"), name);
4970 break;
4972 case DT_RPATH:
4973 printf (_("Library rpath: [%s]"), name);
4974 break;
4976 case DT_RUNPATH:
4977 printf (_("Library runpath: [%s]"), name);
4978 break;
4980 default:
4981 print_vma (entry->d_un.d_val, PREFIX_HEX);
4982 break;
4985 else
4986 print_vma (entry->d_un.d_val, PREFIX_HEX);
4988 putchar ('\n');
4990 break;
4992 case DT_PLTRELSZ:
4993 case DT_RELASZ :
4994 case DT_STRSZ :
4995 case DT_RELSZ :
4996 case DT_RELAENT :
4997 case DT_SYMENT :
4998 case DT_RELENT :
4999 case DT_PLTPADSZ:
5000 case DT_MOVEENT :
5001 case DT_MOVESZ :
5002 case DT_INIT_ARRAYSZ:
5003 case DT_FINI_ARRAYSZ:
5004 case DT_GNU_CONFLICTSZ:
5005 case DT_GNU_LIBLISTSZ:
5006 if (do_dynamic)
5008 print_vma (entry->d_un.d_val, UNSIGNED);
5009 printf (" (bytes)\n");
5011 break;
5013 case DT_VERDEFNUM:
5014 case DT_VERNEEDNUM:
5015 case DT_RELACOUNT:
5016 case DT_RELCOUNT:
5017 if (do_dynamic)
5019 print_vma (entry->d_un.d_val, UNSIGNED);
5020 putchar ('\n');
5022 break;
5024 case DT_SYMINSZ:
5025 case DT_SYMINENT:
5026 case DT_SYMINFO:
5027 case DT_USED:
5028 case DT_INIT_ARRAY:
5029 case DT_FINI_ARRAY:
5030 if (do_dynamic)
5032 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
5034 char *name;
5036 name = dynamic_strings + entry->d_un.d_val;
5038 if (*name)
5040 printf (_("Not needed object: [%s]\n"), name);
5041 break;
5045 print_vma (entry->d_un.d_val, PREFIX_HEX);
5046 putchar ('\n');
5048 break;
5050 case DT_BIND_NOW:
5051 /* The value of this entry is ignored. */
5052 if (do_dynamic)
5053 putchar ('\n');
5054 break;
5056 case DT_GNU_PRELINKED:
5057 if (do_dynamic)
5059 struct tm *tmp;
5060 time_t time = entry->d_un.d_val;
5062 tmp = gmtime (&time);
5063 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5064 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5065 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5068 break;
5070 default:
5071 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5072 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5073 entry->d_un.d_val;
5075 if (do_dynamic)
5077 switch (elf_header.e_machine)
5079 case EM_MIPS:
5080 case EM_MIPS_RS3_LE:
5081 dynamic_segment_mips_val (entry);
5082 break;
5083 case EM_PARISC:
5084 dynamic_segment_parisc_val (entry);
5085 break;
5086 default:
5087 print_vma (entry->d_un.d_val, PREFIX_HEX);
5088 putchar ('\n');
5091 break;
5095 return 1;
5098 static char *
5099 get_ver_flags (flags)
5100 unsigned int flags;
5102 static char buff[32];
5104 buff[0] = 0;
5106 if (flags == 0)
5107 return _("none");
5109 if (flags & VER_FLG_BASE)
5110 strcat (buff, "BASE ");
5112 if (flags & VER_FLG_WEAK)
5114 if (flags & VER_FLG_BASE)
5115 strcat (buff, "| ");
5117 strcat (buff, "WEAK ");
5120 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5121 strcat (buff, "| <unknown>");
5123 return buff;
5126 /* Display the contents of the version sections. */
5127 static int
5128 process_version_sections (file)
5129 FILE *file;
5131 Elf_Internal_Shdr *section;
5132 unsigned i;
5133 int found = 0;
5135 if (! do_version)
5136 return 1;
5138 for (i = 0, section = section_headers;
5139 i < elf_header.e_shnum;
5140 i++, section++)
5142 switch (section->sh_type)
5144 case SHT_GNU_verdef:
5146 Elf_External_Verdef *edefs;
5147 unsigned int idx;
5148 unsigned int cnt;
5150 found = 1;
5152 printf
5153 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5154 SECTION_NAME (section), section->sh_info);
5156 printf (_(" Addr: 0x"));
5157 printf_vma (section->sh_addr);
5158 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5159 (unsigned long) section->sh_offset, section->sh_link,
5160 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5162 edefs = ((Elf_External_Verdef *)
5163 get_data (NULL, file, section->sh_offset,
5164 section->sh_size,
5165 _("version definition section")));
5166 if (!edefs)
5167 break;
5169 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5171 char *vstart;
5172 Elf_External_Verdef *edef;
5173 Elf_Internal_Verdef ent;
5174 Elf_External_Verdaux *eaux;
5175 Elf_Internal_Verdaux aux;
5176 int j;
5177 int isum;
5179 vstart = ((char *) edefs) + idx;
5181 edef = (Elf_External_Verdef *) vstart;
5183 ent.vd_version = BYTE_GET (edef->vd_version);
5184 ent.vd_flags = BYTE_GET (edef->vd_flags);
5185 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5186 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5187 ent.vd_hash = BYTE_GET (edef->vd_hash);
5188 ent.vd_aux = BYTE_GET (edef->vd_aux);
5189 ent.vd_next = BYTE_GET (edef->vd_next);
5191 printf (_(" %#06x: Rev: %d Flags: %s"),
5192 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5194 printf (_(" Index: %d Cnt: %d "),
5195 ent.vd_ndx, ent.vd_cnt);
5197 vstart += ent.vd_aux;
5199 eaux = (Elf_External_Verdaux *) vstart;
5201 aux.vda_name = BYTE_GET (eaux->vda_name);
5202 aux.vda_next = BYTE_GET (eaux->vda_next);
5204 if (dynamic_strings)
5205 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
5206 else
5207 printf (_("Name index: %ld\n"), aux.vda_name);
5209 isum = idx + ent.vd_aux;
5211 for (j = 1; j < ent.vd_cnt; j++)
5213 isum += aux.vda_next;
5214 vstart += aux.vda_next;
5216 eaux = (Elf_External_Verdaux *) vstart;
5218 aux.vda_name = BYTE_GET (eaux->vda_name);
5219 aux.vda_next = BYTE_GET (eaux->vda_next);
5221 if (dynamic_strings)
5222 printf (_(" %#06x: Parent %d: %s\n"),
5223 isum, j, dynamic_strings + aux.vda_name);
5224 else
5225 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5226 isum, j, aux.vda_name);
5229 idx += ent.vd_next;
5232 free (edefs);
5234 break;
5236 case SHT_GNU_verneed:
5238 Elf_External_Verneed *eneed;
5239 unsigned int idx;
5240 unsigned int cnt;
5242 found = 1;
5244 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5245 SECTION_NAME (section), section->sh_info);
5247 printf (_(" Addr: 0x"));
5248 printf_vma (section->sh_addr);
5249 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5250 (unsigned long) section->sh_offset, section->sh_link,
5251 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5253 eneed = ((Elf_External_Verneed *)
5254 get_data (NULL, file, section->sh_offset,
5255 section->sh_size, _("version need section")));
5256 if (!eneed)
5257 break;
5259 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5261 Elf_External_Verneed *entry;
5262 Elf_Internal_Verneed ent;
5263 int j;
5264 int isum;
5265 char *vstart;
5267 vstart = ((char *) eneed) + idx;
5269 entry = (Elf_External_Verneed *) vstart;
5271 ent.vn_version = BYTE_GET (entry->vn_version);
5272 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5273 ent.vn_file = BYTE_GET (entry->vn_file);
5274 ent.vn_aux = BYTE_GET (entry->vn_aux);
5275 ent.vn_next = BYTE_GET (entry->vn_next);
5277 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
5279 if (dynamic_strings)
5280 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
5281 else
5282 printf (_(" File: %lx"), ent.vn_file);
5284 printf (_(" Cnt: %d\n"), ent.vn_cnt);
5286 vstart += ent.vn_aux;
5288 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
5290 Elf_External_Vernaux *eaux;
5291 Elf_Internal_Vernaux aux;
5293 eaux = (Elf_External_Vernaux *) vstart;
5295 aux.vna_hash = BYTE_GET (eaux->vna_hash);
5296 aux.vna_flags = BYTE_GET (eaux->vna_flags);
5297 aux.vna_other = BYTE_GET (eaux->vna_other);
5298 aux.vna_name = BYTE_GET (eaux->vna_name);
5299 aux.vna_next = BYTE_GET (eaux->vna_next);
5301 if (dynamic_strings)
5302 printf (_(" %#06x: Name: %s"),
5303 isum, dynamic_strings + aux.vna_name);
5304 else
5305 printf (_(" %#06x: Name index: %lx"),
5306 isum, aux.vna_name);
5308 printf (_(" Flags: %s Version: %d\n"),
5309 get_ver_flags (aux.vna_flags), aux.vna_other);
5311 isum += aux.vna_next;
5312 vstart += aux.vna_next;
5315 idx += ent.vn_next;
5318 free (eneed);
5320 break;
5322 case SHT_GNU_versym:
5324 Elf_Internal_Shdr *link_section;
5325 int total;
5326 int cnt;
5327 unsigned char *edata;
5328 unsigned short *data;
5329 char *strtab;
5330 Elf_Internal_Sym *symbols;
5331 Elf_Internal_Shdr *string_sec;
5333 link_section = SECTION_HEADER (section->sh_link);
5334 total = section->sh_size / section->sh_entsize;
5336 found = 1;
5338 symbols = GET_ELF_SYMBOLS (file, link_section);
5340 string_sec = SECTION_HEADER (link_section->sh_link);
5342 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5343 string_sec->sh_size,
5344 _("version string table"));
5345 if (!strtab)
5346 break;
5348 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5349 SECTION_NAME (section), total);
5351 printf (_(" Addr: "));
5352 printf_vma (section->sh_addr);
5353 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5354 (unsigned long) section->sh_offset, section->sh_link,
5355 SECTION_NAME (link_section));
5357 edata =
5358 ((unsigned char *)
5359 get_data (NULL, file,
5360 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5361 total * sizeof (short), _("version symbol data")));
5362 if (!edata)
5364 free (strtab);
5365 break;
5368 data = (unsigned short *) malloc (total * sizeof (short));
5370 for (cnt = total; cnt --;)
5371 data[cnt] = byte_get (edata + cnt * sizeof (short),
5372 sizeof (short));
5374 free (edata);
5376 for (cnt = 0; cnt < total; cnt += 4)
5378 int j, nn;
5379 int check_def, check_need;
5380 char *name;
5382 printf (" %03x:", cnt);
5384 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5385 switch (data[cnt + j])
5387 case 0:
5388 fputs (_(" 0 (*local*) "), stdout);
5389 break;
5391 case 1:
5392 fputs (_(" 1 (*global*) "), stdout);
5393 break;
5395 default:
5396 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
5397 data[cnt + j] & 0x8000 ? 'h' : ' ');
5399 check_def = 1;
5400 check_need = 1;
5401 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
5402 != SHT_NOBITS)
5404 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
5405 check_def = 0;
5406 else
5407 check_need = 0;
5410 if (check_need
5411 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
5413 Elf_Internal_Verneed ivn;
5414 unsigned long offset;
5416 offset = version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5417 - loadaddr;
5421 Elf_Internal_Vernaux ivna;
5422 Elf_External_Verneed evn;
5423 Elf_External_Vernaux evna;
5424 unsigned long a_off;
5426 get_data (&evn, file, offset, sizeof (evn),
5427 _("version need"));
5429 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5430 ivn.vn_next = BYTE_GET (evn.vn_next);
5432 a_off = offset + ivn.vn_aux;
5436 get_data (&evna, file, a_off, sizeof (evna),
5437 _("version need aux (2)"));
5439 ivna.vna_next = BYTE_GET (evna.vna_next);
5440 ivna.vna_other = BYTE_GET (evna.vna_other);
5442 a_off += ivna.vna_next;
5444 while (ivna.vna_other != data[cnt + j]
5445 && ivna.vna_next != 0);
5447 if (ivna.vna_other == data[cnt + j])
5449 ivna.vna_name = BYTE_GET (evna.vna_name);
5451 name = strtab + ivna.vna_name;
5452 nn += printf ("(%s%-*s",
5453 name,
5454 12 - (int) strlen (name),
5455 ")");
5456 check_def = 0;
5457 break;
5460 offset += ivn.vn_next;
5462 while (ivn.vn_next);
5465 if (check_def && data[cnt + j] != 0x8001
5466 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5468 Elf_Internal_Verdef ivd;
5469 Elf_External_Verdef evd;
5470 unsigned long offset;
5472 offset = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5473 - loadaddr);
5477 get_data (&evd, file, offset, sizeof (evd),
5478 _("version def"));
5480 ivd.vd_next = BYTE_GET (evd.vd_next);
5481 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5483 offset += ivd.vd_next;
5485 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
5486 && ivd.vd_next != 0);
5488 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
5490 Elf_External_Verdaux evda;
5491 Elf_Internal_Verdaux ivda;
5493 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5495 get_data (&evda, file,
5496 offset - ivd.vd_next + ivd.vd_aux,
5497 sizeof (evda), _("version def aux"));
5499 ivda.vda_name = BYTE_GET (evda.vda_name);
5501 name = strtab + ivda.vda_name;
5502 nn += printf ("(%s%-*s",
5503 name,
5504 12 - (int) strlen (name),
5505 ")");
5509 if (nn < 18)
5510 printf ("%*c", 18 - nn, ' ');
5513 putchar ('\n');
5516 free (data);
5517 free (strtab);
5518 free (symbols);
5520 break;
5522 default:
5523 break;
5527 if (! found)
5528 printf (_("\nNo version information found in this file.\n"));
5530 return 1;
5533 static const char *
5534 get_symbol_binding (binding)
5535 unsigned int binding;
5537 static char buff[32];
5539 switch (binding)
5541 case STB_LOCAL: return "LOCAL";
5542 case STB_GLOBAL: return "GLOBAL";
5543 case STB_WEAK: return "WEAK";
5544 default:
5545 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5546 sprintf (buff, _("<processor specific>: %d"), binding);
5547 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5548 sprintf (buff, _("<OS specific>: %d"), binding);
5549 else
5550 sprintf (buff, _("<unknown>: %d"), binding);
5551 return buff;
5555 static const char *
5556 get_symbol_type (type)
5557 unsigned int type;
5559 static char buff[32];
5561 switch (type)
5563 case STT_NOTYPE: return "NOTYPE";
5564 case STT_OBJECT: return "OBJECT";
5565 case STT_FUNC: return "FUNC";
5566 case STT_SECTION: return "SECTION";
5567 case STT_FILE: return "FILE";
5568 case STT_COMMON: return "COMMON";
5569 case STT_TLS: return "TLS";
5570 default:
5571 if (type >= STT_LOPROC && type <= STT_HIPROC)
5573 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5574 return "THUMB_FUNC";
5576 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5577 return "REGISTER";
5579 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5580 return "PARISC_MILLI";
5582 sprintf (buff, _("<processor specific>: %d"), type);
5584 else if (type >= STT_LOOS && type <= STT_HIOS)
5586 if (elf_header.e_machine == EM_PARISC)
5588 if (type == STT_HP_OPAQUE)
5589 return "HP_OPAQUE";
5590 if (type == STT_HP_STUB)
5591 return "HP_STUB";
5594 sprintf (buff, _("<OS specific>: %d"), type);
5596 else
5597 sprintf (buff, _("<unknown>: %d"), type);
5598 return buff;
5602 static const char *
5603 get_symbol_visibility (visibility)
5604 unsigned int visibility;
5606 switch (visibility)
5608 case STV_DEFAULT: return "DEFAULT";
5609 case STV_INTERNAL: return "INTERNAL";
5610 case STV_HIDDEN: return "HIDDEN";
5611 case STV_PROTECTED: return "PROTECTED";
5612 default: abort ();
5616 static const char *
5617 get_symbol_index_type (type)
5618 unsigned int type;
5620 static char buff[32];
5622 switch (type)
5624 case SHN_UNDEF: return "UND";
5625 case SHN_ABS: return "ABS";
5626 case SHN_COMMON: return "COM";
5627 default:
5628 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5629 sprintf (buff, "PRC[0x%04x]", type);
5630 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5631 sprintf (buff, "OS [0x%04x]", type);
5632 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5633 sprintf (buff, "RSV[0x%04x]", type);
5634 else
5635 sprintf (buff, "%3d", type);
5636 break;
5639 return buff;
5642 static int *
5643 get_dynamic_data (file, number)
5644 FILE *file;
5645 unsigned int number;
5647 unsigned char *e_data;
5648 int *i_data;
5650 e_data = (unsigned char *) malloc (number * 4);
5652 if (e_data == NULL)
5654 error (_("Out of memory\n"));
5655 return NULL;
5658 if (fread (e_data, 4, number, file) != number)
5660 error (_("Unable to read in dynamic data\n"));
5661 return NULL;
5664 i_data = (int *) malloc (number * sizeof (*i_data));
5666 if (i_data == NULL)
5668 error (_("Out of memory\n"));
5669 free (e_data);
5670 return NULL;
5673 while (number--)
5674 i_data[number] = byte_get (e_data + number * 4, 4);
5676 free (e_data);
5678 return i_data;
5681 /* Dump the symbol table. */
5682 static int
5683 process_symbol_table (file)
5684 FILE *file;
5686 Elf_Internal_Shdr *section;
5687 unsigned char nb[4];
5688 unsigned char nc[4];
5689 int nbuckets = 0;
5690 int nchains = 0;
5691 int *buckets = NULL;
5692 int *chains = NULL;
5694 if (! do_syms && !do_histogram)
5695 return 1;
5697 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5698 || do_histogram))
5700 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5702 error (_("Unable to seek to start of dynamic information"));
5703 return 0;
5706 if (fread (nb, sizeof (nb), 1, file) != 1)
5708 error (_("Failed to read in number of buckets\n"));
5709 return 0;
5712 if (fread (nc, sizeof (nc), 1, file) != 1)
5714 error (_("Failed to read in number of chains\n"));
5715 return 0;
5718 nbuckets = byte_get (nb, 4);
5719 nchains = byte_get (nc, 4);
5721 buckets = get_dynamic_data (file, nbuckets);
5722 chains = get_dynamic_data (file, nchains);
5724 if (buckets == NULL || chains == NULL)
5725 return 0;
5728 if (do_syms
5729 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5731 int hn;
5732 int si;
5734 printf (_("\nSymbol table for image:\n"));
5735 if (is_32bit_elf)
5736 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5737 else
5738 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5740 for (hn = 0; hn < nbuckets; hn++)
5742 if (! buckets[hn])
5743 continue;
5745 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
5747 Elf_Internal_Sym *psym;
5749 psym = dynamic_symbols + si;
5751 printf (" %3d %3d: ", si, hn);
5752 print_vma (psym->st_value, LONG_HEX);
5753 putchar (' ' );
5754 print_vma (psym->st_size, DEC_5);
5756 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5757 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5758 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5759 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5760 print_symbol (25, dynamic_strings + psym->st_name);
5761 putchar ('\n');
5765 else if (do_syms && !do_using_dynamic)
5767 unsigned int i;
5769 for (i = 0, section = section_headers;
5770 i < elf_header.e_shnum;
5771 i++, section++)
5773 unsigned int si;
5774 char *strtab;
5775 Elf_Internal_Sym *symtab;
5776 Elf_Internal_Sym *psym;
5779 if ( section->sh_type != SHT_SYMTAB
5780 && section->sh_type != SHT_DYNSYM)
5781 continue;
5783 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5784 SECTION_NAME (section),
5785 (unsigned long) (section->sh_size / section->sh_entsize));
5786 if (is_32bit_elf)
5787 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5788 else
5789 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5791 symtab = GET_ELF_SYMBOLS (file, section);
5792 if (symtab == NULL)
5793 continue;
5795 if (section->sh_link == elf_header.e_shstrndx)
5796 strtab = string_table;
5797 else
5799 Elf_Internal_Shdr *string_sec;
5801 string_sec = SECTION_HEADER (section->sh_link);
5803 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5804 string_sec->sh_size,
5805 _("string table"));
5808 for (si = 0, psym = symtab;
5809 si < section->sh_size / section->sh_entsize;
5810 si++, psym++)
5812 printf ("%6d: ", si);
5813 print_vma (psym->st_value, LONG_HEX);
5814 putchar (' ');
5815 print_vma (psym->st_size, DEC_5);
5816 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5817 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5818 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5819 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5820 print_symbol (25, strtab + psym->st_name);
5822 if (section->sh_type == SHT_DYNSYM &&
5823 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5825 unsigned char data[2];
5826 unsigned short vers_data;
5827 unsigned long offset;
5828 int is_nobits;
5829 int check_def;
5831 offset = version_info[DT_VERSIONTAGIDX (DT_VERSYM)]
5832 - loadaddr;
5834 get_data (&data, file, offset + si * sizeof (vers_data),
5835 sizeof (data), _("version data"));
5837 vers_data = byte_get (data, 2);
5839 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5840 == SHT_NOBITS);
5842 check_def = (psym->st_shndx != SHN_UNDEF);
5844 if ((vers_data & 0x8000) || vers_data > 1)
5846 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5847 && (is_nobits || ! check_def))
5849 Elf_External_Verneed evn;
5850 Elf_Internal_Verneed ivn;
5851 Elf_Internal_Vernaux ivna;
5853 /* We must test both. */
5854 offset = (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5855 - loadaddr);
5859 unsigned long vna_off;
5861 get_data (&evn, file, offset, sizeof (evn),
5862 _("version need"));
5864 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5865 ivn.vn_next = BYTE_GET (evn.vn_next);
5867 vna_off = offset + ivn.vn_aux;
5871 Elf_External_Vernaux evna;
5873 get_data (&evna, file, vna_off,
5874 sizeof (evna),
5875 _("version need aux (3)"));
5877 ivna.vna_other = BYTE_GET (evna.vna_other);
5878 ivna.vna_next = BYTE_GET (evna.vna_next);
5879 ivna.vna_name = BYTE_GET (evna.vna_name);
5881 vna_off += ivna.vna_next;
5883 while (ivna.vna_other != vers_data
5884 && ivna.vna_next != 0);
5886 if (ivna.vna_other == vers_data)
5887 break;
5889 offset += ivn.vn_next;
5891 while (ivn.vn_next != 0);
5893 if (ivna.vna_other == vers_data)
5895 printf ("@%s (%d)",
5896 strtab + ivna.vna_name, ivna.vna_other);
5897 check_def = 0;
5899 else if (! is_nobits)
5900 error (_("bad dynamic symbol"));
5901 else
5902 check_def = 1;
5905 if (check_def)
5907 if (vers_data != 0x8001
5908 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5910 Elf_Internal_Verdef ivd;
5911 Elf_Internal_Verdaux ivda;
5912 Elf_External_Verdaux evda;
5913 unsigned long offset;
5915 offset
5916 = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5917 - loadaddr);
5921 Elf_External_Verdef evd;
5923 get_data (&evd, file, offset, sizeof (evd),
5924 _("version def"));
5926 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5927 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5928 ivd.vd_next = BYTE_GET (evd.vd_next);
5930 offset += ivd.vd_next;
5932 while (ivd.vd_ndx != (vers_data & 0x7fff)
5933 && ivd.vd_next != 0);
5935 offset -= ivd.vd_next;
5936 offset += ivd.vd_aux;
5938 get_data (&evda, file, offset, sizeof (evda),
5939 _("version def aux"));
5941 ivda.vda_name = BYTE_GET (evda.vda_name);
5943 if (psym->st_name != ivda.vda_name)
5944 printf ((vers_data & 0x8000)
5945 ? "@%s" : "@@%s",
5946 strtab + ivda.vda_name);
5952 putchar ('\n');
5955 free (symtab);
5956 if (strtab != string_table)
5957 free (strtab);
5960 else if (do_syms)
5961 printf
5962 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5964 if (do_histogram && buckets != NULL)
5966 int *lengths;
5967 int *counts;
5968 int hn;
5969 int si;
5970 int maxlength = 0;
5971 int nzero_counts = 0;
5972 int nsyms = 0;
5974 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5975 nbuckets);
5976 printf (_(" Length Number %% of total Coverage\n"));
5978 lengths = (int *) calloc (nbuckets, sizeof (int));
5979 if (lengths == NULL)
5981 error (_("Out of memory"));
5982 return 0;
5984 for (hn = 0; hn < nbuckets; ++hn)
5986 if (! buckets[hn])
5987 continue;
5989 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5991 ++nsyms;
5992 if (maxlength < ++lengths[hn])
5993 ++maxlength;
5997 counts = (int *) calloc (maxlength + 1, sizeof (int));
5998 if (counts == NULL)
6000 error (_("Out of memory"));
6001 return 0;
6004 for (hn = 0; hn < nbuckets; ++hn)
6005 ++counts[lengths[hn]];
6007 if (nbuckets > 0)
6009 printf (" 0 %-10d (%5.1f%%)\n",
6010 counts[0], (counts[0] * 100.0) / nbuckets);
6011 for (si = 1; si <= maxlength; ++si)
6013 nzero_counts += counts[si] * si;
6014 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6015 si, counts[si], (counts[si] * 100.0) / nbuckets,
6016 (nzero_counts * 100.0) / nsyms);
6020 free (counts);
6021 free (lengths);
6024 if (buckets != NULL)
6026 free (buckets);
6027 free (chains);
6030 return 1;
6033 static int
6034 process_syminfo (file)
6035 FILE *file ATTRIBUTE_UNUSED;
6037 unsigned int i;
6039 if (dynamic_syminfo == NULL
6040 || !do_dynamic)
6041 /* No syminfo, this is ok. */
6042 return 1;
6044 /* There better should be a dynamic symbol section. */
6045 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6046 return 0;
6048 if (dynamic_addr)
6049 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6050 dynamic_syminfo_offset, dynamic_syminfo_nent);
6052 printf (_(" Num: Name BoundTo Flags\n"));
6053 for (i = 0; i < dynamic_syminfo_nent; ++i)
6055 unsigned short int flags = dynamic_syminfo[i].si_flags;
6057 printf ("%4d: ", i);
6058 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
6059 putchar (' ');
6061 switch (dynamic_syminfo[i].si_boundto)
6063 case SYMINFO_BT_SELF:
6064 fputs ("SELF ", stdout);
6065 break;
6066 case SYMINFO_BT_PARENT:
6067 fputs ("PARENT ", stdout);
6068 break;
6069 default:
6070 if (dynamic_syminfo[i].si_boundto > 0
6071 && dynamic_syminfo[i].si_boundto < dynamic_size)
6073 print_symbol (10,
6074 dynamic_strings
6075 + (dynamic_segment
6076 [dynamic_syminfo[i].si_boundto].d_un.d_val));
6077 putchar (' ' );
6079 else
6080 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6081 break;
6084 if (flags & SYMINFO_FLG_DIRECT)
6085 printf (" DIRECT");
6086 if (flags & SYMINFO_FLG_PASSTHRU)
6087 printf (" PASSTHRU");
6088 if (flags & SYMINFO_FLG_COPY)
6089 printf (" COPY");
6090 if (flags & SYMINFO_FLG_LAZYLOAD)
6091 printf (" LAZYLOAD");
6093 puts ("");
6096 return 1;
6099 #ifdef SUPPORT_DISASSEMBLY
6100 static void
6101 disassemble_section (section, file)
6102 Elf_Internal_Shdr *section;
6103 FILE *file;
6105 printf (_("\nAssembly dump of section %s\n"),
6106 SECTION_NAME (section));
6108 /* XXX -- to be done --- XXX */
6110 return 1;
6112 #endif
6114 static int
6115 dump_section (section, file)
6116 Elf_Internal_Shdr *section;
6117 FILE *file;
6119 bfd_size_type bytes;
6120 bfd_vma addr;
6121 unsigned char *data;
6122 unsigned char *start;
6124 bytes = section->sh_size;
6126 if (bytes == 0)
6128 printf (_("\nSection '%s' has no data to dump.\n"),
6129 SECTION_NAME (section));
6130 return 0;
6132 else
6133 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6135 addr = section->sh_addr;
6137 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
6138 _("section data"));
6139 if (!start)
6140 return 0;
6142 data = start;
6144 while (bytes)
6146 int j;
6147 int k;
6148 int lbytes;
6150 lbytes = (bytes > 16 ? 16 : bytes);
6152 printf (" 0x%8.8lx ", (unsigned long) addr);
6154 switch (elf_header.e_ident[EI_DATA])
6156 default:
6157 case ELFDATA2LSB:
6158 for (j = 15; j >= 0; j --)
6160 if (j < lbytes)
6161 printf ("%2.2x", data[j]);
6162 else
6163 printf (" ");
6165 if (!(j & 0x3))
6166 printf (" ");
6168 break;
6170 case ELFDATA2MSB:
6171 for (j = 0; j < 16; j++)
6173 if (j < lbytes)
6174 printf ("%2.2x", data[j]);
6175 else
6176 printf (" ");
6178 if ((j & 3) == 3)
6179 printf (" ");
6181 break;
6184 for (j = 0; j < lbytes; j++)
6186 k = data[j];
6187 if (k >= ' ' && k < 0x80)
6188 printf ("%c", k);
6189 else
6190 printf (".");
6193 putchar ('\n');
6195 data += lbytes;
6196 addr += lbytes;
6197 bytes -= lbytes;
6200 free (start);
6202 return 1;
6206 static unsigned long int
6207 read_leb128 (data, length_return, sign)
6208 unsigned char *data;
6209 int *length_return;
6210 int sign;
6212 unsigned long int result = 0;
6213 unsigned int num_read = 0;
6214 int shift = 0;
6215 unsigned char byte;
6219 byte = *data++;
6220 num_read++;
6222 result |= (byte & 0x7f) << shift;
6224 shift += 7;
6227 while (byte & 0x80);
6229 if (length_return != NULL)
6230 *length_return = num_read;
6232 if (sign && (shift < 32) && (byte & 0x40))
6233 result |= -1 << shift;
6235 return result;
6238 typedef struct State_Machine_Registers
6240 unsigned long address;
6241 unsigned int file;
6242 unsigned int line;
6243 unsigned int column;
6244 int is_stmt;
6245 int basic_block;
6246 int end_sequence;
6247 /* This variable hold the number of the last entry seen
6248 in the File Table. */
6249 unsigned int last_file_entry;
6250 } SMR;
6252 static SMR state_machine_regs;
6254 static void
6255 reset_state_machine (is_stmt)
6256 int is_stmt;
6258 state_machine_regs.address = 0;
6259 state_machine_regs.file = 1;
6260 state_machine_regs.line = 1;
6261 state_machine_regs.column = 0;
6262 state_machine_regs.is_stmt = is_stmt;
6263 state_machine_regs.basic_block = 0;
6264 state_machine_regs.end_sequence = 0;
6265 state_machine_regs.last_file_entry = 0;
6268 /* Handled an extend line op. Returns true if this is the end
6269 of sequence. */
6270 static int
6271 process_extended_line_op (data, is_stmt, pointer_size)
6272 unsigned char *data;
6273 int is_stmt;
6274 int pointer_size;
6276 unsigned char op_code;
6277 int bytes_read;
6278 unsigned int len;
6279 unsigned char *name;
6280 unsigned long adr;
6282 len = read_leb128 (data, & bytes_read, 0);
6283 data += bytes_read;
6285 if (len == 0)
6287 warn (_("badly formed extended line op encountered!\n"));
6288 return bytes_read;
6291 len += bytes_read;
6292 op_code = *data++;
6294 printf (_(" Extended opcode %d: "), op_code);
6296 switch (op_code)
6298 case DW_LNE_end_sequence:
6299 printf (_("End of Sequence\n\n"));
6300 reset_state_machine (is_stmt);
6301 break;
6303 case DW_LNE_set_address:
6304 adr = byte_get (data, pointer_size);
6305 printf (_("set Address to 0x%lx\n"), adr);
6306 state_machine_regs.address = adr;
6307 break;
6309 case DW_LNE_define_file:
6310 printf (_(" define new File Table entry\n"));
6311 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6313 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6314 name = data;
6315 data += strlen ((char *) data) + 1;
6316 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6317 data += bytes_read;
6318 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6319 data += bytes_read;
6320 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6321 printf (_("%s\n\n"), name);
6322 break;
6324 default:
6325 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6326 break;
6329 return len;
6332 /* Size of pointers in the .debug_line section. This information is not
6333 really present in that section. It's obtained before dumping the debug
6334 sections by doing some pre-scan of the .debug_info section. */
6335 static int debug_line_pointer_size = 4;
6337 static int
6338 display_debug_lines (section, start, file)
6339 Elf_Internal_Shdr *section;
6340 unsigned char * start;
6341 FILE *file ATTRIBUTE_UNUSED;
6343 DWARF2_External_LineInfo *external;
6344 DWARF2_Internal_LineInfo info;
6345 unsigned char *standard_opcodes;
6346 unsigned char *data = start;
6347 unsigned char *end = start + section->sh_size;
6348 unsigned char *end_of_sequence;
6349 int i;
6351 printf (_("\nDump of debug contents of section %s:\n\n"),
6352 SECTION_NAME (section));
6354 while (data < end)
6356 external = (DWARF2_External_LineInfo *) data;
6358 /* Check the length of the block. */
6359 info.li_length = BYTE_GET (external->li_length);
6361 if (info.li_length == 0xffffffff)
6363 warn (_("64-bit DWARF line info is not supported yet.\n"));
6364 break;
6367 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6369 warn
6370 (_("The line info appears to be corrupt - the section is too small\n"));
6371 return 0;
6374 /* Check its version number. */
6375 info.li_version = BYTE_GET (external->li_version);
6376 if (info.li_version != 2)
6378 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6379 return 0;
6382 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6383 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6384 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6385 info.li_line_base = BYTE_GET (external->li_line_base);
6386 info.li_line_range = BYTE_GET (external->li_line_range);
6387 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6389 /* Sign extend the line base field. */
6390 info.li_line_base <<= 24;
6391 info.li_line_base >>= 24;
6393 printf (_(" Length: %ld\n"), info.li_length);
6394 printf (_(" DWARF Version: %d\n"), info.li_version);
6395 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6396 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6397 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6398 printf (_(" Line Base: %d\n"), info.li_line_base);
6399 printf (_(" Line Range: %d\n"), info.li_line_range);
6400 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6402 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6404 reset_state_machine (info.li_default_is_stmt);
6406 /* Display the contents of the Opcodes table. */
6407 standard_opcodes = data + sizeof (*external);
6409 printf (_("\n Opcodes:\n"));
6411 for (i = 1; i < info.li_opcode_base; i++)
6412 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6414 /* Display the contents of the Directory table. */
6415 data = standard_opcodes + info.li_opcode_base - 1;
6417 if (*data == 0)
6418 printf (_("\n The Directory Table is empty.\n"));
6419 else
6421 printf (_("\n The Directory Table:\n"));
6423 while (*data != 0)
6425 printf (_(" %s\n"), data);
6427 data += strlen ((char *) data) + 1;
6431 /* Skip the NUL at the end of the table. */
6432 data++;
6434 /* Display the contents of the File Name table. */
6435 if (*data == 0)
6436 printf (_("\n The File Name Table is empty.\n"));
6437 else
6439 printf (_("\n The File Name Table:\n"));
6440 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6442 while (*data != 0)
6444 unsigned char *name;
6445 int bytes_read;
6447 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6448 name = data;
6450 data += strlen ((char *) data) + 1;
6452 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6453 data += bytes_read;
6454 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6455 data += bytes_read;
6456 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6457 data += bytes_read;
6458 printf (_("%s\n"), name);
6462 /* Skip the NUL at the end of the table. */
6463 data++;
6465 /* Now display the statements. */
6466 printf (_("\n Line Number Statements:\n"));
6469 while (data < end_of_sequence)
6471 unsigned char op_code;
6472 int adv;
6473 int bytes_read;
6475 op_code = *data++;
6477 if (op_code >= info.li_opcode_base)
6479 op_code -= info.li_opcode_base;
6480 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6481 state_machine_regs.address += adv;
6482 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6483 op_code, adv, state_machine_regs.address);
6484 adv = (op_code % info.li_line_range) + info.li_line_base;
6485 state_machine_regs.line += adv;
6486 printf (_(" and Line by %d to %d\n"),
6487 adv, state_machine_regs.line);
6489 else switch (op_code)
6491 case DW_LNS_extended_op:
6492 data += process_extended_line_op (data, info.li_default_is_stmt,
6493 debug_line_pointer_size);
6494 break;
6496 case DW_LNS_copy:
6497 printf (_(" Copy\n"));
6498 break;
6500 case DW_LNS_advance_pc:
6501 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6502 data += bytes_read;
6503 state_machine_regs.address += adv;
6504 printf (_(" Advance PC by %d to %lx\n"), adv,
6505 state_machine_regs.address);
6506 break;
6508 case DW_LNS_advance_line:
6509 adv = read_leb128 (data, & bytes_read, 1);
6510 data += bytes_read;
6511 state_machine_regs.line += adv;
6512 printf (_(" Advance Line by %d to %d\n"), adv,
6513 state_machine_regs.line);
6514 break;
6516 case DW_LNS_set_file:
6517 adv = read_leb128 (data, & bytes_read, 0);
6518 data += bytes_read;
6519 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6520 adv);
6521 state_machine_regs.file = adv;
6522 break;
6524 case DW_LNS_set_column:
6525 adv = read_leb128 (data, & bytes_read, 0);
6526 data += bytes_read;
6527 printf (_(" Set column to %d\n"), adv);
6528 state_machine_regs.column = adv;
6529 break;
6531 case DW_LNS_negate_stmt:
6532 adv = state_machine_regs.is_stmt;
6533 adv = ! adv;
6534 printf (_(" Set is_stmt to %d\n"), adv);
6535 state_machine_regs.is_stmt = adv;
6536 break;
6538 case DW_LNS_set_basic_block:
6539 printf (_(" Set basic block\n"));
6540 state_machine_regs.basic_block = 1;
6541 break;
6543 case DW_LNS_const_add_pc:
6544 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6545 * info.li_min_insn_length);
6546 state_machine_regs.address += adv;
6547 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6548 state_machine_regs.address);
6549 break;
6551 case DW_LNS_fixed_advance_pc:
6552 adv = byte_get (data, 2);
6553 data += 2;
6554 state_machine_regs.address += adv;
6555 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6556 adv, state_machine_regs.address);
6557 break;
6559 case DW_LNS_set_prologue_end:
6560 printf (_(" Set prologue_end to true\n"));
6561 break;
6563 case DW_LNS_set_epilogue_begin:
6564 printf (_(" Set epilogue_begin to true\n"));
6565 break;
6567 case DW_LNS_set_isa:
6568 adv = read_leb128 (data, & bytes_read, 0);
6569 data += bytes_read;
6570 printf (_(" Set ISA to %d\n"), adv);
6571 break;
6573 default:
6574 printf (_(" Unknown opcode %d with operands: "), op_code);
6576 int i;
6577 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6579 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6580 i == 1 ? "" : ", ");
6581 data += bytes_read;
6583 putchar ('\n');
6585 break;
6588 putchar ('\n');
6591 return 1;
6594 static int
6595 display_debug_pubnames (section, start, file)
6596 Elf_Internal_Shdr *section;
6597 unsigned char *start;
6598 FILE *file ATTRIBUTE_UNUSED;
6600 DWARF2_External_PubNames *external;
6601 DWARF2_Internal_PubNames pubnames;
6602 unsigned char *end;
6604 end = start + section->sh_size;
6606 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6608 while (start < end)
6610 unsigned char *data;
6611 unsigned long offset;
6613 external = (DWARF2_External_PubNames *) start;
6615 pubnames.pn_length = BYTE_GET (external->pn_length);
6616 pubnames.pn_version = BYTE_GET (external->pn_version);
6617 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6618 pubnames.pn_size = BYTE_GET (external->pn_size);
6620 data = start + sizeof (*external);
6621 start += pubnames.pn_length + sizeof (external->pn_length);
6623 if (pubnames.pn_length == 0xffffffff)
6625 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6626 break;
6629 if (pubnames.pn_version != 2)
6631 static int warned = 0;
6633 if (! warned)
6635 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6636 warned = 1;
6639 continue;
6642 printf (_(" Length: %ld\n"),
6643 pubnames.pn_length);
6644 printf (_(" Version: %d\n"),
6645 pubnames.pn_version);
6646 printf (_(" Offset into .debug_info section: %ld\n"),
6647 pubnames.pn_offset);
6648 printf (_(" Size of area in .debug_info section: %ld\n"),
6649 pubnames.pn_size);
6651 printf (_("\n Offset\tName\n"));
6655 offset = byte_get (data, 4);
6657 if (offset != 0)
6659 data += 4;
6660 printf (" %ld\t\t%s\n", offset, data);
6661 data += strlen ((char *) data) + 1;
6664 while (offset != 0);
6667 printf ("\n");
6668 return 1;
6671 static char *
6672 get_TAG_name (tag)
6673 unsigned long tag;
6675 switch (tag)
6677 case DW_TAG_padding: return "DW_TAG_padding";
6678 case DW_TAG_array_type: return "DW_TAG_array_type";
6679 case DW_TAG_class_type: return "DW_TAG_class_type";
6680 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6681 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6682 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6683 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6684 case DW_TAG_label: return "DW_TAG_label";
6685 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6686 case DW_TAG_member: return "DW_TAG_member";
6687 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6688 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6689 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6690 case DW_TAG_string_type: return "DW_TAG_string_type";
6691 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6692 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6693 case DW_TAG_typedef: return "DW_TAG_typedef";
6694 case DW_TAG_union_type: return "DW_TAG_union_type";
6695 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6696 case DW_TAG_variant: return "DW_TAG_variant";
6697 case DW_TAG_common_block: return "DW_TAG_common_block";
6698 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6699 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6700 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6701 case DW_TAG_module: return "DW_TAG_module";
6702 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6703 case DW_TAG_set_type: return "DW_TAG_set_type";
6704 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6705 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6706 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6707 case DW_TAG_base_type: return "DW_TAG_base_type";
6708 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6709 case DW_TAG_const_type: return "DW_TAG_const_type";
6710 case DW_TAG_constant: return "DW_TAG_constant";
6711 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6712 case DW_TAG_file_type: return "DW_TAG_file_type";
6713 case DW_TAG_friend: return "DW_TAG_friend";
6714 case DW_TAG_namelist: return "DW_TAG_namelist";
6715 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6716 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6717 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6718 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6719 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6720 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6721 case DW_TAG_try_block: return "DW_TAG_try_block";
6722 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6723 case DW_TAG_variable: return "DW_TAG_variable";
6724 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6725 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6726 case DW_TAG_format_label: return "DW_TAG_format_label";
6727 case DW_TAG_function_template: return "DW_TAG_function_template";
6728 case DW_TAG_class_template: return "DW_TAG_class_template";
6729 /* DWARF 2.1 values. */
6730 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6731 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6732 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6733 case DW_TAG_namespace: return "DW_TAG_namespace";
6734 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6735 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6736 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6737 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6738 default:
6740 static char buffer[100];
6742 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6743 return buffer;
6748 static char *
6749 get_AT_name (attribute)
6750 unsigned long attribute;
6752 switch (attribute)
6754 case DW_AT_sibling: return "DW_AT_sibling";
6755 case DW_AT_location: return "DW_AT_location";
6756 case DW_AT_name: return "DW_AT_name";
6757 case DW_AT_ordering: return "DW_AT_ordering";
6758 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6759 case DW_AT_byte_size: return "DW_AT_byte_size";
6760 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6761 case DW_AT_bit_size: return "DW_AT_bit_size";
6762 case DW_AT_element_list: return "DW_AT_element_list";
6763 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6764 case DW_AT_low_pc: return "DW_AT_low_pc";
6765 case DW_AT_high_pc: return "DW_AT_high_pc";
6766 case DW_AT_language: return "DW_AT_language";
6767 case DW_AT_member: return "DW_AT_member";
6768 case DW_AT_discr: return "DW_AT_discr";
6769 case DW_AT_discr_value: return "DW_AT_discr_value";
6770 case DW_AT_visibility: return "DW_AT_visibility";
6771 case DW_AT_import: return "DW_AT_import";
6772 case DW_AT_string_length: return "DW_AT_string_length";
6773 case DW_AT_common_reference: return "DW_AT_common_reference";
6774 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6775 case DW_AT_const_value: return "DW_AT_const_value";
6776 case DW_AT_containing_type: return "DW_AT_containing_type";
6777 case DW_AT_default_value: return "DW_AT_default_value";
6778 case DW_AT_inline: return "DW_AT_inline";
6779 case DW_AT_is_optional: return "DW_AT_is_optional";
6780 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6781 case DW_AT_producer: return "DW_AT_producer";
6782 case DW_AT_prototyped: return "DW_AT_prototyped";
6783 case DW_AT_return_addr: return "DW_AT_return_addr";
6784 case DW_AT_start_scope: return "DW_AT_start_scope";
6785 case DW_AT_stride_size: return "DW_AT_stride_size";
6786 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6787 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6788 case DW_AT_accessibility: return "DW_AT_accessibility";
6789 case DW_AT_address_class: return "DW_AT_address_class";
6790 case DW_AT_artificial: return "DW_AT_artificial";
6791 case DW_AT_base_types: return "DW_AT_base_types";
6792 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6793 case DW_AT_count: return "DW_AT_count";
6794 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6795 case DW_AT_decl_column: return "DW_AT_decl_column";
6796 case DW_AT_decl_file: return "DW_AT_decl_file";
6797 case DW_AT_decl_line: return "DW_AT_decl_line";
6798 case DW_AT_declaration: return "DW_AT_declaration";
6799 case DW_AT_discr_list: return "DW_AT_discr_list";
6800 case DW_AT_encoding: return "DW_AT_encoding";
6801 case DW_AT_external: return "DW_AT_external";
6802 case DW_AT_frame_base: return "DW_AT_frame_base";
6803 case DW_AT_friend: return "DW_AT_friend";
6804 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6805 case DW_AT_macro_info: return "DW_AT_macro_info";
6806 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6807 case DW_AT_priority: return "DW_AT_priority";
6808 case DW_AT_segment: return "DW_AT_segment";
6809 case DW_AT_specification: return "DW_AT_specification";
6810 case DW_AT_static_link: return "DW_AT_static_link";
6811 case DW_AT_type: return "DW_AT_type";
6812 case DW_AT_use_location: return "DW_AT_use_location";
6813 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6814 case DW_AT_virtuality: return "DW_AT_virtuality";
6815 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6816 /* DWARF 2.1 values. */
6817 case DW_AT_allocated: return "DW_AT_allocated";
6818 case DW_AT_associated: return "DW_AT_associated";
6819 case DW_AT_data_location: return "DW_AT_data_location";
6820 case DW_AT_stride: return "DW_AT_stride";
6821 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6822 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6823 case DW_AT_extension: return "DW_AT_extension";
6824 case DW_AT_ranges: return "DW_AT_ranges";
6825 case DW_AT_trampoline: return "DW_AT_trampoline";
6826 case DW_AT_call_column: return "DW_AT_call_column";
6827 case DW_AT_call_file: return "DW_AT_call_file";
6828 case DW_AT_call_line: return "DW_AT_call_line";
6829 /* SGI/MIPS extensions. */
6830 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6831 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6832 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6833 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6834 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6835 case DW_AT_MIPS_software_pipeline_depth:
6836 return "DW_AT_MIPS_software_pipeline_depth";
6837 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6838 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6839 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6840 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6841 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6842 /* GNU extensions. */
6843 case DW_AT_sf_names: return "DW_AT_sf_names";
6844 case DW_AT_src_info: return "DW_AT_src_info";
6845 case DW_AT_mac_info: return "DW_AT_mac_info";
6846 case DW_AT_src_coords: return "DW_AT_src_coords";
6847 case DW_AT_body_begin: return "DW_AT_body_begin";
6848 case DW_AT_body_end: return "DW_AT_body_end";
6849 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
6850 default:
6852 static char buffer[100];
6854 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6855 return buffer;
6860 static char *
6861 get_FORM_name (form)
6862 unsigned long form;
6864 switch (form)
6866 case DW_FORM_addr: return "DW_FORM_addr";
6867 case DW_FORM_block2: return "DW_FORM_block2";
6868 case DW_FORM_block4: return "DW_FORM_block4";
6869 case DW_FORM_data2: return "DW_FORM_data2";
6870 case DW_FORM_data4: return "DW_FORM_data4";
6871 case DW_FORM_data8: return "DW_FORM_data8";
6872 case DW_FORM_string: return "DW_FORM_string";
6873 case DW_FORM_block: return "DW_FORM_block";
6874 case DW_FORM_block1: return "DW_FORM_block1";
6875 case DW_FORM_data1: return "DW_FORM_data1";
6876 case DW_FORM_flag: return "DW_FORM_flag";
6877 case DW_FORM_sdata: return "DW_FORM_sdata";
6878 case DW_FORM_strp: return "DW_FORM_strp";
6879 case DW_FORM_udata: return "DW_FORM_udata";
6880 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6881 case DW_FORM_ref1: return "DW_FORM_ref1";
6882 case DW_FORM_ref2: return "DW_FORM_ref2";
6883 case DW_FORM_ref4: return "DW_FORM_ref4";
6884 case DW_FORM_ref8: return "DW_FORM_ref8";
6885 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6886 case DW_FORM_indirect: return "DW_FORM_indirect";
6887 default:
6889 static char buffer[100];
6891 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6892 return buffer;
6897 /* FIXME: There are better and more effiecint ways to handle
6898 these structures. For now though, I just want something that
6899 is simple to implement. */
6900 typedef struct abbrev_attr
6902 unsigned long attribute;
6903 unsigned long form;
6904 struct abbrev_attr *next;
6906 abbrev_attr;
6908 typedef struct abbrev_entry
6910 unsigned long entry;
6911 unsigned long tag;
6912 int children;
6913 struct abbrev_attr *first_attr;
6914 struct abbrev_attr *last_attr;
6915 struct abbrev_entry *next;
6917 abbrev_entry;
6919 static abbrev_entry *first_abbrev = NULL;
6920 static abbrev_entry *last_abbrev = NULL;
6922 static void
6923 free_abbrevs ()
6925 abbrev_entry *abbrev;
6927 for (abbrev = first_abbrev; abbrev;)
6929 abbrev_entry *next = abbrev->next;
6930 abbrev_attr *attr;
6932 for (attr = abbrev->first_attr; attr;)
6934 abbrev_attr *next = attr->next;
6936 free (attr);
6937 attr = next;
6940 free (abbrev);
6941 abbrev = next;
6944 last_abbrev = first_abbrev = NULL;
6947 static void
6948 add_abbrev (number, tag, children)
6949 unsigned long number;
6950 unsigned long tag;
6951 int children;
6953 abbrev_entry *entry;
6955 entry = (abbrev_entry *) malloc (sizeof (*entry));
6957 if (entry == NULL)
6958 /* ugg */
6959 return;
6961 entry->entry = number;
6962 entry->tag = tag;
6963 entry->children = children;
6964 entry->first_attr = NULL;
6965 entry->last_attr = NULL;
6966 entry->next = NULL;
6968 if (first_abbrev == NULL)
6969 first_abbrev = entry;
6970 else
6971 last_abbrev->next = entry;
6973 last_abbrev = entry;
6976 static void
6977 add_abbrev_attr (attribute, form)
6978 unsigned long attribute;
6979 unsigned long form;
6981 abbrev_attr *attr;
6983 attr = (abbrev_attr *) malloc (sizeof (*attr));
6985 if (attr == NULL)
6986 /* ugg */
6987 return;
6989 attr->attribute = attribute;
6990 attr->form = form;
6991 attr->next = NULL;
6993 if (last_abbrev->first_attr == NULL)
6994 last_abbrev->first_attr = attr;
6995 else
6996 last_abbrev->last_attr->next = attr;
6998 last_abbrev->last_attr = attr;
7001 /* Processes the (partial) contents of a .debug_abbrev section.
7002 Returns NULL if the end of the section was encountered.
7003 Returns the address after the last byte read if the end of
7004 an abbreviation set was found. */
7006 static unsigned char *
7007 process_abbrev_section (start, end)
7008 unsigned char *start;
7009 unsigned char *end;
7011 if (first_abbrev != NULL)
7012 return NULL;
7014 while (start < end)
7016 int bytes_read;
7017 unsigned long entry;
7018 unsigned long tag;
7019 unsigned long attribute;
7020 int children;
7022 entry = read_leb128 (start, & bytes_read, 0);
7023 start += bytes_read;
7025 /* A single zero is supposed to end the section according
7026 to the standard. If there's more, then signal that to
7027 the caller. */
7028 if (entry == 0)
7029 return start == end ? NULL : start;
7031 tag = read_leb128 (start, & bytes_read, 0);
7032 start += bytes_read;
7034 children = *start++;
7036 add_abbrev (entry, tag, children);
7040 unsigned long form;
7042 attribute = read_leb128 (start, & bytes_read, 0);
7043 start += bytes_read;
7045 form = read_leb128 (start, & bytes_read, 0);
7046 start += bytes_read;
7048 if (attribute != 0)
7049 add_abbrev_attr (attribute, form);
7051 while (attribute != 0);
7054 return NULL;
7058 static int
7059 display_debug_macinfo (section, start, file)
7060 Elf_Internal_Shdr *section;
7061 unsigned char *start;
7062 FILE *file ATTRIBUTE_UNUSED;
7064 unsigned char *end = start + section->sh_size;
7065 unsigned char *curr = start;
7066 unsigned int bytes_read;
7067 enum dwarf_macinfo_record_type op;
7069 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7071 while (curr < end)
7073 unsigned int lineno;
7074 const char *string;
7076 op = *curr;
7077 curr++;
7079 switch (op)
7081 case DW_MACINFO_start_file:
7083 unsigned int filenum;
7085 lineno = read_leb128 (curr, & bytes_read, 0);
7086 curr += bytes_read;
7087 filenum = read_leb128 (curr, & bytes_read, 0);
7088 curr += bytes_read;
7090 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
7092 break;
7094 case DW_MACINFO_end_file:
7095 printf (_(" DW_MACINFO_end_file\n"));
7096 break;
7098 case DW_MACINFO_define:
7099 lineno = read_leb128 (curr, & bytes_read, 0);
7100 curr += bytes_read;
7101 string = curr;
7102 curr += strlen (string) + 1;
7103 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
7104 break;
7106 case DW_MACINFO_undef:
7107 lineno = read_leb128 (curr, & bytes_read, 0);
7108 curr += bytes_read;
7109 string = curr;
7110 curr += strlen (string) + 1;
7111 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
7112 break;
7114 case DW_MACINFO_vendor_ext:
7116 unsigned int constant;
7118 constant = read_leb128 (curr, & bytes_read, 0);
7119 curr += bytes_read;
7120 string = curr;
7121 curr += strlen (string) + 1;
7122 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
7124 break;
7128 return 1;
7132 static int
7133 display_debug_abbrev (section, start, file)
7134 Elf_Internal_Shdr *section;
7135 unsigned char *start;
7136 FILE *file ATTRIBUTE_UNUSED;
7138 abbrev_entry *entry;
7139 unsigned char *end = start + section->sh_size;
7141 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7145 start = process_abbrev_section (start, end);
7147 if (first_abbrev == NULL)
7148 continue;
7150 printf (_(" Number TAG\n"));
7152 for (entry = first_abbrev; entry; entry = entry->next)
7154 abbrev_attr *attr;
7156 printf (_(" %ld %s [%s]\n"),
7157 entry->entry,
7158 get_TAG_name (entry->tag),
7159 entry->children ? _("has children") : _("no children"));
7161 for (attr = entry->first_attr; attr; attr = attr->next)
7163 printf (_(" %-18s %s\n"),
7164 get_AT_name (attr->attribute),
7165 get_FORM_name (attr->form));
7169 free_abbrevs ();
7171 while (start);
7173 printf ("\n");
7175 return 1;
7179 static unsigned char *
7180 display_block (data, length)
7181 unsigned char *data;
7182 unsigned long length;
7184 printf (_(" %lu byte block: "), length);
7186 while (length --)
7187 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7189 return data;
7192 static void
7193 decode_location_expression (data, pointer_size, length)
7194 unsigned char * data;
7195 unsigned int pointer_size;
7196 unsigned long length;
7198 unsigned op;
7199 int bytes_read;
7200 unsigned long uvalue;
7201 unsigned char *end = data + length;
7203 while (data < end)
7205 op = *data++;
7207 switch (op)
7209 case DW_OP_addr:
7210 printf ("DW_OP_addr: %lx",
7211 (unsigned long) byte_get (data, pointer_size));
7212 data += pointer_size;
7213 break;
7214 case DW_OP_deref:
7215 printf ("DW_OP_deref");
7216 break;
7217 case DW_OP_const1u:
7218 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7219 break;
7220 case DW_OP_const1s:
7221 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
7222 break;
7223 case DW_OP_const2u:
7224 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7225 data += 2;
7226 break;
7227 case DW_OP_const2s:
7228 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
7229 data += 2;
7230 break;
7231 case DW_OP_const4u:
7232 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7233 data += 4;
7234 break;
7235 case DW_OP_const4s:
7236 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
7237 data += 4;
7238 break;
7239 case DW_OP_const8u:
7240 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7241 (unsigned long) byte_get (data + 4, 4));
7242 data += 8;
7243 break;
7244 case DW_OP_const8s:
7245 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7246 (long) byte_get (data + 4, 4));
7247 data += 8;
7248 break;
7249 case DW_OP_constu:
7250 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7251 data += bytes_read;
7252 break;
7253 case DW_OP_consts:
7254 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7255 data += bytes_read;
7256 break;
7257 case DW_OP_dup:
7258 printf ("DW_OP_dup");
7259 break;
7260 case DW_OP_drop:
7261 printf ("DW_OP_drop");
7262 break;
7263 case DW_OP_over:
7264 printf ("DW_OP_over");
7265 break;
7266 case DW_OP_pick:
7267 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7268 break;
7269 case DW_OP_swap:
7270 printf ("DW_OP_swap");
7271 break;
7272 case DW_OP_rot:
7273 printf ("DW_OP_rot");
7274 break;
7275 case DW_OP_xderef:
7276 printf ("DW_OP_xderef");
7277 break;
7278 case DW_OP_abs:
7279 printf ("DW_OP_abs");
7280 break;
7281 case DW_OP_and:
7282 printf ("DW_OP_and");
7283 break;
7284 case DW_OP_div:
7285 printf ("DW_OP_div");
7286 break;
7287 case DW_OP_minus:
7288 printf ("DW_OP_minus");
7289 break;
7290 case DW_OP_mod:
7291 printf ("DW_OP_mod");
7292 break;
7293 case DW_OP_mul:
7294 printf ("DW_OP_mul");
7295 break;
7296 case DW_OP_neg:
7297 printf ("DW_OP_neg");
7298 break;
7299 case DW_OP_not:
7300 printf ("DW_OP_not");
7301 break;
7302 case DW_OP_or:
7303 printf ("DW_OP_or");
7304 break;
7305 case DW_OP_plus:
7306 printf ("DW_OP_plus");
7307 break;
7308 case DW_OP_plus_uconst:
7309 printf ("DW_OP_plus_uconst: %lu",
7310 read_leb128 (data, &bytes_read, 0));
7311 data += bytes_read;
7312 break;
7313 case DW_OP_shl:
7314 printf ("DW_OP_shl");
7315 break;
7316 case DW_OP_shr:
7317 printf ("DW_OP_shr");
7318 break;
7319 case DW_OP_shra:
7320 printf ("DW_OP_shra");
7321 break;
7322 case DW_OP_xor:
7323 printf ("DW_OP_xor");
7324 break;
7325 case DW_OP_bra:
7326 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7327 data += 2;
7328 break;
7329 case DW_OP_eq:
7330 printf ("DW_OP_eq");
7331 break;
7332 case DW_OP_ge:
7333 printf ("DW_OP_ge");
7334 break;
7335 case DW_OP_gt:
7336 printf ("DW_OP_gt");
7337 break;
7338 case DW_OP_le:
7339 printf ("DW_OP_le");
7340 break;
7341 case DW_OP_lt:
7342 printf ("DW_OP_lt");
7343 break;
7344 case DW_OP_ne:
7345 printf ("DW_OP_ne");
7346 break;
7347 case DW_OP_skip:
7348 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7349 data += 2;
7350 break;
7352 case DW_OP_lit0:
7353 case DW_OP_lit1:
7354 case DW_OP_lit2:
7355 case DW_OP_lit3:
7356 case DW_OP_lit4:
7357 case DW_OP_lit5:
7358 case DW_OP_lit6:
7359 case DW_OP_lit7:
7360 case DW_OP_lit8:
7361 case DW_OP_lit9:
7362 case DW_OP_lit10:
7363 case DW_OP_lit11:
7364 case DW_OP_lit12:
7365 case DW_OP_lit13:
7366 case DW_OP_lit14:
7367 case DW_OP_lit15:
7368 case DW_OP_lit16:
7369 case DW_OP_lit17:
7370 case DW_OP_lit18:
7371 case DW_OP_lit19:
7372 case DW_OP_lit20:
7373 case DW_OP_lit21:
7374 case DW_OP_lit22:
7375 case DW_OP_lit23:
7376 case DW_OP_lit24:
7377 case DW_OP_lit25:
7378 case DW_OP_lit26:
7379 case DW_OP_lit27:
7380 case DW_OP_lit28:
7381 case DW_OP_lit29:
7382 case DW_OP_lit30:
7383 case DW_OP_lit31:
7384 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7385 break;
7387 case DW_OP_reg0:
7388 case DW_OP_reg1:
7389 case DW_OP_reg2:
7390 case DW_OP_reg3:
7391 case DW_OP_reg4:
7392 case DW_OP_reg5:
7393 case DW_OP_reg6:
7394 case DW_OP_reg7:
7395 case DW_OP_reg8:
7396 case DW_OP_reg9:
7397 case DW_OP_reg10:
7398 case DW_OP_reg11:
7399 case DW_OP_reg12:
7400 case DW_OP_reg13:
7401 case DW_OP_reg14:
7402 case DW_OP_reg15:
7403 case DW_OP_reg16:
7404 case DW_OP_reg17:
7405 case DW_OP_reg18:
7406 case DW_OP_reg19:
7407 case DW_OP_reg20:
7408 case DW_OP_reg21:
7409 case DW_OP_reg22:
7410 case DW_OP_reg23:
7411 case DW_OP_reg24:
7412 case DW_OP_reg25:
7413 case DW_OP_reg26:
7414 case DW_OP_reg27:
7415 case DW_OP_reg28:
7416 case DW_OP_reg29:
7417 case DW_OP_reg30:
7418 case DW_OP_reg31:
7419 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7420 break;
7422 case DW_OP_breg0:
7423 case DW_OP_breg1:
7424 case DW_OP_breg2:
7425 case DW_OP_breg3:
7426 case DW_OP_breg4:
7427 case DW_OP_breg5:
7428 case DW_OP_breg6:
7429 case DW_OP_breg7:
7430 case DW_OP_breg8:
7431 case DW_OP_breg9:
7432 case DW_OP_breg10:
7433 case DW_OP_breg11:
7434 case DW_OP_breg12:
7435 case DW_OP_breg13:
7436 case DW_OP_breg14:
7437 case DW_OP_breg15:
7438 case DW_OP_breg16:
7439 case DW_OP_breg17:
7440 case DW_OP_breg18:
7441 case DW_OP_breg19:
7442 case DW_OP_breg20:
7443 case DW_OP_breg21:
7444 case DW_OP_breg22:
7445 case DW_OP_breg23:
7446 case DW_OP_breg24:
7447 case DW_OP_breg25:
7448 case DW_OP_breg26:
7449 case DW_OP_breg27:
7450 case DW_OP_breg28:
7451 case DW_OP_breg29:
7452 case DW_OP_breg30:
7453 case DW_OP_breg31:
7454 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7455 read_leb128 (data, &bytes_read, 1));
7456 data += bytes_read;
7457 break;
7459 case DW_OP_regx:
7460 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7461 data += bytes_read;
7462 break;
7463 case DW_OP_fbreg:
7464 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7465 data += bytes_read;
7466 break;
7467 case DW_OP_bregx:
7468 uvalue = read_leb128 (data, &bytes_read, 0);
7469 data += bytes_read;
7470 printf ("DW_OP_bregx: %lu %ld", uvalue,
7471 read_leb128 (data, &bytes_read, 1));
7472 data += bytes_read;
7473 break;
7474 case DW_OP_piece:
7475 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7476 data += bytes_read;
7477 break;
7478 case DW_OP_deref_size:
7479 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7480 break;
7481 case DW_OP_xderef_size:
7482 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7483 break;
7484 case DW_OP_nop:
7485 printf ("DW_OP_nop");
7486 break;
7488 /* DWARF 3 extensions. */
7489 case DW_OP_push_object_address:
7490 printf ("DW_OP_push_object_address");
7491 break;
7492 case DW_OP_call2:
7493 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7494 data += 2;
7495 break;
7496 case DW_OP_call4:
7497 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7498 data += 4;
7499 break;
7500 case DW_OP_call_ref:
7501 printf ("DW_OP_call_ref");
7502 break;
7504 /* GNU extensions. */
7505 case DW_OP_GNU_push_tls_address:
7506 printf ("DW_OP_GNU_push_tls_address");
7507 break;
7509 default:
7510 if (op >= DW_OP_lo_user
7511 && op <= DW_OP_hi_user)
7512 printf (_("(User defined location op)"));
7513 else
7514 printf (_("(Unknown location op)"));
7515 /* No way to tell where the next op is, so just bail. */
7516 return;
7519 /* Separate the ops. */
7520 printf ("; ");
7524 static const char *debug_loc_contents;
7525 static bfd_vma debug_loc_size;
7527 static void
7528 load_debug_loc (file)
7529 FILE *file;
7531 Elf_Internal_Shdr *sec;
7532 unsigned int i;
7534 /* If it is already loaded, do nothing. */
7535 if (debug_loc_contents != NULL)
7536 return;
7538 /* Locate the .debug_loc section. */
7539 for (i = 0, sec = section_headers;
7540 i < elf_header.e_shnum;
7541 i++, sec++)
7542 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7543 break;
7545 if (i == elf_header.e_shnum || sec->sh_size == 0)
7546 return;
7548 debug_loc_size = sec->sh_size;
7550 debug_loc_contents = ((char *)
7551 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7552 _("debug_loc section data")));
7555 static void
7556 free_debug_loc ()
7558 if (debug_loc_contents == NULL)
7559 return;
7561 free ((char *) debug_loc_contents);
7562 debug_loc_contents = NULL;
7563 debug_loc_size = 0;
7567 static int
7568 display_debug_loc (section, start, file)
7569 Elf_Internal_Shdr *section;
7570 unsigned char *start;
7571 FILE *file ATTRIBUTE_UNUSED;
7573 unsigned char *section_end;
7574 unsigned long bytes;
7575 unsigned char *section_begin = start;
7576 bfd_vma addr;
7578 addr = section->sh_addr;
7579 bytes = section->sh_size;
7580 section_end = start + bytes;
7582 if (bytes == 0)
7584 printf (_("\nThe .debug_loc section is empty.\n"));
7585 return 0;
7588 printf (_("Contents of the .debug_loc section:\n\n"));
7589 printf (_("\n Offset Begin End Expression\n"));
7591 while (start < section_end)
7593 unsigned long begin;
7594 unsigned long end;
7595 unsigned short length;
7596 unsigned long offset;
7598 offset = start - section_begin;
7600 while (1)
7602 /* Normally, the lists in the debug_loc section are related to a
7603 given compilation unit, and thus, we would use the
7604 pointer size of that compilation unit. However, since we are
7605 displaying it seperately here, we either have to store
7606 pointer sizes of all compilation units, or assume they don't
7607 change. We assume, like the debug_line display, that
7608 it doesn't change. */
7609 begin = byte_get (start, debug_line_pointer_size);
7610 start += debug_line_pointer_size;
7611 end = byte_get (start, debug_line_pointer_size);
7612 start += debug_line_pointer_size;
7614 if (begin == 0 && end == 0)
7615 break;
7617 begin += addr;
7618 end += addr;
7620 length = byte_get (start, 2);
7621 start += 2;
7623 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7624 decode_location_expression (start, debug_line_pointer_size, length);
7625 printf (")\n");
7627 start += length;
7629 printf ("\n");
7631 return 1;
7634 static const char *debug_str_contents;
7635 static bfd_vma debug_str_size;
7637 static void
7638 load_debug_str (file)
7639 FILE *file;
7641 Elf_Internal_Shdr *sec;
7642 unsigned int i;
7644 /* If it is already loaded, do nothing. */
7645 if (debug_str_contents != NULL)
7646 return;
7648 /* Locate the .debug_str section. */
7649 for (i = 0, sec = section_headers;
7650 i < elf_header.e_shnum;
7651 i++, sec++)
7652 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7653 break;
7655 if (i == elf_header.e_shnum || sec->sh_size == 0)
7656 return;
7658 debug_str_size = sec->sh_size;
7660 debug_str_contents = ((char *)
7661 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7662 _("debug_str section data")));
7665 static void
7666 free_debug_str ()
7668 if (debug_str_contents == NULL)
7669 return;
7671 free ((char *) debug_str_contents);
7672 debug_str_contents = NULL;
7673 debug_str_size = 0;
7676 static const char *
7677 fetch_indirect_string (offset)
7678 unsigned long offset;
7680 if (debug_str_contents == NULL)
7681 return _("<no .debug_str section>");
7683 if (offset > debug_str_size)
7684 return _("<offset is too big>");
7686 return debug_str_contents + offset;
7689 static int
7690 display_debug_str (section, start, file)
7691 Elf_Internal_Shdr *section;
7692 unsigned char *start;
7693 FILE *file ATTRIBUTE_UNUSED;
7695 unsigned long bytes;
7696 bfd_vma addr;
7698 addr = section->sh_addr;
7699 bytes = section->sh_size;
7701 if (bytes == 0)
7703 printf (_("\nThe .debug_str section is empty.\n"));
7704 return 0;
7707 printf (_("Contents of the .debug_str section:\n\n"));
7709 while (bytes)
7711 int j;
7712 int k;
7713 int lbytes;
7715 lbytes = (bytes > 16 ? 16 : bytes);
7717 printf (" 0x%8.8lx ", (unsigned long) addr);
7719 for (j = 0; j < 16; j++)
7721 if (j < lbytes)
7722 printf ("%2.2x", start[j]);
7723 else
7724 printf (" ");
7726 if ((j & 3) == 3)
7727 printf (" ");
7730 for (j = 0; j < lbytes; j++)
7732 k = start[j];
7733 if (k >= ' ' && k < 0x80)
7734 printf ("%c", k);
7735 else
7736 printf (".");
7739 putchar ('\n');
7741 start += lbytes;
7742 addr += lbytes;
7743 bytes -= lbytes;
7746 return 1;
7749 static unsigned char *
7750 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7751 unsigned long attribute;
7752 unsigned long form;
7753 unsigned char *data;
7754 unsigned long cu_offset;
7755 unsigned long pointer_size;
7757 unsigned long uvalue = 0;
7758 unsigned char *block_start = NULL;
7759 int bytes_read;
7761 switch (form)
7763 default:
7764 break;
7766 case DW_FORM_ref_addr:
7767 case DW_FORM_addr:
7768 uvalue = byte_get (data, pointer_size);
7769 data += pointer_size;
7770 break;
7772 case DW_FORM_strp:
7773 uvalue = byte_get (data, /* offset_size */ 4);
7774 data += /* offset_size */ 4;
7775 break;
7777 case DW_FORM_ref1:
7778 case DW_FORM_flag:
7779 case DW_FORM_data1:
7780 uvalue = byte_get (data++, 1);
7781 break;
7783 case DW_FORM_ref2:
7784 case DW_FORM_data2:
7785 uvalue = byte_get (data, 2);
7786 data += 2;
7787 break;
7789 case DW_FORM_ref4:
7790 case DW_FORM_data4:
7791 uvalue = byte_get (data, 4);
7792 data += 4;
7793 break;
7795 case DW_FORM_sdata:
7796 uvalue = read_leb128 (data, & bytes_read, 1);
7797 data += bytes_read;
7798 break;
7800 case DW_FORM_ref_udata:
7801 case DW_FORM_udata:
7802 uvalue = read_leb128 (data, & bytes_read, 0);
7803 data += bytes_read;
7804 break;
7806 case DW_FORM_indirect:
7807 form = read_leb128 (data, & bytes_read, 0);
7808 data += bytes_read;
7809 printf (" %s", get_FORM_name (form));
7810 return read_and_display_attr_value (attribute, form, data, cu_offset,
7811 pointer_size);
7814 switch (form)
7816 case DW_FORM_ref_addr:
7817 printf (" <#%lx>", uvalue);
7818 break;
7820 case DW_FORM_ref1:
7821 case DW_FORM_ref2:
7822 case DW_FORM_ref4:
7823 case DW_FORM_ref_udata:
7824 printf (" <%lx>", uvalue + cu_offset);
7825 break;
7827 case DW_FORM_addr:
7828 printf (" %#lx", uvalue);
7830 case DW_FORM_flag:
7831 case DW_FORM_data1:
7832 case DW_FORM_data2:
7833 case DW_FORM_data4:
7834 case DW_FORM_sdata:
7835 case DW_FORM_udata:
7836 printf (" %ld", uvalue);
7837 break;
7839 case DW_FORM_ref8:
7840 case DW_FORM_data8:
7841 uvalue = byte_get (data, 4);
7842 printf (" %lx", uvalue);
7843 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7844 data += 8;
7845 break;
7847 case DW_FORM_string:
7848 printf (" %s", data);
7849 data += strlen ((char *) data) + 1;
7850 break;
7852 case DW_FORM_block:
7853 uvalue = read_leb128 (data, & bytes_read, 0);
7854 block_start = data + bytes_read;
7855 data = display_block (block_start, uvalue);
7856 break;
7858 case DW_FORM_block1:
7859 uvalue = byte_get (data, 1);
7860 block_start = data + 1;
7861 data = display_block (block_start, uvalue);
7862 break;
7864 case DW_FORM_block2:
7865 uvalue = byte_get (data, 2);
7866 block_start = data + 2;
7867 data = display_block (block_start, uvalue);
7868 break;
7870 case DW_FORM_block4:
7871 uvalue = byte_get (data, 4);
7872 block_start = data + 4;
7873 data = display_block (block_start, uvalue);
7874 break;
7876 case DW_FORM_strp:
7877 printf (_(" (indirect string, offset: 0x%lx): %s"),
7878 uvalue, fetch_indirect_string (uvalue));
7879 break;
7881 case DW_FORM_indirect:
7882 /* Handled above. */
7883 break;
7885 default:
7886 warn (_("Unrecognized form: %d\n"), form);
7887 break;
7890 /* For some attributes we can display futher information. */
7892 printf ("\t");
7894 switch (attribute)
7896 case DW_AT_inline:
7897 switch (uvalue)
7899 case DW_INL_not_inlined:
7900 printf (_("(not inlined)"));
7901 break;
7902 case DW_INL_inlined:
7903 printf (_("(inlined)"));
7904 break;
7905 case DW_INL_declared_not_inlined:
7906 printf (_("(declared as inline but ignored)"));
7907 break;
7908 case DW_INL_declared_inlined:
7909 printf (_("(declared as inline and inlined)"));
7910 break;
7911 default:
7912 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
7913 break;
7915 break;
7917 case DW_AT_language:
7918 switch (uvalue)
7920 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7921 case DW_LANG_C89: printf ("(ANSI C)"); break;
7922 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7923 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7924 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7925 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7926 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7927 case DW_LANG_Ada83: printf ("(Ada)"); break;
7928 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7929 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7930 /* DWARF 2.1 values. */
7931 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7932 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7933 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7934 /* MIPS extension. */
7935 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7936 default:
7937 printf ("(Unknown: %lx)", uvalue);
7938 break;
7940 break;
7942 case DW_AT_encoding:
7943 switch (uvalue)
7945 case DW_ATE_void: printf ("(void)"); break;
7946 case DW_ATE_address: printf ("(machine address)"); break;
7947 case DW_ATE_boolean: printf ("(boolean)"); break;
7948 case DW_ATE_complex_float: printf ("(complex float)"); break;
7949 case DW_ATE_float: printf ("(float)"); break;
7950 case DW_ATE_signed: printf ("(signed)"); break;
7951 case DW_ATE_signed_char: printf ("(signed char)"); break;
7952 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7953 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7954 /* DWARF 2.1 value. */
7955 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7956 default:
7957 if (uvalue >= DW_ATE_lo_user
7958 && uvalue <= DW_ATE_hi_user)
7959 printf ("(user defined type)");
7960 else
7961 printf ("(unknown type)");
7962 break;
7964 break;
7966 case DW_AT_accessibility:
7967 switch (uvalue)
7969 case DW_ACCESS_public: printf ("(public)"); break;
7970 case DW_ACCESS_protected: printf ("(protected)"); break;
7971 case DW_ACCESS_private: printf ("(private)"); break;
7972 default:
7973 printf ("(unknown accessibility)");
7974 break;
7976 break;
7978 case DW_AT_visibility:
7979 switch (uvalue)
7981 case DW_VIS_local: printf ("(local)"); break;
7982 case DW_VIS_exported: printf ("(exported)"); break;
7983 case DW_VIS_qualified: printf ("(qualified)"); break;
7984 default: printf ("(unknown visibility)"); break;
7986 break;
7988 case DW_AT_virtuality:
7989 switch (uvalue)
7991 case DW_VIRTUALITY_none: printf ("(none)"); break;
7992 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7993 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7994 default: printf ("(unknown virtuality)"); break;
7996 break;
7998 case DW_AT_identifier_case:
7999 switch (uvalue)
8001 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8002 case DW_ID_up_case: printf ("(up_case)"); break;
8003 case DW_ID_down_case: printf ("(down_case)"); break;
8004 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8005 default: printf ("(unknown case)"); break;
8007 break;
8009 case DW_AT_calling_convention:
8010 switch (uvalue)
8012 case DW_CC_normal: printf ("(normal)"); break;
8013 case DW_CC_program: printf ("(program)"); break;
8014 case DW_CC_nocall: printf ("(nocall)"); break;
8015 default:
8016 if (uvalue >= DW_CC_lo_user
8017 && uvalue <= DW_CC_hi_user)
8018 printf ("(user defined)");
8019 else
8020 printf ("(unknown convention)");
8022 break;
8024 case DW_AT_ordering:
8025 switch (uvalue)
8027 case -1: printf ("(undefined)"); break;
8028 case 0: printf ("(row major)"); break;
8029 case 1: printf ("(column major)"); break;
8031 break;
8033 case DW_AT_frame_base:
8034 case DW_AT_location:
8035 case DW_AT_data_member_location:
8036 case DW_AT_vtable_elem_location:
8037 case DW_AT_allocated:
8038 case DW_AT_associated:
8039 case DW_AT_data_location:
8040 case DW_AT_stride:
8041 case DW_AT_upper_bound:
8042 case DW_AT_lower_bound:
8043 if (block_start)
8045 printf ("(");
8046 decode_location_expression (block_start, pointer_size, uvalue);
8047 printf (")");
8049 else if (form == DW_FORM_data4)
8051 printf ("(");
8052 printf ("location list");
8053 printf (")");
8055 break;
8057 default:
8058 break;
8061 return data;
8064 static unsigned char *
8065 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
8066 unsigned long attribute;
8067 unsigned long form;
8068 unsigned char *data;
8069 unsigned long cu_offset;
8070 unsigned long pointer_size;
8072 printf (" %-18s:", get_AT_name (attribute));
8073 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8074 pointer_size);
8075 printf ("\n");
8076 return data;
8079 static int
8080 display_debug_info (section, start, file)
8081 Elf_Internal_Shdr *section;
8082 unsigned char *start;
8083 FILE *file;
8085 unsigned char *end = start + section->sh_size;
8086 unsigned char *section_begin = start;
8088 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8090 load_debug_str (file);
8091 load_debug_loc (file);
8093 while (start < end)
8095 DWARF2_External_CompUnit *external;
8096 DWARF2_Internal_CompUnit compunit;
8097 Elf_Internal_Shdr *relsec;
8098 unsigned char *tags;
8099 unsigned int i;
8100 int level;
8101 unsigned long cu_offset;
8103 external = (DWARF2_External_CompUnit *) start;
8105 compunit.cu_length = BYTE_GET (external->cu_length);
8106 compunit.cu_version = BYTE_GET (external->cu_version);
8107 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
8108 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
8110 if (compunit.cu_length == 0xffffffff)
8112 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8113 break;
8116 /* Check for RELA relocations in the
8117 abbrev_offset address, and apply them. */
8118 for (relsec = section_headers;
8119 relsec < section_headers + elf_header.e_shnum;
8120 ++relsec)
8122 unsigned long nrelas;
8123 Elf_Internal_Rela *rela, *rp;
8124 Elf_Internal_Shdr *symsec;
8125 Elf_Internal_Sym *symtab;
8126 Elf_Internal_Sym *sym;
8128 if (relsec->sh_type != SHT_RELA
8129 || SECTION_HEADER (relsec->sh_info) != section
8130 || relsec->sh_size == 0)
8131 continue;
8133 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8134 & rela, & nrelas))
8135 return 0;
8137 symsec = SECTION_HEADER (relsec->sh_link);
8138 symtab = GET_ELF_SYMBOLS (file, symsec);
8140 for (rp = rela; rp < rela + nrelas; ++rp)
8142 if (rp->r_offset
8143 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
8144 - section_begin))
8145 continue;
8147 if (is_32bit_elf)
8149 sym = symtab + ELF32_R_SYM (rp->r_info);
8151 if (ELF32_R_SYM (rp->r_info) != 0
8152 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
8154 warn (_("Skipping unexpected symbol type %u\n"),
8155 ELF32_ST_TYPE (sym->st_info));
8156 continue;
8159 else
8161 sym = symtab + ELF64_R_SYM (rp->r_info);
8163 if (ELF64_R_SYM (rp->r_info) != 0
8164 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
8166 warn (_("Skipping unexpected symbol type %u\n"),
8167 ELF64_ST_TYPE (sym->st_info));
8168 continue;
8172 compunit.cu_abbrev_offset = rp->r_addend;
8173 break;
8176 free (rela);
8177 break;
8180 tags = start + sizeof (*external);
8181 cu_offset = start - section_begin;
8182 start += compunit.cu_length + sizeof (external->cu_length);
8184 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8185 printf (_(" Length: %ld\n"), compunit.cu_length);
8186 printf (_(" Version: %d\n"), compunit.cu_version);
8187 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8188 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8190 if (compunit.cu_version != 2)
8192 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8193 continue;
8196 free_abbrevs ();
8198 /* Read in the abbrevs used by this compilation unit. */
8200 Elf_Internal_Shdr *sec;
8201 unsigned char *begin;
8203 /* Locate the .debug_abbrev section and process it. */
8204 for (i = 0, sec = section_headers;
8205 i < elf_header.e_shnum;
8206 i++, sec++)
8207 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
8208 break;
8210 if (i == elf_header.e_shnum || sec->sh_size == 0)
8212 warn (_("Unable to locate .debug_abbrev section!\n"));
8213 return 0;
8216 begin = ((unsigned char *)
8217 get_data (NULL, file, sec->sh_offset, sec->sh_size,
8218 _("debug_abbrev section data")));
8219 if (!begin)
8220 return 0;
8222 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8223 begin + sec->sh_size);
8225 free (begin);
8228 level = 0;
8229 while (tags < start)
8231 int bytes_read;
8232 unsigned long abbrev_number;
8233 abbrev_entry *entry;
8234 abbrev_attr *attr;
8236 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8237 tags += bytes_read;
8239 /* A null DIE marks the end of a list of children. */
8240 if (abbrev_number == 0)
8242 --level;
8243 continue;
8246 /* Scan through the abbreviation list until we reach the
8247 correct entry. */
8248 for (entry = first_abbrev;
8249 entry && entry->entry != abbrev_number;
8250 entry = entry->next)
8251 continue;
8253 if (entry == NULL)
8255 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8256 abbrev_number);
8257 return 0;
8260 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8261 level,
8262 (unsigned long) (tags - section_begin - bytes_read),
8263 abbrev_number,
8264 get_TAG_name (entry->tag));
8266 for (attr = entry->first_attr; attr; attr = attr->next)
8267 tags = read_and_display_attr (attr->attribute,
8268 attr->form,
8269 tags, cu_offset,
8270 compunit.cu_pointer_size);
8272 if (entry->children)
8273 ++level;
8277 free_debug_str ();
8278 free_debug_loc ();
8280 printf ("\n");
8282 return 1;
8285 static int
8286 display_debug_aranges (section, start, file)
8287 Elf_Internal_Shdr *section;
8288 unsigned char *start;
8289 FILE *file ATTRIBUTE_UNUSED;
8291 unsigned char *end = start + section->sh_size;
8293 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8295 while (start < end)
8297 DWARF2_External_ARange *external;
8298 DWARF2_Internal_ARange arange;
8299 unsigned char *ranges;
8300 unsigned long length;
8301 unsigned long address;
8302 int excess;
8304 external = (DWARF2_External_ARange *) start;
8306 arange.ar_length = BYTE_GET (external->ar_length);
8307 arange.ar_version = BYTE_GET (external->ar_version);
8308 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
8309 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
8310 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
8312 if (arange.ar_length == 0xffffffff)
8314 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8315 break;
8318 if (arange.ar_version != 2)
8320 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8321 break;
8324 printf (_(" Length: %ld\n"), arange.ar_length);
8325 printf (_(" Version: %d\n"), arange.ar_version);
8326 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8327 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8328 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8330 printf (_("\n Address Length\n"));
8332 ranges = start + sizeof (*external);
8334 /* Must pad to an alignment boundary that is twice the pointer size. */
8335 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
8336 if (excess)
8337 ranges += (2 * arange.ar_pointer_size) - excess;
8339 for (;;)
8341 address = byte_get (ranges, arange.ar_pointer_size);
8343 ranges += arange.ar_pointer_size;
8345 length = byte_get (ranges, arange.ar_pointer_size);
8347 ranges += arange.ar_pointer_size;
8349 /* A pair of zeros marks the end of the list. */
8350 if (address == 0 && length == 0)
8351 break;
8353 printf (" %8.8lx %lu\n", address, length);
8356 start += arange.ar_length + sizeof (external->ar_length);
8359 printf ("\n");
8361 return 1;
8364 typedef struct Frame_Chunk
8366 struct Frame_Chunk *next;
8367 unsigned char *chunk_start;
8368 int ncols;
8369 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8370 short int *col_type;
8371 int *col_offset;
8372 char *augmentation;
8373 unsigned int code_factor;
8374 int data_factor;
8375 unsigned long pc_begin;
8376 unsigned long pc_range;
8377 int cfa_reg;
8378 int cfa_offset;
8379 int ra;
8380 unsigned char fde_encoding;
8382 Frame_Chunk;
8384 /* A marker for a col_type that means this column was never referenced
8385 in the frame info. */
8386 #define DW_CFA_unreferenced (-1)
8388 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8389 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8390 static int size_of_encoded_value PARAMS ((int));
8392 static void
8393 frame_need_space (fc, reg)
8394 Frame_Chunk *fc;
8395 int reg;
8397 int prev = fc->ncols;
8399 if (reg < fc->ncols)
8400 return;
8402 fc->ncols = reg + 1;
8403 fc->col_type = (short int *) xrealloc (fc->col_type,
8404 fc->ncols * sizeof (short int));
8405 fc->col_offset = (int *) xrealloc (fc->col_offset,
8406 fc->ncols * sizeof (int));
8408 while (prev < fc->ncols)
8410 fc->col_type[prev] = DW_CFA_unreferenced;
8411 fc->col_offset[prev] = 0;
8412 prev++;
8416 static void
8417 frame_display_row (fc, need_col_headers, max_regs)
8418 Frame_Chunk *fc;
8419 int *need_col_headers;
8420 int *max_regs;
8422 int r;
8423 char tmp[100];
8425 if (*max_regs < fc->ncols)
8426 *max_regs = fc->ncols;
8428 if (*need_col_headers)
8430 *need_col_headers = 0;
8432 printf (" LOC CFA ");
8434 for (r = 0; r < *max_regs; r++)
8435 if (fc->col_type[r] != DW_CFA_unreferenced)
8437 if (r == fc->ra)
8438 printf ("ra ");
8439 else
8440 printf ("r%-4d", r);
8443 printf ("\n");
8446 printf ("%08lx ", fc->pc_begin);
8447 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8448 printf ("%-8s ", tmp);
8450 for (r = 0; r < fc->ncols; r++)
8452 if (fc->col_type[r] != DW_CFA_unreferenced)
8454 switch (fc->col_type[r])
8456 case DW_CFA_undefined:
8457 strcpy (tmp, "u");
8458 break;
8459 case DW_CFA_same_value:
8460 strcpy (tmp, "s");
8461 break;
8462 case DW_CFA_offset:
8463 sprintf (tmp, "c%+d", fc->col_offset[r]);
8464 break;
8465 case DW_CFA_register:
8466 sprintf (tmp, "r%d", fc->col_offset[r]);
8467 break;
8468 default:
8469 strcpy (tmp, "n/a");
8470 break;
8472 printf ("%-5s", tmp);
8475 printf ("\n");
8478 static int
8479 size_of_encoded_value (encoding)
8480 int encoding;
8482 switch (encoding & 0x7)
8484 default: /* ??? */
8485 case 0: return is_32bit_elf ? 4 : 8;
8486 case 2: return 2;
8487 case 3: return 4;
8488 case 4: return 8;
8492 #define GET(N) byte_get (start, N); start += N
8493 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8494 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8496 static int
8497 display_debug_frames (section, start, file)
8498 Elf_Internal_Shdr *section;
8499 unsigned char *start;
8500 FILE *file ATTRIBUTE_UNUSED;
8502 unsigned char *end = start + section->sh_size;
8503 unsigned char *section_start = start;
8504 Frame_Chunk *chunks = 0;
8505 Frame_Chunk *remembered_state = 0;
8506 Frame_Chunk *rs;
8507 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8508 int length_return;
8509 int max_regs = 0;
8510 int addr_size = is_32bit_elf ? 4 : 8;
8512 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8514 while (start < end)
8516 unsigned char *saved_start;
8517 unsigned char *block_end;
8518 unsigned long length;
8519 unsigned long cie_id;
8520 Frame_Chunk *fc;
8521 Frame_Chunk *cie;
8522 int need_col_headers = 1;
8523 unsigned char *augmentation_data = NULL;
8524 unsigned long augmentation_data_len = 0;
8525 int encoded_ptr_size = addr_size;
8527 saved_start = start;
8528 length = byte_get (start, 4); start += 4;
8530 if (length == 0)
8532 printf ("\n%08lx ZERO terminator\n\n",
8533 (unsigned long)(saved_start - section_start));
8534 return 1;
8537 if (length == 0xffffffff)
8539 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8540 break;
8543 block_end = saved_start + length + 4;
8544 cie_id = byte_get (start, 4); start += 4;
8546 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8548 int version;
8550 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8551 memset (fc, 0, sizeof (Frame_Chunk));
8553 fc->next = chunks;
8554 chunks = fc;
8555 fc->chunk_start = saved_start;
8556 fc->ncols = 0;
8557 fc->col_type = (short int *) xmalloc (sizeof (short int));
8558 fc->col_offset = (int *) xmalloc (sizeof (int));
8559 frame_need_space (fc, max_regs-1);
8561 version = *start++;
8563 fc->augmentation = start;
8564 start = strchr (start, '\0') + 1;
8566 if (fc->augmentation[0] == 'z')
8568 fc->code_factor = LEB ();
8569 fc->data_factor = SLEB ();
8570 fc->ra = byte_get (start, 1); start += 1;
8571 augmentation_data_len = LEB ();
8572 augmentation_data = start;
8573 start += augmentation_data_len;
8575 else if (strcmp (fc->augmentation, "eh") == 0)
8577 start += addr_size;
8578 fc->code_factor = LEB ();
8579 fc->data_factor = SLEB ();
8580 fc->ra = byte_get (start, 1); start += 1;
8582 else
8584 fc->code_factor = LEB ();
8585 fc->data_factor = SLEB ();
8586 fc->ra = byte_get (start, 1); start += 1;
8588 cie = fc;
8590 if (do_debug_frames_interp)
8591 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8592 (unsigned long)(saved_start - section_start), length, cie_id,
8593 fc->augmentation, fc->code_factor, fc->data_factor,
8594 fc->ra);
8595 else
8597 printf ("\n%08lx %08lx %08lx CIE\n",
8598 (unsigned long)(saved_start - section_start), length, cie_id);
8599 printf (" Version: %d\n", version);
8600 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8601 printf (" Code alignment factor: %u\n", fc->code_factor);
8602 printf (" Data alignment factor: %d\n", fc->data_factor);
8603 printf (" Return address column: %d\n", fc->ra);
8605 if (augmentation_data_len)
8607 unsigned long i;
8608 printf (" Augmentation data: ");
8609 for (i = 0; i < augmentation_data_len; ++i)
8610 printf (" %02x", augmentation_data[i]);
8611 putchar ('\n');
8613 putchar ('\n');
8616 if (augmentation_data_len)
8618 unsigned char *p, *q;
8619 p = fc->augmentation + 1;
8620 q = augmentation_data;
8622 while (1)
8624 if (*p == 'L')
8625 q++;
8626 else if (*p == 'P')
8627 q += 1 + size_of_encoded_value (*q);
8628 else if (*p == 'R')
8629 fc->fde_encoding = *q++;
8630 else
8631 break;
8632 p++;
8635 if (fc->fde_encoding)
8636 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8639 frame_need_space (fc, fc->ra);
8641 else
8643 unsigned char *look_for;
8644 static Frame_Chunk fde_fc;
8646 fc = & fde_fc;
8647 memset (fc, 0, sizeof (Frame_Chunk));
8649 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8651 for (cie = chunks; cie ; cie = cie->next)
8652 if (cie->chunk_start == look_for)
8653 break;
8655 if (!cie)
8657 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8658 cie_id, saved_start);
8659 start = block_end;
8660 fc->ncols = 0;
8661 fc->col_type = (short int *) xmalloc (sizeof (short int));
8662 fc->col_offset = (int *) xmalloc (sizeof (int));
8663 frame_need_space (fc, max_regs - 1);
8664 cie = fc;
8665 fc->augmentation = "";
8666 fc->fde_encoding = 0;
8668 else
8670 fc->ncols = cie->ncols;
8671 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8672 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8673 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8674 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8675 fc->augmentation = cie->augmentation;
8676 fc->code_factor = cie->code_factor;
8677 fc->data_factor = cie->data_factor;
8678 fc->cfa_reg = cie->cfa_reg;
8679 fc->cfa_offset = cie->cfa_offset;
8680 fc->ra = cie->ra;
8681 frame_need_space (fc, max_regs-1);
8682 fc->fde_encoding = cie->fde_encoding;
8685 if (fc->fde_encoding)
8686 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8688 fc->pc_begin = byte_get (start, encoded_ptr_size);
8689 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8690 fc->pc_begin += section->sh_addr + (start - section_start);
8691 start += encoded_ptr_size;
8692 fc->pc_range = byte_get (start, encoded_ptr_size);
8693 start += encoded_ptr_size;
8695 if (cie->augmentation[0] == 'z')
8697 augmentation_data_len = LEB ();
8698 augmentation_data = start;
8699 start += augmentation_data_len;
8702 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8703 (unsigned long)(saved_start - section_start), length, cie_id,
8704 (unsigned long)(cie->chunk_start - section_start),
8705 fc->pc_begin, fc->pc_begin + fc->pc_range);
8706 if (! do_debug_frames_interp && augmentation_data_len)
8708 unsigned long i;
8709 printf (" Augmentation data: ");
8710 for (i = 0; i < augmentation_data_len; ++i)
8711 printf (" %02x", augmentation_data[i]);
8712 putchar ('\n');
8713 putchar ('\n');
8717 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8718 about to interpret instructions for the chunk. */
8720 if (do_debug_frames_interp)
8722 /* Start by making a pass over the chunk, allocating storage
8723 and taking note of what registers are used. */
8724 unsigned char *tmp = start;
8726 while (start < block_end)
8728 unsigned op, opa;
8729 unsigned long reg;
8731 op = *start++;
8732 opa = op & 0x3f;
8733 if (op & 0xc0)
8734 op &= 0xc0;
8736 /* Warning: if you add any more cases to this switch, be
8737 sure to add them to the corresponding switch below. */
8738 switch (op)
8740 case DW_CFA_advance_loc:
8741 break;
8742 case DW_CFA_offset:
8743 LEB ();
8744 frame_need_space (fc, opa);
8745 fc->col_type[opa] = DW_CFA_undefined;
8746 break;
8747 case DW_CFA_restore:
8748 frame_need_space (fc, opa);
8749 fc->col_type[opa] = DW_CFA_undefined;
8750 break;
8751 case DW_CFA_set_loc:
8752 start += encoded_ptr_size;
8753 break;
8754 case DW_CFA_advance_loc1:
8755 start += 1;
8756 break;
8757 case DW_CFA_advance_loc2:
8758 start += 2;
8759 break;
8760 case DW_CFA_advance_loc4:
8761 start += 4;
8762 break;
8763 case DW_CFA_offset_extended:
8764 reg = LEB (); LEB ();
8765 frame_need_space (fc, reg);
8766 fc->col_type[reg] = DW_CFA_undefined;
8767 break;
8768 case DW_CFA_restore_extended:
8769 reg = LEB ();
8770 frame_need_space (fc, reg);
8771 fc->col_type[reg] = DW_CFA_undefined;
8772 break;
8773 case DW_CFA_undefined:
8774 reg = LEB ();
8775 frame_need_space (fc, reg);
8776 fc->col_type[reg] = DW_CFA_undefined;
8777 break;
8778 case DW_CFA_same_value:
8779 reg = LEB ();
8780 frame_need_space (fc, reg);
8781 fc->col_type[reg] = DW_CFA_undefined;
8782 break;
8783 case DW_CFA_register:
8784 reg = LEB (); LEB ();
8785 frame_need_space (fc, reg);
8786 fc->col_type[reg] = DW_CFA_undefined;
8787 break;
8788 case DW_CFA_def_cfa:
8789 LEB (); LEB ();
8790 break;
8791 case DW_CFA_def_cfa_register:
8792 LEB ();
8793 break;
8794 case DW_CFA_def_cfa_offset:
8795 LEB ();
8796 break;
8797 case DW_CFA_offset_extended_sf:
8798 reg = LEB (); SLEB ();
8799 frame_need_space (fc, reg);
8800 fc->col_type[reg] = DW_CFA_undefined;
8801 break;
8802 case DW_CFA_def_cfa_sf:
8803 LEB (); SLEB ();
8804 break;
8805 case DW_CFA_def_cfa_offset_sf:
8806 SLEB ();
8807 break;
8808 case DW_CFA_GNU_args_size:
8809 LEB ();
8810 break;
8811 case DW_CFA_GNU_negative_offset_extended:
8812 reg = LEB (); LEB ();
8813 frame_need_space (fc, reg);
8814 fc->col_type[reg] = DW_CFA_undefined;
8816 default:
8817 break;
8820 start = tmp;
8823 /* Now we know what registers are used, make a second pass over
8824 the chunk, this time actually printing out the info. */
8826 while (start < block_end)
8828 unsigned op, opa;
8829 unsigned long ul, reg, roffs;
8830 long l, ofs;
8831 bfd_vma vma;
8833 op = *start++;
8834 opa = op & 0x3f;
8835 if (op & 0xc0)
8836 op &= 0xc0;
8838 /* Warning: if you add any more cases to this switch, be
8839 sure to add them to the corresponding switch above. */
8840 switch (op)
8842 case DW_CFA_advance_loc:
8843 if (do_debug_frames_interp)
8844 frame_display_row (fc, &need_col_headers, &max_regs);
8845 else
8846 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8847 opa * fc->code_factor,
8848 fc->pc_begin + opa * fc->code_factor);
8849 fc->pc_begin += opa * fc->code_factor;
8850 break;
8852 case DW_CFA_offset:
8853 roffs = LEB ();
8854 if (! do_debug_frames_interp)
8855 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8856 opa, roffs * fc->data_factor);
8857 fc->col_type[opa] = DW_CFA_offset;
8858 fc->col_offset[opa] = roffs * fc->data_factor;
8859 break;
8861 case DW_CFA_restore:
8862 if (! do_debug_frames_interp)
8863 printf (" DW_CFA_restore: r%d\n", opa);
8864 fc->col_type[opa] = cie->col_type[opa];
8865 fc->col_offset[opa] = cie->col_offset[opa];
8866 break;
8868 case DW_CFA_set_loc:
8869 vma = byte_get (start, encoded_ptr_size);
8870 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8871 vma += section->sh_addr + (start - section_start);
8872 start += encoded_ptr_size;
8873 if (do_debug_frames_interp)
8874 frame_display_row (fc, &need_col_headers, &max_regs);
8875 else
8876 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8877 fc->pc_begin = vma;
8878 break;
8880 case DW_CFA_advance_loc1:
8881 ofs = byte_get (start, 1); start += 1;
8882 if (do_debug_frames_interp)
8883 frame_display_row (fc, &need_col_headers, &max_regs);
8884 else
8885 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8886 ofs * fc->code_factor,
8887 fc->pc_begin + ofs * fc->code_factor);
8888 fc->pc_begin += ofs * fc->code_factor;
8889 break;
8891 case DW_CFA_advance_loc2:
8892 ofs = byte_get (start, 2); start += 2;
8893 if (do_debug_frames_interp)
8894 frame_display_row (fc, &need_col_headers, &max_regs);
8895 else
8896 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8897 ofs * fc->code_factor,
8898 fc->pc_begin + ofs * fc->code_factor);
8899 fc->pc_begin += ofs * fc->code_factor;
8900 break;
8902 case DW_CFA_advance_loc4:
8903 ofs = byte_get (start, 4); start += 4;
8904 if (do_debug_frames_interp)
8905 frame_display_row (fc, &need_col_headers, &max_regs);
8906 else
8907 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8908 ofs * fc->code_factor,
8909 fc->pc_begin + ofs * fc->code_factor);
8910 fc->pc_begin += ofs * fc->code_factor;
8911 break;
8913 case DW_CFA_offset_extended:
8914 reg = LEB ();
8915 roffs = LEB ();
8916 if (! do_debug_frames_interp)
8917 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8918 reg, roffs * fc->data_factor);
8919 fc->col_type[reg] = DW_CFA_offset;
8920 fc->col_offset[reg] = roffs * fc->data_factor;
8921 break;
8923 case DW_CFA_restore_extended:
8924 reg = LEB ();
8925 if (! do_debug_frames_interp)
8926 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8927 fc->col_type[reg] = cie->col_type[reg];
8928 fc->col_offset[reg] = cie->col_offset[reg];
8929 break;
8931 case DW_CFA_undefined:
8932 reg = LEB ();
8933 if (! do_debug_frames_interp)
8934 printf (" DW_CFA_undefined: r%ld\n", reg);
8935 fc->col_type[reg] = DW_CFA_undefined;
8936 fc->col_offset[reg] = 0;
8937 break;
8939 case DW_CFA_same_value:
8940 reg = LEB ();
8941 if (! do_debug_frames_interp)
8942 printf (" DW_CFA_same_value: r%ld\n", reg);
8943 fc->col_type[reg] = DW_CFA_same_value;
8944 fc->col_offset[reg] = 0;
8945 break;
8947 case DW_CFA_register:
8948 reg = LEB ();
8949 roffs = LEB ();
8950 if (! do_debug_frames_interp)
8951 printf (" DW_CFA_register: r%ld\n", reg);
8952 fc->col_type[reg] = DW_CFA_register;
8953 fc->col_offset[reg] = roffs;
8954 break;
8956 case DW_CFA_remember_state:
8957 if (! do_debug_frames_interp)
8958 printf (" DW_CFA_remember_state\n");
8959 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8960 rs->ncols = fc->ncols;
8961 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8962 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8963 memcpy (rs->col_type, fc->col_type, rs->ncols);
8964 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8965 rs->next = remembered_state;
8966 remembered_state = rs;
8967 break;
8969 case DW_CFA_restore_state:
8970 if (! do_debug_frames_interp)
8971 printf (" DW_CFA_restore_state\n");
8972 rs = remembered_state;
8973 remembered_state = rs->next;
8974 frame_need_space (fc, rs->ncols-1);
8975 memcpy (fc->col_type, rs->col_type, rs->ncols);
8976 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8977 free (rs->col_type);
8978 free (rs->col_offset);
8979 free (rs);
8980 break;
8982 case DW_CFA_def_cfa:
8983 fc->cfa_reg = LEB ();
8984 fc->cfa_offset = LEB ();
8985 if (! do_debug_frames_interp)
8986 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8987 fc->cfa_reg, fc->cfa_offset);
8988 break;
8990 case DW_CFA_def_cfa_register:
8991 fc->cfa_reg = LEB ();
8992 if (! do_debug_frames_interp)
8993 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8994 break;
8996 case DW_CFA_def_cfa_offset:
8997 fc->cfa_offset = LEB ();
8998 if (! do_debug_frames_interp)
8999 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
9000 break;
9002 case DW_CFA_nop:
9003 if (! do_debug_frames_interp)
9004 printf (" DW_CFA_nop\n");
9005 break;
9007 case DW_CFA_offset_extended_sf:
9008 reg = LEB ();
9009 l = SLEB ();
9010 frame_need_space (fc, reg);
9011 if (! do_debug_frames_interp)
9012 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9013 reg, l * fc->data_factor);
9014 fc->col_type[reg] = DW_CFA_offset;
9015 fc->col_offset[reg] = l * fc->data_factor;
9016 break;
9018 case DW_CFA_def_cfa_sf:
9019 fc->cfa_reg = LEB ();
9020 fc->cfa_offset = SLEB ();
9021 if (! do_debug_frames_interp)
9022 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9023 fc->cfa_reg, fc->cfa_offset);
9024 break;
9026 case DW_CFA_def_cfa_offset_sf:
9027 fc->cfa_offset = SLEB ();
9028 if (! do_debug_frames_interp)
9029 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
9030 break;
9032 case DW_CFA_GNU_window_save:
9033 if (! do_debug_frames_interp)
9034 printf (" DW_CFA_GNU_window_save\n");
9035 break;
9037 case DW_CFA_GNU_args_size:
9038 ul = LEB ();
9039 if (! do_debug_frames_interp)
9040 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
9041 break;
9043 case DW_CFA_GNU_negative_offset_extended:
9044 reg = LEB ();
9045 l = - LEB ();
9046 frame_need_space (fc, reg);
9047 if (! do_debug_frames_interp)
9048 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9049 reg, l * fc->data_factor);
9050 fc->col_type[reg] = DW_CFA_offset;
9051 fc->col_offset[reg] = l * fc->data_factor;
9052 break;
9054 /* FIXME: How do we handle these? */
9055 case DW_CFA_def_cfa_expression:
9056 fprintf (stderr, "unsupported DW_CFA_def_cfa_expression\n");
9057 start = block_end;
9058 break;
9060 case DW_CFA_expression:
9061 fprintf (stderr, "unsupported DW_CFA_expression\n");
9062 start = block_end;
9063 break;
9065 default:
9066 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
9067 start = block_end;
9071 if (do_debug_frames_interp)
9072 frame_display_row (fc, &need_col_headers, &max_regs);
9074 start = block_end;
9077 printf ("\n");
9079 return 1;
9082 #undef GET
9083 #undef LEB
9084 #undef SLEB
9086 static int
9087 display_debug_not_supported (section, start, file)
9088 Elf_Internal_Shdr *section;
9089 unsigned char *start ATTRIBUTE_UNUSED;
9090 FILE *file ATTRIBUTE_UNUSED;
9092 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9093 SECTION_NAME (section));
9095 return 1;
9098 /* Pre-scan the .debug_info section to record the size of address.
9099 When dumping the .debug_line, we use that size information, assuming
9100 that all compilation units have the same address size. */
9101 static int
9102 prescan_debug_info (section, start, file)
9103 Elf_Internal_Shdr *section ATTRIBUTE_UNUSED;
9104 unsigned char *start;
9105 FILE *file ATTRIBUTE_UNUSED;
9107 DWARF2_External_CompUnit *external;
9109 external = (DWARF2_External_CompUnit *) start;
9111 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
9112 return 0;
9115 /* A structure containing the name of a debug section and a pointer
9116 to a function that can decode it. The third field is a prescan
9117 function to be run over the section before displaying any of the
9118 sections. */
9119 struct
9121 const char *const name;
9122 int (*display) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9123 int (*prescan) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9125 debug_displays[] =
9127 { ".debug_abbrev", display_debug_abbrev, NULL },
9128 { ".debug_aranges", display_debug_aranges, NULL },
9129 { ".debug_frame", display_debug_frames, NULL },
9130 { ".debug_info", display_debug_info, prescan_debug_info },
9131 { ".debug_line", display_debug_lines, NULL },
9132 { ".debug_pubnames", display_debug_pubnames, NULL },
9133 { ".eh_frame", display_debug_frames, NULL },
9134 { ".debug_macinfo", display_debug_macinfo, NULL },
9135 { ".debug_str", display_debug_str, NULL },
9136 { ".debug_loc", display_debug_loc, NULL },
9137 { ".debug_pubtypes", display_debug_not_supported, NULL },
9138 { ".debug_ranges", display_debug_not_supported, NULL },
9139 { ".debug_static_func", display_debug_not_supported, NULL },
9140 { ".debug_static_vars", display_debug_not_supported, NULL },
9141 { ".debug_types", display_debug_not_supported, NULL },
9142 { ".debug_weaknames", display_debug_not_supported, NULL }
9145 static int
9146 display_debug_section (section, file)
9147 Elf_Internal_Shdr *section;
9148 FILE *file;
9150 char *name = SECTION_NAME (section);
9151 bfd_size_type length;
9152 unsigned char *start;
9153 int i;
9155 length = section->sh_size;
9156 if (length == 0)
9158 printf (_("\nSection '%s' has no debugging data.\n"), name);
9159 return 0;
9162 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
9163 _("debug section data"));
9164 if (!start)
9165 return 0;
9167 /* See if we know how to display the contents of this section. */
9168 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
9169 name = ".debug_info";
9171 for (i = NUM_ELEM (debug_displays); i--;)
9172 if (strcmp (debug_displays[i].name, name) == 0)
9174 debug_displays[i].display (section, start, file);
9175 break;
9178 if (i == -1)
9179 printf (_("Unrecognized debug section: %s\n"), name);
9181 free (start);
9183 /* If we loaded in the abbrev section at some point,
9184 we must release it here. */
9185 free_abbrevs ();
9187 return 1;
9190 static int
9191 process_section_contents (file)
9192 FILE *file;
9194 Elf_Internal_Shdr *section;
9195 unsigned int i;
9197 if (! do_dump)
9198 return 1;
9200 /* Pre-scan the debug sections to find some debug information not
9201 present in some of them. For the .debug_line, we must find out the
9202 size of address (specified in .debug_info and .debug_aranges). */
9203 for (i = 0, section = section_headers;
9204 i < elf_header.e_shnum && i < num_dump_sects;
9205 i++, section++)
9207 char *name = SECTION_NAME (section);
9208 int j;
9210 if (section->sh_size == 0)
9211 continue;
9213 /* See if there is some pre-scan operation for this section. */
9214 for (j = NUM_ELEM (debug_displays); j--;)
9215 if (strcmp (debug_displays[j].name, name) == 0)
9217 if (debug_displays[j].prescan != NULL)
9219 bfd_size_type length;
9220 unsigned char *start;
9222 length = section->sh_size;
9223 start = ((unsigned char *)
9224 get_data (NULL, file, section->sh_offset, length,
9225 _("debug section data")));
9226 if (!start)
9227 return 0;
9229 debug_displays[j].prescan (section, start, file);
9230 free (start);
9233 break;
9237 for (i = 0, section = section_headers;
9238 i < elf_header.e_shnum && i < num_dump_sects;
9239 i++, section++)
9241 #ifdef SUPPORT_DISASSEMBLY
9242 if (dump_sects[i] & DISASS_DUMP)
9243 disassemble_section (section, file);
9244 #endif
9245 if (dump_sects[i] & HEX_DUMP)
9246 dump_section (section, file);
9248 if (dump_sects[i] & DEBUG_DUMP)
9249 display_debug_section (section, file);
9252 if (i < num_dump_sects)
9253 warn (_("Some sections were not dumped because they do not exist!\n"));
9255 return 1;
9258 static void
9259 process_mips_fpe_exception (mask)
9260 int mask;
9262 if (mask)
9264 int first = 1;
9265 if (mask & OEX_FPU_INEX)
9266 fputs ("INEX", stdout), first = 0;
9267 if (mask & OEX_FPU_UFLO)
9268 printf ("%sUFLO", first ? "" : "|"), first = 0;
9269 if (mask & OEX_FPU_OFLO)
9270 printf ("%sOFLO", first ? "" : "|"), first = 0;
9271 if (mask & OEX_FPU_DIV0)
9272 printf ("%sDIV0", first ? "" : "|"), first = 0;
9273 if (mask & OEX_FPU_INVAL)
9274 printf ("%sINVAL", first ? "" : "|");
9276 else
9277 fputs ("0", stdout);
9280 static int
9281 process_mips_specific (file)
9282 FILE *file;
9284 Elf_Internal_Dyn *entry;
9285 size_t liblist_offset = 0;
9286 size_t liblistno = 0;
9287 size_t conflictsno = 0;
9288 size_t options_offset = 0;
9289 size_t conflicts_offset = 0;
9291 /* We have a lot of special sections. Thanks SGI! */
9292 if (dynamic_segment == NULL)
9293 /* No information available. */
9294 return 0;
9296 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
9297 switch (entry->d_tag)
9299 case DT_MIPS_LIBLIST:
9300 liblist_offset = entry->d_un.d_val - loadaddr;
9301 break;
9302 case DT_MIPS_LIBLISTNO:
9303 liblistno = entry->d_un.d_val;
9304 break;
9305 case DT_MIPS_OPTIONS:
9306 options_offset = entry->d_un.d_val - loadaddr;
9307 break;
9308 case DT_MIPS_CONFLICT:
9309 conflicts_offset = entry->d_un.d_val - loadaddr;
9310 break;
9311 case DT_MIPS_CONFLICTNO:
9312 conflictsno = entry->d_un.d_val;
9313 break;
9314 default:
9315 break;
9318 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9320 Elf32_External_Lib *elib;
9321 size_t cnt;
9323 elib = ((Elf32_External_Lib *)
9324 get_data (NULL, file, liblist_offset,
9325 liblistno * sizeof (Elf32_External_Lib),
9326 _("liblist")));
9327 if (elib)
9329 printf ("\nSection '.liblist' contains %lu entries:\n",
9330 (unsigned long) liblistno);
9331 fputs (" Library Time Stamp Checksum Version Flags\n",
9332 stdout);
9334 for (cnt = 0; cnt < liblistno; ++cnt)
9336 Elf32_Lib liblist;
9337 time_t time;
9338 char timebuf[20];
9339 struct tm *tmp;
9341 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9342 time = BYTE_GET (elib[cnt].l_time_stamp);
9343 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9344 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9345 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9347 tmp = gmtime (&time);
9348 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9349 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9350 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9352 printf ("%3lu: ", (unsigned long) cnt);
9353 print_symbol (20, dynamic_strings + liblist.l_name);
9354 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9355 liblist.l_version);
9357 if (liblist.l_flags == 0)
9358 puts (" NONE");
9359 else
9361 static const struct
9363 const char *name;
9364 int bit;
9366 l_flags_vals[] =
9368 { " EXACT_MATCH", LL_EXACT_MATCH },
9369 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9370 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9371 { " EXPORTS", LL_EXPORTS },
9372 { " DELAY_LOAD", LL_DELAY_LOAD },
9373 { " DELTA", LL_DELTA }
9375 int flags = liblist.l_flags;
9376 size_t fcnt;
9378 for (fcnt = 0;
9379 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9380 ++fcnt)
9381 if ((flags & l_flags_vals[fcnt].bit) != 0)
9383 fputs (l_flags_vals[fcnt].name, stdout);
9384 flags ^= l_flags_vals[fcnt].bit;
9386 if (flags != 0)
9387 printf (" %#x", (unsigned int) flags);
9389 puts ("");
9393 free (elib);
9397 if (options_offset != 0)
9399 Elf_External_Options *eopt;
9400 Elf_Internal_Shdr *sect = section_headers;
9401 Elf_Internal_Options *iopt;
9402 Elf_Internal_Options *option;
9403 size_t offset;
9404 int cnt;
9406 /* Find the section header so that we get the size. */
9407 while (sect->sh_type != SHT_MIPS_OPTIONS)
9408 ++sect;
9410 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9411 sect->sh_size, _("options"));
9412 if (eopt)
9414 iopt = ((Elf_Internal_Options *)
9415 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt)));
9416 if (iopt == NULL)
9418 error (_("Out of memory"));
9419 return 0;
9422 offset = cnt = 0;
9423 option = iopt;
9425 while (offset < sect->sh_size)
9427 Elf_External_Options *eoption;
9429 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9431 option->kind = BYTE_GET (eoption->kind);
9432 option->size = BYTE_GET (eoption->size);
9433 option->section = BYTE_GET (eoption->section);
9434 option->info = BYTE_GET (eoption->info);
9436 offset += option->size;
9438 ++option;
9439 ++cnt;
9442 printf (_("\nSection '%s' contains %d entries:\n"),
9443 SECTION_NAME (sect), cnt);
9445 option = iopt;
9447 while (cnt-- > 0)
9449 size_t len;
9451 switch (option->kind)
9453 case ODK_NULL:
9454 /* This shouldn't happen. */
9455 printf (" NULL %d %lx", option->section, option->info);
9456 break;
9457 case ODK_REGINFO:
9458 printf (" REGINFO ");
9459 if (elf_header.e_machine == EM_MIPS)
9461 /* 32bit form. */
9462 Elf32_External_RegInfo *ereg;
9463 Elf32_RegInfo reginfo;
9465 ereg = (Elf32_External_RegInfo *) (option + 1);
9466 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9467 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9468 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9469 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9470 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9471 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9473 printf ("GPR %08lx GP 0x%lx\n",
9474 reginfo.ri_gprmask,
9475 (unsigned long) reginfo.ri_gp_value);
9476 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9477 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9478 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9480 else
9482 /* 64 bit form. */
9483 Elf64_External_RegInfo *ereg;
9484 Elf64_Internal_RegInfo reginfo;
9486 ereg = (Elf64_External_RegInfo *) (option + 1);
9487 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9488 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9489 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9490 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9491 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9492 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9494 printf ("GPR %08lx GP 0x",
9495 reginfo.ri_gprmask);
9496 printf_vma (reginfo.ri_gp_value);
9497 printf ("\n");
9499 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9500 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9501 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9503 ++option;
9504 continue;
9505 case ODK_EXCEPTIONS:
9506 fputs (" EXCEPTIONS fpe_min(", stdout);
9507 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9508 fputs (") fpe_max(", stdout);
9509 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9510 fputs (")", stdout);
9512 if (option->info & OEX_PAGE0)
9513 fputs (" PAGE0", stdout);
9514 if (option->info & OEX_SMM)
9515 fputs (" SMM", stdout);
9516 if (option->info & OEX_FPDBUG)
9517 fputs (" FPDBUG", stdout);
9518 if (option->info & OEX_DISMISS)
9519 fputs (" DISMISS", stdout);
9520 break;
9521 case ODK_PAD:
9522 fputs (" PAD ", stdout);
9523 if (option->info & OPAD_PREFIX)
9524 fputs (" PREFIX", stdout);
9525 if (option->info & OPAD_POSTFIX)
9526 fputs (" POSTFIX", stdout);
9527 if (option->info & OPAD_SYMBOL)
9528 fputs (" SYMBOL", stdout);
9529 break;
9530 case ODK_HWPATCH:
9531 fputs (" HWPATCH ", stdout);
9532 if (option->info & OHW_R4KEOP)
9533 fputs (" R4KEOP", stdout);
9534 if (option->info & OHW_R8KPFETCH)
9535 fputs (" R8KPFETCH", stdout);
9536 if (option->info & OHW_R5KEOP)
9537 fputs (" R5KEOP", stdout);
9538 if (option->info & OHW_R5KCVTL)
9539 fputs (" R5KCVTL", stdout);
9540 break;
9541 case ODK_FILL:
9542 fputs (" FILL ", stdout);
9543 /* XXX Print content of info word? */
9544 break;
9545 case ODK_TAGS:
9546 fputs (" TAGS ", stdout);
9547 /* XXX Print content of info word? */
9548 break;
9549 case ODK_HWAND:
9550 fputs (" HWAND ", stdout);
9551 if (option->info & OHWA0_R4KEOP_CHECKED)
9552 fputs (" R4KEOP_CHECKED", stdout);
9553 if (option->info & OHWA0_R4KEOP_CLEAN)
9554 fputs (" R4KEOP_CLEAN", stdout);
9555 break;
9556 case ODK_HWOR:
9557 fputs (" HWOR ", stdout);
9558 if (option->info & OHWA0_R4KEOP_CHECKED)
9559 fputs (" R4KEOP_CHECKED", stdout);
9560 if (option->info & OHWA0_R4KEOP_CLEAN)
9561 fputs (" R4KEOP_CLEAN", stdout);
9562 break;
9563 case ODK_GP_GROUP:
9564 printf (" GP_GROUP %#06lx self-contained %#06lx",
9565 option->info & OGP_GROUP,
9566 (option->info & OGP_SELF) >> 16);
9567 break;
9568 case ODK_IDENT:
9569 printf (" IDENT %#06lx self-contained %#06lx",
9570 option->info & OGP_GROUP,
9571 (option->info & OGP_SELF) >> 16);
9572 break;
9573 default:
9574 /* This shouldn't happen. */
9575 printf (" %3d ??? %d %lx",
9576 option->kind, option->section, option->info);
9577 break;
9580 len = sizeof (*eopt);
9581 while (len < option->size)
9582 if (((char *) option)[len] >= ' '
9583 && ((char *) option)[len] < 0x7f)
9584 printf ("%c", ((char *) option)[len++]);
9585 else
9586 printf ("\\%03o", ((char *) option)[len++]);
9588 fputs ("\n", stdout);
9589 ++option;
9592 free (eopt);
9596 if (conflicts_offset != 0 && conflictsno != 0)
9598 Elf32_Conflict *iconf;
9599 size_t cnt;
9601 if (dynamic_symbols == NULL)
9603 error (_("conflict list found without a dynamic symbol table"));
9604 return 0;
9607 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
9608 if (iconf == NULL)
9610 error (_("Out of memory"));
9611 return 0;
9614 if (is_32bit_elf)
9616 Elf32_External_Conflict *econf32;
9618 econf32 = ((Elf32_External_Conflict *)
9619 get_data (NULL, file, conflicts_offset,
9620 conflictsno * sizeof (*econf32),
9621 _("conflict")));
9622 if (!econf32)
9623 return 0;
9625 for (cnt = 0; cnt < conflictsno; ++cnt)
9626 iconf[cnt] = BYTE_GET (econf32[cnt]);
9628 free (econf32);
9630 else
9632 Elf64_External_Conflict *econf64;
9634 econf64 = ((Elf64_External_Conflict *)
9635 get_data (NULL, file, conflicts_offset,
9636 conflictsno * sizeof (*econf64),
9637 _("conflict")));
9638 if (!econf64)
9639 return 0;
9641 for (cnt = 0; cnt < conflictsno; ++cnt)
9642 iconf[cnt] = BYTE_GET (econf64[cnt]);
9644 free (econf64);
9647 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9648 (long) conflictsno);
9649 puts (_(" Num: Index Value Name"));
9651 for (cnt = 0; cnt < conflictsno; ++cnt)
9653 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
9655 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
9656 print_vma (psym->st_value, FULL_HEX);
9657 putchar (' ');
9658 print_symbol (25, dynamic_strings + psym->st_name);
9659 putchar ('\n');
9662 free (iconf);
9665 return 1;
9668 static int
9669 process_gnu_liblist (file)
9670 FILE *file;
9672 Elf_Internal_Shdr *section, *string_sec;
9673 Elf32_External_Lib *elib;
9674 char *strtab;
9675 size_t cnt;
9676 unsigned i;
9678 if (! do_arch)
9679 return 0;
9681 for (i = 0, section = section_headers;
9682 i < elf_header.e_shnum;
9683 i++, section++)
9685 switch (section->sh_type)
9687 case SHT_GNU_LIBLIST:
9688 elib = ((Elf32_External_Lib *)
9689 get_data (NULL, file, section->sh_offset, section->sh_size,
9690 _("liblist")));
9692 if (elib == NULL)
9693 break;
9694 string_sec = SECTION_HEADER (section->sh_link);
9696 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9697 string_sec->sh_size,
9698 _("liblist string table"));
9700 if (strtab == NULL
9701 || section->sh_entsize != sizeof (Elf32_External_Lib))
9703 free (elib);
9704 break;
9707 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9708 SECTION_NAME (section),
9709 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9711 puts (" Library Time Stamp Checksum Version Flags");
9713 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9714 ++cnt)
9716 Elf32_Lib liblist;
9717 time_t time;
9718 char timebuf[20];
9719 struct tm *tmp;
9721 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9722 time = BYTE_GET (elib[cnt].l_time_stamp);
9723 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9724 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9725 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9727 tmp = gmtime (&time);
9728 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9729 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9730 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9732 printf ("%3lu: ", (unsigned long) cnt);
9733 if (do_wide)
9734 printf ("%-20s", strtab + liblist.l_name);
9735 else
9736 printf ("%-20.20s", strtab + liblist.l_name);
9737 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9738 liblist.l_version, liblist.l_flags);
9741 free (elib);
9745 return 1;
9748 static const char *
9749 get_note_type (e_type)
9750 unsigned e_type;
9752 static char buff[64];
9754 switch (e_type)
9756 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9757 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9758 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9759 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9760 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9761 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9762 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9763 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9764 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9765 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9766 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9767 default:
9768 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9769 return buff;
9773 static const char *
9774 get_netbsd_elfcore_note_type (e_type)
9775 unsigned e_type;
9777 static char buff[64];
9779 if (e_type == NT_NETBSDCORE_PROCINFO)
9781 /* NetBSD core "procinfo" structure. */
9782 return _("NetBSD procinfo structure");
9785 /* As of Jan 2002 there are no other machine-independent notes
9786 defined for NetBSD core files. If the note type is less
9787 than the start of the machine-dependent note types, we don't
9788 understand it. */
9790 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9792 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9793 return buff;
9796 switch (elf_header.e_machine)
9798 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9799 and PT_GETFPREGS == mach+2. */
9801 case EM_OLD_ALPHA:
9802 case EM_ALPHA:
9803 case EM_SPARC:
9804 case EM_SPARC32PLUS:
9805 case EM_SPARCV9:
9806 switch (e_type)
9808 case NT_NETBSDCORE_FIRSTMACH+0:
9809 return _("PT_GETREGS (reg structure)");
9810 case NT_NETBSDCORE_FIRSTMACH+2:
9811 return _("PT_GETFPREGS (fpreg structure)");
9812 default:
9813 break;
9815 break;
9817 /* On all other arch's, PT_GETREGS == mach+1 and
9818 PT_GETFPREGS == mach+3. */
9819 default:
9820 switch (e_type)
9822 case NT_NETBSDCORE_FIRSTMACH+1:
9823 return _("PT_GETREGS (reg structure)");
9824 case NT_NETBSDCORE_FIRSTMACH+3:
9825 return _("PT_GETFPREGS (fpreg structure)");
9826 default:
9827 break;
9831 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9832 return buff;
9835 /* Note that by the ELF standard, the name field is already null byte
9836 terminated, and namesz includes the terminating null byte.
9837 I.E. the value of namesz for the name "FSF" is 4.
9839 If the value of namesz is zero, there is no name present. */
9840 static int
9841 process_note (pnote)
9842 Elf_Internal_Note *pnote;
9844 const char *nt;
9846 if (pnote->namesz == 0)
9848 /* If there is no note name, then use the default set of
9849 note type strings. */
9850 nt = get_note_type (pnote->type);
9852 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9854 /* NetBSD-specific core file notes. */
9855 nt = get_netbsd_elfcore_note_type (pnote->type);
9857 else
9859 /* Don't recognize this note name; just use the default set of
9860 note type strings. */
9861 nt = get_note_type (pnote->type);
9864 printf (" %s\t\t0x%08lx\t%s\n",
9865 pnote->namesz ? pnote->namedata : "(NONE)",
9866 pnote->descsz, nt);
9867 return 1;
9871 static int
9872 process_corefile_note_segment (file, offset, length)
9873 FILE *file;
9874 bfd_vma offset;
9875 bfd_vma length;
9877 Elf_External_Note *pnotes;
9878 Elf_External_Note *external;
9879 int res = 1;
9881 if (length <= 0)
9882 return 0;
9884 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9885 _("notes"));
9886 if (!pnotes)
9887 return 0;
9889 external = pnotes;
9891 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9892 (unsigned long) offset, (unsigned long) length);
9893 printf (_(" Owner\t\tData size\tDescription\n"));
9895 while (external < (Elf_External_Note *)((char *) pnotes + length))
9897 Elf_External_Note *next;
9898 Elf_Internal_Note inote;
9899 char *temp = NULL;
9901 inote.type = BYTE_GET (external->type);
9902 inote.namesz = BYTE_GET (external->namesz);
9903 inote.namedata = external->name;
9904 inote.descsz = BYTE_GET (external->descsz);
9905 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9906 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9908 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9910 if (((char *) next) > (((char *) pnotes) + length))
9912 warn (_("corrupt note found at offset %x into core notes\n"),
9913 ((char *) external) - ((char *) pnotes));
9914 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9915 inote.type, inote.namesz, inote.descsz);
9916 break;
9919 external = next;
9921 /* Verify that name is null terminated. It appears that at least
9922 one version of Linux (RedHat 6.0) generates corefiles that don't
9923 comply with the ELF spec by failing to include the null byte in
9924 namesz. */
9925 if (inote.namedata[inote.namesz] != '\0')
9927 temp = malloc (inote.namesz + 1);
9929 if (temp == NULL)
9931 error (_("Out of memory\n"));
9932 res = 0;
9933 break;
9936 strncpy (temp, inote.namedata, inote.namesz);
9937 temp[inote.namesz] = 0;
9939 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9940 inote.namedata = temp;
9943 res &= process_note (& inote);
9945 if (temp != NULL)
9947 free (temp);
9948 temp = NULL;
9952 free (pnotes);
9954 return res;
9957 static int
9958 process_corefile_note_segments (file)
9959 FILE *file;
9961 Elf_Internal_Phdr *program_headers;
9962 Elf_Internal_Phdr *segment;
9963 unsigned int i;
9964 int res = 1;
9966 program_headers = (Elf_Internal_Phdr *) malloc
9967 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9969 if (program_headers == NULL)
9971 error (_("Out of memory\n"));
9972 return 0;
9975 if (is_32bit_elf)
9976 i = get_32bit_program_headers (file, program_headers);
9977 else
9978 i = get_64bit_program_headers (file, program_headers);
9980 if (i == 0)
9982 free (program_headers);
9983 return 0;
9986 for (i = 0, segment = program_headers;
9987 i < elf_header.e_phnum;
9988 i++, segment++)
9990 if (segment->p_type == PT_NOTE)
9991 res &= process_corefile_note_segment (file,
9992 (bfd_vma) segment->p_offset,
9993 (bfd_vma) segment->p_filesz);
9996 free (program_headers);
9998 return res;
10001 static int
10002 process_corefile_contents (file)
10003 FILE *file;
10005 /* If we have not been asked to display the notes then do nothing. */
10006 if (! do_notes)
10007 return 1;
10009 /* If file is not a core file then exit. */
10010 if (elf_header.e_type != ET_CORE)
10011 return 1;
10013 /* No program headers means no NOTE segment. */
10014 if (elf_header.e_phnum == 0)
10016 printf (_("No note segments present in the core file.\n"));
10017 return 1;
10020 return process_corefile_note_segments (file);
10023 static int
10024 process_arch_specific (file)
10025 FILE *file;
10027 if (! do_arch)
10028 return 1;
10030 switch (elf_header.e_machine)
10032 case EM_MIPS:
10033 case EM_MIPS_RS3_LE:
10034 return process_mips_specific (file);
10035 break;
10036 default:
10037 break;
10039 return 1;
10042 static int
10043 get_file_header (file)
10044 FILE *file;
10046 /* Read in the identity array. */
10047 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
10048 return 0;
10050 /* Determine how to read the rest of the header. */
10051 switch (elf_header.e_ident[EI_DATA])
10053 default: /* fall through */
10054 case ELFDATANONE: /* fall through */
10055 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
10056 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
10059 /* For now we only support 32 bit and 64 bit ELF files. */
10060 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
10062 /* Read in the rest of the header. */
10063 if (is_32bit_elf)
10065 Elf32_External_Ehdr ehdr32;
10067 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
10068 return 0;
10070 elf_header.e_type = BYTE_GET (ehdr32.e_type);
10071 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
10072 elf_header.e_version = BYTE_GET (ehdr32.e_version);
10073 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
10074 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
10075 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
10076 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
10077 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
10078 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
10079 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
10080 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
10081 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
10082 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
10084 else
10086 Elf64_External_Ehdr ehdr64;
10088 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10089 we will not be able to cope with the 64bit data found in
10090 64 ELF files. Detect this now and abort before we start
10091 overwritting things. */
10092 if (sizeof (bfd_vma) < 8)
10094 error (_("This instance of readelf has been built without support for a\n\
10095 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10096 return 0;
10099 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
10100 return 0;
10102 elf_header.e_type = BYTE_GET (ehdr64.e_type);
10103 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
10104 elf_header.e_version = BYTE_GET (ehdr64.e_version);
10105 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
10106 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
10107 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
10108 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
10109 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
10110 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
10111 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
10112 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
10113 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
10114 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
10117 if (elf_header.e_shoff)
10119 /* There may be some extensions in the first section header. Don't
10120 bomb if we can't read it. */
10121 if (is_32bit_elf)
10122 get_32bit_section_headers (file, 1);
10123 else
10124 get_64bit_section_headers (file, 1);
10127 return 1;
10130 static int
10131 process_file (file_name)
10132 char *file_name;
10134 FILE *file;
10135 struct stat statbuf;
10136 unsigned int i;
10138 if (stat (file_name, & statbuf) < 0)
10140 error (_("Cannot stat input file %s.\n"), file_name);
10141 return 1;
10144 file = fopen (file_name, "rb");
10145 if (file == NULL)
10147 error (_("Input file %s not found.\n"), file_name);
10148 return 1;
10151 if (! get_file_header (file))
10153 error (_("%s: Failed to read file header\n"), file_name);
10154 fclose (file);
10155 return 1;
10158 /* Initialise per file variables. */
10159 for (i = NUM_ELEM (version_info); i--;)
10160 version_info[i] = 0;
10162 for (i = NUM_ELEM (dynamic_info); i--;)
10163 dynamic_info[i] = 0;
10165 /* Process the file. */
10166 if (show_name)
10167 printf (_("\nFile: %s\n"), file_name);
10169 if (! process_file_header ())
10171 fclose (file);
10172 return 1;
10175 if (! process_section_headers (file))
10177 /* Without loaded section headers we
10178 cannot process lots of things. */
10179 do_unwind = do_version = do_dump = do_arch = 0;
10181 if (! do_using_dynamic)
10182 do_syms = do_reloc = 0;
10185 if (process_program_headers (file))
10186 process_dynamic_segment (file);
10188 process_relocs (file);
10190 process_unwind (file);
10192 process_symbol_table (file);
10194 process_syminfo (file);
10196 process_version_sections (file);
10198 process_section_contents (file);
10200 process_corefile_contents (file);
10202 process_gnu_liblist (file);
10204 process_arch_specific (file);
10206 fclose (file);
10208 if (section_headers)
10210 free (section_headers);
10211 section_headers = NULL;
10214 if (string_table)
10216 free (string_table);
10217 string_table = NULL;
10218 string_table_length = 0;
10221 if (dynamic_strings)
10223 free (dynamic_strings);
10224 dynamic_strings = NULL;
10227 if (dynamic_symbols)
10229 free (dynamic_symbols);
10230 dynamic_symbols = NULL;
10231 num_dynamic_syms = 0;
10234 if (dynamic_syminfo)
10236 free (dynamic_syminfo);
10237 dynamic_syminfo = NULL;
10240 return 0;
10243 #ifdef SUPPORT_DISASSEMBLY
10244 /* Needed by the i386 disassembler. For extra credit, someone could
10245 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10246 symbols. */
10248 void
10249 print_address (unsigned int addr, FILE *outfile)
10251 fprintf (outfile,"0x%8.8x", addr);
10254 /* Needed by the i386 disassembler. */
10255 void
10256 db_task_printsym (unsigned int addr)
10258 print_address (addr, stderr);
10260 #endif
10262 int main PARAMS ((int, char **));
10265 main (argc, argv)
10266 int argc;
10267 char **argv;
10269 int err;
10271 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10272 setlocale (LC_MESSAGES, "");
10273 #endif
10274 #if defined (HAVE_SETLOCALE)
10275 setlocale (LC_CTYPE, "");
10276 #endif
10277 bindtextdomain (PACKAGE, LOCALEDIR);
10278 textdomain (PACKAGE);
10280 parse_args (argc, argv);
10282 if (optind < (argc - 1))
10283 show_name = 1;
10285 err = 0;
10286 while (optind < argc)
10287 err |= process_file (argv[optind++]);
10289 if (dump_sects != NULL)
10290 free (dump_sects);
10292 return err;