]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
* readelf.c (get_machine_flags): Handle E_MIPS_ARCH_32R2.
[thirdparty/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
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.
13
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.
18
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. */
23 \f
24
25 #include <assert.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <stdio.h>
29 #include <time.h>
30
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
38
39 #include "bfd.h"
40
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
45
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() */
49
50 #define RELOC_MACROS_GEN_FUNC
51
52 #include "elf/alpha.h"
53 #include "elf/arc.h"
54 #include "elf/arm.h"
55 #include "elf/avr.h"
56 #include "elf/cris.h"
57 #include "elf/d10v.h"
58 #include "elf/d30v.h"
59 #include "elf/dlx.h"
60 #include "elf/fr30.h"
61 #include "elf/frv.h"
62 #include "elf/h8.h"
63 #include "elf/hppa.h"
64 #include "elf/i386.h"
65 #include "elf/i370.h"
66 #include "elf/i860.h"
67 #include "elf/i960.h"
68 #include "elf/ia64.h"
69 #include "elf/ip2k.h"
70 #include "elf/m32r.h"
71 #include "elf/m68k.h"
72 #include "elf/m68hc11.h"
73 #include "elf/mcore.h"
74 #include "elf/mips.h"
75 #include "elf/mmix.h"
76 #include "elf/mn10200.h"
77 #include "elf/mn10300.h"
78 #include "elf/msp430.h"
79 #include "elf/or32.h"
80 #include "elf/pj.h"
81 #include "elf/ppc.h"
82 #include "elf/s390.h"
83 #include "elf/sh.h"
84 #include "elf/sparc.h"
85 #include "elf/v850.h"
86 #include "elf/vax.h"
87 #include "elf/x86-64.h"
88 #include "elf/xstormy16.h"
89
90 #include "bucomm.h"
91 #include "getopt.h"
92
93 char *program_name = "readelf";
94 unsigned long dynamic_addr;
95 bfd_size_type dynamic_size;
96 char *dynamic_strings;
97 char *string_table;
98 unsigned long string_table_length;
99 unsigned long num_dynamic_syms;
100 Elf_Internal_Sym *dynamic_symbols;
101 Elf_Internal_Syminfo *dynamic_syminfo;
102 unsigned long dynamic_syminfo_offset;
103 unsigned int dynamic_syminfo_nent;
104 char program_interpreter[64];
105 long dynamic_info[DT_JMPREL + 1];
106 long version_info[16];
107 long loadaddr = 0;
108 Elf_Internal_Ehdr elf_header;
109 Elf_Internal_Shdr *section_headers;
110 Elf_Internal_Dyn *dynamic_segment;
111 Elf_Internal_Shdr *symtab_shndx_hdr;
112 int show_name;
113 int do_dynamic;
114 int do_syms;
115 int do_reloc;
116 int do_sections;
117 int do_segments;
118 int do_unwind;
119 int do_using_dynamic;
120 int do_header;
121 int do_dump;
122 int do_version;
123 int do_wide;
124 int do_histogram;
125 int do_debugging;
126 int do_debug_info;
127 int do_debug_abbrevs;
128 int do_debug_lines;
129 int do_debug_pubnames;
130 int do_debug_aranges;
131 int do_debug_frames;
132 int do_debug_frames_interp;
133 int do_debug_macinfo;
134 int do_debug_str;
135 int do_debug_loc;
136 int do_arch;
137 int do_notes;
138 int is_32bit_elf;
139
140 /* A dynamic array of flags indicating which sections require dumping. */
141 char *dump_sects = NULL;
142 unsigned int num_dump_sects = 0;
143
144 #define HEX_DUMP (1 << 0)
145 #define DISASS_DUMP (1 << 1)
146 #define DEBUG_DUMP (1 << 2)
147
148 /* How to rpint a vma value. */
149 typedef enum print_mode
150 {
151 HEX,
152 DEC,
153 DEC_5,
154 UNSIGNED,
155 PREFIX_HEX,
156 FULL_HEX,
157 LONG_HEX
158 }
159 print_mode;
160
161 /* Forward declarations for dumb compilers. */
162 static void print_vma
163 PARAMS ((bfd_vma, print_mode));
164 static void print_symbol
165 PARAMS ((int, const char *));
166 static bfd_vma (*byte_get)
167 PARAMS ((unsigned char *, int));
168 static bfd_vma byte_get_little_endian
169 PARAMS ((unsigned char *, int));
170 static bfd_vma byte_get_big_endian
171 PARAMS ((unsigned char *, int));
172 static const char *get_mips_dynamic_type
173 PARAMS ((unsigned long));
174 static const char *get_sparc64_dynamic_type
175 PARAMS ((unsigned long));
176 static const char *get_ppc64_dynamic_type
177 PARAMS ((unsigned long));
178 static const char *get_parisc_dynamic_type
179 PARAMS ((unsigned long));
180 static const char *get_dynamic_type
181 PARAMS ((unsigned long));
182 static int slurp_rela_relocs
183 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
184 unsigned long *));
185 static int slurp_rel_relocs
186 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
187 unsigned long *));
188 static int dump_relocations
189 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *,
190 unsigned long, char *, int));
191 static char *get_file_type
192 PARAMS ((unsigned));
193 static char *get_machine_name
194 PARAMS ((unsigned));
195 static void decode_ARM_machine_flags
196 PARAMS ((unsigned, char[]));
197 static char *get_machine_flags
198 PARAMS ((unsigned, unsigned));
199 static const char *get_mips_segment_type
200 PARAMS ((unsigned long));
201 static const char *get_parisc_segment_type
202 PARAMS ((unsigned long));
203 static const char *get_ia64_segment_type
204 PARAMS ((unsigned long));
205 static const char *get_segment_type
206 PARAMS ((unsigned long));
207 static const char *get_mips_section_type_name
208 PARAMS ((unsigned int));
209 static const char *get_parisc_section_type_name
210 PARAMS ((unsigned int));
211 static const char *get_ia64_section_type_name
212 PARAMS ((unsigned int));
213 static const char *get_section_type_name
214 PARAMS ((unsigned int));
215 static const char *get_symbol_binding
216 PARAMS ((unsigned int));
217 static const char *get_symbol_type
218 PARAMS ((unsigned int));
219 static const char *get_symbol_visibility
220 PARAMS ((unsigned int));
221 static const char *get_symbol_index_type
222 PARAMS ((unsigned int));
223 static const char *get_dynamic_flags
224 PARAMS ((bfd_vma));
225 static void usage
226 PARAMS ((void));
227 static void parse_args
228 PARAMS ((int, char **));
229 static int process_file_header
230 PARAMS ((void));
231 static int process_program_headers
232 PARAMS ((FILE *));
233 static int process_section_headers
234 PARAMS ((FILE *));
235 static int process_unwind
236 PARAMS ((FILE *));
237 static void dynamic_segment_mips_val
238 PARAMS ((Elf_Internal_Dyn *));
239 static void dynamic_segment_parisc_val
240 PARAMS ((Elf_Internal_Dyn *));
241 static int process_dynamic_segment
242 PARAMS ((FILE *));
243 static int process_symbol_table
244 PARAMS ((FILE *));
245 static int process_syminfo
246 PARAMS ((FILE *));
247 static int process_section_contents
248 PARAMS ((FILE *));
249 static void process_mips_fpe_exception
250 PARAMS ((int));
251 static int process_mips_specific
252 PARAMS ((FILE *));
253 static int process_file
254 PARAMS ((char *));
255 static int process_relocs
256 PARAMS ((FILE *));
257 static int process_version_sections
258 PARAMS ((FILE *));
259 static char *get_ver_flags
260 PARAMS ((unsigned int));
261 static int get_32bit_section_headers
262 PARAMS ((FILE *, unsigned int));
263 static int get_64bit_section_headers
264 PARAMS ((FILE *, unsigned int));
265 static int get_32bit_program_headers
266 PARAMS ((FILE *, Elf_Internal_Phdr *));
267 static int get_64bit_program_headers
268 PARAMS ((FILE *, Elf_Internal_Phdr *));
269 static int get_file_header
270 PARAMS ((FILE *));
271 static Elf_Internal_Sym *get_32bit_elf_symbols
272 PARAMS ((FILE *, Elf_Internal_Shdr *));
273 static Elf_Internal_Sym *get_64bit_elf_symbols
274 PARAMS ((FILE *, Elf_Internal_Shdr *));
275 static const char *get_elf_section_flags
276 PARAMS ((bfd_vma));
277 static int *get_dynamic_data
278 PARAMS ((FILE *, unsigned int));
279 static int get_32bit_dynamic_segment
280 PARAMS ((FILE *));
281 static int get_64bit_dynamic_segment
282 PARAMS ((FILE *));
283 #ifdef SUPPORT_DISASSEMBLY
284 static int disassemble_section
285 PARAMS ((Elf_Internal_Shdr *, FILE *));
286 #endif
287 static int dump_section
288 PARAMS ((Elf_Internal_Shdr *, FILE *));
289 static int display_debug_section
290 PARAMS ((Elf_Internal_Shdr *, FILE *));
291 static int display_debug_info
292 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
293 static int display_debug_not_supported
294 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
295 static int prescan_debug_info
296 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
297 static int display_debug_lines
298 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
299 static int display_debug_pubnames
300 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
301 static int display_debug_abbrev
302 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
303 static int display_debug_aranges
304 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
305 static int display_debug_frames
306 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
307 static int display_debug_macinfo
308 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
309 static int display_debug_str
310 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
311 static int display_debug_loc
312 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
313 static unsigned char *process_abbrev_section
314 PARAMS ((unsigned char *, unsigned char *));
315 static void load_debug_str
316 PARAMS ((FILE *));
317 static void free_debug_str
318 PARAMS ((void));
319 static const char *fetch_indirect_string
320 PARAMS ((unsigned long));
321 static void load_debug_loc
322 PARAMS ((FILE *));
323 static void free_debug_loc
324 PARAMS ((void));
325 static unsigned long read_leb128
326 PARAMS ((unsigned char *, int *, int));
327 static int process_extended_line_op
328 PARAMS ((unsigned char *, int, int));
329 static void reset_state_machine
330 PARAMS ((int));
331 static char *get_TAG_name
332 PARAMS ((unsigned long));
333 static char *get_AT_name
334 PARAMS ((unsigned long));
335 static char *get_FORM_name
336 PARAMS ((unsigned long));
337 static void free_abbrevs
338 PARAMS ((void));
339 static void add_abbrev
340 PARAMS ((unsigned long, unsigned long, int));
341 static void add_abbrev_attr
342 PARAMS ((unsigned long, unsigned long));
343 static unsigned char *read_and_display_attr
344 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
345 unsigned long));
346 static unsigned char *read_and_display_attr_value
347 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
348 unsigned long));
349 static unsigned char *display_block
350 PARAMS ((unsigned char *, unsigned long));
351 static void decode_location_expression
352 PARAMS ((unsigned char *, unsigned int, unsigned long));
353 static void request_dump
354 PARAMS ((unsigned int, int));
355 static const char *get_elf_class
356 PARAMS ((unsigned int));
357 static const char *get_data_encoding
358 PARAMS ((unsigned int));
359 static const char *get_osabi_name
360 PARAMS ((unsigned int));
361 static int guess_is_rela
362 PARAMS ((unsigned long));
363 static const char *get_note_type
364 PARAMS ((unsigned int));
365 static const char *get_netbsd_elfcore_note_type
366 PARAMS ((unsigned int));
367 static int process_note
368 PARAMS ((Elf_Internal_Note *));
369 static int process_corefile_note_segment
370 PARAMS ((FILE *, bfd_vma, bfd_vma));
371 static int process_corefile_note_segments
372 PARAMS ((FILE *));
373 static int process_corefile_contents
374 PARAMS ((FILE *));
375 static int process_arch_specific
376 PARAMS ((FILE *));
377 static int process_gnu_liblist
378 PARAMS ((FILE *));
379
380 typedef int Elf32_Word;
381
382 #define UNKNOWN -1
383
384 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
385 ((X)->sh_name >= string_table_length \
386 ? "<corrupt>" : string_table + (X)->sh_name))
387
388 /* Given st_shndx I, map to section_headers index. */
389 #define SECTION_HEADER_INDEX(I) \
390 ((I) < SHN_LORESERVE \
391 ? (I) \
392 : ((I) <= SHN_HIRESERVE \
393 ? 0 \
394 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
395
396 /* Reverse of the above. */
397 #define SECTION_HEADER_NUM(N) \
398 ((N) < SHN_LORESERVE \
399 ? (N) \
400 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
401
402 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
403
404 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
405
406 #define BYTE_GET(field) byte_get (field, sizeof (field))
407
408 /* If we can support a 64 bit data type then BFD64 should be defined
409 and sizeof (bfd_vma) == 8. In this case when translating from an
410 external 8 byte field to an internal field, we can assume that the
411 internal field is also 8 bytes wide and so we can extract all the data.
412 If, however, BFD64 is not defined, then we must assume that the
413 internal data structure only has 4 byte wide fields that are the
414 equivalent of the 8 byte wide external counterparts, and so we must
415 truncate the data. */
416 #ifdef BFD64
417 #define BYTE_GET8(field) byte_get (field, -8)
418 #else
419 #define BYTE_GET8(field) byte_get (field, 8)
420 #endif
421
422 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
423
424 #define GET_ELF_SYMBOLS(file, section) \
425 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
426 : get_64bit_elf_symbols (file, section))
427
428
429 static void
430 error VPARAMS ((const char *message, ...))
431 {
432 VA_OPEN (args, message);
433 VA_FIXEDARG (args, const char *, message);
434
435 fprintf (stderr, _("%s: Error: "), program_name);
436 vfprintf (stderr, message, args);
437 VA_CLOSE (args);
438 }
439
440 static void
441 warn VPARAMS ((const char *message, ...))
442 {
443 VA_OPEN (args, message);
444 VA_FIXEDARG (args, const char *, message);
445
446 fprintf (stderr, _("%s: Warning: "), program_name);
447 vfprintf (stderr, message, args);
448 VA_CLOSE (args);
449 }
450
451 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
452
453 static PTR
454 get_data (var, file, offset, size, reason)
455 PTR var;
456 FILE *file;
457 long offset;
458 size_t size;
459 const char *reason;
460 {
461 PTR mvar;
462
463 if (size == 0)
464 return NULL;
465
466 if (fseek (file, offset, SEEK_SET))
467 {
468 error (_("Unable to seek to %x for %s\n"), offset, reason);
469 return NULL;
470 }
471
472 mvar = var;
473 if (mvar == NULL)
474 {
475 mvar = (PTR) malloc (size);
476
477 if (mvar == NULL)
478 {
479 error (_("Out of memory allocating %d bytes for %s\n"),
480 size, reason);
481 return NULL;
482 }
483 }
484
485 if (fread (mvar, size, 1, file) != 1)
486 {
487 error (_("Unable to read in %d bytes of %s\n"), size, reason);
488 if (mvar != var)
489 free (mvar);
490 return NULL;
491 }
492
493 return mvar;
494 }
495
496 static bfd_vma
497 byte_get_little_endian (field, size)
498 unsigned char *field;
499 int size;
500 {
501 switch (size)
502 {
503 case 1:
504 return *field;
505
506 case 2:
507 return ((unsigned int) (field[0]))
508 | (((unsigned int) (field[1])) << 8);
509
510 #ifndef BFD64
511 case 8:
512 /* We want to extract data from an 8 byte wide field and
513 place it into a 4 byte wide field. Since this is a little
514 endian source we can just use the 4 byte extraction code. */
515 /* Fall through. */
516 #endif
517 case 4:
518 return ((unsigned long) (field[0]))
519 | (((unsigned long) (field[1])) << 8)
520 | (((unsigned long) (field[2])) << 16)
521 | (((unsigned long) (field[3])) << 24);
522
523 #ifdef BFD64
524 case 8:
525 case -8:
526 /* This is a special case, generated by the BYTE_GET8 macro.
527 It means that we are loading an 8 byte value from a field
528 in an external structure into an 8 byte value in a field
529 in an internal strcuture. */
530 return ((bfd_vma) (field[0]))
531 | (((bfd_vma) (field[1])) << 8)
532 | (((bfd_vma) (field[2])) << 16)
533 | (((bfd_vma) (field[3])) << 24)
534 | (((bfd_vma) (field[4])) << 32)
535 | (((bfd_vma) (field[5])) << 40)
536 | (((bfd_vma) (field[6])) << 48)
537 | (((bfd_vma) (field[7])) << 56);
538 #endif
539 default:
540 error (_("Unhandled data length: %d\n"), size);
541 abort ();
542 }
543 }
544
545 /* Print a VMA value. */
546 static void
547 print_vma (vma, mode)
548 bfd_vma vma;
549 print_mode mode;
550 {
551 #ifdef BFD64
552 if (is_32bit_elf)
553 #endif
554 {
555 switch (mode)
556 {
557 case FULL_HEX: printf ("0x"); /* drop through */
558 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
559 case PREFIX_HEX: printf ("0x"); /* drop through */
560 case HEX: printf ("%lx", (unsigned long) vma); break;
561 case DEC: printf ("%ld", (unsigned long) vma); break;
562 case DEC_5: printf ("%5ld", (long) vma); break;
563 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
564 }
565 }
566 #ifdef BFD64
567 else
568 {
569 switch (mode)
570 {
571 case FULL_HEX:
572 printf ("0x");
573 /* drop through */
574
575 case LONG_HEX:
576 printf_vma (vma);
577 break;
578
579 case PREFIX_HEX:
580 printf ("0x");
581 /* drop through */
582
583 case HEX:
584 #if BFD_HOST_64BIT_LONG
585 printf ("%lx", vma);
586 #else
587 if (_bfd_int64_high (vma))
588 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
589 else
590 printf ("%lx", _bfd_int64_low (vma));
591 #endif
592 break;
593
594 case DEC:
595 #if BFD_HOST_64BIT_LONG
596 printf ("%ld", vma);
597 #else
598 if (_bfd_int64_high (vma))
599 /* ugg */
600 printf ("++%ld", _bfd_int64_low (vma));
601 else
602 printf ("%ld", _bfd_int64_low (vma));
603 #endif
604 break;
605
606 case DEC_5:
607 #if BFD_HOST_64BIT_LONG
608 printf ("%5ld", vma);
609 #else
610 if (_bfd_int64_high (vma))
611 /* ugg */
612 printf ("++%ld", _bfd_int64_low (vma));
613 else
614 printf ("%5ld", _bfd_int64_low (vma));
615 #endif
616 break;
617
618 case UNSIGNED:
619 #if BFD_HOST_64BIT_LONG
620 printf ("%lu", vma);
621 #else
622 if (_bfd_int64_high (vma))
623 /* ugg */
624 printf ("++%lu", _bfd_int64_low (vma));
625 else
626 printf ("%lu", _bfd_int64_low (vma));
627 #endif
628 break;
629 }
630 }
631 #endif
632 }
633
634 /* Display a symbol on stdout. If do_wide is not true then
635 format the symbol to be at most WIDTH characters,
636 truncating as necessary. If WIDTH is negative then
637 format the string to be exactly - WIDTH characters,
638 truncating or padding as necessary. */
639
640 static void
641 print_symbol (width, symbol)
642 int width;
643 const char *symbol;
644 {
645 if (do_wide)
646 printf ("%s", symbol);
647 else if (width < 0)
648 printf ("%-*.*s", width, width, symbol);
649 else
650 printf ("%-.*s", width, symbol);
651 }
652
653 static bfd_vma
654 byte_get_big_endian (field, size)
655 unsigned char *field;
656 int size;
657 {
658 switch (size)
659 {
660 case 1:
661 return *field;
662
663 case 2:
664 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
665
666 case 4:
667 return ((unsigned long) (field[3]))
668 | (((unsigned long) (field[2])) << 8)
669 | (((unsigned long) (field[1])) << 16)
670 | (((unsigned long) (field[0])) << 24);
671
672 #ifndef BFD64
673 case 8:
674 /* Although we are extracing data from an 8 byte wide field, we
675 are returning only 4 bytes of data. */
676 return ((unsigned long) (field[7]))
677 | (((unsigned long) (field[6])) << 8)
678 | (((unsigned long) (field[5])) << 16)
679 | (((unsigned long) (field[4])) << 24);
680 #else
681 case 8:
682 case -8:
683 /* This is a special case, generated by the BYTE_GET8 macro.
684 It means that we are loading an 8 byte value from a field
685 in an external structure into an 8 byte value in a field
686 in an internal strcuture. */
687 return ((bfd_vma) (field[7]))
688 | (((bfd_vma) (field[6])) << 8)
689 | (((bfd_vma) (field[5])) << 16)
690 | (((bfd_vma) (field[4])) << 24)
691 | (((bfd_vma) (field[3])) << 32)
692 | (((bfd_vma) (field[2])) << 40)
693 | (((bfd_vma) (field[1])) << 48)
694 | (((bfd_vma) (field[0])) << 56);
695 #endif
696
697 default:
698 error (_("Unhandled data length: %d\n"), size);
699 abort ();
700 }
701 }
702
703 /* Guess the relocation size commonly used by the specific machines. */
704
705 static int
706 guess_is_rela (e_machine)
707 unsigned long e_machine;
708 {
709 switch (e_machine)
710 {
711 /* Targets that use REL relocations. */
712 case EM_ARM:
713 case EM_386:
714 case EM_486:
715 case EM_960:
716 case EM_DLX:
717 case EM_OPENRISC:
718 case EM_OR32:
719 case EM_M32R:
720 case EM_CYGNUS_M32R:
721 case EM_D10V:
722 case EM_CYGNUS_D10V:
723 case EM_MIPS:
724 case EM_MIPS_RS3_LE:
725 return FALSE;
726
727 /* Targets that use RELA relocations. */
728 case EM_68K:
729 case EM_H8_300:
730 case EM_H8_300H:
731 case EM_H8S:
732 case EM_SPARC32PLUS:
733 case EM_SPARCV9:
734 case EM_SPARC:
735 case EM_PPC:
736 case EM_PPC64:
737 case EM_V850:
738 case EM_CYGNUS_V850:
739 case EM_D30V:
740 case EM_CYGNUS_D30V:
741 case EM_MN10200:
742 case EM_CYGNUS_MN10200:
743 case EM_MN10300:
744 case EM_CYGNUS_MN10300:
745 case EM_FR30:
746 case EM_CYGNUS_FR30:
747 case EM_CYGNUS_FRV:
748 case EM_SH:
749 case EM_ALPHA:
750 case EM_MCORE:
751 case EM_IA_64:
752 case EM_AVR:
753 case EM_AVR_OLD:
754 case EM_CRIS:
755 case EM_860:
756 case EM_X86_64:
757 case EM_S390:
758 case EM_S390_OLD:
759 case EM_MMIX:
760 case EM_MSP430:
761 case EM_MSP430_OLD:
762 case EM_XSTORMY16:
763 case EM_VAX:
764 case EM_IP2K:
765 case EM_IP2K_OLD:
766 return TRUE;
767
768 case EM_MMA:
769 case EM_PCP:
770 case EM_NCPU:
771 case EM_NDR1:
772 case EM_STARCORE:
773 case EM_ME16:
774 case EM_ST100:
775 case EM_TINYJ:
776 case EM_FX66:
777 case EM_ST9PLUS:
778 case EM_ST7:
779 case EM_68HC16:
780 case EM_68HC11:
781 case EM_68HC08:
782 case EM_68HC05:
783 case EM_SVX:
784 case EM_ST19:
785 default:
786 warn (_("Don't know about relocations on this machine architecture\n"));
787 return FALSE;
788 }
789 }
790
791 static int
792 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
793 FILE *file;
794 unsigned long rel_offset;
795 unsigned long rel_size;
796 Elf_Internal_Rela **relasp;
797 unsigned long *nrelasp;
798 {
799 Elf_Internal_Rela *relas;
800 unsigned long nrelas;
801 unsigned int i;
802
803 if (is_32bit_elf)
804 {
805 Elf32_External_Rela *erelas;
806
807 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
808 rel_size, _("relocs"));
809 if (!erelas)
810 return 0;
811
812 nrelas = rel_size / sizeof (Elf32_External_Rela);
813
814 relas = (Elf_Internal_Rela *)
815 malloc (nrelas * sizeof (Elf_Internal_Rela));
816
817 if (relas == NULL)
818 {
819 error(_("out of memory parsing relocs"));
820 return 0;
821 }
822
823 for (i = 0; i < nrelas; i++)
824 {
825 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
826 relas[i].r_info = BYTE_GET (erelas[i].r_info);
827 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
828 }
829
830 free (erelas);
831 }
832 else
833 {
834 Elf64_External_Rela *erelas;
835
836 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
837 rel_size, _("relocs"));
838 if (!erelas)
839 return 0;
840
841 nrelas = rel_size / sizeof (Elf64_External_Rela);
842
843 relas = (Elf_Internal_Rela *)
844 malloc (nrelas * sizeof (Elf_Internal_Rela));
845
846 if (relas == NULL)
847 {
848 error(_("out of memory parsing relocs"));
849 return 0;
850 }
851
852 for (i = 0; i < nrelas; i++)
853 {
854 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
855 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
856 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
857 }
858
859 free (erelas);
860 }
861 *relasp = relas;
862 *nrelasp = nrelas;
863 return 1;
864 }
865
866 static int
867 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
868 FILE *file;
869 unsigned long rel_offset;
870 unsigned long rel_size;
871 Elf_Internal_Rela **relsp;
872 unsigned long *nrelsp;
873 {
874 Elf_Internal_Rela *rels;
875 unsigned long nrels;
876 unsigned int i;
877
878 if (is_32bit_elf)
879 {
880 Elf32_External_Rel *erels;
881
882 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
883 rel_size, _("relocs"));
884 if (!erels)
885 return 0;
886
887 nrels = rel_size / sizeof (Elf32_External_Rel);
888
889 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
890
891 if (rels == NULL)
892 {
893 error(_("out of memory parsing relocs"));
894 return 0;
895 }
896
897 for (i = 0; i < nrels; i++)
898 {
899 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
900 rels[i].r_info = BYTE_GET (erels[i].r_info);
901 rels[i].r_addend = 0;
902 }
903
904 free (erels);
905 }
906 else
907 {
908 Elf64_External_Rel *erels;
909
910 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
911 rel_size, _("relocs"));
912 if (!erels)
913 return 0;
914
915 nrels = rel_size / sizeof (Elf64_External_Rel);
916
917 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
918
919 if (rels == NULL)
920 {
921 error(_("out of memory parsing relocs"));
922 return 0;
923 }
924
925 for (i = 0; i < nrels; i++)
926 {
927 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
928 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
929 rels[i].r_addend = 0;
930 }
931
932 free (erels);
933 }
934 *relsp = rels;
935 *nrelsp = nrels;
936 return 1;
937 }
938
939 /* Display the contents of the relocation data found at the specified offset. */
940 static int
941 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
942 FILE *file;
943 unsigned long rel_offset;
944 unsigned long rel_size;
945 Elf_Internal_Sym *symtab;
946 unsigned long nsyms;
947 char *strtab;
948 int is_rela;
949 {
950 unsigned int i;
951 Elf_Internal_Rela *rels;
952
953
954 if (is_rela == UNKNOWN)
955 is_rela = guess_is_rela (elf_header.e_machine);
956
957 if (is_rela)
958 {
959 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
960 return 0;
961 }
962 else
963 {
964 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
965 return 0;
966 }
967
968 if (is_32bit_elf)
969 {
970 if (is_rela)
971 {
972 if (do_wide)
973 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
974 else
975 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
976 }
977 else
978 {
979 if (do_wide)
980 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
981 else
982 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
983 }
984 }
985 else
986 {
987 if (is_rela)
988 {
989 if (do_wide)
990 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
991 else
992 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
993 }
994 else
995 {
996 if (do_wide)
997 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
998 else
999 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1000 }
1001 }
1002
1003 for (i = 0; i < rel_size; i++)
1004 {
1005 const char *rtype;
1006 const char *rtype2 = NULL;
1007 const char *rtype3 = NULL;
1008 bfd_vma offset;
1009 bfd_vma info;
1010 bfd_vma symtab_index;
1011 bfd_vma type;
1012 bfd_vma type2 = (bfd_vma) NULL;
1013 bfd_vma type3 = (bfd_vma) NULL;
1014
1015 offset = rels[i].r_offset;
1016 info = rels[i].r_info;
1017
1018 if (is_32bit_elf)
1019 {
1020 type = ELF32_R_TYPE (info);
1021 symtab_index = ELF32_R_SYM (info);
1022 }
1023 else
1024 {
1025 if (elf_header.e_machine == EM_MIPS)
1026 {
1027 type = ELF64_MIPS_R_TYPE (info);
1028 type2 = ELF64_MIPS_R_TYPE2 (info);
1029 type3 = ELF64_MIPS_R_TYPE3 (info);
1030 }
1031 else if (elf_header.e_machine == EM_SPARCV9)
1032 type = ELF64_R_TYPE_ID (info);
1033 else
1034 type = ELF64_R_TYPE (info);
1035 /* The #ifdef BFD64 below is to prevent a compile time warning.
1036 We know that if we do not have a 64 bit data type that we
1037 will never execute this code anyway. */
1038 #ifdef BFD64
1039 symtab_index = ELF64_R_SYM (info);
1040 #endif
1041 }
1042
1043 if (is_32bit_elf)
1044 {
1045 #ifdef _bfd_int64_low
1046 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
1047 #else
1048 printf ("%8.8lx %8.8lx ", offset, info);
1049 #endif
1050 }
1051 else
1052 {
1053 #ifdef _bfd_int64_low
1054 printf (do_wide
1055 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1056 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1057 _bfd_int64_high (offset),
1058 _bfd_int64_low (offset),
1059 _bfd_int64_high (info),
1060 _bfd_int64_low (info));
1061 #else
1062 printf (do_wide
1063 ? "%16.16lx %16.16lx "
1064 : "%12.12lx %12.12lx ",
1065 offset, info);
1066 #endif
1067 }
1068
1069 switch (elf_header.e_machine)
1070 {
1071 default:
1072 rtype = NULL;
1073 break;
1074
1075 case EM_M32R:
1076 case EM_CYGNUS_M32R:
1077 rtype = elf_m32r_reloc_type (type);
1078 break;
1079
1080 case EM_386:
1081 case EM_486:
1082 rtype = elf_i386_reloc_type (type);
1083 break;
1084
1085 case EM_68HC11:
1086 case EM_68HC12:
1087 rtype = elf_m68hc11_reloc_type (type);
1088 break;
1089
1090 case EM_68K:
1091 rtype = elf_m68k_reloc_type (type);
1092 break;
1093
1094 case EM_960:
1095 rtype = elf_i960_reloc_type (type);
1096 break;
1097
1098 case EM_AVR:
1099 case EM_AVR_OLD:
1100 rtype = elf_avr_reloc_type (type);
1101 break;
1102
1103 case EM_OLD_SPARCV9:
1104 case EM_SPARC32PLUS:
1105 case EM_SPARCV9:
1106 case EM_SPARC:
1107 rtype = elf_sparc_reloc_type (type);
1108 break;
1109
1110 case EM_V850:
1111 case EM_CYGNUS_V850:
1112 rtype = v850_reloc_type (type);
1113 break;
1114
1115 case EM_D10V:
1116 case EM_CYGNUS_D10V:
1117 rtype = elf_d10v_reloc_type (type);
1118 break;
1119
1120 case EM_D30V:
1121 case EM_CYGNUS_D30V:
1122 rtype = elf_d30v_reloc_type (type);
1123 break;
1124
1125 case EM_DLX:
1126 rtype = elf_dlx_reloc_type (type);
1127 break;
1128
1129 case EM_SH:
1130 rtype = elf_sh_reloc_type (type);
1131 break;
1132
1133 case EM_MN10300:
1134 case EM_CYGNUS_MN10300:
1135 rtype = elf_mn10300_reloc_type (type);
1136 break;
1137
1138 case EM_MN10200:
1139 case EM_CYGNUS_MN10200:
1140 rtype = elf_mn10200_reloc_type (type);
1141 break;
1142
1143 case EM_FR30:
1144 case EM_CYGNUS_FR30:
1145 rtype = elf_fr30_reloc_type (type);
1146 break;
1147
1148 case EM_CYGNUS_FRV:
1149 rtype = elf_frv_reloc_type (type);
1150 break;
1151
1152 case EM_MCORE:
1153 rtype = elf_mcore_reloc_type (type);
1154 break;
1155
1156 case EM_MMIX:
1157 rtype = elf_mmix_reloc_type (type);
1158 break;
1159
1160 case EM_MSP430:
1161 case EM_MSP430_OLD:
1162 rtype = elf_msp430_reloc_type (type);
1163 break;
1164
1165 case EM_PPC:
1166 case EM_PPC64:
1167 rtype = elf_ppc_reloc_type (type);
1168 break;
1169
1170 case EM_MIPS:
1171 case EM_MIPS_RS3_LE:
1172 rtype = elf_mips_reloc_type (type);
1173 if (!is_32bit_elf)
1174 {
1175 rtype2 = elf_mips_reloc_type (type2);
1176 rtype3 = elf_mips_reloc_type (type3);
1177 }
1178 break;
1179
1180 case EM_ALPHA:
1181 rtype = elf_alpha_reloc_type (type);
1182 break;
1183
1184 case EM_ARM:
1185 rtype = elf_arm_reloc_type (type);
1186 break;
1187
1188 case EM_ARC:
1189 rtype = elf_arc_reloc_type (type);
1190 break;
1191
1192 case EM_PARISC:
1193 rtype = elf_hppa_reloc_type (type);
1194 break;
1195
1196 case EM_H8_300:
1197 case EM_H8_300H:
1198 case EM_H8S:
1199 rtype = elf_h8_reloc_type (type);
1200 break;
1201
1202 case EM_OPENRISC:
1203 case EM_OR32:
1204 rtype = elf_or32_reloc_type (type);
1205 break;
1206
1207 case EM_PJ:
1208 case EM_PJ_OLD:
1209 rtype = elf_pj_reloc_type (type);
1210 break;
1211 case EM_IA_64:
1212 rtype = elf_ia64_reloc_type (type);
1213 break;
1214
1215 case EM_CRIS:
1216 rtype = elf_cris_reloc_type (type);
1217 break;
1218
1219 case EM_860:
1220 rtype = elf_i860_reloc_type (type);
1221 break;
1222
1223 case EM_X86_64:
1224 rtype = elf_x86_64_reloc_type (type);
1225 break;
1226
1227 case EM_S370:
1228 rtype = i370_reloc_type (type);
1229 break;
1230
1231 case EM_S390_OLD:
1232 case EM_S390:
1233 rtype = elf_s390_reloc_type (type);
1234 break;
1235
1236 case EM_XSTORMY16:
1237 rtype = elf_xstormy16_reloc_type (type);
1238 break;
1239
1240 case EM_VAX:
1241 rtype = elf_vax_reloc_type (type);
1242 break;
1243
1244 case EM_IP2K:
1245 case EM_IP2K_OLD:
1246 rtype = elf_ip2k_reloc_type (type);
1247 break;
1248 }
1249
1250 if (rtype == NULL)
1251 #ifdef _bfd_int64_low
1252 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1253 #else
1254 printf (_("unrecognized: %-7lx"), type);
1255 #endif
1256 else
1257 printf (do_wide ? "%-21.21s" : "%-17.17s", rtype);
1258
1259 if (symtab_index)
1260 {
1261 if (symtab == NULL || symtab_index >= nsyms)
1262 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1263 else
1264 {
1265 Elf_Internal_Sym *psym;
1266
1267 psym = symtab + symtab_index;
1268
1269 printf (" ");
1270 print_vma (psym->st_value, LONG_HEX);
1271 printf (is_32bit_elf ? " " : " ");
1272
1273 if (psym->st_name == 0)
1274 {
1275 const char *sec_name = "<null>";
1276 char name_buf[40];
1277
1278 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1279 {
1280 bfd_vma sec_index = (bfd_vma) -1;
1281
1282 if (psym->st_shndx < SHN_LORESERVE)
1283 sec_index = psym->st_shndx;
1284 else if (psym->st_shndx > SHN_LORESERVE)
1285 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1286 - SHN_LORESERVE);
1287
1288 if (sec_index != (bfd_vma) -1)
1289 sec_name = SECTION_NAME (section_headers + sec_index);
1290 else if (psym->st_shndx == SHN_ABS)
1291 sec_name = "ABS";
1292 else if (psym->st_shndx == SHN_COMMON)
1293 sec_name = "COMMON";
1294 else
1295 {
1296 sprintf (name_buf, "<section 0x%x>",
1297 (unsigned int) psym->st_shndx);
1298 sec_name = name_buf;
1299 }
1300 }
1301 print_symbol (22, sec_name);
1302 }
1303 else if (strtab == NULL)
1304 printf (_("<string table index %3ld>"), psym->st_name);
1305 else
1306 print_symbol (22, strtab + psym->st_name);
1307
1308 if (is_rela)
1309 printf (" + %lx", (unsigned long) rels[i].r_addend);
1310 }
1311 }
1312 else if (is_rela)
1313 {
1314 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1315 print_vma (rels[i].r_addend, LONG_HEX);
1316 }
1317
1318 if (elf_header.e_machine == EM_SPARCV9
1319 && !strcmp (rtype, "R_SPARC_OLO10"))
1320 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1321
1322 putchar ('\n');
1323
1324 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1325 {
1326 printf (" Type2: ");
1327
1328 if (rtype2 == NULL)
1329 #ifdef _bfd_int64_low
1330 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1331 #else
1332 printf (_("unrecognized: %-7lx"), type2);
1333 #endif
1334 else
1335 printf ("%-17.17s", rtype2);
1336
1337 printf("\n Type3: ");
1338
1339 if (rtype3 == NULL)
1340 #ifdef _bfd_int64_low
1341 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1342 #else
1343 printf (_("unrecognized: %-7lx"), type3);
1344 #endif
1345 else
1346 printf ("%-17.17s", rtype3);
1347
1348 putchar ('\n');
1349 }
1350 }
1351
1352 free (rels);
1353
1354 return 1;
1355 }
1356
1357 static const char *
1358 get_mips_dynamic_type (type)
1359 unsigned long type;
1360 {
1361 switch (type)
1362 {
1363 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1364 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1365 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1366 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1367 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1368 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1369 case DT_MIPS_MSYM: return "MIPS_MSYM";
1370 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1371 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1372 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1373 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1374 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1375 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1376 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1377 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1378 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1379 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1380 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1381 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1382 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1383 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1384 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1385 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1386 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1387 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1388 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1389 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1390 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1391 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1392 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1393 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1394 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1395 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1396 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1397 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1398 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1399 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1400 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1401 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1402 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1403 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1404 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1405 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1406 default:
1407 return NULL;
1408 }
1409 }
1410
1411 static const char *
1412 get_sparc64_dynamic_type (type)
1413 unsigned long type;
1414 {
1415 switch (type)
1416 {
1417 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1418 default:
1419 return NULL;
1420 }
1421 }
1422
1423 static const char *
1424 get_ppc64_dynamic_type (type)
1425 unsigned long type;
1426 {
1427 switch (type)
1428 {
1429 case DT_PPC64_GLINK: return "PPC64_GLINK";
1430 case DT_PPC64_OPD: return "PPC64_OPD";
1431 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1432 default:
1433 return NULL;
1434 }
1435 }
1436
1437 static const char *
1438 get_parisc_dynamic_type (type)
1439 unsigned long type;
1440 {
1441 switch (type)
1442 {
1443 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1444 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1445 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1446 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1447 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1448 case DT_HP_PREINIT: return "HP_PREINIT";
1449 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1450 case DT_HP_NEEDED: return "HP_NEEDED";
1451 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1452 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1453 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1454 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1455 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1456 default:
1457 return NULL;
1458 }
1459 }
1460
1461 static const char *
1462 get_dynamic_type (type)
1463 unsigned long type;
1464 {
1465 static char buff[32];
1466
1467 switch (type)
1468 {
1469 case DT_NULL: return "NULL";
1470 case DT_NEEDED: return "NEEDED";
1471 case DT_PLTRELSZ: return "PLTRELSZ";
1472 case DT_PLTGOT: return "PLTGOT";
1473 case DT_HASH: return "HASH";
1474 case DT_STRTAB: return "STRTAB";
1475 case DT_SYMTAB: return "SYMTAB";
1476 case DT_RELA: return "RELA";
1477 case DT_RELASZ: return "RELASZ";
1478 case DT_RELAENT: return "RELAENT";
1479 case DT_STRSZ: return "STRSZ";
1480 case DT_SYMENT: return "SYMENT";
1481 case DT_INIT: return "INIT";
1482 case DT_FINI: return "FINI";
1483 case DT_SONAME: return "SONAME";
1484 case DT_RPATH: return "RPATH";
1485 case DT_SYMBOLIC: return "SYMBOLIC";
1486 case DT_REL: return "REL";
1487 case DT_RELSZ: return "RELSZ";
1488 case DT_RELENT: return "RELENT";
1489 case DT_PLTREL: return "PLTREL";
1490 case DT_DEBUG: return "DEBUG";
1491 case DT_TEXTREL: return "TEXTREL";
1492 case DT_JMPREL: return "JMPREL";
1493 case DT_BIND_NOW: return "BIND_NOW";
1494 case DT_INIT_ARRAY: return "INIT_ARRAY";
1495 case DT_FINI_ARRAY: return "FINI_ARRAY";
1496 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1497 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1498 case DT_RUNPATH: return "RUNPATH";
1499 case DT_FLAGS: return "FLAGS";
1500
1501 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1502 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1503
1504 case DT_CHECKSUM: return "CHECKSUM";
1505 case DT_PLTPADSZ: return "PLTPADSZ";
1506 case DT_MOVEENT: return "MOVEENT";
1507 case DT_MOVESZ: return "MOVESZ";
1508 case DT_FEATURE: return "FEATURE";
1509 case DT_POSFLAG_1: return "POSFLAG_1";
1510 case DT_SYMINSZ: return "SYMINSZ";
1511 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1512
1513 case DT_ADDRRNGLO: return "ADDRRNGLO";
1514 case DT_CONFIG: return "CONFIG";
1515 case DT_DEPAUDIT: return "DEPAUDIT";
1516 case DT_AUDIT: return "AUDIT";
1517 case DT_PLTPAD: return "PLTPAD";
1518 case DT_MOVETAB: return "MOVETAB";
1519 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1520
1521 case DT_VERSYM: return "VERSYM";
1522
1523 case DT_RELACOUNT: return "RELACOUNT";
1524 case DT_RELCOUNT: return "RELCOUNT";
1525 case DT_FLAGS_1: return "FLAGS_1";
1526 case DT_VERDEF: return "VERDEF";
1527 case DT_VERDEFNUM: return "VERDEFNUM";
1528 case DT_VERNEED: return "VERNEED";
1529 case DT_VERNEEDNUM: return "VERNEEDNUM";
1530
1531 case DT_AUXILIARY: return "AUXILIARY";
1532 case DT_USED: return "USED";
1533 case DT_FILTER: return "FILTER";
1534
1535 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1536 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1537 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1538 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1539 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1540
1541 default:
1542 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1543 {
1544 const char *result;
1545
1546 switch (elf_header.e_machine)
1547 {
1548 case EM_MIPS:
1549 case EM_MIPS_RS3_LE:
1550 result = get_mips_dynamic_type (type);
1551 break;
1552 case EM_SPARCV9:
1553 result = get_sparc64_dynamic_type (type);
1554 break;
1555 case EM_PPC64:
1556 result = get_ppc64_dynamic_type (type);
1557 break;
1558 default:
1559 result = NULL;
1560 break;
1561 }
1562
1563 if (result != NULL)
1564 return result;
1565
1566 sprintf (buff, _("Processor Specific: %lx"), type);
1567 }
1568 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1569 {
1570 const char *result;
1571
1572 switch (elf_header.e_machine)
1573 {
1574 case EM_PARISC:
1575 result = get_parisc_dynamic_type (type);
1576 break;
1577 default:
1578 result = NULL;
1579 break;
1580 }
1581
1582 if (result != NULL)
1583 return result;
1584
1585 sprintf (buff, _("Operating System specific: %lx"), type);
1586 }
1587 else
1588 sprintf (buff, _("<unknown>: %lx"), type);
1589
1590 return buff;
1591 }
1592 }
1593
1594 static char *
1595 get_file_type (e_type)
1596 unsigned e_type;
1597 {
1598 static char buff[32];
1599
1600 switch (e_type)
1601 {
1602 case ET_NONE: return _("NONE (None)");
1603 case ET_REL: return _("REL (Relocatable file)");
1604 case ET_EXEC: return _("EXEC (Executable file)");
1605 case ET_DYN: return _("DYN (Shared object file)");
1606 case ET_CORE: return _("CORE (Core file)");
1607
1608 default:
1609 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1610 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1611 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1612 sprintf (buff, _("OS Specific: (%x)"), e_type);
1613 else
1614 sprintf (buff, _("<unknown>: %x"), e_type);
1615 return buff;
1616 }
1617 }
1618
1619 static char *
1620 get_machine_name (e_machine)
1621 unsigned e_machine;
1622 {
1623 static char buff[64]; /* XXX */
1624
1625 switch (e_machine)
1626 {
1627 case EM_NONE: return _("None");
1628 case EM_M32: return "WE32100";
1629 case EM_SPARC: return "Sparc";
1630 case EM_386: return "Intel 80386";
1631 case EM_68K: return "MC68000";
1632 case EM_88K: return "MC88000";
1633 case EM_486: return "Intel 80486";
1634 case EM_860: return "Intel 80860";
1635 case EM_MIPS: return "MIPS R3000";
1636 case EM_S370: return "IBM System/370";
1637 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1638 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1639 case EM_PARISC: return "HPPA";
1640 case EM_PPC_OLD: return "Power PC (old)";
1641 case EM_SPARC32PLUS: return "Sparc v8+" ;
1642 case EM_960: return "Intel 90860";
1643 case EM_PPC: return "PowerPC";
1644 case EM_PPC64: return "PowerPC64";
1645 case EM_V800: return "NEC V800";
1646 case EM_FR20: return "Fujitsu FR20";
1647 case EM_RH32: return "TRW RH32";
1648 case EM_MCORE: return "MCORE";
1649 case EM_ARM: return "ARM";
1650 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1651 case EM_SH: return "Hitachi SH";
1652 case EM_SPARCV9: return "Sparc v9";
1653 case EM_TRICORE: return "Siemens Tricore";
1654 case EM_ARC: return "ARC";
1655 case EM_H8_300: return "Hitachi H8/300";
1656 case EM_H8_300H: return "Hitachi H8/300H";
1657 case EM_H8S: return "Hitachi H8S";
1658 case EM_H8_500: return "Hitachi H8/500";
1659 case EM_IA_64: return "Intel IA-64";
1660 case EM_MIPS_X: return "Stanford MIPS-X";
1661 case EM_COLDFIRE: return "Motorola Coldfire";
1662 case EM_68HC12: return "Motorola M68HC12";
1663 case EM_ALPHA: return "Alpha";
1664 case EM_CYGNUS_D10V:
1665 case EM_D10V: return "d10v";
1666 case EM_CYGNUS_D30V:
1667 case EM_D30V: return "d30v";
1668 case EM_CYGNUS_M32R:
1669 case EM_M32R: return "Mitsubishi M32r";
1670 case EM_CYGNUS_V850:
1671 case EM_V850: return "NEC v850";
1672 case EM_CYGNUS_MN10300:
1673 case EM_MN10300: return "mn10300";
1674 case EM_CYGNUS_MN10200:
1675 case EM_MN10200: return "mn10200";
1676 case EM_CYGNUS_FR30:
1677 case EM_FR30: return "Fujitsu FR30";
1678 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1679 case EM_PJ_OLD:
1680 case EM_PJ: return "picoJava";
1681 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1682 case EM_PCP: return "Siemens PCP";
1683 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1684 case EM_NDR1: return "Denso NDR1 microprocesspr";
1685 case EM_STARCORE: return "Motorola Star*Core processor";
1686 case EM_ME16: return "Toyota ME16 processor";
1687 case EM_ST100: return "STMicroelectronics ST100 processor";
1688 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1689 case EM_FX66: return "Siemens FX66 microcontroller";
1690 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1691 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1692 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1693 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1694 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1695 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1696 case EM_SVX: return "Silicon Graphics SVx";
1697 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1698 case EM_VAX: return "Digital VAX";
1699 case EM_AVR_OLD:
1700 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1701 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1702 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1703 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1704 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1705 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1706 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1707 case EM_PRISM: return "SiTera Prism";
1708 case EM_X86_64: return "Advanced Micro Devices X86-64";
1709 case EM_S390_OLD:
1710 case EM_S390: return "IBM S/390";
1711 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1712 case EM_OPENRISC:
1713 case EM_OR32: return "OpenRISC";
1714 case EM_DLX: return "OpenDLX";
1715 case EM_IP2K_OLD:
1716 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1717 default:
1718 sprintf (buff, _("<unknown>: %x"), e_machine);
1719 return buff;
1720 }
1721 }
1722
1723 static void
1724 decode_ARM_machine_flags (e_flags, buf)
1725 unsigned e_flags;
1726 char buf[];
1727 {
1728 unsigned eabi;
1729 int unknown = 0;
1730
1731 eabi = EF_ARM_EABI_VERSION (e_flags);
1732 e_flags &= ~ EF_ARM_EABIMASK;
1733
1734 /* Handle "generic" ARM flags. */
1735 if (e_flags & EF_ARM_RELEXEC)
1736 {
1737 strcat (buf, ", relocatable executable");
1738 e_flags &= ~ EF_ARM_RELEXEC;
1739 }
1740
1741 if (e_flags & EF_ARM_HASENTRY)
1742 {
1743 strcat (buf, ", has entry point");
1744 e_flags &= ~ EF_ARM_HASENTRY;
1745 }
1746
1747 /* Now handle EABI specific flags. */
1748 switch (eabi)
1749 {
1750 default:
1751 strcat (buf, ", <unrecognized EABI>");
1752 if (e_flags)
1753 unknown = 1;
1754 break;
1755
1756 case EF_ARM_EABI_VER1:
1757 strcat (buf, ", Version1 EABI");
1758 while (e_flags)
1759 {
1760 unsigned flag;
1761
1762 /* Process flags one bit at a time. */
1763 flag = e_flags & - e_flags;
1764 e_flags &= ~ flag;
1765
1766 switch (flag)
1767 {
1768 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1769 strcat (buf, ", sorted symbol tables");
1770 break;
1771
1772 default:
1773 unknown = 1;
1774 break;
1775 }
1776 }
1777 break;
1778
1779 case EF_ARM_EABI_VER2:
1780 strcat (buf, ", Version2 EABI");
1781 while (e_flags)
1782 {
1783 unsigned flag;
1784
1785 /* Process flags one bit at a time. */
1786 flag = e_flags & - e_flags;
1787 e_flags &= ~ flag;
1788
1789 switch (flag)
1790 {
1791 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1792 strcat (buf, ", sorted symbol tables");
1793 break;
1794
1795 case EF_ARM_DYNSYMSUSESEGIDX:
1796 strcat (buf, ", dynamic symbols use segment index");
1797 break;
1798
1799 case EF_ARM_MAPSYMSFIRST:
1800 strcat (buf, ", mapping symbols precede others");
1801 break;
1802
1803 default:
1804 unknown = 1;
1805 break;
1806 }
1807 }
1808 break;
1809
1810 case EF_ARM_EABI_UNKNOWN:
1811 strcat (buf, ", GNU EABI");
1812 while (e_flags)
1813 {
1814 unsigned flag;
1815
1816 /* Process flags one bit at a time. */
1817 flag = e_flags & - e_flags;
1818 e_flags &= ~ flag;
1819
1820 switch (flag)
1821 {
1822 case EF_ARM_INTERWORK:
1823 strcat (buf, ", interworking enabled");
1824 break;
1825
1826 case EF_ARM_APCS_26:
1827 strcat (buf, ", uses APCS/26");
1828 break;
1829
1830 case EF_ARM_APCS_FLOAT:
1831 strcat (buf, ", uses APCS/float");
1832 break;
1833
1834 case EF_ARM_PIC:
1835 strcat (buf, ", position independent");
1836 break;
1837
1838 case EF_ARM_ALIGN8:
1839 strcat (buf, ", 8 bit structure alignment");
1840 break;
1841
1842 case EF_ARM_NEW_ABI:
1843 strcat (buf, ", uses new ABI");
1844 break;
1845
1846 case EF_ARM_OLD_ABI:
1847 strcat (buf, ", uses old ABI");
1848 break;
1849
1850 case EF_ARM_SOFT_FLOAT:
1851 strcat (buf, ", software FP");
1852 break;
1853
1854 default:
1855 unknown = 1;
1856 break;
1857 }
1858 }
1859 }
1860
1861 if (unknown)
1862 strcat (buf,", <unknown>");
1863 }
1864
1865 static char *
1866 get_machine_flags (e_flags, e_machine)
1867 unsigned e_flags;
1868 unsigned e_machine;
1869 {
1870 static char buf[1024];
1871
1872 buf[0] = '\0';
1873
1874 if (e_flags)
1875 {
1876 switch (e_machine)
1877 {
1878 default:
1879 break;
1880
1881 case EM_ARM:
1882 decode_ARM_machine_flags (e_flags, buf);
1883 break;
1884
1885 case EM_68K:
1886 if (e_flags & EF_CPU32)
1887 strcat (buf, ", cpu32");
1888 if (e_flags & EF_M68000)
1889 strcat (buf, ", m68000");
1890 break;
1891
1892 case EM_PPC:
1893 if (e_flags & EF_PPC_EMB)
1894 strcat (buf, ", emb");
1895
1896 if (e_flags & EF_PPC_RELOCATABLE)
1897 strcat (buf, ", relocatable");
1898
1899 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1900 strcat (buf, ", relocatable-lib");
1901 break;
1902
1903 case EM_V850:
1904 case EM_CYGNUS_V850:
1905 switch (e_flags & EF_V850_ARCH)
1906 {
1907 case E_V850E_ARCH:
1908 strcat (buf, ", v850e");
1909 break;
1910 case E_V850_ARCH:
1911 strcat (buf, ", v850");
1912 break;
1913 default:
1914 strcat (buf, ", unknown v850 architecture variant");
1915 break;
1916 }
1917 break;
1918
1919 case EM_M32R:
1920 case EM_CYGNUS_M32R:
1921 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1922 strcat (buf, ", m32r");
1923
1924 break;
1925
1926 case EM_MIPS:
1927 case EM_MIPS_RS3_LE:
1928 if (e_flags & EF_MIPS_NOREORDER)
1929 strcat (buf, ", noreorder");
1930
1931 if (e_flags & EF_MIPS_PIC)
1932 strcat (buf, ", pic");
1933
1934 if (e_flags & EF_MIPS_CPIC)
1935 strcat (buf, ", cpic");
1936
1937 if (e_flags & EF_MIPS_UCODE)
1938 strcat (buf, ", ugen_reserved");
1939
1940 if (e_flags & EF_MIPS_ABI2)
1941 strcat (buf, ", abi2");
1942
1943 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1944 strcat (buf, ", odk first");
1945
1946 if (e_flags & EF_MIPS_32BITMODE)
1947 strcat (buf, ", 32bitmode");
1948
1949 switch ((e_flags & EF_MIPS_MACH))
1950 {
1951 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1952 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1953 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1954 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1955 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
1956 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1957 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
1958 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
1959 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1960 case 0:
1961 /* We simply ignore the field in this case to avoid confusion:
1962 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1963 extension. */
1964 break;
1965 default: strcat (buf, ", unknown CPU"); break;
1966 }
1967
1968 switch ((e_flags & EF_MIPS_ABI))
1969 {
1970 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1971 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1972 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1973 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1974 case 0:
1975 /* We simply ignore the field in this case to avoid confusion:
1976 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1977 This means it is likely to be an o32 file, but not for
1978 sure. */
1979 break;
1980 default: strcat (buf, ", unknown ABI"); break;
1981 }
1982
1983 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1984 strcat (buf, ", mdmx");
1985
1986 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1987 strcat (buf, ", mips16");
1988
1989 switch ((e_flags & EF_MIPS_ARCH))
1990 {
1991 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1992 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1993 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1994 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1995 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1996 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1997 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
1998 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1999 default: strcat (buf, ", unknown ISA"); break;
2000 }
2001
2002 break;
2003
2004 case EM_SPARCV9:
2005 if (e_flags & EF_SPARC_32PLUS)
2006 strcat (buf, ", v8+");
2007
2008 if (e_flags & EF_SPARC_SUN_US1)
2009 strcat (buf, ", ultrasparcI");
2010
2011 if (e_flags & EF_SPARC_SUN_US3)
2012 strcat (buf, ", ultrasparcIII");
2013
2014 if (e_flags & EF_SPARC_HAL_R1)
2015 strcat (buf, ", halr1");
2016
2017 if (e_flags & EF_SPARC_LEDATA)
2018 strcat (buf, ", ledata");
2019
2020 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2021 strcat (buf, ", tso");
2022
2023 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2024 strcat (buf, ", pso");
2025
2026 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2027 strcat (buf, ", rmo");
2028 break;
2029
2030 case EM_PARISC:
2031 switch (e_flags & EF_PARISC_ARCH)
2032 {
2033 case EFA_PARISC_1_0:
2034 strcpy (buf, ", PA-RISC 1.0");
2035 break;
2036 case EFA_PARISC_1_1:
2037 strcpy (buf, ", PA-RISC 1.1");
2038 break;
2039 case EFA_PARISC_2_0:
2040 strcpy (buf, ", PA-RISC 2.0");
2041 break;
2042 default:
2043 break;
2044 }
2045 if (e_flags & EF_PARISC_TRAPNIL)
2046 strcat (buf, ", trapnil");
2047 if (e_flags & EF_PARISC_EXT)
2048 strcat (buf, ", ext");
2049 if (e_flags & EF_PARISC_LSB)
2050 strcat (buf, ", lsb");
2051 if (e_flags & EF_PARISC_WIDE)
2052 strcat (buf, ", wide");
2053 if (e_flags & EF_PARISC_NO_KABP)
2054 strcat (buf, ", no kabp");
2055 if (e_flags & EF_PARISC_LAZYSWAP)
2056 strcat (buf, ", lazyswap");
2057 break;
2058
2059 case EM_PJ:
2060 case EM_PJ_OLD:
2061 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2062 strcat (buf, ", new calling convention");
2063
2064 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2065 strcat (buf, ", gnu calling convention");
2066 break;
2067
2068 case EM_IA_64:
2069 if ((e_flags & EF_IA_64_ABI64))
2070 strcat (buf, ", 64-bit");
2071 else
2072 strcat (buf, ", 32-bit");
2073 if ((e_flags & EF_IA_64_REDUCEDFP))
2074 strcat (buf, ", reduced fp model");
2075 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2076 strcat (buf, ", no function descriptors, constant gp");
2077 else if ((e_flags & EF_IA_64_CONS_GP))
2078 strcat (buf, ", constant gp");
2079 if ((e_flags & EF_IA_64_ABSOLUTE))
2080 strcat (buf, ", absolute");
2081 break;
2082
2083 case EM_VAX:
2084 if ((e_flags & EF_VAX_NONPIC))
2085 strcat (buf, ", non-PIC");
2086 if ((e_flags & EF_VAX_DFLOAT))
2087 strcat (buf, ", D-Float");
2088 if ((e_flags & EF_VAX_GFLOAT))
2089 strcat (buf, ", G-Float");
2090 break;
2091 }
2092 }
2093
2094 return buf;
2095 }
2096
2097 static const char *
2098 get_mips_segment_type (type)
2099 unsigned long type;
2100 {
2101 switch (type)
2102 {
2103 case PT_MIPS_REGINFO:
2104 return "REGINFO";
2105 case PT_MIPS_RTPROC:
2106 return "RTPROC";
2107 case PT_MIPS_OPTIONS:
2108 return "OPTIONS";
2109 default:
2110 break;
2111 }
2112
2113 return NULL;
2114 }
2115
2116 static const char *
2117 get_parisc_segment_type (type)
2118 unsigned long type;
2119 {
2120 switch (type)
2121 {
2122 case PT_HP_TLS: return "HP_TLS";
2123 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2124 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2125 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2126 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2127 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2128 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2129 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2130 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2131 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2132 case PT_HP_PARALLEL: return "HP_PARALLEL";
2133 case PT_HP_FASTBIND: return "HP_FASTBIND";
2134 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2135 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2136 default:
2137 break;
2138 }
2139
2140 return NULL;
2141 }
2142
2143 static const char *
2144 get_ia64_segment_type (type)
2145 unsigned long type;
2146 {
2147 switch (type)
2148 {
2149 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2150 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2151 case PT_HP_TLS: return "HP_TLS";
2152 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2153 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2154 case PT_IA_64_HP_STACK: return "HP_STACK";
2155 default:
2156 break;
2157 }
2158
2159 return NULL;
2160 }
2161
2162 static const char *
2163 get_segment_type (p_type)
2164 unsigned long p_type;
2165 {
2166 static char buff[32];
2167
2168 switch (p_type)
2169 {
2170 case PT_NULL: return "NULL";
2171 case PT_LOAD: return "LOAD";
2172 case PT_DYNAMIC: return "DYNAMIC";
2173 case PT_INTERP: return "INTERP";
2174 case PT_NOTE: return "NOTE";
2175 case PT_SHLIB: return "SHLIB";
2176 case PT_PHDR: return "PHDR";
2177 case PT_TLS: return "TLS";
2178
2179 case PT_GNU_EH_FRAME:
2180 return "GNU_EH_FRAME";
2181
2182 default:
2183 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2184 {
2185 const char *result;
2186
2187 switch (elf_header.e_machine)
2188 {
2189 case EM_MIPS:
2190 case EM_MIPS_RS3_LE:
2191 result = get_mips_segment_type (p_type);
2192 break;
2193 case EM_PARISC:
2194 result = get_parisc_segment_type (p_type);
2195 break;
2196 case EM_IA_64:
2197 result = get_ia64_segment_type (p_type);
2198 break;
2199 default:
2200 result = NULL;
2201 break;
2202 }
2203
2204 if (result != NULL)
2205 return result;
2206
2207 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2208 }
2209 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2210 {
2211 const char *result;
2212
2213 switch (elf_header.e_machine)
2214 {
2215 case EM_PARISC:
2216 result = get_parisc_segment_type (p_type);
2217 break;
2218 case EM_IA_64:
2219 result = get_ia64_segment_type (p_type);
2220 break;
2221 default:
2222 result = NULL;
2223 break;
2224 }
2225
2226 if (result != NULL)
2227 return result;
2228
2229 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2230 }
2231 else
2232 sprintf (buff, _("<unknown>: %lx"), p_type);
2233
2234 return buff;
2235 }
2236 }
2237
2238 static const char *
2239 get_mips_section_type_name (sh_type)
2240 unsigned int sh_type;
2241 {
2242 switch (sh_type)
2243 {
2244 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2245 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2246 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2247 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2248 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2249 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2250 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2251 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2252 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2253 case SHT_MIPS_RELD: return "MIPS_RELD";
2254 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2255 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2256 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2257 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2258 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2259 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2260 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2261 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2262 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2263 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2264 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2265 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2266 case SHT_MIPS_LINE: return "MIPS_LINE";
2267 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2268 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2269 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2270 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2271 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2272 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2273 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2274 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2275 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2276 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2277 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2278 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2279 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2280 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2281 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2282 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2283 default:
2284 break;
2285 }
2286 return NULL;
2287 }
2288
2289 static const char *
2290 get_parisc_section_type_name (sh_type)
2291 unsigned int sh_type;
2292 {
2293 switch (sh_type)
2294 {
2295 case SHT_PARISC_EXT: return "PARISC_EXT";
2296 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2297 case SHT_PARISC_DOC: return "PARISC_DOC";
2298 default:
2299 break;
2300 }
2301 return NULL;
2302 }
2303
2304 static const char *
2305 get_ia64_section_type_name (sh_type)
2306 unsigned int sh_type;
2307 {
2308 switch (sh_type)
2309 {
2310 case SHT_IA_64_EXT: return "IA_64_EXT";
2311 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2312 default:
2313 break;
2314 }
2315 return NULL;
2316 }
2317
2318 static const char *
2319 get_section_type_name (sh_type)
2320 unsigned int sh_type;
2321 {
2322 static char buff[32];
2323
2324 switch (sh_type)
2325 {
2326 case SHT_NULL: return "NULL";
2327 case SHT_PROGBITS: return "PROGBITS";
2328 case SHT_SYMTAB: return "SYMTAB";
2329 case SHT_STRTAB: return "STRTAB";
2330 case SHT_RELA: return "RELA";
2331 case SHT_HASH: return "HASH";
2332 case SHT_DYNAMIC: return "DYNAMIC";
2333 case SHT_NOTE: return "NOTE";
2334 case SHT_NOBITS: return "NOBITS";
2335 case SHT_REL: return "REL";
2336 case SHT_SHLIB: return "SHLIB";
2337 case SHT_DYNSYM: return "DYNSYM";
2338 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2339 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2340 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2341 case SHT_GROUP: return "GROUP";
2342 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2343 case SHT_GNU_verdef: return "VERDEF";
2344 case SHT_GNU_verneed: return "VERNEED";
2345 case SHT_GNU_versym: return "VERSYM";
2346 case 0x6ffffff0: return "VERSYM";
2347 case 0x6ffffffc: return "VERDEF";
2348 case 0x7ffffffd: return "AUXILIARY";
2349 case 0x7fffffff: return "FILTER";
2350 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2351
2352 default:
2353 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2354 {
2355 const char *result;
2356
2357 switch (elf_header.e_machine)
2358 {
2359 case EM_MIPS:
2360 case EM_MIPS_RS3_LE:
2361 result = get_mips_section_type_name (sh_type);
2362 break;
2363 case EM_PARISC:
2364 result = get_parisc_section_type_name (sh_type);
2365 break;
2366 case EM_IA_64:
2367 result = get_ia64_section_type_name (sh_type);
2368 break;
2369 default:
2370 result = NULL;
2371 break;
2372 }
2373
2374 if (result != NULL)
2375 return result;
2376
2377 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2378 }
2379 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2380 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2381 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2382 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2383 else
2384 sprintf (buff, _("<unknown>: %x"), sh_type);
2385
2386 return buff;
2387 }
2388 }
2389
2390 #define OPTION_DEBUG_DUMP 512
2391
2392 struct option options[] =
2393 {
2394 {"all", no_argument, 0, 'a'},
2395 {"file-header", no_argument, 0, 'h'},
2396 {"program-headers", no_argument, 0, 'l'},
2397 {"headers", no_argument, 0, 'e'},
2398 {"histogram", no_argument, 0, 'I'},
2399 {"segments", no_argument, 0, 'l'},
2400 {"sections", no_argument, 0, 'S'},
2401 {"section-headers", no_argument, 0, 'S'},
2402 {"symbols", no_argument, 0, 's'},
2403 {"syms", no_argument, 0, 's'},
2404 {"relocs", no_argument, 0, 'r'},
2405 {"notes", no_argument, 0, 'n'},
2406 {"dynamic", no_argument, 0, 'd'},
2407 {"arch-specific", no_argument, 0, 'A'},
2408 {"version-info", no_argument, 0, 'V'},
2409 {"use-dynamic", no_argument, 0, 'D'},
2410 {"hex-dump", required_argument, 0, 'x'},
2411 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2412 {"unwind", no_argument, 0, 'u'},
2413 #ifdef SUPPORT_DISASSEMBLY
2414 {"instruction-dump", required_argument, 0, 'i'},
2415 #endif
2416
2417 {"version", no_argument, 0, 'v'},
2418 {"wide", no_argument, 0, 'W'},
2419 {"help", no_argument, 0, 'H'},
2420 {0, no_argument, 0, 0}
2421 };
2422
2423 static void
2424 usage ()
2425 {
2426 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2427 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2428 fprintf (stdout, _(" Options are:\n\
2429 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2430 -h --file-header Display the ELF file header\n\
2431 -l --program-headers Display the program headers\n\
2432 --segments An alias for --program-headers\n\
2433 -S --section-headers Display the sections' header\n\
2434 --sections An alias for --section-headers\n\
2435 -e --headers Equivalent to: -h -l -S\n\
2436 -s --syms Display the symbol table\n\
2437 --symbols An alias for --syms\n\
2438 -n --notes Display the core notes (if present)\n\
2439 -r --relocs Display the relocations (if present)\n\
2440 -u --unwind Display the unwind info (if present)\n\
2441 -d --dynamic Display the dynamic segment (if present)\n\
2442 -V --version-info Display the version sections (if present)\n\
2443 -A --arch-specific Display architecture specific information (if any).\n\
2444 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2445 -x --hex-dump=<number> Dump the contents of section <number>\n\
2446 -w[liaprmfFso] or\n\
2447 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2448 Display the contents of DWARF2 debug sections\n"));
2449 #ifdef SUPPORT_DISASSEMBLY
2450 fprintf (stdout, _("\
2451 -i --instruction-dump=<number>\n\
2452 Disassemble the contents of section <number>\n"));
2453 #endif
2454 fprintf (stdout, _("\
2455 -I --histogram Display histogram of bucket list lengths\n\
2456 -W --wide Allow output width to exceed 80 characters\n\
2457 -H --help Display this information\n\
2458 -v --version Display the version number of readelf\n"));
2459 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2460
2461 exit (0);
2462 }
2463
2464 static void
2465 request_dump (section, type)
2466 unsigned int section;
2467 int type;
2468 {
2469 if (section >= num_dump_sects)
2470 {
2471 char *new_dump_sects;
2472
2473 new_dump_sects = (char *) calloc (section + 1, 1);
2474
2475 if (new_dump_sects == NULL)
2476 error (_("Out of memory allocating dump request table."));
2477 else
2478 {
2479 /* Copy current flag settings. */
2480 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2481
2482 free (dump_sects);
2483
2484 dump_sects = new_dump_sects;
2485 num_dump_sects = section + 1;
2486 }
2487 }
2488
2489 if (dump_sects)
2490 dump_sects[section] |= type;
2491
2492 return;
2493 }
2494
2495 static void
2496 parse_args (argc, argv)
2497 int argc;
2498 char **argv;
2499 {
2500 int c;
2501
2502 if (argc < 2)
2503 usage ();
2504
2505 while ((c = getopt_long
2506 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2507 {
2508 char *cp;
2509 int section;
2510
2511 switch (c)
2512 {
2513 case 0:
2514 /* Long options. */
2515 break;
2516 case 'H':
2517 usage ();
2518 break;
2519
2520 case 'a':
2521 do_syms++;
2522 do_reloc++;
2523 do_unwind++;
2524 do_dynamic++;
2525 do_header++;
2526 do_sections++;
2527 do_segments++;
2528 do_version++;
2529 do_histogram++;
2530 do_arch++;
2531 do_notes++;
2532 break;
2533 case 'e':
2534 do_header++;
2535 do_sections++;
2536 do_segments++;
2537 break;
2538 case 'A':
2539 do_arch++;
2540 break;
2541 case 'D':
2542 do_using_dynamic++;
2543 break;
2544 case 'r':
2545 do_reloc++;
2546 break;
2547 case 'u':
2548 do_unwind++;
2549 break;
2550 case 'h':
2551 do_header++;
2552 break;
2553 case 'l':
2554 do_segments++;
2555 break;
2556 case 's':
2557 do_syms++;
2558 break;
2559 case 'S':
2560 do_sections++;
2561 break;
2562 case 'd':
2563 do_dynamic++;
2564 break;
2565 case 'I':
2566 do_histogram++;
2567 break;
2568 case 'n':
2569 do_notes++;
2570 break;
2571 case 'x':
2572 do_dump++;
2573 section = strtoul (optarg, & cp, 0);
2574 if (! *cp && section >= 0)
2575 {
2576 request_dump (section, HEX_DUMP);
2577 break;
2578 }
2579 goto oops;
2580 case 'w':
2581 do_dump++;
2582 if (optarg == 0)
2583 do_debugging = 1;
2584 else
2585 {
2586 unsigned int index = 0;
2587
2588 do_debugging = 0;
2589
2590 while (optarg[index])
2591 switch (optarg[index++])
2592 {
2593 case 'i':
2594 case 'I':
2595 do_debug_info = 1;
2596 break;
2597
2598 case 'a':
2599 case 'A':
2600 do_debug_abbrevs = 1;
2601 break;
2602
2603 case 'l':
2604 case 'L':
2605 do_debug_lines = 1;
2606 break;
2607
2608 case 'p':
2609 case 'P':
2610 do_debug_pubnames = 1;
2611 break;
2612
2613 case 'r':
2614 case 'R':
2615 do_debug_aranges = 1;
2616 break;
2617
2618 case 'F':
2619 do_debug_frames_interp = 1;
2620 case 'f':
2621 do_debug_frames = 1;
2622 break;
2623
2624 case 'm':
2625 case 'M':
2626 do_debug_macinfo = 1;
2627 break;
2628
2629 case 's':
2630 case 'S':
2631 do_debug_str = 1;
2632 break;
2633
2634 case 'o':
2635 case 'O':
2636 do_debug_loc = 1;
2637 break;
2638
2639 default:
2640 warn (_("Unrecognized debug option '%s'\n"), optarg);
2641 break;
2642 }
2643 }
2644 break;
2645 case OPTION_DEBUG_DUMP:
2646 do_dump++;
2647 if (optarg == 0)
2648 do_debugging = 1;
2649 else
2650 {
2651 static const char *debug_dump_opt[]
2652 = { "line", "info", "abbrev", "pubnames", "ranges",
2653 "macro", "frames", "frames-interp", "str", "loc", NULL };
2654 unsigned int index;
2655 const char *p;
2656
2657 do_debugging = 0;
2658
2659 p = optarg;
2660 while (*p)
2661 {
2662 for (index = 0; debug_dump_opt[index]; index++)
2663 {
2664 size_t len = strlen (debug_dump_opt[index]);
2665
2666 if (strncmp (p, debug_dump_opt[index], len) == 0
2667 && (p[len] == ',' || p[len] == '\0'))
2668 {
2669 switch (p[0])
2670 {
2671 case 'i':
2672 do_debug_info = 1;
2673 break;
2674
2675 case 'a':
2676 do_debug_abbrevs = 1;
2677 break;
2678
2679 case 'l':
2680 if (p[1] == 'i')
2681 do_debug_lines = 1;
2682 else
2683 do_debug_loc = 1;
2684 break;
2685
2686 case 'p':
2687 do_debug_pubnames = 1;
2688 break;
2689
2690 case 'r':
2691 do_debug_aranges = 1;
2692 break;
2693
2694 case 'f':
2695 if (len > 6)
2696 do_debug_frames_interp = 1;
2697 do_debug_frames = 1;
2698 break;
2699
2700 case 'm':
2701 do_debug_macinfo = 1;
2702 break;
2703
2704 case 's':
2705 do_debug_str = 1;
2706 break;
2707 }
2708
2709 p += len;
2710 break;
2711 }
2712 }
2713
2714 if (debug_dump_opt[index] == NULL)
2715 {
2716 warn (_("Unrecognized debug option '%s'\n"), p);
2717 p = strchr (p, ',');
2718 if (p == NULL)
2719 break;
2720 }
2721
2722 if (*p == ',')
2723 p++;
2724 }
2725 }
2726 break;
2727 #ifdef SUPPORT_DISASSEMBLY
2728 case 'i':
2729 do_dump++;
2730 section = strtoul (optarg, & cp, 0);
2731 if (! *cp && section >= 0)
2732 {
2733 request_dump (section, DISASS_DUMP);
2734 break;
2735 }
2736 goto oops;
2737 #endif
2738 case 'v':
2739 print_version (program_name);
2740 break;
2741 case 'V':
2742 do_version++;
2743 break;
2744 case 'W':
2745 do_wide++;
2746 break;
2747 default:
2748 oops:
2749 /* xgettext:c-format */
2750 error (_("Invalid option '-%c'\n"), c);
2751 /* Drop through. */
2752 case '?':
2753 usage ();
2754 }
2755 }
2756
2757 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2758 && !do_segments && !do_header && !do_dump && !do_version
2759 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2760 usage ();
2761 else if (argc < 3)
2762 {
2763 warn (_("Nothing to do.\n"));
2764 usage();
2765 }
2766 }
2767
2768 static const char *
2769 get_elf_class (elf_class)
2770 unsigned int elf_class;
2771 {
2772 static char buff[32];
2773
2774 switch (elf_class)
2775 {
2776 case ELFCLASSNONE: return _("none");
2777 case ELFCLASS32: return "ELF32";
2778 case ELFCLASS64: return "ELF64";
2779 default:
2780 sprintf (buff, _("<unknown: %x>"), elf_class);
2781 return buff;
2782 }
2783 }
2784
2785 static const char *
2786 get_data_encoding (encoding)
2787 unsigned int encoding;
2788 {
2789 static char buff[32];
2790
2791 switch (encoding)
2792 {
2793 case ELFDATANONE: return _("none");
2794 case ELFDATA2LSB: return _("2's complement, little endian");
2795 case ELFDATA2MSB: return _("2's complement, big endian");
2796 default:
2797 sprintf (buff, _("<unknown: %x>"), encoding);
2798 return buff;
2799 }
2800 }
2801
2802 static const char *
2803 get_osabi_name (osabi)
2804 unsigned int osabi;
2805 {
2806 static char buff[32];
2807
2808 switch (osabi)
2809 {
2810 case ELFOSABI_NONE: return "UNIX - System V";
2811 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2812 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2813 case ELFOSABI_LINUX: return "UNIX - Linux";
2814 case ELFOSABI_HURD: return "GNU/Hurd";
2815 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2816 case ELFOSABI_AIX: return "UNIX - AIX";
2817 case ELFOSABI_IRIX: return "UNIX - IRIX";
2818 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2819 case ELFOSABI_TRU64: return "UNIX - TRU64";
2820 case ELFOSABI_MODESTO: return "Novell - Modesto";
2821 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2822 case ELFOSABI_STANDALONE: return _("Standalone App");
2823 case ELFOSABI_ARM: return "ARM";
2824 default:
2825 sprintf (buff, _("<unknown: %x>"), osabi);
2826 return buff;
2827 }
2828 }
2829
2830 /* Decode the data held in 'elf_header'. */
2831 static int
2832 process_file_header ()
2833 {
2834 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
2835 || elf_header.e_ident[EI_MAG1] != ELFMAG1
2836 || elf_header.e_ident[EI_MAG2] != ELFMAG2
2837 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
2838 {
2839 error
2840 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2841 return 0;
2842 }
2843
2844 if (do_header)
2845 {
2846 int i;
2847
2848 printf (_("ELF Header:\n"));
2849 printf (_(" Magic: "));
2850 for (i = 0; i < EI_NIDENT; i++)
2851 printf ("%2.2x ", elf_header.e_ident[i]);
2852 printf ("\n");
2853 printf (_(" Class: %s\n"),
2854 get_elf_class (elf_header.e_ident[EI_CLASS]));
2855 printf (_(" Data: %s\n"),
2856 get_data_encoding (elf_header.e_ident[EI_DATA]));
2857 printf (_(" Version: %d %s\n"),
2858 elf_header.e_ident[EI_VERSION],
2859 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
2860 ? "(current)"
2861 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2862 ? "<unknown: %lx>"
2863 : "")));
2864 printf (_(" OS/ABI: %s\n"),
2865 get_osabi_name (elf_header.e_ident[EI_OSABI]));
2866 printf (_(" ABI Version: %d\n"),
2867 elf_header.e_ident[EI_ABIVERSION]);
2868 printf (_(" Type: %s\n"),
2869 get_file_type (elf_header.e_type));
2870 printf (_(" Machine: %s\n"),
2871 get_machine_name (elf_header.e_machine));
2872 printf (_(" Version: 0x%lx\n"),
2873 (unsigned long) elf_header.e_version);
2874
2875 printf (_(" Entry point address: "));
2876 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2877 printf (_("\n Start of program headers: "));
2878 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2879 printf (_(" (bytes into file)\n Start of section headers: "));
2880 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2881 printf (_(" (bytes into file)\n"));
2882
2883 printf (_(" Flags: 0x%lx%s\n"),
2884 (unsigned long) elf_header.e_flags,
2885 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2886 printf (_(" Size of this header: %ld (bytes)\n"),
2887 (long) elf_header.e_ehsize);
2888 printf (_(" Size of program headers: %ld (bytes)\n"),
2889 (long) elf_header.e_phentsize);
2890 printf (_(" Number of program headers: %ld\n"),
2891 (long) elf_header.e_phnum);
2892 printf (_(" Size of section headers: %ld (bytes)\n"),
2893 (long) elf_header.e_shentsize);
2894 printf (_(" Number of section headers: %ld"),
2895 (long) elf_header.e_shnum);
2896 if (section_headers != NULL && elf_header.e_shnum == 0)
2897 printf (" (%ld)", (long) section_headers[0].sh_size);
2898 putc ('\n', stdout);
2899 printf (_(" Section header string table index: %ld"),
2900 (long) elf_header.e_shstrndx);
2901 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2902 printf (" (%ld)", (long) section_headers[0].sh_link);
2903 putc ('\n', stdout);
2904 }
2905
2906 if (section_headers != NULL)
2907 {
2908 if (elf_header.e_shnum == 0)
2909 elf_header.e_shnum = section_headers[0].sh_size;
2910 if (elf_header.e_shstrndx == SHN_XINDEX)
2911 elf_header.e_shstrndx = section_headers[0].sh_link;
2912 free (section_headers);
2913 section_headers = NULL;
2914 }
2915
2916 return 1;
2917 }
2918
2919
2920 static int
2921 get_32bit_program_headers (file, program_headers)
2922 FILE *file;
2923 Elf_Internal_Phdr *program_headers;
2924 {
2925 Elf32_External_Phdr *phdrs;
2926 Elf32_External_Phdr *external;
2927 Elf_Internal_Phdr *internal;
2928 unsigned int i;
2929
2930 phdrs = ((Elf32_External_Phdr *)
2931 get_data (NULL, file, elf_header.e_phoff,
2932 elf_header.e_phentsize * elf_header.e_phnum,
2933 _("program headers")));
2934 if (!phdrs)
2935 return 0;
2936
2937 for (i = 0, internal = program_headers, external = phdrs;
2938 i < elf_header.e_phnum;
2939 i++, internal++, external++)
2940 {
2941 internal->p_type = BYTE_GET (external->p_type);
2942 internal->p_offset = BYTE_GET (external->p_offset);
2943 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2944 internal->p_paddr = BYTE_GET (external->p_paddr);
2945 internal->p_filesz = BYTE_GET (external->p_filesz);
2946 internal->p_memsz = BYTE_GET (external->p_memsz);
2947 internal->p_flags = BYTE_GET (external->p_flags);
2948 internal->p_align = BYTE_GET (external->p_align);
2949 }
2950
2951 free (phdrs);
2952
2953 return 1;
2954 }
2955
2956 static int
2957 get_64bit_program_headers (file, program_headers)
2958 FILE *file;
2959 Elf_Internal_Phdr *program_headers;
2960 {
2961 Elf64_External_Phdr *phdrs;
2962 Elf64_External_Phdr *external;
2963 Elf_Internal_Phdr *internal;
2964 unsigned int i;
2965
2966 phdrs = ((Elf64_External_Phdr *)
2967 get_data (NULL, file, elf_header.e_phoff,
2968 elf_header.e_phentsize * elf_header.e_phnum,
2969 _("program headers")));
2970 if (!phdrs)
2971 return 0;
2972
2973 for (i = 0, internal = program_headers, external = phdrs;
2974 i < elf_header.e_phnum;
2975 i++, internal++, external++)
2976 {
2977 internal->p_type = BYTE_GET (external->p_type);
2978 internal->p_flags = BYTE_GET (external->p_flags);
2979 internal->p_offset = BYTE_GET8 (external->p_offset);
2980 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2981 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2982 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2983 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2984 internal->p_align = BYTE_GET8 (external->p_align);
2985 }
2986
2987 free (phdrs);
2988
2989 return 1;
2990 }
2991
2992 /* Returns 1 if the program headers were loaded. */
2993
2994 static int
2995 process_program_headers (file)
2996 FILE *file;
2997 {
2998 Elf_Internal_Phdr *program_headers;
2999 Elf_Internal_Phdr *segment;
3000 unsigned int i;
3001
3002 if (elf_header.e_phnum == 0)
3003 {
3004 if (do_segments)
3005 printf (_("\nThere are no program headers in this file.\n"));
3006 return 0;
3007 }
3008
3009 if (do_segments && !do_header)
3010 {
3011 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3012 printf (_("Entry point "));
3013 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3014 printf (_("\nThere are %d program headers, starting at offset "),
3015 elf_header.e_phnum);
3016 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3017 printf ("\n");
3018 }
3019
3020 program_headers = (Elf_Internal_Phdr *) malloc
3021 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3022
3023 if (program_headers == NULL)
3024 {
3025 error (_("Out of memory\n"));
3026 return 0;
3027 }
3028
3029 if (is_32bit_elf)
3030 i = get_32bit_program_headers (file, program_headers);
3031 else
3032 i = get_64bit_program_headers (file, program_headers);
3033
3034 if (i == 0)
3035 {
3036 free (program_headers);
3037 return 0;
3038 }
3039
3040 if (do_segments)
3041 {
3042 if (elf_header.e_phnum > 1)
3043 printf (_("\nProgram Headers:\n"));
3044 else
3045 printf (_("\nProgram Headers:\n"));
3046
3047 if (is_32bit_elf)
3048 printf
3049 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3050 else if (do_wide)
3051 printf
3052 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3053 else
3054 {
3055 printf
3056 (_(" Type Offset VirtAddr PhysAddr\n"));
3057 printf
3058 (_(" FileSiz MemSiz Flags Align\n"));
3059 }
3060 }
3061
3062 loadaddr = -1;
3063 dynamic_addr = 0;
3064 dynamic_size = 0;
3065
3066 for (i = 0, segment = program_headers;
3067 i < elf_header.e_phnum;
3068 i++, segment++)
3069 {
3070 if (do_segments)
3071 {
3072 printf (" %-14.14s ", get_segment_type (segment->p_type));
3073
3074 if (is_32bit_elf)
3075 {
3076 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3077 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3078 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3079 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3080 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3081 printf ("%c%c%c ",
3082 (segment->p_flags & PF_R ? 'R' : ' '),
3083 (segment->p_flags & PF_W ? 'W' : ' '),
3084 (segment->p_flags & PF_X ? 'E' : ' '));
3085 printf ("%#lx", (unsigned long) segment->p_align);
3086 }
3087 else if (do_wide)
3088 {
3089 if ((unsigned long) segment->p_offset == segment->p_offset)
3090 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3091 else
3092 {
3093 print_vma (segment->p_offset, FULL_HEX);
3094 putchar (' ');
3095 }
3096
3097 print_vma (segment->p_vaddr, FULL_HEX);
3098 putchar (' ');
3099 print_vma (segment->p_paddr, FULL_HEX);
3100 putchar (' ');
3101
3102 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3103 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3104 else
3105 {
3106 print_vma (segment->p_filesz, FULL_HEX);
3107 putchar (' ');
3108 }
3109
3110 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3111 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3112 else
3113 {
3114 print_vma (segment->p_offset, FULL_HEX);
3115 }
3116
3117 printf (" %c%c%c ",
3118 (segment->p_flags & PF_R ? 'R' : ' '),
3119 (segment->p_flags & PF_W ? 'W' : ' '),
3120 (segment->p_flags & PF_X ? 'E' : ' '));
3121
3122 if ((unsigned long) segment->p_align == segment->p_align)
3123 printf ("%#lx", (unsigned long) segment->p_align);
3124 else
3125 {
3126 print_vma (segment->p_align, PREFIX_HEX);
3127 }
3128 }
3129 else
3130 {
3131 print_vma (segment->p_offset, FULL_HEX);
3132 putchar (' ');
3133 print_vma (segment->p_vaddr, FULL_HEX);
3134 putchar (' ');
3135 print_vma (segment->p_paddr, FULL_HEX);
3136 printf ("\n ");
3137 print_vma (segment->p_filesz, FULL_HEX);
3138 putchar (' ');
3139 print_vma (segment->p_memsz, FULL_HEX);
3140 printf (" %c%c%c ",
3141 (segment->p_flags & PF_R ? 'R' : ' '),
3142 (segment->p_flags & PF_W ? 'W' : ' '),
3143 (segment->p_flags & PF_X ? 'E' : ' '));
3144 print_vma (segment->p_align, HEX);
3145 }
3146 }
3147
3148 switch (segment->p_type)
3149 {
3150 case PT_LOAD:
3151 if (loadaddr == -1)
3152 {
3153 unsigned long align_mask = -segment->p_align;
3154
3155 if (align_mask == 0)
3156 --align_mask;
3157 loadaddr = ((segment->p_vaddr & align_mask)
3158 - (segment->p_offset & align_mask));
3159 }
3160 break;
3161
3162 case PT_DYNAMIC:
3163 if (dynamic_addr)
3164 error (_("more than one dynamic segment\n"));
3165
3166 dynamic_addr = segment->p_offset;
3167 dynamic_size = segment->p_filesz;
3168 break;
3169
3170 case PT_INTERP:
3171 if (fseek (file, (long) segment->p_offset, SEEK_SET))
3172 error (_("Unable to find program interpreter name\n"));
3173 else
3174 {
3175 program_interpreter[0] = 0;
3176 fscanf (file, "%63s", program_interpreter);
3177
3178 if (do_segments)
3179 printf (_("\n [Requesting program interpreter: %s]"),
3180 program_interpreter);
3181 }
3182 break;
3183 }
3184
3185 if (do_segments)
3186 putc ('\n', stdout);
3187 }
3188
3189 if (loadaddr == -1)
3190 {
3191 /* Very strange. */
3192 loadaddr = 0;
3193 }
3194
3195 if (do_segments && section_headers != NULL)
3196 {
3197 printf (_("\n Section to Segment mapping:\n"));
3198 printf (_(" Segment Sections...\n"));
3199
3200 assert (string_table != NULL);
3201
3202 for (i = 0; i < elf_header.e_phnum; i++)
3203 {
3204 unsigned int j;
3205 Elf_Internal_Shdr *section;
3206
3207 segment = program_headers + i;
3208 section = section_headers;
3209
3210 printf (" %2.2d ", i);
3211
3212 for (j = 1; j < elf_header.e_shnum; j++, section++)
3213 {
3214 if (section->sh_size > 0
3215 /* Compare allocated sections by VMA, unallocated
3216 sections by file offset. */
3217 && (section->sh_flags & SHF_ALLOC
3218 ? (section->sh_addr >= segment->p_vaddr
3219 && section->sh_addr + section->sh_size
3220 <= segment->p_vaddr + segment->p_memsz)
3221 : ((bfd_vma) section->sh_offset >= segment->p_offset
3222 && (section->sh_offset + section->sh_size
3223 <= segment->p_offset + segment->p_filesz))))
3224 printf ("%s ", SECTION_NAME (section));
3225 }
3226
3227 putc ('\n',stdout);
3228 }
3229 }
3230
3231 free (program_headers);
3232
3233 return 1;
3234 }
3235
3236
3237 static int
3238 get_32bit_section_headers (file, num)
3239 FILE *file;
3240 unsigned int num;
3241 {
3242 Elf32_External_Shdr *shdrs;
3243 Elf_Internal_Shdr *internal;
3244 unsigned int i;
3245
3246 shdrs = ((Elf32_External_Shdr *)
3247 get_data (NULL, file, elf_header.e_shoff,
3248 elf_header.e_shentsize * num,
3249 _("section headers")));
3250 if (!shdrs)
3251 return 0;
3252
3253 section_headers = ((Elf_Internal_Shdr *)
3254 malloc (num * sizeof (Elf_Internal_Shdr)));
3255
3256 if (section_headers == NULL)
3257 {
3258 error (_("Out of memory\n"));
3259 return 0;
3260 }
3261
3262 for (i = 0, internal = section_headers;
3263 i < num;
3264 i++, internal++)
3265 {
3266 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3267 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3268 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3269 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3270 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3271 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3272 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3273 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3274 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3275 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3276 }
3277
3278 free (shdrs);
3279
3280 return 1;
3281 }
3282
3283 static int
3284 get_64bit_section_headers (file, num)
3285 FILE *file;
3286 unsigned int num;
3287 {
3288 Elf64_External_Shdr *shdrs;
3289 Elf_Internal_Shdr *internal;
3290 unsigned int i;
3291
3292 shdrs = ((Elf64_External_Shdr *)
3293 get_data (NULL, file, elf_header.e_shoff,
3294 elf_header.e_shentsize * num,
3295 _("section headers")));
3296 if (!shdrs)
3297 return 0;
3298
3299 section_headers = ((Elf_Internal_Shdr *)
3300 malloc (num * sizeof (Elf_Internal_Shdr)));
3301
3302 if (section_headers == NULL)
3303 {
3304 error (_("Out of memory\n"));
3305 return 0;
3306 }
3307
3308 for (i = 0, internal = section_headers;
3309 i < num;
3310 i++, internal++)
3311 {
3312 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3313 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3314 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3315 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3316 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3317 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3318 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3319 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3320 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3321 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3322 }
3323
3324 free (shdrs);
3325
3326 return 1;
3327 }
3328
3329 static Elf_Internal_Sym *
3330 get_32bit_elf_symbols (file, section)
3331 FILE *file;
3332 Elf_Internal_Shdr *section;
3333 {
3334 unsigned long number;
3335 Elf32_External_Sym *esyms;
3336 Elf_External_Sym_Shndx *shndx;
3337 Elf_Internal_Sym *isyms;
3338 Elf_Internal_Sym *psym;
3339 unsigned int j;
3340
3341 esyms = ((Elf32_External_Sym *)
3342 get_data (NULL, file, section->sh_offset,
3343 section->sh_size, _("symbols")));
3344 if (!esyms)
3345 return NULL;
3346
3347 shndx = NULL;
3348 if (symtab_shndx_hdr != NULL
3349 && (symtab_shndx_hdr->sh_link
3350 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3351 {
3352 shndx = ((Elf_External_Sym_Shndx *)
3353 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3354 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3355 if (!shndx)
3356 {
3357 free (esyms);
3358 return NULL;
3359 }
3360 }
3361
3362 number = section->sh_size / section->sh_entsize;
3363 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3364
3365 if (isyms == NULL)
3366 {
3367 error (_("Out of memory\n"));
3368 if (shndx)
3369 free (shndx);
3370 free (esyms);
3371 return NULL;
3372 }
3373
3374 for (j = 0, psym = isyms;
3375 j < number;
3376 j++, psym++)
3377 {
3378 psym->st_name = BYTE_GET (esyms[j].st_name);
3379 psym->st_value = BYTE_GET (esyms[j].st_value);
3380 psym->st_size = BYTE_GET (esyms[j].st_size);
3381 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3382 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3383 psym->st_shndx
3384 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3385 psym->st_info = BYTE_GET (esyms[j].st_info);
3386 psym->st_other = BYTE_GET (esyms[j].st_other);
3387 }
3388
3389 if (shndx)
3390 free (shndx);
3391 free (esyms);
3392
3393 return isyms;
3394 }
3395
3396 static Elf_Internal_Sym *
3397 get_64bit_elf_symbols (file, section)
3398 FILE *file;
3399 Elf_Internal_Shdr *section;
3400 {
3401 unsigned long number;
3402 Elf64_External_Sym *esyms;
3403 Elf_External_Sym_Shndx *shndx;
3404 Elf_Internal_Sym *isyms;
3405 Elf_Internal_Sym *psym;
3406 unsigned int j;
3407
3408 esyms = ((Elf64_External_Sym *)
3409 get_data (NULL, file, section->sh_offset,
3410 section->sh_size, _("symbols")));
3411 if (!esyms)
3412 return NULL;
3413
3414 shndx = NULL;
3415 if (symtab_shndx_hdr != NULL
3416 && (symtab_shndx_hdr->sh_link
3417 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3418 {
3419 shndx = ((Elf_External_Sym_Shndx *)
3420 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3421 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3422 if (!shndx)
3423 {
3424 free (esyms);
3425 return NULL;
3426 }
3427 }
3428
3429 number = section->sh_size / section->sh_entsize;
3430 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3431
3432 if (isyms == NULL)
3433 {
3434 error (_("Out of memory\n"));
3435 if (shndx)
3436 free (shndx);
3437 free (esyms);
3438 return NULL;
3439 }
3440
3441 for (j = 0, psym = isyms;
3442 j < number;
3443 j++, psym++)
3444 {
3445 psym->st_name = BYTE_GET (esyms[j].st_name);
3446 psym->st_info = BYTE_GET (esyms[j].st_info);
3447 psym->st_other = BYTE_GET (esyms[j].st_other);
3448 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3449 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3450 psym->st_shndx
3451 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3452 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3453 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3454 }
3455
3456 if (shndx)
3457 free (shndx);
3458 free (esyms);
3459
3460 return isyms;
3461 }
3462
3463 static const char *
3464 get_elf_section_flags (sh_flags)
3465 bfd_vma sh_flags;
3466 {
3467 static char buff[32];
3468
3469 *buff = 0;
3470
3471 while (sh_flags)
3472 {
3473 bfd_vma flag;
3474
3475 flag = sh_flags & - sh_flags;
3476 sh_flags &= ~ flag;
3477
3478 switch (flag)
3479 {
3480 case SHF_WRITE: strcat (buff, "W"); break;
3481 case SHF_ALLOC: strcat (buff, "A"); break;
3482 case SHF_EXECINSTR: strcat (buff, "X"); break;
3483 case SHF_MERGE: strcat (buff, "M"); break;
3484 case SHF_STRINGS: strcat (buff, "S"); break;
3485 case SHF_INFO_LINK: strcat (buff, "I"); break;
3486 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3487 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3488 case SHF_GROUP: strcat (buff, "G"); break;
3489 case SHF_TLS: strcat (buff, "T"); break;
3490
3491 default:
3492 if (flag & SHF_MASKOS)
3493 {
3494 strcat (buff, "o");
3495 sh_flags &= ~ SHF_MASKOS;
3496 }
3497 else if (flag & SHF_MASKPROC)
3498 {
3499 strcat (buff, "p");
3500 sh_flags &= ~ SHF_MASKPROC;
3501 }
3502 else
3503 strcat (buff, "x");
3504 break;
3505 }
3506 }
3507
3508 return buff;
3509 }
3510
3511 static int
3512 process_section_headers (file)
3513 FILE *file;
3514 {
3515 Elf_Internal_Shdr *section;
3516 unsigned int i;
3517
3518 section_headers = NULL;
3519
3520 if (elf_header.e_shnum == 0)
3521 {
3522 if (do_sections)
3523 printf (_("\nThere are no sections in this file.\n"));
3524
3525 return 1;
3526 }
3527
3528 if (do_sections && !do_header)
3529 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3530 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3531
3532 if (is_32bit_elf)
3533 {
3534 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3535 return 0;
3536 }
3537 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3538 return 0;
3539
3540 /* Read in the string table, so that we have names to display. */
3541 section = SECTION_HEADER (elf_header.e_shstrndx);
3542
3543 if (section->sh_size != 0)
3544 {
3545 string_table = (char *) get_data (NULL, file, section->sh_offset,
3546 section->sh_size, _("string table"));
3547
3548 string_table_length = section->sh_size;
3549 }
3550
3551 /* Scan the sections for the dynamic symbol table
3552 and dynamic string table and debug sections. */
3553 dynamic_symbols = NULL;
3554 dynamic_strings = NULL;
3555 dynamic_syminfo = NULL;
3556 symtab_shndx_hdr = NULL;
3557
3558 for (i = 0, section = section_headers;
3559 i < elf_header.e_shnum;
3560 i++, section++)
3561 {
3562 char *name = SECTION_NAME (section);
3563
3564 if (section->sh_type == SHT_DYNSYM)
3565 {
3566 if (dynamic_symbols != NULL)
3567 {
3568 error (_("File contains multiple dynamic symbol tables\n"));
3569 continue;
3570 }
3571
3572 num_dynamic_syms = section->sh_size / section->sh_entsize;
3573 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3574 }
3575 else if (section->sh_type == SHT_STRTAB
3576 && strcmp (name, ".dynstr") == 0)
3577 {
3578 if (dynamic_strings != NULL)
3579 {
3580 error (_("File contains multiple dynamic string tables\n"));
3581 continue;
3582 }
3583
3584 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3585 section->sh_size,
3586 _("dynamic strings"));
3587 }
3588 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3589 {
3590 if (symtab_shndx_hdr != NULL)
3591 {
3592 error (_("File contains multiple symtab shndx tables\n"));
3593 continue;
3594 }
3595 symtab_shndx_hdr = section;
3596 }
3597 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3598 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3599 || do_debug_frames || do_debug_macinfo || do_debug_str
3600 || do_debug_loc)
3601 && strncmp (name, ".debug_", 7) == 0)
3602 {
3603 name += 7;
3604
3605 if (do_debugging
3606 || (do_debug_info && (strcmp (name, "info") == 0))
3607 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3608 || (do_debug_lines && (strcmp (name, "line") == 0))
3609 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3610 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3611 || (do_debug_frames && (strcmp (name, "frame") == 0))
3612 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3613 || (do_debug_str && (strcmp (name, "str") == 0))
3614 || (do_debug_loc && (strcmp (name, "loc") == 0))
3615 )
3616 request_dump (i, DEBUG_DUMP);
3617 }
3618 /* linkonce section to be combined with .debug_info at link time. */
3619 else if ((do_debugging || do_debug_info)
3620 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3621 request_dump (i, DEBUG_DUMP);
3622 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3623 request_dump (i, DEBUG_DUMP);
3624 }
3625
3626 if (! do_sections)
3627 return 1;
3628
3629 if (elf_header.e_shnum > 1)
3630 printf (_("\nSection Headers:\n"));
3631 else
3632 printf (_("\nSection Header:\n"));
3633
3634 if (is_32bit_elf)
3635 printf
3636 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3637 else if (do_wide)
3638 printf
3639 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3640 else
3641 {
3642 printf (_(" [Nr] Name Type Address Offset\n"));
3643 printf (_(" Size EntSize Flags Link Info Align\n"));
3644 }
3645
3646 for (i = 0, section = section_headers;
3647 i < elf_header.e_shnum;
3648 i++, section++)
3649 {
3650 printf (" [%2u] %-17.17s %-15.15s ",
3651 SECTION_HEADER_NUM (i),
3652 SECTION_NAME (section),
3653 get_section_type_name (section->sh_type));
3654
3655 if (is_32bit_elf)
3656 {
3657 print_vma (section->sh_addr, LONG_HEX);
3658
3659 printf ( " %6.6lx %6.6lx %2.2lx",
3660 (unsigned long) section->sh_offset,
3661 (unsigned long) section->sh_size,
3662 (unsigned long) section->sh_entsize);
3663
3664 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3665
3666 printf ("%2ld %3lx %2ld\n",
3667 (unsigned long) section->sh_link,
3668 (unsigned long) section->sh_info,
3669 (unsigned long) section->sh_addralign);
3670 }
3671 else if (do_wide)
3672 {
3673 print_vma (section->sh_addr, LONG_HEX);
3674
3675 if ((long) section->sh_offset == section->sh_offset)
3676 printf (" %6.6lx", (unsigned long) section->sh_offset);
3677 else
3678 {
3679 putchar (' ');
3680 print_vma (section->sh_offset, LONG_HEX);
3681 }
3682
3683 if ((unsigned long) section->sh_size == section->sh_size)
3684 printf (" %6.6lx", (unsigned long) section->sh_size);
3685 else
3686 {
3687 putchar (' ');
3688 print_vma (section->sh_size, LONG_HEX);
3689 }
3690
3691 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3692 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3693 else
3694 {
3695 putchar (' ');
3696 print_vma (section->sh_entsize, LONG_HEX);
3697 }
3698
3699 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3700
3701 printf ("%2ld %3lx ",
3702 (unsigned long) section->sh_link,
3703 (unsigned long) section->sh_info);
3704
3705 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3706 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3707 else
3708 {
3709 print_vma (section->sh_addralign, DEC);
3710 putchar ('\n');
3711 }
3712 }
3713 else
3714 {
3715 putchar (' ');
3716 print_vma (section->sh_addr, LONG_HEX);
3717 if ((long) section->sh_offset == section->sh_offset)
3718 printf (" %8.8lx", (unsigned long) section->sh_offset);
3719 else
3720 {
3721 printf (" ");
3722 print_vma (section->sh_offset, LONG_HEX);
3723 }
3724 printf ("\n ");
3725 print_vma (section->sh_size, LONG_HEX);
3726 printf (" ");
3727 print_vma (section->sh_entsize, LONG_HEX);
3728
3729 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3730
3731 printf (" %2ld %3lx %ld\n",
3732 (unsigned long) section->sh_link,
3733 (unsigned long) section->sh_info,
3734 (unsigned long) section->sh_addralign);
3735 }
3736 }
3737
3738 printf (_("Key to Flags:\n\
3739 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3740 I (info), L (link order), G (group), x (unknown)\n\
3741 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3742
3743 return 1;
3744 }
3745
3746 /* Process the reloc section. */
3747 static int
3748 process_relocs (file)
3749 FILE *file;
3750 {
3751 unsigned long rel_size;
3752 unsigned long rel_offset;
3753
3754
3755 if (!do_reloc)
3756 return 1;
3757
3758 if (do_using_dynamic)
3759 {
3760 int is_rela = FALSE;
3761
3762 rel_size = 0;
3763 rel_offset = 0;
3764
3765 if (dynamic_info[DT_REL])
3766 {
3767 rel_offset = dynamic_info[DT_REL];
3768 rel_size = dynamic_info[DT_RELSZ];
3769 is_rela = FALSE;
3770 }
3771 else if (dynamic_info[DT_RELA])
3772 {
3773 rel_offset = dynamic_info[DT_RELA];
3774 rel_size = dynamic_info[DT_RELASZ];
3775 is_rela = TRUE;
3776 }
3777 else if (dynamic_info[DT_JMPREL])
3778 {
3779 rel_offset = dynamic_info[DT_JMPREL];
3780 rel_size = dynamic_info[DT_PLTRELSZ];
3781
3782 switch (dynamic_info[DT_PLTREL])
3783 {
3784 case DT_REL:
3785 is_rela = FALSE;
3786 break;
3787 case DT_RELA:
3788 is_rela = TRUE;
3789 break;
3790 default:
3791 is_rela = UNKNOWN;
3792 break;
3793 }
3794 }
3795
3796 if (rel_size)
3797 {
3798 printf
3799 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3800 rel_offset, rel_size);
3801
3802 dump_relocations (file, rel_offset - loadaddr, rel_size,
3803 dynamic_symbols, num_dynamic_syms, dynamic_strings,
3804 is_rela);
3805 }
3806 else
3807 printf (_("\nThere are no dynamic relocations in this file.\n"));
3808 }
3809 else
3810 {
3811 Elf_Internal_Shdr *section;
3812 unsigned long i;
3813 int found = 0;
3814
3815 for (i = 0, section = section_headers;
3816 i < elf_header.e_shnum;
3817 i++, section++)
3818 {
3819 if ( section->sh_type != SHT_RELA
3820 && section->sh_type != SHT_REL)
3821 continue;
3822
3823 rel_offset = section->sh_offset;
3824 rel_size = section->sh_size;
3825
3826 if (rel_size)
3827 {
3828 Elf_Internal_Shdr *strsec;
3829 Elf_Internal_Sym *symtab;
3830 char *strtab;
3831 int is_rela;
3832 unsigned long nsyms;
3833
3834 printf (_("\nRelocation section "));
3835
3836 if (string_table == NULL)
3837 printf ("%d", section->sh_name);
3838 else
3839 printf (_("'%s'"), SECTION_NAME (section));
3840
3841 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3842 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3843
3844 symtab = NULL;
3845 strtab = NULL;
3846 nsyms = 0;
3847 if (section->sh_link)
3848 {
3849 Elf_Internal_Shdr *symsec;
3850
3851 symsec = SECTION_HEADER (section->sh_link);
3852 nsyms = symsec->sh_size / symsec->sh_entsize;
3853 symtab = GET_ELF_SYMBOLS (file, symsec);
3854
3855 if (symtab == NULL)
3856 continue;
3857
3858 strsec = SECTION_HEADER (symsec->sh_link);
3859
3860 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3861 strsec->sh_size,
3862 _("string table"));
3863 }
3864 is_rela = section->sh_type == SHT_RELA;
3865
3866 dump_relocations (file, rel_offset, rel_size,
3867 symtab, nsyms, strtab, is_rela);
3868
3869 if (strtab)
3870 free (strtab);
3871 if (symtab)
3872 free (symtab);
3873
3874 found = 1;
3875 }
3876 }
3877
3878 if (! found)
3879 printf (_("\nThere are no relocations in this file.\n"));
3880 }
3881
3882 return 1;
3883 }
3884
3885 #include "unwind-ia64.h"
3886
3887 /* An absolute address consists of a section and an offset. If the
3888 section is NULL, the offset itself is the address, otherwise, the
3889 address equals to LOAD_ADDRESS(section) + offset. */
3890
3891 struct absaddr
3892 {
3893 unsigned short section;
3894 bfd_vma offset;
3895 };
3896
3897 struct unw_aux_info
3898 {
3899 struct unw_table_entry
3900 {
3901 struct absaddr start;
3902 struct absaddr end;
3903 struct absaddr info;
3904 }
3905 *table; /* Unwind table. */
3906 unsigned long table_len; /* Length of unwind table. */
3907 unsigned char *info; /* Unwind info. */
3908 unsigned long info_size; /* Size of unwind info. */
3909 bfd_vma info_addr; /* starting address of unwind info. */
3910 bfd_vma seg_base; /* Starting address of segment. */
3911 Elf_Internal_Sym *symtab; /* The symbol table. */
3912 unsigned long nsyms; /* Number of symbols. */
3913 char *strtab; /* The string table. */
3914 unsigned long strtab_size; /* Size of string table. */
3915 };
3916
3917 static void find_symbol_for_address
3918 PARAMS ((struct unw_aux_info *, struct absaddr, const char **, bfd_vma *));
3919 static void dump_ia64_unwind
3920 PARAMS ((struct unw_aux_info *));
3921 static int slurp_ia64_unwind_table
3922 PARAMS ((FILE *, struct unw_aux_info *, Elf_Internal_Shdr *));
3923
3924 static void
3925 find_symbol_for_address (aux, addr, symname, offset)
3926 struct unw_aux_info *aux;
3927 struct absaddr addr;
3928 const char **symname;
3929 bfd_vma *offset;
3930 {
3931 bfd_vma dist = (bfd_vma) 0x100000;
3932 Elf_Internal_Sym *sym, *best = NULL;
3933 unsigned long i;
3934
3935 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3936 {
3937 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3938 && sym->st_name != 0
3939 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3940 && addr.offset >= sym->st_value
3941 && addr.offset - sym->st_value < dist)
3942 {
3943 best = sym;
3944 dist = addr.offset - sym->st_value;
3945 if (!dist)
3946 break;
3947 }
3948 }
3949 if (best)
3950 {
3951 *symname = (best->st_name >= aux->strtab_size
3952 ? "<corrupt>" : aux->strtab + best->st_name);
3953 *offset = dist;
3954 return;
3955 }
3956 *symname = NULL;
3957 *offset = addr.offset;
3958 }
3959
3960 static void
3961 dump_ia64_unwind (aux)
3962 struct unw_aux_info *aux;
3963 {
3964 bfd_vma addr_size;
3965 struct unw_table_entry *tp;
3966 int in_body;
3967
3968 addr_size = is_32bit_elf ? 4 : 8;
3969
3970 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3971 {
3972 bfd_vma stamp;
3973 bfd_vma offset;
3974 const unsigned char *dp;
3975 const unsigned char *head;
3976 const char *procname;
3977
3978 find_symbol_for_address (aux, tp->start, &procname, &offset);
3979
3980 fputs ("\n<", stdout);
3981
3982 if (procname)
3983 {
3984 fputs (procname, stdout);
3985
3986 if (offset)
3987 printf ("+%lx", (unsigned long) offset);
3988 }
3989
3990 fputs (">: [", stdout);
3991 print_vma (tp->start.offset, PREFIX_HEX);
3992 fputc ('-', stdout);
3993 print_vma (tp->end.offset, PREFIX_HEX);
3994 printf ("], info at +0x%lx\n",
3995 (unsigned long) (tp->info.offset - aux->seg_base));
3996
3997 head = aux->info + (tp->info.offset - aux->info_addr);
3998 stamp = BYTE_GET8 ((unsigned char *) head);
3999
4000 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4001 (unsigned) UNW_VER (stamp),
4002 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4003 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4004 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4005 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
4006
4007 if (UNW_VER (stamp) != 1)
4008 {
4009 printf ("\tUnknown version.\n");
4010 continue;
4011 }
4012
4013 in_body = 0;
4014 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
4015 dp = unw_decode (dp, in_body, & in_body);
4016 }
4017 }
4018
4019 static int
4020 slurp_ia64_unwind_table (file, aux, sec)
4021 FILE *file;
4022 struct unw_aux_info *aux;
4023 Elf_Internal_Shdr *sec;
4024 {
4025 unsigned long size, addr_size, nrelas, i;
4026 Elf_Internal_Phdr *prog_hdrs, *seg;
4027 struct unw_table_entry *tep;
4028 Elf_Internal_Shdr *relsec;
4029 Elf_Internal_Rela *rela, *rp;
4030 unsigned char *table, *tp;
4031 Elf_Internal_Sym *sym;
4032 const char *relname;
4033 int result;
4034
4035 addr_size = is_32bit_elf ? 4 : 8;
4036
4037 /* First, find the starting address of the segment that includes
4038 this section: */
4039
4040 if (elf_header.e_phnum)
4041 {
4042 prog_hdrs = (Elf_Internal_Phdr *)
4043 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
4044
4045 if (is_32bit_elf)
4046 result = get_32bit_program_headers (file, prog_hdrs);
4047 else
4048 result = get_64bit_program_headers (file, prog_hdrs);
4049
4050 if (!result)
4051 {
4052 free (prog_hdrs);
4053 return 0;
4054 }
4055
4056 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
4057 {
4058 if (seg->p_type != PT_LOAD)
4059 continue;
4060
4061 if (sec->sh_addr >= seg->p_vaddr
4062 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4063 {
4064 aux->seg_base = seg->p_vaddr;
4065 break;
4066 }
4067 }
4068
4069 free (prog_hdrs);
4070 }
4071
4072 /* Second, build the unwind table from the contents of the unwind section: */
4073 size = sec->sh_size;
4074 table = (char *) get_data (NULL, file, sec->sh_offset,
4075 size, _("unwind table"));
4076 if (!table)
4077 return 0;
4078
4079 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
4080 for (tp = table; tp < table + size; tp += 3 * addr_size, ++tep)
4081 {
4082 tep->start.section = SHN_UNDEF;
4083 tep->end.section = SHN_UNDEF;
4084 tep->info.section = SHN_UNDEF;
4085 if (is_32bit_elf)
4086 {
4087 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4088 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4089 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4090 }
4091 else
4092 {
4093 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4094 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4095 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
4096 }
4097 tep->start.offset += aux->seg_base;
4098 tep->end.offset += aux->seg_base;
4099 tep->info.offset += aux->seg_base;
4100 }
4101 free (table);
4102
4103 /* Third, apply any relocations to the unwind table: */
4104
4105 for (relsec = section_headers;
4106 relsec < section_headers + elf_header.e_shnum;
4107 ++relsec)
4108 {
4109 if (relsec->sh_type != SHT_RELA
4110 || SECTION_HEADER (relsec->sh_info) != sec)
4111 continue;
4112
4113 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4114 & rela, & nrelas))
4115 return 0;
4116
4117 for (rp = rela; rp < rela + nrelas; ++rp)
4118 {
4119 if (is_32bit_elf)
4120 {
4121 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4122 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4123
4124 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
4125 {
4126 warn (_("Skipping unexpected symbol type %u\n"),
4127 ELF32_ST_TYPE (sym->st_info));
4128 continue;
4129 }
4130 }
4131 else
4132 {
4133 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4134 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4135
4136 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
4137 {
4138 warn (_("Skipping unexpected symbol type %u\n"),
4139 ELF64_ST_TYPE (sym->st_info));
4140 continue;
4141 }
4142 }
4143
4144 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
4145 {
4146 warn (_("Skipping unexpected relocation type %s\n"), relname);
4147 continue;
4148 }
4149
4150 i = rp->r_offset / (3 * addr_size);
4151
4152 switch (rp->r_offset/addr_size % 3)
4153 {
4154 case 0:
4155 aux->table[i].start.section = sym->st_shndx;
4156 aux->table[i].start.offset += rp->r_addend;
4157 break;
4158 case 1:
4159 aux->table[i].end.section = sym->st_shndx;
4160 aux->table[i].end.offset += rp->r_addend;
4161 break;
4162 case 2:
4163 aux->table[i].info.section = sym->st_shndx;
4164 aux->table[i].info.offset += rp->r_addend;
4165 break;
4166 default:
4167 break;
4168 }
4169 }
4170
4171 free (rela);
4172 }
4173
4174 aux->table_len = size / (3 * addr_size);
4175 return 1;
4176 }
4177
4178 static int
4179 process_unwind (file)
4180 FILE *file;
4181 {
4182 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4183 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4184 struct unw_aux_info aux;
4185
4186 if (!do_unwind)
4187 return 1;
4188
4189 if (elf_header.e_machine != EM_IA_64)
4190 {
4191 printf (_("\nThere are no unwind sections in this file.\n"));
4192 return 1;
4193 }
4194
4195 memset (& aux, 0, sizeof (aux));
4196
4197 addr_size = is_32bit_elf ? 4 : 8;
4198
4199 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4200 {
4201 if (sec->sh_type == SHT_SYMTAB)
4202 {
4203 aux.nsyms = sec->sh_size / sec->sh_entsize;
4204 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4205
4206 strsec = SECTION_HEADER (sec->sh_link);
4207 aux.strtab_size = strsec->sh_size;
4208 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
4209 aux.strtab_size, _("string table"));
4210 }
4211 else if (sec->sh_type == SHT_IA_64_UNWIND)
4212 unwcount++;
4213 }
4214
4215 if (!unwcount)
4216 printf (_("\nThere are no unwind sections in this file.\n"));
4217
4218 while (unwcount-- > 0)
4219 {
4220 char *suffix;
4221 size_t len, len2;
4222
4223 for (i = unwstart, sec = section_headers + unwstart;
4224 i < elf_header.e_shnum; ++i, ++sec)
4225 if (sec->sh_type == SHT_IA_64_UNWIND)
4226 {
4227 unwsec = sec;
4228 break;
4229 }
4230
4231 unwstart = i + 1;
4232 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4233
4234 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
4235 len) == 0)
4236 {
4237 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4238 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4239 suffix = SECTION_NAME (unwsec) + len;
4240 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4241 ++i, ++sec)
4242 if (strncmp (SECTION_NAME (sec),
4243 ELF_STRING_ia64_unwind_info_once, len2) == 0
4244 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4245 break;
4246 }
4247 else
4248 {
4249 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4250 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4251 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4252 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4253 suffix = "";
4254 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
4255 len) == 0)
4256 suffix = SECTION_NAME (unwsec) + len;
4257 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4258 ++i, ++sec)
4259 if (strncmp (SECTION_NAME (sec),
4260 ELF_STRING_ia64_unwind_info, len2) == 0
4261 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4262 break;
4263 }
4264
4265 if (i == elf_header.e_shnum)
4266 {
4267 printf (_("\nCould not find unwind info section for "));
4268
4269 if (string_table == NULL)
4270 printf ("%d", unwsec->sh_name);
4271 else
4272 printf (_("'%s'"), SECTION_NAME (unwsec));
4273 }
4274 else
4275 {
4276 aux.info_size = sec->sh_size;
4277 aux.info_addr = sec->sh_addr;
4278 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
4279 aux.info_size, _("unwind info"));
4280
4281 printf (_("\nUnwind section "));
4282
4283 if (string_table == NULL)
4284 printf ("%d", unwsec->sh_name);
4285 else
4286 printf (_("'%s'"), SECTION_NAME (unwsec));
4287
4288 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4289 (unsigned long) unwsec->sh_offset,
4290 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4291
4292 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4293
4294 if (aux.table_len > 0)
4295 dump_ia64_unwind (& aux);
4296
4297 if (aux.table)
4298 free ((char *) aux.table);
4299 if (aux.info)
4300 free ((char *) aux.info);
4301 aux.table = NULL;
4302 aux.info = NULL;
4303 }
4304 }
4305
4306 if (aux.symtab)
4307 free (aux.symtab);
4308 if (aux.strtab)
4309 free ((char *) aux.strtab);
4310
4311 return 1;
4312 }
4313
4314 static void
4315 dynamic_segment_mips_val (entry)
4316 Elf_Internal_Dyn *entry;
4317 {
4318 switch (entry->d_tag)
4319 {
4320 case DT_MIPS_FLAGS:
4321 if (entry->d_un.d_val == 0)
4322 printf ("NONE\n");
4323 else
4324 {
4325 static const char * opts[] =
4326 {
4327 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4328 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4329 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4330 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4331 "RLD_ORDER_SAFE"
4332 };
4333 unsigned int cnt;
4334 int first = 1;
4335 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
4336 if (entry->d_un.d_val & (1 << cnt))
4337 {
4338 printf ("%s%s", first ? "" : " ", opts[cnt]);
4339 first = 0;
4340 }
4341 puts ("");
4342 }
4343 break;
4344
4345 case DT_MIPS_IVERSION:
4346 if (dynamic_strings != NULL)
4347 printf ("Interface Version: %s\n",
4348 dynamic_strings + entry->d_un.d_val);
4349 else
4350 printf ("%ld\n", (long) entry->d_un.d_ptr);
4351 break;
4352
4353 case DT_MIPS_TIME_STAMP:
4354 {
4355 char timebuf[20];
4356 struct tm *tmp;
4357
4358 time_t time = entry->d_un.d_val;
4359 tmp = gmtime (&time);
4360 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4361 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4362 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4363 printf ("Time Stamp: %s\n", timebuf);
4364 }
4365 break;
4366
4367 case DT_MIPS_RLD_VERSION:
4368 case DT_MIPS_LOCAL_GOTNO:
4369 case DT_MIPS_CONFLICTNO:
4370 case DT_MIPS_LIBLISTNO:
4371 case DT_MIPS_SYMTABNO:
4372 case DT_MIPS_UNREFEXTNO:
4373 case DT_MIPS_HIPAGENO:
4374 case DT_MIPS_DELTA_CLASS_NO:
4375 case DT_MIPS_DELTA_INSTANCE_NO:
4376 case DT_MIPS_DELTA_RELOC_NO:
4377 case DT_MIPS_DELTA_SYM_NO:
4378 case DT_MIPS_DELTA_CLASSSYM_NO:
4379 case DT_MIPS_COMPACT_SIZE:
4380 printf ("%ld\n", (long) entry->d_un.d_ptr);
4381 break;
4382
4383 default:
4384 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4385 }
4386 }
4387
4388
4389 static void
4390 dynamic_segment_parisc_val (entry)
4391 Elf_Internal_Dyn *entry;
4392 {
4393 switch (entry->d_tag)
4394 {
4395 case DT_HP_DLD_FLAGS:
4396 {
4397 static struct
4398 {
4399 long int bit;
4400 const char *str;
4401 }
4402 flags[] =
4403 {
4404 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4405 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4406 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4407 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4408 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4409 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4410 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4411 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4412 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4413 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4414 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4415 };
4416 int first = 1;
4417 size_t cnt;
4418 bfd_vma val = entry->d_un.d_val;
4419
4420 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4421 if (val & flags[cnt].bit)
4422 {
4423 if (! first)
4424 putchar (' ');
4425 fputs (flags[cnt].str, stdout);
4426 first = 0;
4427 val ^= flags[cnt].bit;
4428 }
4429
4430 if (val != 0 || first)
4431 {
4432 if (! first)
4433 putchar (' ');
4434 print_vma (val, HEX);
4435 }
4436 }
4437 break;
4438
4439 default:
4440 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4441 break;
4442 }
4443 putchar ('\n');
4444 }
4445
4446 static int
4447 get_32bit_dynamic_segment (file)
4448 FILE *file;
4449 {
4450 Elf32_External_Dyn *edyn;
4451 Elf_Internal_Dyn *entry;
4452 bfd_size_type i;
4453
4454 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4455 dynamic_size, _("dynamic segment"));
4456 if (!edyn)
4457 return 0;
4458
4459 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4460 how large this .dynamic is now. We can do this even before the byte
4461 swapping since the DT_NULL tag is recognizable. */
4462 dynamic_size = 0;
4463 while (*(Elf32_Word *) edyn[dynamic_size++].d_tag != DT_NULL)
4464 ;
4465
4466 dynamic_segment = (Elf_Internal_Dyn *)
4467 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4468
4469 if (dynamic_segment == NULL)
4470 {
4471 error (_("Out of memory\n"));
4472 free (edyn);
4473 return 0;
4474 }
4475
4476 for (i = 0, entry = dynamic_segment;
4477 i < dynamic_size;
4478 i++, entry++)
4479 {
4480 entry->d_tag = BYTE_GET (edyn[i].d_tag);
4481 entry->d_un.d_val = BYTE_GET (edyn[i].d_un.d_val);
4482 }
4483
4484 free (edyn);
4485
4486 return 1;
4487 }
4488
4489 static int
4490 get_64bit_dynamic_segment (file)
4491 FILE *file;
4492 {
4493 Elf64_External_Dyn *edyn;
4494 Elf_Internal_Dyn *entry;
4495 bfd_size_type i;
4496
4497 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4498 dynamic_size, _("dynamic segment"));
4499 if (!edyn)
4500 return 0;
4501
4502 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4503 how large this .dynamic is now. We can do this even before the byte
4504 swapping since the DT_NULL tag is recognizable. */
4505 dynamic_size = 0;
4506 while (*(bfd_vma *) edyn[dynamic_size++].d_tag != DT_NULL)
4507 ;
4508
4509 dynamic_segment = (Elf_Internal_Dyn *)
4510 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4511
4512 if (dynamic_segment == NULL)
4513 {
4514 error (_("Out of memory\n"));
4515 free (edyn);
4516 return 0;
4517 }
4518
4519 for (i = 0, entry = dynamic_segment;
4520 i < dynamic_size;
4521 i++, entry++)
4522 {
4523 entry->d_tag = BYTE_GET8 (edyn[i].d_tag);
4524 entry->d_un.d_val = BYTE_GET8 (edyn[i].d_un.d_val);
4525 }
4526
4527 free (edyn);
4528
4529 return 1;
4530 }
4531
4532 static const char *
4533 get_dynamic_flags (flags)
4534 bfd_vma flags;
4535 {
4536 static char buff[128];
4537 char *p = buff;
4538
4539 *p = '\0';
4540 while (flags)
4541 {
4542 bfd_vma flag;
4543
4544 flag = flags & - flags;
4545 flags &= ~ flag;
4546
4547 if (p != buff)
4548 *p++ = ' ';
4549
4550 switch (flag)
4551 {
4552 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4553 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4554 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4555 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4556 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4557 default: strcpy (p, "unknown"); break;
4558 }
4559
4560 p = strchr (p, '\0');
4561 }
4562 return buff;
4563 }
4564
4565 /* Parse and display the contents of the dynamic segment. */
4566 static int
4567 process_dynamic_segment (file)
4568 FILE *file;
4569 {
4570 Elf_Internal_Dyn *entry;
4571 bfd_size_type i;
4572
4573 if (dynamic_size == 0)
4574 {
4575 if (do_dynamic)
4576 printf (_("\nThere is no dynamic segment in this file.\n"));
4577
4578 return 1;
4579 }
4580
4581 if (is_32bit_elf)
4582 {
4583 if (! get_32bit_dynamic_segment (file))
4584 return 0;
4585 }
4586 else if (! get_64bit_dynamic_segment (file))
4587 return 0;
4588
4589 /* Find the appropriate symbol table. */
4590 if (dynamic_symbols == NULL)
4591 {
4592 for (i = 0, entry = dynamic_segment;
4593 i < dynamic_size;
4594 ++i, ++entry)
4595 {
4596 Elf_Internal_Shdr section;
4597
4598 if (entry->d_tag != DT_SYMTAB)
4599 continue;
4600
4601 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4602
4603 /* Since we do not know how big the symbol table is,
4604 we default to reading in the entire file (!) and
4605 processing that. This is overkill, I know, but it
4606 should work. */
4607 section.sh_offset = entry->d_un.d_val - loadaddr;
4608
4609 if (fseek (file, 0, SEEK_END))
4610 error (_("Unable to seek to end of file!"));
4611
4612 section.sh_size = ftell (file) - section.sh_offset;
4613 if (is_32bit_elf)
4614 section.sh_entsize = sizeof (Elf32_External_Sym);
4615 else
4616 section.sh_entsize = sizeof (Elf64_External_Sym);
4617
4618 num_dynamic_syms = section.sh_size / section.sh_entsize;
4619 if (num_dynamic_syms < 1)
4620 {
4621 error (_("Unable to determine the number of symbols to load\n"));
4622 continue;
4623 }
4624
4625 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
4626 }
4627 }
4628
4629 /* Similarly find a string table. */
4630 if (dynamic_strings == NULL)
4631 {
4632 for (i = 0, entry = dynamic_segment;
4633 i < dynamic_size;
4634 ++i, ++entry)
4635 {
4636 unsigned long offset;
4637 long str_tab_len;
4638
4639 if (entry->d_tag != DT_STRTAB)
4640 continue;
4641
4642 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4643
4644 /* Since we do not know how big the string table is,
4645 we default to reading in the entire file (!) and
4646 processing that. This is overkill, I know, but it
4647 should work. */
4648
4649 offset = entry->d_un.d_val - loadaddr;
4650 if (fseek (file, 0, SEEK_END))
4651 error (_("Unable to seek to end of file\n"));
4652 str_tab_len = ftell (file) - offset;
4653
4654 if (str_tab_len < 1)
4655 {
4656 error
4657 (_("Unable to determine the length of the dynamic string table\n"));
4658 continue;
4659 }
4660
4661 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4662 _("dynamic string table"));
4663 break;
4664 }
4665 }
4666
4667 /* And find the syminfo section if available. */
4668 if (dynamic_syminfo == NULL)
4669 {
4670 unsigned long syminsz = 0;
4671
4672 for (i = 0, entry = dynamic_segment;
4673 i < dynamic_size;
4674 ++i, ++entry)
4675 {
4676 if (entry->d_tag == DT_SYMINENT)
4677 {
4678 /* Note: these braces are necessary to avoid a syntax
4679 error from the SunOS4 C compiler. */
4680 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4681 }
4682 else if (entry->d_tag == DT_SYMINSZ)
4683 syminsz = entry->d_un.d_val;
4684 else if (entry->d_tag == DT_SYMINFO)
4685 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4686 }
4687
4688 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4689 {
4690 Elf_External_Syminfo *extsyminfo;
4691 Elf_Internal_Syminfo *syminfo;
4692
4693 /* There is a syminfo section. Read the data. */
4694 extsyminfo = ((Elf_External_Syminfo *)
4695 get_data (NULL, file, dynamic_syminfo_offset,
4696 syminsz, _("symbol information")));
4697 if (!extsyminfo)
4698 return 0;
4699
4700 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4701 if (dynamic_syminfo == NULL)
4702 {
4703 error (_("Out of memory\n"));
4704 return 0;
4705 }
4706
4707 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4708 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4709 ++i, ++syminfo)
4710 {
4711 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4712 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4713 }
4714
4715 free (extsyminfo);
4716 }
4717 }
4718
4719 if (do_dynamic && dynamic_addr)
4720 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4721 dynamic_addr, (long) dynamic_size);
4722 if (do_dynamic)
4723 printf (_(" Tag Type Name/Value\n"));
4724
4725 for (i = 0, entry = dynamic_segment;
4726 i < dynamic_size;
4727 i++, entry++)
4728 {
4729 if (do_dynamic)
4730 {
4731 const char *dtype;
4732
4733 putchar (' ');
4734 print_vma (entry->d_tag, FULL_HEX);
4735 dtype = get_dynamic_type (entry->d_tag);
4736 printf (" (%s)%*s", dtype,
4737 ((is_32bit_elf ? 27 : 19)
4738 - (int) strlen (dtype)),
4739 " ");
4740 }
4741
4742 switch (entry->d_tag)
4743 {
4744 case DT_FLAGS:
4745 if (do_dynamic)
4746 puts (get_dynamic_flags (entry->d_un.d_val));
4747 break;
4748
4749 case DT_AUXILIARY:
4750 case DT_FILTER:
4751 case DT_CONFIG:
4752 case DT_DEPAUDIT:
4753 case DT_AUDIT:
4754 if (do_dynamic)
4755 {
4756 switch (entry->d_tag)
4757 {
4758 case DT_AUXILIARY:
4759 printf (_("Auxiliary library"));
4760 break;
4761
4762 case DT_FILTER:
4763 printf (_("Filter library"));
4764 break;
4765
4766 case DT_CONFIG:
4767 printf (_("Configuration file"));
4768 break;
4769
4770 case DT_DEPAUDIT:
4771 printf (_("Dependency audit library"));
4772 break;
4773
4774 case DT_AUDIT:
4775 printf (_("Audit library"));
4776 break;
4777 }
4778
4779 if (dynamic_strings)
4780 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4781 else
4782 {
4783 printf (": ");
4784 print_vma (entry->d_un.d_val, PREFIX_HEX);
4785 putchar ('\n');
4786 }
4787 }
4788 break;
4789
4790 case DT_FEATURE:
4791 if (do_dynamic)
4792 {
4793 printf (_("Flags:"));
4794
4795 if (entry->d_un.d_val == 0)
4796 printf (_(" None\n"));
4797 else
4798 {
4799 unsigned long int val = entry->d_un.d_val;
4800
4801 if (val & DTF_1_PARINIT)
4802 {
4803 printf (" PARINIT");
4804 val ^= DTF_1_PARINIT;
4805 }
4806 if (val & DTF_1_CONFEXP)
4807 {
4808 printf (" CONFEXP");
4809 val ^= DTF_1_CONFEXP;
4810 }
4811 if (val != 0)
4812 printf (" %lx", val);
4813 puts ("");
4814 }
4815 }
4816 break;
4817
4818 case DT_POSFLAG_1:
4819 if (do_dynamic)
4820 {
4821 printf (_("Flags:"));
4822
4823 if (entry->d_un.d_val == 0)
4824 printf (_(" None\n"));
4825 else
4826 {
4827 unsigned long int val = entry->d_un.d_val;
4828
4829 if (val & DF_P1_LAZYLOAD)
4830 {
4831 printf (" LAZYLOAD");
4832 val ^= DF_P1_LAZYLOAD;
4833 }
4834 if (val & DF_P1_GROUPPERM)
4835 {
4836 printf (" GROUPPERM");
4837 val ^= DF_P1_GROUPPERM;
4838 }
4839 if (val != 0)
4840 printf (" %lx", val);
4841 puts ("");
4842 }
4843 }
4844 break;
4845
4846 case DT_FLAGS_1:
4847 if (do_dynamic)
4848 {
4849 printf (_("Flags:"));
4850 if (entry->d_un.d_val == 0)
4851 printf (_(" None\n"));
4852 else
4853 {
4854 unsigned long int val = entry->d_un.d_val;
4855
4856 if (val & DF_1_NOW)
4857 {
4858 printf (" NOW");
4859 val ^= DF_1_NOW;
4860 }
4861 if (val & DF_1_GLOBAL)
4862 {
4863 printf (" GLOBAL");
4864 val ^= DF_1_GLOBAL;
4865 }
4866 if (val & DF_1_GROUP)
4867 {
4868 printf (" GROUP");
4869 val ^= DF_1_GROUP;
4870 }
4871 if (val & DF_1_NODELETE)
4872 {
4873 printf (" NODELETE");
4874 val ^= DF_1_NODELETE;
4875 }
4876 if (val & DF_1_LOADFLTR)
4877 {
4878 printf (" LOADFLTR");
4879 val ^= DF_1_LOADFLTR;
4880 }
4881 if (val & DF_1_INITFIRST)
4882 {
4883 printf (" INITFIRST");
4884 val ^= DF_1_INITFIRST;
4885 }
4886 if (val & DF_1_NOOPEN)
4887 {
4888 printf (" NOOPEN");
4889 val ^= DF_1_NOOPEN;
4890 }
4891 if (val & DF_1_ORIGIN)
4892 {
4893 printf (" ORIGIN");
4894 val ^= DF_1_ORIGIN;
4895 }
4896 if (val & DF_1_DIRECT)
4897 {
4898 printf (" DIRECT");
4899 val ^= DF_1_DIRECT;
4900 }
4901 if (val & DF_1_TRANS)
4902 {
4903 printf (" TRANS");
4904 val ^= DF_1_TRANS;
4905 }
4906 if (val & DF_1_INTERPOSE)
4907 {
4908 printf (" INTERPOSE");
4909 val ^= DF_1_INTERPOSE;
4910 }
4911 if (val & DF_1_NODEFLIB)
4912 {
4913 printf (" NODEFLIB");
4914 val ^= DF_1_NODEFLIB;
4915 }
4916 if (val & DF_1_NODUMP)
4917 {
4918 printf (" NODUMP");
4919 val ^= DF_1_NODUMP;
4920 }
4921 if (val & DF_1_CONLFAT)
4922 {
4923 printf (" CONLFAT");
4924 val ^= DF_1_CONLFAT;
4925 }
4926 if (val != 0)
4927 printf (" %lx", val);
4928 puts ("");
4929 }
4930 }
4931 break;
4932
4933 case DT_PLTREL:
4934 if (do_dynamic)
4935 puts (get_dynamic_type (entry->d_un.d_val));
4936 break;
4937
4938 case DT_NULL :
4939 case DT_NEEDED :
4940 case DT_PLTGOT :
4941 case DT_HASH :
4942 case DT_STRTAB :
4943 case DT_SYMTAB :
4944 case DT_RELA :
4945 case DT_INIT :
4946 case DT_FINI :
4947 case DT_SONAME :
4948 case DT_RPATH :
4949 case DT_SYMBOLIC:
4950 case DT_REL :
4951 case DT_DEBUG :
4952 case DT_TEXTREL :
4953 case DT_JMPREL :
4954 case DT_RUNPATH :
4955 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4956
4957 if (do_dynamic)
4958 {
4959 char *name;
4960
4961 if (dynamic_strings == NULL)
4962 name = NULL;
4963 else
4964 name = dynamic_strings + entry->d_un.d_val;
4965
4966 if (name)
4967 {
4968 switch (entry->d_tag)
4969 {
4970 case DT_NEEDED:
4971 printf (_("Shared library: [%s]"), name);
4972
4973 if (strcmp (name, program_interpreter) == 0)
4974 printf (_(" program interpreter"));
4975 break;
4976
4977 case DT_SONAME:
4978 printf (_("Library soname: [%s]"), name);
4979 break;
4980
4981 case DT_RPATH:
4982 printf (_("Library rpath: [%s]"), name);
4983 break;
4984
4985 case DT_RUNPATH:
4986 printf (_("Library runpath: [%s]"), name);
4987 break;
4988
4989 default:
4990 print_vma (entry->d_un.d_val, PREFIX_HEX);
4991 break;
4992 }
4993 }
4994 else
4995 print_vma (entry->d_un.d_val, PREFIX_HEX);
4996
4997 putchar ('\n');
4998 }
4999 break;
5000
5001 case DT_PLTRELSZ:
5002 case DT_RELASZ :
5003 case DT_STRSZ :
5004 case DT_RELSZ :
5005 case DT_RELAENT :
5006 case DT_SYMENT :
5007 case DT_RELENT :
5008 case DT_PLTPADSZ:
5009 case DT_MOVEENT :
5010 case DT_MOVESZ :
5011 case DT_INIT_ARRAYSZ:
5012 case DT_FINI_ARRAYSZ:
5013 case DT_GNU_CONFLICTSZ:
5014 case DT_GNU_LIBLISTSZ:
5015 if (do_dynamic)
5016 {
5017 print_vma (entry->d_un.d_val, UNSIGNED);
5018 printf (" (bytes)\n");
5019 }
5020 break;
5021
5022 case DT_VERDEFNUM:
5023 case DT_VERNEEDNUM:
5024 case DT_RELACOUNT:
5025 case DT_RELCOUNT:
5026 if (do_dynamic)
5027 {
5028 print_vma (entry->d_un.d_val, UNSIGNED);
5029 putchar ('\n');
5030 }
5031 break;
5032
5033 case DT_SYMINSZ:
5034 case DT_SYMINENT:
5035 case DT_SYMINFO:
5036 case DT_USED:
5037 case DT_INIT_ARRAY:
5038 case DT_FINI_ARRAY:
5039 if (do_dynamic)
5040 {
5041 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
5042 {
5043 char *name;
5044
5045 name = dynamic_strings + entry->d_un.d_val;
5046
5047 if (*name)
5048 {
5049 printf (_("Not needed object: [%s]\n"), name);
5050 break;
5051 }
5052 }
5053
5054 print_vma (entry->d_un.d_val, PREFIX_HEX);
5055 putchar ('\n');
5056 }
5057 break;
5058
5059 case DT_BIND_NOW:
5060 /* The value of this entry is ignored. */
5061 if (do_dynamic)
5062 putchar ('\n');
5063 break;
5064
5065 case DT_GNU_PRELINKED:
5066 if (do_dynamic)
5067 {
5068 struct tm *tmp;
5069 time_t time = entry->d_un.d_val;
5070
5071 tmp = gmtime (&time);
5072 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5073 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5074 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5075
5076 }
5077 break;
5078
5079 default:
5080 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5081 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5082 entry->d_un.d_val;
5083
5084 if (do_dynamic)
5085 {
5086 switch (elf_header.e_machine)
5087 {
5088 case EM_MIPS:
5089 case EM_MIPS_RS3_LE:
5090 dynamic_segment_mips_val (entry);
5091 break;
5092 case EM_PARISC:
5093 dynamic_segment_parisc_val (entry);
5094 break;
5095 default:
5096 print_vma (entry->d_un.d_val, PREFIX_HEX);
5097 putchar ('\n');
5098 }
5099 }
5100 break;
5101 }
5102 }
5103
5104 return 1;
5105 }
5106
5107 static char *
5108 get_ver_flags (flags)
5109 unsigned int flags;
5110 {
5111 static char buff[32];
5112
5113 buff[0] = 0;
5114
5115 if (flags == 0)
5116 return _("none");
5117
5118 if (flags & VER_FLG_BASE)
5119 strcat (buff, "BASE ");
5120
5121 if (flags & VER_FLG_WEAK)
5122 {
5123 if (flags & VER_FLG_BASE)
5124 strcat (buff, "| ");
5125
5126 strcat (buff, "WEAK ");
5127 }
5128
5129 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5130 strcat (buff, "| <unknown>");
5131
5132 return buff;
5133 }
5134
5135 /* Display the contents of the version sections. */
5136 static int
5137 process_version_sections (file)
5138 FILE *file;
5139 {
5140 Elf_Internal_Shdr *section;
5141 unsigned i;
5142 int found = 0;
5143
5144 if (! do_version)
5145 return 1;
5146
5147 for (i = 0, section = section_headers;
5148 i < elf_header.e_shnum;
5149 i++, section++)
5150 {
5151 switch (section->sh_type)
5152 {
5153 case SHT_GNU_verdef:
5154 {
5155 Elf_External_Verdef *edefs;
5156 unsigned int idx;
5157 unsigned int cnt;
5158
5159 found = 1;
5160
5161 printf
5162 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5163 SECTION_NAME (section), section->sh_info);
5164
5165 printf (_(" Addr: 0x"));
5166 printf_vma (section->sh_addr);
5167 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5168 (unsigned long) section->sh_offset, section->sh_link,
5169 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5170
5171 edefs = ((Elf_External_Verdef *)
5172 get_data (NULL, file, section->sh_offset,
5173 section->sh_size,
5174 _("version definition section")));
5175 if (!edefs)
5176 break;
5177
5178 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5179 {
5180 char *vstart;
5181 Elf_External_Verdef *edef;
5182 Elf_Internal_Verdef ent;
5183 Elf_External_Verdaux *eaux;
5184 Elf_Internal_Verdaux aux;
5185 int j;
5186 int isum;
5187
5188 vstart = ((char *) edefs) + idx;
5189
5190 edef = (Elf_External_Verdef *) vstart;
5191
5192 ent.vd_version = BYTE_GET (edef->vd_version);
5193 ent.vd_flags = BYTE_GET (edef->vd_flags);
5194 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5195 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5196 ent.vd_hash = BYTE_GET (edef->vd_hash);
5197 ent.vd_aux = BYTE_GET (edef->vd_aux);
5198 ent.vd_next = BYTE_GET (edef->vd_next);
5199
5200 printf (_(" %#06x: Rev: %d Flags: %s"),
5201 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5202
5203 printf (_(" Index: %d Cnt: %d "),
5204 ent.vd_ndx, ent.vd_cnt);
5205
5206 vstart += ent.vd_aux;
5207
5208 eaux = (Elf_External_Verdaux *) vstart;
5209
5210 aux.vda_name = BYTE_GET (eaux->vda_name);
5211 aux.vda_next = BYTE_GET (eaux->vda_next);
5212
5213 if (dynamic_strings)
5214 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
5215 else
5216 printf (_("Name index: %ld\n"), aux.vda_name);
5217
5218 isum = idx + ent.vd_aux;
5219
5220 for (j = 1; j < ent.vd_cnt; j++)
5221 {
5222 isum += aux.vda_next;
5223 vstart += aux.vda_next;
5224
5225 eaux = (Elf_External_Verdaux *) vstart;
5226
5227 aux.vda_name = BYTE_GET (eaux->vda_name);
5228 aux.vda_next = BYTE_GET (eaux->vda_next);
5229
5230 if (dynamic_strings)
5231 printf (_(" %#06x: Parent %d: %s\n"),
5232 isum, j, dynamic_strings + aux.vda_name);
5233 else
5234 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5235 isum, j, aux.vda_name);
5236 }
5237
5238 idx += ent.vd_next;
5239 }
5240
5241 free (edefs);
5242 }
5243 break;
5244
5245 case SHT_GNU_verneed:
5246 {
5247 Elf_External_Verneed *eneed;
5248 unsigned int idx;
5249 unsigned int cnt;
5250
5251 found = 1;
5252
5253 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5254 SECTION_NAME (section), section->sh_info);
5255
5256 printf (_(" Addr: 0x"));
5257 printf_vma (section->sh_addr);
5258 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5259 (unsigned long) section->sh_offset, section->sh_link,
5260 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5261
5262 eneed = ((Elf_External_Verneed *)
5263 get_data (NULL, file, section->sh_offset,
5264 section->sh_size, _("version need section")));
5265 if (!eneed)
5266 break;
5267
5268 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5269 {
5270 Elf_External_Verneed *entry;
5271 Elf_Internal_Verneed ent;
5272 int j;
5273 int isum;
5274 char *vstart;
5275
5276 vstart = ((char *) eneed) + idx;
5277
5278 entry = (Elf_External_Verneed *) vstart;
5279
5280 ent.vn_version = BYTE_GET (entry->vn_version);
5281 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5282 ent.vn_file = BYTE_GET (entry->vn_file);
5283 ent.vn_aux = BYTE_GET (entry->vn_aux);
5284 ent.vn_next = BYTE_GET (entry->vn_next);
5285
5286 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
5287
5288 if (dynamic_strings)
5289 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
5290 else
5291 printf (_(" File: %lx"), ent.vn_file);
5292
5293 printf (_(" Cnt: %d\n"), ent.vn_cnt);
5294
5295 vstart += ent.vn_aux;
5296
5297 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
5298 {
5299 Elf_External_Vernaux *eaux;
5300 Elf_Internal_Vernaux aux;
5301
5302 eaux = (Elf_External_Vernaux *) vstart;
5303
5304 aux.vna_hash = BYTE_GET (eaux->vna_hash);
5305 aux.vna_flags = BYTE_GET (eaux->vna_flags);
5306 aux.vna_other = BYTE_GET (eaux->vna_other);
5307 aux.vna_name = BYTE_GET (eaux->vna_name);
5308 aux.vna_next = BYTE_GET (eaux->vna_next);
5309
5310 if (dynamic_strings)
5311 printf (_(" %#06x: Name: %s"),
5312 isum, dynamic_strings + aux.vna_name);
5313 else
5314 printf (_(" %#06x: Name index: %lx"),
5315 isum, aux.vna_name);
5316
5317 printf (_(" Flags: %s Version: %d\n"),
5318 get_ver_flags (aux.vna_flags), aux.vna_other);
5319
5320 isum += aux.vna_next;
5321 vstart += aux.vna_next;
5322 }
5323
5324 idx += ent.vn_next;
5325 }
5326
5327 free (eneed);
5328 }
5329 break;
5330
5331 case SHT_GNU_versym:
5332 {
5333 Elf_Internal_Shdr *link_section;
5334 int total;
5335 int cnt;
5336 unsigned char *edata;
5337 unsigned short *data;
5338 char *strtab;
5339 Elf_Internal_Sym *symbols;
5340 Elf_Internal_Shdr *string_sec;
5341
5342 link_section = SECTION_HEADER (section->sh_link);
5343 total = section->sh_size / section->sh_entsize;
5344
5345 found = 1;
5346
5347 symbols = GET_ELF_SYMBOLS (file, link_section);
5348
5349 string_sec = SECTION_HEADER (link_section->sh_link);
5350
5351 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5352 string_sec->sh_size,
5353 _("version string table"));
5354 if (!strtab)
5355 break;
5356
5357 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5358 SECTION_NAME (section), total);
5359
5360 printf (_(" Addr: "));
5361 printf_vma (section->sh_addr);
5362 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5363 (unsigned long) section->sh_offset, section->sh_link,
5364 SECTION_NAME (link_section));
5365
5366 edata =
5367 ((unsigned char *)
5368 get_data (NULL, file,
5369 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5370 total * sizeof (short), _("version symbol data")));
5371 if (!edata)
5372 {
5373 free (strtab);
5374 break;
5375 }
5376
5377 data = (unsigned short *) malloc (total * sizeof (short));
5378
5379 for (cnt = total; cnt --;)
5380 data[cnt] = byte_get (edata + cnt * sizeof (short),
5381 sizeof (short));
5382
5383 free (edata);
5384
5385 for (cnt = 0; cnt < total; cnt += 4)
5386 {
5387 int j, nn;
5388 int check_def, check_need;
5389 char *name;
5390
5391 printf (" %03x:", cnt);
5392
5393 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5394 switch (data[cnt + j])
5395 {
5396 case 0:
5397 fputs (_(" 0 (*local*) "), stdout);
5398 break;
5399
5400 case 1:
5401 fputs (_(" 1 (*global*) "), stdout);
5402 break;
5403
5404 default:
5405 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
5406 data[cnt + j] & 0x8000 ? 'h' : ' ');
5407
5408 check_def = 1;
5409 check_need = 1;
5410 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
5411 != SHT_NOBITS)
5412 {
5413 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
5414 check_def = 0;
5415 else
5416 check_need = 0;
5417 }
5418
5419 if (check_need
5420 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
5421 {
5422 Elf_Internal_Verneed ivn;
5423 unsigned long offset;
5424
5425 offset = version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5426 - loadaddr;
5427
5428 do
5429 {
5430 Elf_Internal_Vernaux ivna;
5431 Elf_External_Verneed evn;
5432 Elf_External_Vernaux evna;
5433 unsigned long a_off;
5434
5435 get_data (&evn, file, offset, sizeof (evn),
5436 _("version need"));
5437
5438 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5439 ivn.vn_next = BYTE_GET (evn.vn_next);
5440
5441 a_off = offset + ivn.vn_aux;
5442
5443 do
5444 {
5445 get_data (&evna, file, a_off, sizeof (evna),
5446 _("version need aux (2)"));
5447
5448 ivna.vna_next = BYTE_GET (evna.vna_next);
5449 ivna.vna_other = BYTE_GET (evna.vna_other);
5450
5451 a_off += ivna.vna_next;
5452 }
5453 while (ivna.vna_other != data[cnt + j]
5454 && ivna.vna_next != 0);
5455
5456 if (ivna.vna_other == data[cnt + j])
5457 {
5458 ivna.vna_name = BYTE_GET (evna.vna_name);
5459
5460 name = strtab + ivna.vna_name;
5461 nn += printf ("(%s%-*s",
5462 name,
5463 12 - (int) strlen (name),
5464 ")");
5465 check_def = 0;
5466 break;
5467 }
5468
5469 offset += ivn.vn_next;
5470 }
5471 while (ivn.vn_next);
5472 }
5473
5474 if (check_def && data[cnt + j] != 0x8001
5475 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5476 {
5477 Elf_Internal_Verdef ivd;
5478 Elf_External_Verdef evd;
5479 unsigned long offset;
5480
5481 offset = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5482 - loadaddr);
5483
5484 do
5485 {
5486 get_data (&evd, file, offset, sizeof (evd),
5487 _("version def"));
5488
5489 ivd.vd_next = BYTE_GET (evd.vd_next);
5490 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5491
5492 offset += ivd.vd_next;
5493 }
5494 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
5495 && ivd.vd_next != 0);
5496
5497 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
5498 {
5499 Elf_External_Verdaux evda;
5500 Elf_Internal_Verdaux ivda;
5501
5502 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5503
5504 get_data (&evda, file,
5505 offset - ivd.vd_next + ivd.vd_aux,
5506 sizeof (evda), _("version def aux"));
5507
5508 ivda.vda_name = BYTE_GET (evda.vda_name);
5509
5510 name = strtab + ivda.vda_name;
5511 nn += printf ("(%s%-*s",
5512 name,
5513 12 - (int) strlen (name),
5514 ")");
5515 }
5516 }
5517
5518 if (nn < 18)
5519 printf ("%*c", 18 - nn, ' ');
5520 }
5521
5522 putchar ('\n');
5523 }
5524
5525 free (data);
5526 free (strtab);
5527 free (symbols);
5528 }
5529 break;
5530
5531 default:
5532 break;
5533 }
5534 }
5535
5536 if (! found)
5537 printf (_("\nNo version information found in this file.\n"));
5538
5539 return 1;
5540 }
5541
5542 static const char *
5543 get_symbol_binding (binding)
5544 unsigned int binding;
5545 {
5546 static char buff[32];
5547
5548 switch (binding)
5549 {
5550 case STB_LOCAL: return "LOCAL";
5551 case STB_GLOBAL: return "GLOBAL";
5552 case STB_WEAK: return "WEAK";
5553 default:
5554 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5555 sprintf (buff, _("<processor specific>: %d"), binding);
5556 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5557 sprintf (buff, _("<OS specific>: %d"), binding);
5558 else
5559 sprintf (buff, _("<unknown>: %d"), binding);
5560 return buff;
5561 }
5562 }
5563
5564 static const char *
5565 get_symbol_type (type)
5566 unsigned int type;
5567 {
5568 static char buff[32];
5569
5570 switch (type)
5571 {
5572 case STT_NOTYPE: return "NOTYPE";
5573 case STT_OBJECT: return "OBJECT";
5574 case STT_FUNC: return "FUNC";
5575 case STT_SECTION: return "SECTION";
5576 case STT_FILE: return "FILE";
5577 case STT_COMMON: return "COMMON";
5578 case STT_TLS: return "TLS";
5579 default:
5580 if (type >= STT_LOPROC && type <= STT_HIPROC)
5581 {
5582 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5583 return "THUMB_FUNC";
5584
5585 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5586 return "REGISTER";
5587
5588 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5589 return "PARISC_MILLI";
5590
5591 sprintf (buff, _("<processor specific>: %d"), type);
5592 }
5593 else if (type >= STT_LOOS && type <= STT_HIOS)
5594 {
5595 if (elf_header.e_machine == EM_PARISC)
5596 {
5597 if (type == STT_HP_OPAQUE)
5598 return "HP_OPAQUE";
5599 if (type == STT_HP_STUB)
5600 return "HP_STUB";
5601 }
5602
5603 sprintf (buff, _("<OS specific>: %d"), type);
5604 }
5605 else
5606 sprintf (buff, _("<unknown>: %d"), type);
5607 return buff;
5608 }
5609 }
5610
5611 static const char *
5612 get_symbol_visibility (visibility)
5613 unsigned int visibility;
5614 {
5615 switch (visibility)
5616 {
5617 case STV_DEFAULT: return "DEFAULT";
5618 case STV_INTERNAL: return "INTERNAL";
5619 case STV_HIDDEN: return "HIDDEN";
5620 case STV_PROTECTED: return "PROTECTED";
5621 default: abort ();
5622 }
5623 }
5624
5625 static const char *
5626 get_symbol_index_type (type)
5627 unsigned int type;
5628 {
5629 static char buff[32];
5630
5631 switch (type)
5632 {
5633 case SHN_UNDEF: return "UND";
5634 case SHN_ABS: return "ABS";
5635 case SHN_COMMON: return "COM";
5636 default:
5637 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5638 sprintf (buff, "PRC[0x%04x]", type);
5639 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5640 sprintf (buff, "OS [0x%04x]", type);
5641 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5642 sprintf (buff, "RSV[0x%04x]", type);
5643 else
5644 sprintf (buff, "%3d", type);
5645 break;
5646 }
5647
5648 return buff;
5649 }
5650
5651 static int *
5652 get_dynamic_data (file, number)
5653 FILE *file;
5654 unsigned int number;
5655 {
5656 unsigned char *e_data;
5657 int *i_data;
5658
5659 e_data = (unsigned char *) malloc (number * 4);
5660
5661 if (e_data == NULL)
5662 {
5663 error (_("Out of memory\n"));
5664 return NULL;
5665 }
5666
5667 if (fread (e_data, 4, number, file) != number)
5668 {
5669 error (_("Unable to read in dynamic data\n"));
5670 return NULL;
5671 }
5672
5673 i_data = (int *) malloc (number * sizeof (*i_data));
5674
5675 if (i_data == NULL)
5676 {
5677 error (_("Out of memory\n"));
5678 free (e_data);
5679 return NULL;
5680 }
5681
5682 while (number--)
5683 i_data[number] = byte_get (e_data + number * 4, 4);
5684
5685 free (e_data);
5686
5687 return i_data;
5688 }
5689
5690 /* Dump the symbol table. */
5691 static int
5692 process_symbol_table (file)
5693 FILE *file;
5694 {
5695 Elf_Internal_Shdr *section;
5696 unsigned char nb[4];
5697 unsigned char nc[4];
5698 int nbuckets = 0;
5699 int nchains = 0;
5700 int *buckets = NULL;
5701 int *chains = NULL;
5702
5703 if (! do_syms && !do_histogram)
5704 return 1;
5705
5706 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5707 || do_histogram))
5708 {
5709 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5710 {
5711 error (_("Unable to seek to start of dynamic information"));
5712 return 0;
5713 }
5714
5715 if (fread (nb, sizeof (nb), 1, file) != 1)
5716 {
5717 error (_("Failed to read in number of buckets\n"));
5718 return 0;
5719 }
5720
5721 if (fread (nc, sizeof (nc), 1, file) != 1)
5722 {
5723 error (_("Failed to read in number of chains\n"));
5724 return 0;
5725 }
5726
5727 nbuckets = byte_get (nb, 4);
5728 nchains = byte_get (nc, 4);
5729
5730 buckets = get_dynamic_data (file, nbuckets);
5731 chains = get_dynamic_data (file, nchains);
5732
5733 if (buckets == NULL || chains == NULL)
5734 return 0;
5735 }
5736
5737 if (do_syms
5738 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5739 {
5740 int hn;
5741 int si;
5742
5743 printf (_("\nSymbol table for image:\n"));
5744 if (is_32bit_elf)
5745 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5746 else
5747 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5748
5749 for (hn = 0; hn < nbuckets; hn++)
5750 {
5751 if (! buckets[hn])
5752 continue;
5753
5754 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
5755 {
5756 Elf_Internal_Sym *psym;
5757
5758 psym = dynamic_symbols + si;
5759
5760 printf (" %3d %3d: ", si, hn);
5761 print_vma (psym->st_value, LONG_HEX);
5762 putchar (' ' );
5763 print_vma (psym->st_size, DEC_5);
5764
5765 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5766 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5767 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5768 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5769 print_symbol (25, dynamic_strings + psym->st_name);
5770 putchar ('\n');
5771 }
5772 }
5773 }
5774 else if (do_syms && !do_using_dynamic)
5775 {
5776 unsigned int i;
5777
5778 for (i = 0, section = section_headers;
5779 i < elf_header.e_shnum;
5780 i++, section++)
5781 {
5782 unsigned int si;
5783 char *strtab;
5784 Elf_Internal_Sym *symtab;
5785 Elf_Internal_Sym *psym;
5786
5787
5788 if ( section->sh_type != SHT_SYMTAB
5789 && section->sh_type != SHT_DYNSYM)
5790 continue;
5791
5792 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5793 SECTION_NAME (section),
5794 (unsigned long) (section->sh_size / section->sh_entsize));
5795 if (is_32bit_elf)
5796 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5797 else
5798 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5799
5800 symtab = GET_ELF_SYMBOLS (file, section);
5801 if (symtab == NULL)
5802 continue;
5803
5804 if (section->sh_link == elf_header.e_shstrndx)
5805 strtab = string_table;
5806 else
5807 {
5808 Elf_Internal_Shdr *string_sec;
5809
5810 string_sec = SECTION_HEADER (section->sh_link);
5811
5812 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5813 string_sec->sh_size,
5814 _("string table"));
5815 }
5816
5817 for (si = 0, psym = symtab;
5818 si < section->sh_size / section->sh_entsize;
5819 si++, psym++)
5820 {
5821 printf ("%6d: ", si);
5822 print_vma (psym->st_value, LONG_HEX);
5823 putchar (' ');
5824 print_vma (psym->st_size, DEC_5);
5825 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5826 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5827 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5828 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5829 print_symbol (25, strtab + psym->st_name);
5830
5831 if (section->sh_type == SHT_DYNSYM &&
5832 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5833 {
5834 unsigned char data[2];
5835 unsigned short vers_data;
5836 unsigned long offset;
5837 int is_nobits;
5838 int check_def;
5839
5840 offset = version_info[DT_VERSIONTAGIDX (DT_VERSYM)]
5841 - loadaddr;
5842
5843 get_data (&data, file, offset + si * sizeof (vers_data),
5844 sizeof (data), _("version data"));
5845
5846 vers_data = byte_get (data, 2);
5847
5848 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5849 == SHT_NOBITS);
5850
5851 check_def = (psym->st_shndx != SHN_UNDEF);
5852
5853 if ((vers_data & 0x8000) || vers_data > 1)
5854 {
5855 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5856 && (is_nobits || ! check_def))
5857 {
5858 Elf_External_Verneed evn;
5859 Elf_Internal_Verneed ivn;
5860 Elf_Internal_Vernaux ivna;
5861
5862 /* We must test both. */
5863 offset = (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5864 - loadaddr);
5865
5866 do
5867 {
5868 unsigned long vna_off;
5869
5870 get_data (&evn, file, offset, sizeof (evn),
5871 _("version need"));
5872
5873 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5874 ivn.vn_next = BYTE_GET (evn.vn_next);
5875
5876 vna_off = offset + ivn.vn_aux;
5877
5878 do
5879 {
5880 Elf_External_Vernaux evna;
5881
5882 get_data (&evna, file, vna_off,
5883 sizeof (evna),
5884 _("version need aux (3)"));
5885
5886 ivna.vna_other = BYTE_GET (evna.vna_other);
5887 ivna.vna_next = BYTE_GET (evna.vna_next);
5888 ivna.vna_name = BYTE_GET (evna.vna_name);
5889
5890 vna_off += ivna.vna_next;
5891 }
5892 while (ivna.vna_other != vers_data
5893 && ivna.vna_next != 0);
5894
5895 if (ivna.vna_other == vers_data)
5896 break;
5897
5898 offset += ivn.vn_next;
5899 }
5900 while (ivn.vn_next != 0);
5901
5902 if (ivna.vna_other == vers_data)
5903 {
5904 printf ("@%s (%d)",
5905 strtab + ivna.vna_name, ivna.vna_other);
5906 check_def = 0;
5907 }
5908 else if (! is_nobits)
5909 error (_("bad dynamic symbol"));
5910 else
5911 check_def = 1;
5912 }
5913
5914 if (check_def)
5915 {
5916 if (vers_data != 0x8001
5917 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5918 {
5919 Elf_Internal_Verdef ivd;
5920 Elf_Internal_Verdaux ivda;
5921 Elf_External_Verdaux evda;
5922 unsigned long offset;
5923
5924 offset
5925 = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5926 - loadaddr);
5927
5928 do
5929 {
5930 Elf_External_Verdef evd;
5931
5932 get_data (&evd, file, offset, sizeof (evd),
5933 _("version def"));
5934
5935 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5936 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5937 ivd.vd_next = BYTE_GET (evd.vd_next);
5938
5939 offset += ivd.vd_next;
5940 }
5941 while (ivd.vd_ndx != (vers_data & 0x7fff)
5942 && ivd.vd_next != 0);
5943
5944 offset -= ivd.vd_next;
5945 offset += ivd.vd_aux;
5946
5947 get_data (&evda, file, offset, sizeof (evda),
5948 _("version def aux"));
5949
5950 ivda.vda_name = BYTE_GET (evda.vda_name);
5951
5952 if (psym->st_name != ivda.vda_name)
5953 printf ((vers_data & 0x8000)
5954 ? "@%s" : "@@%s",
5955 strtab + ivda.vda_name);
5956 }
5957 }
5958 }
5959 }
5960
5961 putchar ('\n');
5962 }
5963
5964 free (symtab);
5965 if (strtab != string_table)
5966 free (strtab);
5967 }
5968 }
5969 else if (do_syms)
5970 printf
5971 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5972
5973 if (do_histogram && buckets != NULL)
5974 {
5975 int *lengths;
5976 int *counts;
5977 int hn;
5978 int si;
5979 int maxlength = 0;
5980 int nzero_counts = 0;
5981 int nsyms = 0;
5982
5983 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5984 nbuckets);
5985 printf (_(" Length Number %% of total Coverage\n"));
5986
5987 lengths = (int *) calloc (nbuckets, sizeof (int));
5988 if (lengths == NULL)
5989 {
5990 error (_("Out of memory"));
5991 return 0;
5992 }
5993 for (hn = 0; hn < nbuckets; ++hn)
5994 {
5995 if (! buckets[hn])
5996 continue;
5997
5998 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5999 {
6000 ++nsyms;
6001 if (maxlength < ++lengths[hn])
6002 ++maxlength;
6003 }
6004 }
6005
6006 counts = (int *) calloc (maxlength + 1, sizeof (int));
6007 if (counts == NULL)
6008 {
6009 error (_("Out of memory"));
6010 return 0;
6011 }
6012
6013 for (hn = 0; hn < nbuckets; ++hn)
6014 ++counts[lengths[hn]];
6015
6016 if (nbuckets > 0)
6017 {
6018 printf (" 0 %-10d (%5.1f%%)\n",
6019 counts[0], (counts[0] * 100.0) / nbuckets);
6020 for (si = 1; si <= maxlength; ++si)
6021 {
6022 nzero_counts += counts[si] * si;
6023 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6024 si, counts[si], (counts[si] * 100.0) / nbuckets,
6025 (nzero_counts * 100.0) / nsyms);
6026 }
6027 }
6028
6029 free (counts);
6030 free (lengths);
6031 }
6032
6033 if (buckets != NULL)
6034 {
6035 free (buckets);
6036 free (chains);
6037 }
6038
6039 return 1;
6040 }
6041
6042 static int
6043 process_syminfo (file)
6044 FILE *file ATTRIBUTE_UNUSED;
6045 {
6046 unsigned int i;
6047
6048 if (dynamic_syminfo == NULL
6049 || !do_dynamic)
6050 /* No syminfo, this is ok. */
6051 return 1;
6052
6053 /* There better should be a dynamic symbol section. */
6054 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6055 return 0;
6056
6057 if (dynamic_addr)
6058 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6059 dynamic_syminfo_offset, dynamic_syminfo_nent);
6060
6061 printf (_(" Num: Name BoundTo Flags\n"));
6062 for (i = 0; i < dynamic_syminfo_nent; ++i)
6063 {
6064 unsigned short int flags = dynamic_syminfo[i].si_flags;
6065
6066 printf ("%4d: ", i);
6067 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
6068 putchar (' ');
6069
6070 switch (dynamic_syminfo[i].si_boundto)
6071 {
6072 case SYMINFO_BT_SELF:
6073 fputs ("SELF ", stdout);
6074 break;
6075 case SYMINFO_BT_PARENT:
6076 fputs ("PARENT ", stdout);
6077 break;
6078 default:
6079 if (dynamic_syminfo[i].si_boundto > 0
6080 && dynamic_syminfo[i].si_boundto < dynamic_size)
6081 {
6082 print_symbol (10,
6083 dynamic_strings
6084 + (dynamic_segment
6085 [dynamic_syminfo[i].si_boundto].d_un.d_val));
6086 putchar (' ' );
6087 }
6088 else
6089 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6090 break;
6091 }
6092
6093 if (flags & SYMINFO_FLG_DIRECT)
6094 printf (" DIRECT");
6095 if (flags & SYMINFO_FLG_PASSTHRU)
6096 printf (" PASSTHRU");
6097 if (flags & SYMINFO_FLG_COPY)
6098 printf (" COPY");
6099 if (flags & SYMINFO_FLG_LAZYLOAD)
6100 printf (" LAZYLOAD");
6101
6102 puts ("");
6103 }
6104
6105 return 1;
6106 }
6107
6108 #ifdef SUPPORT_DISASSEMBLY
6109 static void
6110 disassemble_section (section, file)
6111 Elf_Internal_Shdr *section;
6112 FILE *file;
6113 {
6114 printf (_("\nAssembly dump of section %s\n"),
6115 SECTION_NAME (section));
6116
6117 /* XXX -- to be done --- XXX */
6118
6119 return 1;
6120 }
6121 #endif
6122
6123 static int
6124 dump_section (section, file)
6125 Elf_Internal_Shdr *section;
6126 FILE *file;
6127 {
6128 bfd_size_type bytes;
6129 bfd_vma addr;
6130 unsigned char *data;
6131 unsigned char *start;
6132
6133 bytes = section->sh_size;
6134
6135 if (bytes == 0)
6136 {
6137 printf (_("\nSection '%s' has no data to dump.\n"),
6138 SECTION_NAME (section));
6139 return 0;
6140 }
6141 else
6142 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6143
6144 addr = section->sh_addr;
6145
6146 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
6147 _("section data"));
6148 if (!start)
6149 return 0;
6150
6151 data = start;
6152
6153 while (bytes)
6154 {
6155 int j;
6156 int k;
6157 int lbytes;
6158
6159 lbytes = (bytes > 16 ? 16 : bytes);
6160
6161 printf (" 0x%8.8lx ", (unsigned long) addr);
6162
6163 switch (elf_header.e_ident[EI_DATA])
6164 {
6165 default:
6166 case ELFDATA2LSB:
6167 for (j = 15; j >= 0; j --)
6168 {
6169 if (j < lbytes)
6170 printf ("%2.2x", data[j]);
6171 else
6172 printf (" ");
6173
6174 if (!(j & 0x3))
6175 printf (" ");
6176 }
6177 break;
6178
6179 case ELFDATA2MSB:
6180 for (j = 0; j < 16; j++)
6181 {
6182 if (j < lbytes)
6183 printf ("%2.2x", data[j]);
6184 else
6185 printf (" ");
6186
6187 if ((j & 3) == 3)
6188 printf (" ");
6189 }
6190 break;
6191 }
6192
6193 for (j = 0; j < lbytes; j++)
6194 {
6195 k = data[j];
6196 if (k >= ' ' && k < 0x80)
6197 printf ("%c", k);
6198 else
6199 printf (".");
6200 }
6201
6202 putchar ('\n');
6203
6204 data += lbytes;
6205 addr += lbytes;
6206 bytes -= lbytes;
6207 }
6208
6209 free (start);
6210
6211 return 1;
6212 }
6213
6214
6215 static unsigned long int
6216 read_leb128 (data, length_return, sign)
6217 unsigned char *data;
6218 int *length_return;
6219 int sign;
6220 {
6221 unsigned long int result = 0;
6222 unsigned int num_read = 0;
6223 int shift = 0;
6224 unsigned char byte;
6225
6226 do
6227 {
6228 byte = *data++;
6229 num_read++;
6230
6231 result |= (byte & 0x7f) << shift;
6232
6233 shift += 7;
6234
6235 }
6236 while (byte & 0x80);
6237
6238 if (length_return != NULL)
6239 *length_return = num_read;
6240
6241 if (sign && (shift < 32) && (byte & 0x40))
6242 result |= -1 << shift;
6243
6244 return result;
6245 }
6246
6247 typedef struct State_Machine_Registers
6248 {
6249 unsigned long address;
6250 unsigned int file;
6251 unsigned int line;
6252 unsigned int column;
6253 int is_stmt;
6254 int basic_block;
6255 int end_sequence;
6256 /* This variable hold the number of the last entry seen
6257 in the File Table. */
6258 unsigned int last_file_entry;
6259 } SMR;
6260
6261 static SMR state_machine_regs;
6262
6263 static void
6264 reset_state_machine (is_stmt)
6265 int is_stmt;
6266 {
6267 state_machine_regs.address = 0;
6268 state_machine_regs.file = 1;
6269 state_machine_regs.line = 1;
6270 state_machine_regs.column = 0;
6271 state_machine_regs.is_stmt = is_stmt;
6272 state_machine_regs.basic_block = 0;
6273 state_machine_regs.end_sequence = 0;
6274 state_machine_regs.last_file_entry = 0;
6275 }
6276
6277 /* Handled an extend line op. Returns true if this is the end
6278 of sequence. */
6279 static int
6280 process_extended_line_op (data, is_stmt, pointer_size)
6281 unsigned char *data;
6282 int is_stmt;
6283 int pointer_size;
6284 {
6285 unsigned char op_code;
6286 int bytes_read;
6287 unsigned int len;
6288 unsigned char *name;
6289 unsigned long adr;
6290
6291 len = read_leb128 (data, & bytes_read, 0);
6292 data += bytes_read;
6293
6294 if (len == 0)
6295 {
6296 warn (_("badly formed extended line op encountered!\n"));
6297 return bytes_read;
6298 }
6299
6300 len += bytes_read;
6301 op_code = *data++;
6302
6303 printf (_(" Extended opcode %d: "), op_code);
6304
6305 switch (op_code)
6306 {
6307 case DW_LNE_end_sequence:
6308 printf (_("End of Sequence\n\n"));
6309 reset_state_machine (is_stmt);
6310 break;
6311
6312 case DW_LNE_set_address:
6313 adr = byte_get (data, pointer_size);
6314 printf (_("set Address to 0x%lx\n"), adr);
6315 state_machine_regs.address = adr;
6316 break;
6317
6318 case DW_LNE_define_file:
6319 printf (_(" define new File Table entry\n"));
6320 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6321
6322 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6323 name = data;
6324 data += strlen ((char *) data) + 1;
6325 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6326 data += bytes_read;
6327 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6328 data += bytes_read;
6329 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6330 printf (_("%s\n\n"), name);
6331 break;
6332
6333 default:
6334 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6335 break;
6336 }
6337
6338 return len;
6339 }
6340
6341 /* Size of pointers in the .debug_line section. This information is not
6342 really present in that section. It's obtained before dumping the debug
6343 sections by doing some pre-scan of the .debug_info section. */
6344 static int debug_line_pointer_size = 4;
6345
6346 static int
6347 display_debug_lines (section, start, file)
6348 Elf_Internal_Shdr *section;
6349 unsigned char * start;
6350 FILE *file ATTRIBUTE_UNUSED;
6351 {
6352 DWARF2_External_LineInfo *external;
6353 DWARF2_Internal_LineInfo info;
6354 unsigned char *standard_opcodes;
6355 unsigned char *data = start;
6356 unsigned char *end = start + section->sh_size;
6357 unsigned char *end_of_sequence;
6358 int i;
6359
6360 printf (_("\nDump of debug contents of section %s:\n\n"),
6361 SECTION_NAME (section));
6362
6363 while (data < end)
6364 {
6365 external = (DWARF2_External_LineInfo *) data;
6366
6367 /* Check the length of the block. */
6368 info.li_length = BYTE_GET (external->li_length);
6369
6370 if (info.li_length == 0xffffffff)
6371 {
6372 warn (_("64-bit DWARF line info is not supported yet.\n"));
6373 break;
6374 }
6375
6376 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6377 {
6378 warn
6379 (_("The line info appears to be corrupt - the section is too small\n"));
6380 return 0;
6381 }
6382
6383 /* Check its version number. */
6384 info.li_version = BYTE_GET (external->li_version);
6385 if (info.li_version != 2)
6386 {
6387 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6388 return 0;
6389 }
6390
6391 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6392 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6393 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6394 info.li_line_base = BYTE_GET (external->li_line_base);
6395 info.li_line_range = BYTE_GET (external->li_line_range);
6396 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6397
6398 /* Sign extend the line base field. */
6399 info.li_line_base <<= 24;
6400 info.li_line_base >>= 24;
6401
6402 printf (_(" Length: %ld\n"), info.li_length);
6403 printf (_(" DWARF Version: %d\n"), info.li_version);
6404 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6405 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6406 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6407 printf (_(" Line Base: %d\n"), info.li_line_base);
6408 printf (_(" Line Range: %d\n"), info.li_line_range);
6409 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6410
6411 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6412
6413 reset_state_machine (info.li_default_is_stmt);
6414
6415 /* Display the contents of the Opcodes table. */
6416 standard_opcodes = data + sizeof (*external);
6417
6418 printf (_("\n Opcodes:\n"));
6419
6420 for (i = 1; i < info.li_opcode_base; i++)
6421 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6422
6423 /* Display the contents of the Directory table. */
6424 data = standard_opcodes + info.li_opcode_base - 1;
6425
6426 if (*data == 0)
6427 printf (_("\n The Directory Table is empty.\n"));
6428 else
6429 {
6430 printf (_("\n The Directory Table:\n"));
6431
6432 while (*data != 0)
6433 {
6434 printf (_(" %s\n"), data);
6435
6436 data += strlen ((char *) data) + 1;
6437 }
6438 }
6439
6440 /* Skip the NUL at the end of the table. */
6441 data++;
6442
6443 /* Display the contents of the File Name table. */
6444 if (*data == 0)
6445 printf (_("\n The File Name Table is empty.\n"));
6446 else
6447 {
6448 printf (_("\n The File Name Table:\n"));
6449 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6450
6451 while (*data != 0)
6452 {
6453 unsigned char *name;
6454 int bytes_read;
6455
6456 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6457 name = data;
6458
6459 data += strlen ((char *) data) + 1;
6460
6461 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6462 data += bytes_read;
6463 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6464 data += bytes_read;
6465 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6466 data += bytes_read;
6467 printf (_("%s\n"), name);
6468 }
6469 }
6470
6471 /* Skip the NUL at the end of the table. */
6472 data++;
6473
6474 /* Now display the statements. */
6475 printf (_("\n Line Number Statements:\n"));
6476
6477
6478 while (data < end_of_sequence)
6479 {
6480 unsigned char op_code;
6481 int adv;
6482 int bytes_read;
6483
6484 op_code = *data++;
6485
6486 if (op_code >= info.li_opcode_base)
6487 {
6488 op_code -= info.li_opcode_base;
6489 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6490 state_machine_regs.address += adv;
6491 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6492 op_code, adv, state_machine_regs.address);
6493 adv = (op_code % info.li_line_range) + info.li_line_base;
6494 state_machine_regs.line += adv;
6495 printf (_(" and Line by %d to %d\n"),
6496 adv, state_machine_regs.line);
6497 }
6498 else switch (op_code)
6499 {
6500 case DW_LNS_extended_op:
6501 data += process_extended_line_op (data, info.li_default_is_stmt,
6502 debug_line_pointer_size);
6503 break;
6504
6505 case DW_LNS_copy:
6506 printf (_(" Copy\n"));
6507 break;
6508
6509 case DW_LNS_advance_pc:
6510 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6511 data += bytes_read;
6512 state_machine_regs.address += adv;
6513 printf (_(" Advance PC by %d to %lx\n"), adv,
6514 state_machine_regs.address);
6515 break;
6516
6517 case DW_LNS_advance_line:
6518 adv = read_leb128 (data, & bytes_read, 1);
6519 data += bytes_read;
6520 state_machine_regs.line += adv;
6521 printf (_(" Advance Line by %d to %d\n"), adv,
6522 state_machine_regs.line);
6523 break;
6524
6525 case DW_LNS_set_file:
6526 adv = read_leb128 (data, & bytes_read, 0);
6527 data += bytes_read;
6528 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6529 adv);
6530 state_machine_regs.file = adv;
6531 break;
6532
6533 case DW_LNS_set_column:
6534 adv = read_leb128 (data, & bytes_read, 0);
6535 data += bytes_read;
6536 printf (_(" Set column to %d\n"), adv);
6537 state_machine_regs.column = adv;
6538 break;
6539
6540 case DW_LNS_negate_stmt:
6541 adv = state_machine_regs.is_stmt;
6542 adv = ! adv;
6543 printf (_(" Set is_stmt to %d\n"), adv);
6544 state_machine_regs.is_stmt = adv;
6545 break;
6546
6547 case DW_LNS_set_basic_block:
6548 printf (_(" Set basic block\n"));
6549 state_machine_regs.basic_block = 1;
6550 break;
6551
6552 case DW_LNS_const_add_pc:
6553 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6554 * info.li_min_insn_length);
6555 state_machine_regs.address += adv;
6556 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6557 state_machine_regs.address);
6558 break;
6559
6560 case DW_LNS_fixed_advance_pc:
6561 adv = byte_get (data, 2);
6562 data += 2;
6563 state_machine_regs.address += adv;
6564 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6565 adv, state_machine_regs.address);
6566 break;
6567
6568 case DW_LNS_set_prologue_end:
6569 printf (_(" Set prologue_end to true\n"));
6570 break;
6571
6572 case DW_LNS_set_epilogue_begin:
6573 printf (_(" Set epilogue_begin to true\n"));
6574 break;
6575
6576 case DW_LNS_set_isa:
6577 adv = read_leb128 (data, & bytes_read, 0);
6578 data += bytes_read;
6579 printf (_(" Set ISA to %d\n"), adv);
6580 break;
6581
6582 default:
6583 printf (_(" Unknown opcode %d with operands: "), op_code);
6584 {
6585 int i;
6586 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6587 {
6588 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6589 i == 1 ? "" : ", ");
6590 data += bytes_read;
6591 }
6592 putchar ('\n');
6593 }
6594 break;
6595 }
6596 }
6597 putchar ('\n');
6598 }
6599
6600 return 1;
6601 }
6602
6603 static int
6604 display_debug_pubnames (section, start, file)
6605 Elf_Internal_Shdr *section;
6606 unsigned char *start;
6607 FILE *file ATTRIBUTE_UNUSED;
6608 {
6609 DWARF2_External_PubNames *external;
6610 DWARF2_Internal_PubNames pubnames;
6611 unsigned char *end;
6612
6613 end = start + section->sh_size;
6614
6615 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6616
6617 while (start < end)
6618 {
6619 unsigned char *data;
6620 unsigned long offset;
6621
6622 external = (DWARF2_External_PubNames *) start;
6623
6624 pubnames.pn_length = BYTE_GET (external->pn_length);
6625 pubnames.pn_version = BYTE_GET (external->pn_version);
6626 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6627 pubnames.pn_size = BYTE_GET (external->pn_size);
6628
6629 data = start + sizeof (*external);
6630 start += pubnames.pn_length + sizeof (external->pn_length);
6631
6632 if (pubnames.pn_length == 0xffffffff)
6633 {
6634 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6635 break;
6636 }
6637
6638 if (pubnames.pn_version != 2)
6639 {
6640 static int warned = 0;
6641
6642 if (! warned)
6643 {
6644 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6645 warned = 1;
6646 }
6647
6648 continue;
6649 }
6650
6651 printf (_(" Length: %ld\n"),
6652 pubnames.pn_length);
6653 printf (_(" Version: %d\n"),
6654 pubnames.pn_version);
6655 printf (_(" Offset into .debug_info section: %ld\n"),
6656 pubnames.pn_offset);
6657 printf (_(" Size of area in .debug_info section: %ld\n"),
6658 pubnames.pn_size);
6659
6660 printf (_("\n Offset\tName\n"));
6661
6662 do
6663 {
6664 offset = byte_get (data, 4);
6665
6666 if (offset != 0)
6667 {
6668 data += 4;
6669 printf (" %ld\t\t%s\n", offset, data);
6670 data += strlen ((char *) data) + 1;
6671 }
6672 }
6673 while (offset != 0);
6674 }
6675
6676 printf ("\n");
6677 return 1;
6678 }
6679
6680 static char *
6681 get_TAG_name (tag)
6682 unsigned long tag;
6683 {
6684 switch (tag)
6685 {
6686 case DW_TAG_padding: return "DW_TAG_padding";
6687 case DW_TAG_array_type: return "DW_TAG_array_type";
6688 case DW_TAG_class_type: return "DW_TAG_class_type";
6689 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6690 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6691 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6692 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6693 case DW_TAG_label: return "DW_TAG_label";
6694 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6695 case DW_TAG_member: return "DW_TAG_member";
6696 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6697 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6698 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6699 case DW_TAG_string_type: return "DW_TAG_string_type";
6700 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6701 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6702 case DW_TAG_typedef: return "DW_TAG_typedef";
6703 case DW_TAG_union_type: return "DW_TAG_union_type";
6704 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6705 case DW_TAG_variant: return "DW_TAG_variant";
6706 case DW_TAG_common_block: return "DW_TAG_common_block";
6707 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6708 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6709 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6710 case DW_TAG_module: return "DW_TAG_module";
6711 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6712 case DW_TAG_set_type: return "DW_TAG_set_type";
6713 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6714 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6715 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6716 case DW_TAG_base_type: return "DW_TAG_base_type";
6717 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6718 case DW_TAG_const_type: return "DW_TAG_const_type";
6719 case DW_TAG_constant: return "DW_TAG_constant";
6720 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6721 case DW_TAG_file_type: return "DW_TAG_file_type";
6722 case DW_TAG_friend: return "DW_TAG_friend";
6723 case DW_TAG_namelist: return "DW_TAG_namelist";
6724 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6725 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6726 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6727 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6728 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6729 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6730 case DW_TAG_try_block: return "DW_TAG_try_block";
6731 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6732 case DW_TAG_variable: return "DW_TAG_variable";
6733 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6734 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6735 case DW_TAG_format_label: return "DW_TAG_format_label";
6736 case DW_TAG_function_template: return "DW_TAG_function_template";
6737 case DW_TAG_class_template: return "DW_TAG_class_template";
6738 /* DWARF 2.1 values. */
6739 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6740 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6741 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6742 case DW_TAG_namespace: return "DW_TAG_namespace";
6743 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6744 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6745 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6746 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6747 /* UPC values. */
6748 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
6749 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
6750 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
6751 default:
6752 {
6753 static char buffer[100];
6754
6755 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6756 return buffer;
6757 }
6758 }
6759 }
6760
6761 static char *
6762 get_AT_name (attribute)
6763 unsigned long attribute;
6764 {
6765 switch (attribute)
6766 {
6767 case DW_AT_sibling: return "DW_AT_sibling";
6768 case DW_AT_location: return "DW_AT_location";
6769 case DW_AT_name: return "DW_AT_name";
6770 case DW_AT_ordering: return "DW_AT_ordering";
6771 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6772 case DW_AT_byte_size: return "DW_AT_byte_size";
6773 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6774 case DW_AT_bit_size: return "DW_AT_bit_size";
6775 case DW_AT_element_list: return "DW_AT_element_list";
6776 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6777 case DW_AT_low_pc: return "DW_AT_low_pc";
6778 case DW_AT_high_pc: return "DW_AT_high_pc";
6779 case DW_AT_language: return "DW_AT_language";
6780 case DW_AT_member: return "DW_AT_member";
6781 case DW_AT_discr: return "DW_AT_discr";
6782 case DW_AT_discr_value: return "DW_AT_discr_value";
6783 case DW_AT_visibility: return "DW_AT_visibility";
6784 case DW_AT_import: return "DW_AT_import";
6785 case DW_AT_string_length: return "DW_AT_string_length";
6786 case DW_AT_common_reference: return "DW_AT_common_reference";
6787 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6788 case DW_AT_const_value: return "DW_AT_const_value";
6789 case DW_AT_containing_type: return "DW_AT_containing_type";
6790 case DW_AT_default_value: return "DW_AT_default_value";
6791 case DW_AT_inline: return "DW_AT_inline";
6792 case DW_AT_is_optional: return "DW_AT_is_optional";
6793 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6794 case DW_AT_producer: return "DW_AT_producer";
6795 case DW_AT_prototyped: return "DW_AT_prototyped";
6796 case DW_AT_return_addr: return "DW_AT_return_addr";
6797 case DW_AT_start_scope: return "DW_AT_start_scope";
6798 case DW_AT_stride_size: return "DW_AT_stride_size";
6799 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6800 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6801 case DW_AT_accessibility: return "DW_AT_accessibility";
6802 case DW_AT_address_class: return "DW_AT_address_class";
6803 case DW_AT_artificial: return "DW_AT_artificial";
6804 case DW_AT_base_types: return "DW_AT_base_types";
6805 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6806 case DW_AT_count: return "DW_AT_count";
6807 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6808 case DW_AT_decl_column: return "DW_AT_decl_column";
6809 case DW_AT_decl_file: return "DW_AT_decl_file";
6810 case DW_AT_decl_line: return "DW_AT_decl_line";
6811 case DW_AT_declaration: return "DW_AT_declaration";
6812 case DW_AT_discr_list: return "DW_AT_discr_list";
6813 case DW_AT_encoding: return "DW_AT_encoding";
6814 case DW_AT_external: return "DW_AT_external";
6815 case DW_AT_frame_base: return "DW_AT_frame_base";
6816 case DW_AT_friend: return "DW_AT_friend";
6817 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6818 case DW_AT_macro_info: return "DW_AT_macro_info";
6819 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6820 case DW_AT_priority: return "DW_AT_priority";
6821 case DW_AT_segment: return "DW_AT_segment";
6822 case DW_AT_specification: return "DW_AT_specification";
6823 case DW_AT_static_link: return "DW_AT_static_link";
6824 case DW_AT_type: return "DW_AT_type";
6825 case DW_AT_use_location: return "DW_AT_use_location";
6826 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6827 case DW_AT_virtuality: return "DW_AT_virtuality";
6828 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6829 /* DWARF 2.1 values. */
6830 case DW_AT_allocated: return "DW_AT_allocated";
6831 case DW_AT_associated: return "DW_AT_associated";
6832 case DW_AT_data_location: return "DW_AT_data_location";
6833 case DW_AT_stride: return "DW_AT_stride";
6834 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6835 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6836 case DW_AT_extension: return "DW_AT_extension";
6837 case DW_AT_ranges: return "DW_AT_ranges";
6838 case DW_AT_trampoline: return "DW_AT_trampoline";
6839 case DW_AT_call_column: return "DW_AT_call_column";
6840 case DW_AT_call_file: return "DW_AT_call_file";
6841 case DW_AT_call_line: return "DW_AT_call_line";
6842 /* SGI/MIPS extensions. */
6843 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6844 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6845 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6846 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6847 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6848 case DW_AT_MIPS_software_pipeline_depth:
6849 return "DW_AT_MIPS_software_pipeline_depth";
6850 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6851 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6852 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6853 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6854 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6855 /* GNU extensions. */
6856 case DW_AT_sf_names: return "DW_AT_sf_names";
6857 case DW_AT_src_info: return "DW_AT_src_info";
6858 case DW_AT_mac_info: return "DW_AT_mac_info";
6859 case DW_AT_src_coords: return "DW_AT_src_coords";
6860 case DW_AT_body_begin: return "DW_AT_body_begin";
6861 case DW_AT_body_end: return "DW_AT_body_end";
6862 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
6863 /* UPC extension. */
6864 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
6865 default:
6866 {
6867 static char buffer[100];
6868
6869 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6870 return buffer;
6871 }
6872 }
6873 }
6874
6875 static char *
6876 get_FORM_name (form)
6877 unsigned long form;
6878 {
6879 switch (form)
6880 {
6881 case DW_FORM_addr: return "DW_FORM_addr";
6882 case DW_FORM_block2: return "DW_FORM_block2";
6883 case DW_FORM_block4: return "DW_FORM_block4";
6884 case DW_FORM_data2: return "DW_FORM_data2";
6885 case DW_FORM_data4: return "DW_FORM_data4";
6886 case DW_FORM_data8: return "DW_FORM_data8";
6887 case DW_FORM_string: return "DW_FORM_string";
6888 case DW_FORM_block: return "DW_FORM_block";
6889 case DW_FORM_block1: return "DW_FORM_block1";
6890 case DW_FORM_data1: return "DW_FORM_data1";
6891 case DW_FORM_flag: return "DW_FORM_flag";
6892 case DW_FORM_sdata: return "DW_FORM_sdata";
6893 case DW_FORM_strp: return "DW_FORM_strp";
6894 case DW_FORM_udata: return "DW_FORM_udata";
6895 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6896 case DW_FORM_ref1: return "DW_FORM_ref1";
6897 case DW_FORM_ref2: return "DW_FORM_ref2";
6898 case DW_FORM_ref4: return "DW_FORM_ref4";
6899 case DW_FORM_ref8: return "DW_FORM_ref8";
6900 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6901 case DW_FORM_indirect: return "DW_FORM_indirect";
6902 default:
6903 {
6904 static char buffer[100];
6905
6906 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6907 return buffer;
6908 }
6909 }
6910 }
6911
6912 /* FIXME: There are better and more effiecint ways to handle
6913 these structures. For now though, I just want something that
6914 is simple to implement. */
6915 typedef struct abbrev_attr
6916 {
6917 unsigned long attribute;
6918 unsigned long form;
6919 struct abbrev_attr *next;
6920 }
6921 abbrev_attr;
6922
6923 typedef struct abbrev_entry
6924 {
6925 unsigned long entry;
6926 unsigned long tag;
6927 int children;
6928 struct abbrev_attr *first_attr;
6929 struct abbrev_attr *last_attr;
6930 struct abbrev_entry *next;
6931 }
6932 abbrev_entry;
6933
6934 static abbrev_entry *first_abbrev = NULL;
6935 static abbrev_entry *last_abbrev = NULL;
6936
6937 static void
6938 free_abbrevs ()
6939 {
6940 abbrev_entry *abbrev;
6941
6942 for (abbrev = first_abbrev; abbrev;)
6943 {
6944 abbrev_entry *next = abbrev->next;
6945 abbrev_attr *attr;
6946
6947 for (attr = abbrev->first_attr; attr;)
6948 {
6949 abbrev_attr *next = attr->next;
6950
6951 free (attr);
6952 attr = next;
6953 }
6954
6955 free (abbrev);
6956 abbrev = next;
6957 }
6958
6959 last_abbrev = first_abbrev = NULL;
6960 }
6961
6962 static void
6963 add_abbrev (number, tag, children)
6964 unsigned long number;
6965 unsigned long tag;
6966 int children;
6967 {
6968 abbrev_entry *entry;
6969
6970 entry = (abbrev_entry *) malloc (sizeof (*entry));
6971
6972 if (entry == NULL)
6973 /* ugg */
6974 return;
6975
6976 entry->entry = number;
6977 entry->tag = tag;
6978 entry->children = children;
6979 entry->first_attr = NULL;
6980 entry->last_attr = NULL;
6981 entry->next = NULL;
6982
6983 if (first_abbrev == NULL)
6984 first_abbrev = entry;
6985 else
6986 last_abbrev->next = entry;
6987
6988 last_abbrev = entry;
6989 }
6990
6991 static void
6992 add_abbrev_attr (attribute, form)
6993 unsigned long attribute;
6994 unsigned long form;
6995 {
6996 abbrev_attr *attr;
6997
6998 attr = (abbrev_attr *) malloc (sizeof (*attr));
6999
7000 if (attr == NULL)
7001 /* ugg */
7002 return;
7003
7004 attr->attribute = attribute;
7005 attr->form = form;
7006 attr->next = NULL;
7007
7008 if (last_abbrev->first_attr == NULL)
7009 last_abbrev->first_attr = attr;
7010 else
7011 last_abbrev->last_attr->next = attr;
7012
7013 last_abbrev->last_attr = attr;
7014 }
7015
7016 /* Processes the (partial) contents of a .debug_abbrev section.
7017 Returns NULL if the end of the section was encountered.
7018 Returns the address after the last byte read if the end of
7019 an abbreviation set was found. */
7020
7021 static unsigned char *
7022 process_abbrev_section (start, end)
7023 unsigned char *start;
7024 unsigned char *end;
7025 {
7026 if (first_abbrev != NULL)
7027 return NULL;
7028
7029 while (start < end)
7030 {
7031 int bytes_read;
7032 unsigned long entry;
7033 unsigned long tag;
7034 unsigned long attribute;
7035 int children;
7036
7037 entry = read_leb128 (start, & bytes_read, 0);
7038 start += bytes_read;
7039
7040 /* A single zero is supposed to end the section according
7041 to the standard. If there's more, then signal that to
7042 the caller. */
7043 if (entry == 0)
7044 return start == end ? NULL : start;
7045
7046 tag = read_leb128 (start, & bytes_read, 0);
7047 start += bytes_read;
7048
7049 children = *start++;
7050
7051 add_abbrev (entry, tag, children);
7052
7053 do
7054 {
7055 unsigned long form;
7056
7057 attribute = read_leb128 (start, & bytes_read, 0);
7058 start += bytes_read;
7059
7060 form = read_leb128 (start, & bytes_read, 0);
7061 start += bytes_read;
7062
7063 if (attribute != 0)
7064 add_abbrev_attr (attribute, form);
7065 }
7066 while (attribute != 0);
7067 }
7068
7069 return NULL;
7070 }
7071
7072
7073 static int
7074 display_debug_macinfo (section, start, file)
7075 Elf_Internal_Shdr *section;
7076 unsigned char *start;
7077 FILE *file ATTRIBUTE_UNUSED;
7078 {
7079 unsigned char *end = start + section->sh_size;
7080 unsigned char *curr = start;
7081 unsigned int bytes_read;
7082 enum dwarf_macinfo_record_type op;
7083
7084 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7085
7086 while (curr < end)
7087 {
7088 unsigned int lineno;
7089 const char *string;
7090
7091 op = *curr;
7092 curr++;
7093
7094 switch (op)
7095 {
7096 case DW_MACINFO_start_file:
7097 {
7098 unsigned int filenum;
7099
7100 lineno = read_leb128 (curr, & bytes_read, 0);
7101 curr += bytes_read;
7102 filenum = read_leb128 (curr, & bytes_read, 0);
7103 curr += bytes_read;
7104
7105 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
7106 }
7107 break;
7108
7109 case DW_MACINFO_end_file:
7110 printf (_(" DW_MACINFO_end_file\n"));
7111 break;
7112
7113 case DW_MACINFO_define:
7114 lineno = read_leb128 (curr, & bytes_read, 0);
7115 curr += bytes_read;
7116 string = curr;
7117 curr += strlen (string) + 1;
7118 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
7119 break;
7120
7121 case DW_MACINFO_undef:
7122 lineno = read_leb128 (curr, & bytes_read, 0);
7123 curr += bytes_read;
7124 string = curr;
7125 curr += strlen (string) + 1;
7126 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
7127 break;
7128
7129 case DW_MACINFO_vendor_ext:
7130 {
7131 unsigned int constant;
7132
7133 constant = read_leb128 (curr, & bytes_read, 0);
7134 curr += bytes_read;
7135 string = curr;
7136 curr += strlen (string) + 1;
7137 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
7138 }
7139 break;
7140 }
7141 }
7142
7143 return 1;
7144 }
7145
7146
7147 static int
7148 display_debug_abbrev (section, start, file)
7149 Elf_Internal_Shdr *section;
7150 unsigned char *start;
7151 FILE *file ATTRIBUTE_UNUSED;
7152 {
7153 abbrev_entry *entry;
7154 unsigned char *end = start + section->sh_size;
7155
7156 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7157
7158 do
7159 {
7160 start = process_abbrev_section (start, end);
7161
7162 if (first_abbrev == NULL)
7163 continue;
7164
7165 printf (_(" Number TAG\n"));
7166
7167 for (entry = first_abbrev; entry; entry = entry->next)
7168 {
7169 abbrev_attr *attr;
7170
7171 printf (_(" %ld %s [%s]\n"),
7172 entry->entry,
7173 get_TAG_name (entry->tag),
7174 entry->children ? _("has children") : _("no children"));
7175
7176 for (attr = entry->first_attr; attr; attr = attr->next)
7177 {
7178 printf (_(" %-18s %s\n"),
7179 get_AT_name (attr->attribute),
7180 get_FORM_name (attr->form));
7181 }
7182 }
7183
7184 free_abbrevs ();
7185 }
7186 while (start);
7187
7188 printf ("\n");
7189
7190 return 1;
7191 }
7192
7193
7194 static unsigned char *
7195 display_block (data, length)
7196 unsigned char *data;
7197 unsigned long length;
7198 {
7199 printf (_(" %lu byte block: "), length);
7200
7201 while (length --)
7202 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7203
7204 return data;
7205 }
7206
7207 static void
7208 decode_location_expression (data, pointer_size, length)
7209 unsigned char * data;
7210 unsigned int pointer_size;
7211 unsigned long length;
7212 {
7213 unsigned op;
7214 int bytes_read;
7215 unsigned long uvalue;
7216 unsigned char *end = data + length;
7217
7218 while (data < end)
7219 {
7220 op = *data++;
7221
7222 switch (op)
7223 {
7224 case DW_OP_addr:
7225 printf ("DW_OP_addr: %lx",
7226 (unsigned long) byte_get (data, pointer_size));
7227 data += pointer_size;
7228 break;
7229 case DW_OP_deref:
7230 printf ("DW_OP_deref");
7231 break;
7232 case DW_OP_const1u:
7233 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7234 break;
7235 case DW_OP_const1s:
7236 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
7237 break;
7238 case DW_OP_const2u:
7239 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7240 data += 2;
7241 break;
7242 case DW_OP_const2s:
7243 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
7244 data += 2;
7245 break;
7246 case DW_OP_const4u:
7247 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7248 data += 4;
7249 break;
7250 case DW_OP_const4s:
7251 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
7252 data += 4;
7253 break;
7254 case DW_OP_const8u:
7255 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7256 (unsigned long) byte_get (data + 4, 4));
7257 data += 8;
7258 break;
7259 case DW_OP_const8s:
7260 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7261 (long) byte_get (data + 4, 4));
7262 data += 8;
7263 break;
7264 case DW_OP_constu:
7265 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7266 data += bytes_read;
7267 break;
7268 case DW_OP_consts:
7269 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7270 data += bytes_read;
7271 break;
7272 case DW_OP_dup:
7273 printf ("DW_OP_dup");
7274 break;
7275 case DW_OP_drop:
7276 printf ("DW_OP_drop");
7277 break;
7278 case DW_OP_over:
7279 printf ("DW_OP_over");
7280 break;
7281 case DW_OP_pick:
7282 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7283 break;
7284 case DW_OP_swap:
7285 printf ("DW_OP_swap");
7286 break;
7287 case DW_OP_rot:
7288 printf ("DW_OP_rot");
7289 break;
7290 case DW_OP_xderef:
7291 printf ("DW_OP_xderef");
7292 break;
7293 case DW_OP_abs:
7294 printf ("DW_OP_abs");
7295 break;
7296 case DW_OP_and:
7297 printf ("DW_OP_and");
7298 break;
7299 case DW_OP_div:
7300 printf ("DW_OP_div");
7301 break;
7302 case DW_OP_minus:
7303 printf ("DW_OP_minus");
7304 break;
7305 case DW_OP_mod:
7306 printf ("DW_OP_mod");
7307 break;
7308 case DW_OP_mul:
7309 printf ("DW_OP_mul");
7310 break;
7311 case DW_OP_neg:
7312 printf ("DW_OP_neg");
7313 break;
7314 case DW_OP_not:
7315 printf ("DW_OP_not");
7316 break;
7317 case DW_OP_or:
7318 printf ("DW_OP_or");
7319 break;
7320 case DW_OP_plus:
7321 printf ("DW_OP_plus");
7322 break;
7323 case DW_OP_plus_uconst:
7324 printf ("DW_OP_plus_uconst: %lu",
7325 read_leb128 (data, &bytes_read, 0));
7326 data += bytes_read;
7327 break;
7328 case DW_OP_shl:
7329 printf ("DW_OP_shl");
7330 break;
7331 case DW_OP_shr:
7332 printf ("DW_OP_shr");
7333 break;
7334 case DW_OP_shra:
7335 printf ("DW_OP_shra");
7336 break;
7337 case DW_OP_xor:
7338 printf ("DW_OP_xor");
7339 break;
7340 case DW_OP_bra:
7341 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7342 data += 2;
7343 break;
7344 case DW_OP_eq:
7345 printf ("DW_OP_eq");
7346 break;
7347 case DW_OP_ge:
7348 printf ("DW_OP_ge");
7349 break;
7350 case DW_OP_gt:
7351 printf ("DW_OP_gt");
7352 break;
7353 case DW_OP_le:
7354 printf ("DW_OP_le");
7355 break;
7356 case DW_OP_lt:
7357 printf ("DW_OP_lt");
7358 break;
7359 case DW_OP_ne:
7360 printf ("DW_OP_ne");
7361 break;
7362 case DW_OP_skip:
7363 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7364 data += 2;
7365 break;
7366
7367 case DW_OP_lit0:
7368 case DW_OP_lit1:
7369 case DW_OP_lit2:
7370 case DW_OP_lit3:
7371 case DW_OP_lit4:
7372 case DW_OP_lit5:
7373 case DW_OP_lit6:
7374 case DW_OP_lit7:
7375 case DW_OP_lit8:
7376 case DW_OP_lit9:
7377 case DW_OP_lit10:
7378 case DW_OP_lit11:
7379 case DW_OP_lit12:
7380 case DW_OP_lit13:
7381 case DW_OP_lit14:
7382 case DW_OP_lit15:
7383 case DW_OP_lit16:
7384 case DW_OP_lit17:
7385 case DW_OP_lit18:
7386 case DW_OP_lit19:
7387 case DW_OP_lit20:
7388 case DW_OP_lit21:
7389 case DW_OP_lit22:
7390 case DW_OP_lit23:
7391 case DW_OP_lit24:
7392 case DW_OP_lit25:
7393 case DW_OP_lit26:
7394 case DW_OP_lit27:
7395 case DW_OP_lit28:
7396 case DW_OP_lit29:
7397 case DW_OP_lit30:
7398 case DW_OP_lit31:
7399 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7400 break;
7401
7402 case DW_OP_reg0:
7403 case DW_OP_reg1:
7404 case DW_OP_reg2:
7405 case DW_OP_reg3:
7406 case DW_OP_reg4:
7407 case DW_OP_reg5:
7408 case DW_OP_reg6:
7409 case DW_OP_reg7:
7410 case DW_OP_reg8:
7411 case DW_OP_reg9:
7412 case DW_OP_reg10:
7413 case DW_OP_reg11:
7414 case DW_OP_reg12:
7415 case DW_OP_reg13:
7416 case DW_OP_reg14:
7417 case DW_OP_reg15:
7418 case DW_OP_reg16:
7419 case DW_OP_reg17:
7420 case DW_OP_reg18:
7421 case DW_OP_reg19:
7422 case DW_OP_reg20:
7423 case DW_OP_reg21:
7424 case DW_OP_reg22:
7425 case DW_OP_reg23:
7426 case DW_OP_reg24:
7427 case DW_OP_reg25:
7428 case DW_OP_reg26:
7429 case DW_OP_reg27:
7430 case DW_OP_reg28:
7431 case DW_OP_reg29:
7432 case DW_OP_reg30:
7433 case DW_OP_reg31:
7434 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7435 break;
7436
7437 case DW_OP_breg0:
7438 case DW_OP_breg1:
7439 case DW_OP_breg2:
7440 case DW_OP_breg3:
7441 case DW_OP_breg4:
7442 case DW_OP_breg5:
7443 case DW_OP_breg6:
7444 case DW_OP_breg7:
7445 case DW_OP_breg8:
7446 case DW_OP_breg9:
7447 case DW_OP_breg10:
7448 case DW_OP_breg11:
7449 case DW_OP_breg12:
7450 case DW_OP_breg13:
7451 case DW_OP_breg14:
7452 case DW_OP_breg15:
7453 case DW_OP_breg16:
7454 case DW_OP_breg17:
7455 case DW_OP_breg18:
7456 case DW_OP_breg19:
7457 case DW_OP_breg20:
7458 case DW_OP_breg21:
7459 case DW_OP_breg22:
7460 case DW_OP_breg23:
7461 case DW_OP_breg24:
7462 case DW_OP_breg25:
7463 case DW_OP_breg26:
7464 case DW_OP_breg27:
7465 case DW_OP_breg28:
7466 case DW_OP_breg29:
7467 case DW_OP_breg30:
7468 case DW_OP_breg31:
7469 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7470 read_leb128 (data, &bytes_read, 1));
7471 data += bytes_read;
7472 break;
7473
7474 case DW_OP_regx:
7475 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7476 data += bytes_read;
7477 break;
7478 case DW_OP_fbreg:
7479 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7480 data += bytes_read;
7481 break;
7482 case DW_OP_bregx:
7483 uvalue = read_leb128 (data, &bytes_read, 0);
7484 data += bytes_read;
7485 printf ("DW_OP_bregx: %lu %ld", uvalue,
7486 read_leb128 (data, &bytes_read, 1));
7487 data += bytes_read;
7488 break;
7489 case DW_OP_piece:
7490 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7491 data += bytes_read;
7492 break;
7493 case DW_OP_deref_size:
7494 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7495 break;
7496 case DW_OP_xderef_size:
7497 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7498 break;
7499 case DW_OP_nop:
7500 printf ("DW_OP_nop");
7501 break;
7502
7503 /* DWARF 3 extensions. */
7504 case DW_OP_push_object_address:
7505 printf ("DW_OP_push_object_address");
7506 break;
7507 case DW_OP_call2:
7508 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7509 data += 2;
7510 break;
7511 case DW_OP_call4:
7512 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7513 data += 4;
7514 break;
7515 case DW_OP_call_ref:
7516 printf ("DW_OP_call_ref");
7517 break;
7518
7519 /* GNU extensions. */
7520 case DW_OP_GNU_push_tls_address:
7521 printf ("DW_OP_GNU_push_tls_address");
7522 break;
7523
7524 default:
7525 if (op >= DW_OP_lo_user
7526 && op <= DW_OP_hi_user)
7527 printf (_("(User defined location op)"));
7528 else
7529 printf (_("(Unknown location op)"));
7530 /* No way to tell where the next op is, so just bail. */
7531 return;
7532 }
7533
7534 /* Separate the ops. */
7535 printf ("; ");
7536 }
7537 }
7538
7539 static const char *debug_loc_contents;
7540 static bfd_vma debug_loc_size;
7541
7542 static void
7543 load_debug_loc (file)
7544 FILE *file;
7545 {
7546 Elf_Internal_Shdr *sec;
7547 unsigned int i;
7548
7549 /* If it is already loaded, do nothing. */
7550 if (debug_loc_contents != NULL)
7551 return;
7552
7553 /* Locate the .debug_loc section. */
7554 for (i = 0, sec = section_headers;
7555 i < elf_header.e_shnum;
7556 i++, sec++)
7557 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7558 break;
7559
7560 if (i == elf_header.e_shnum || sec->sh_size == 0)
7561 return;
7562
7563 debug_loc_size = sec->sh_size;
7564
7565 debug_loc_contents = ((char *)
7566 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7567 _("debug_loc section data")));
7568 }
7569
7570 static void
7571 free_debug_loc ()
7572 {
7573 if (debug_loc_contents == NULL)
7574 return;
7575
7576 free ((char *) debug_loc_contents);
7577 debug_loc_contents = NULL;
7578 debug_loc_size = 0;
7579 }
7580
7581
7582 static int
7583 display_debug_loc (section, start, file)
7584 Elf_Internal_Shdr *section;
7585 unsigned char *start;
7586 FILE *file ATTRIBUTE_UNUSED;
7587 {
7588 unsigned char *section_end;
7589 unsigned long bytes;
7590 unsigned char *section_begin = start;
7591 bfd_vma addr;
7592
7593 addr = section->sh_addr;
7594 bytes = section->sh_size;
7595 section_end = start + bytes;
7596
7597 if (bytes == 0)
7598 {
7599 printf (_("\nThe .debug_loc section is empty.\n"));
7600 return 0;
7601 }
7602
7603 printf (_("Contents of the .debug_loc section:\n\n"));
7604 printf (_("\n Offset Begin End Expression\n"));
7605
7606 while (start < section_end)
7607 {
7608 unsigned long begin;
7609 unsigned long end;
7610 unsigned short length;
7611 unsigned long offset;
7612
7613 offset = start - section_begin;
7614
7615 while (1)
7616 {
7617 /* Normally, the lists in the debug_loc section are related to a
7618 given compilation unit, and thus, we would use the
7619 pointer size of that compilation unit. However, since we are
7620 displaying it seperately here, we either have to store
7621 pointer sizes of all compilation units, or assume they don't
7622 change. We assume, like the debug_line display, that
7623 it doesn't change. */
7624 begin = byte_get (start, debug_line_pointer_size);
7625 start += debug_line_pointer_size;
7626 end = byte_get (start, debug_line_pointer_size);
7627 start += debug_line_pointer_size;
7628
7629 if (begin == 0 && end == 0)
7630 break;
7631
7632 begin += addr;
7633 end += addr;
7634
7635 length = byte_get (start, 2);
7636 start += 2;
7637
7638 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7639 decode_location_expression (start, debug_line_pointer_size, length);
7640 printf (")\n");
7641
7642 start += length;
7643 }
7644 printf ("\n");
7645 }
7646 return 1;
7647 }
7648
7649 static const char *debug_str_contents;
7650 static bfd_vma debug_str_size;
7651
7652 static void
7653 load_debug_str (file)
7654 FILE *file;
7655 {
7656 Elf_Internal_Shdr *sec;
7657 unsigned int i;
7658
7659 /* If it is already loaded, do nothing. */
7660 if (debug_str_contents != NULL)
7661 return;
7662
7663 /* Locate the .debug_str section. */
7664 for (i = 0, sec = section_headers;
7665 i < elf_header.e_shnum;
7666 i++, sec++)
7667 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7668 break;
7669
7670 if (i == elf_header.e_shnum || sec->sh_size == 0)
7671 return;
7672
7673 debug_str_size = sec->sh_size;
7674
7675 debug_str_contents = ((char *)
7676 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7677 _("debug_str section data")));
7678 }
7679
7680 static void
7681 free_debug_str ()
7682 {
7683 if (debug_str_contents == NULL)
7684 return;
7685
7686 free ((char *) debug_str_contents);
7687 debug_str_contents = NULL;
7688 debug_str_size = 0;
7689 }
7690
7691 static const char *
7692 fetch_indirect_string (offset)
7693 unsigned long offset;
7694 {
7695 if (debug_str_contents == NULL)
7696 return _("<no .debug_str section>");
7697
7698 if (offset > debug_str_size)
7699 return _("<offset is too big>");
7700
7701 return debug_str_contents + offset;
7702 }
7703
7704 static int
7705 display_debug_str (section, start, file)
7706 Elf_Internal_Shdr *section;
7707 unsigned char *start;
7708 FILE *file ATTRIBUTE_UNUSED;
7709 {
7710 unsigned long bytes;
7711 bfd_vma addr;
7712
7713 addr = section->sh_addr;
7714 bytes = section->sh_size;
7715
7716 if (bytes == 0)
7717 {
7718 printf (_("\nThe .debug_str section is empty.\n"));
7719 return 0;
7720 }
7721
7722 printf (_("Contents of the .debug_str section:\n\n"));
7723
7724 while (bytes)
7725 {
7726 int j;
7727 int k;
7728 int lbytes;
7729
7730 lbytes = (bytes > 16 ? 16 : bytes);
7731
7732 printf (" 0x%8.8lx ", (unsigned long) addr);
7733
7734 for (j = 0; j < 16; j++)
7735 {
7736 if (j < lbytes)
7737 printf ("%2.2x", start[j]);
7738 else
7739 printf (" ");
7740
7741 if ((j & 3) == 3)
7742 printf (" ");
7743 }
7744
7745 for (j = 0; j < lbytes; j++)
7746 {
7747 k = start[j];
7748 if (k >= ' ' && k < 0x80)
7749 printf ("%c", k);
7750 else
7751 printf (".");
7752 }
7753
7754 putchar ('\n');
7755
7756 start += lbytes;
7757 addr += lbytes;
7758 bytes -= lbytes;
7759 }
7760
7761 return 1;
7762 }
7763
7764 static unsigned char *
7765 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7766 unsigned long attribute;
7767 unsigned long form;
7768 unsigned char *data;
7769 unsigned long cu_offset;
7770 unsigned long pointer_size;
7771 {
7772 unsigned long uvalue = 0;
7773 unsigned char *block_start = NULL;
7774 int bytes_read;
7775
7776 switch (form)
7777 {
7778 default:
7779 break;
7780
7781 case DW_FORM_ref_addr:
7782 case DW_FORM_addr:
7783 uvalue = byte_get (data, pointer_size);
7784 data += pointer_size;
7785 break;
7786
7787 case DW_FORM_strp:
7788 uvalue = byte_get (data, /* offset_size */ 4);
7789 data += /* offset_size */ 4;
7790 break;
7791
7792 case DW_FORM_ref1:
7793 case DW_FORM_flag:
7794 case DW_FORM_data1:
7795 uvalue = byte_get (data++, 1);
7796 break;
7797
7798 case DW_FORM_ref2:
7799 case DW_FORM_data2:
7800 uvalue = byte_get (data, 2);
7801 data += 2;
7802 break;
7803
7804 case DW_FORM_ref4:
7805 case DW_FORM_data4:
7806 uvalue = byte_get (data, 4);
7807 data += 4;
7808 break;
7809
7810 case DW_FORM_sdata:
7811 uvalue = read_leb128 (data, & bytes_read, 1);
7812 data += bytes_read;
7813 break;
7814
7815 case DW_FORM_ref_udata:
7816 case DW_FORM_udata:
7817 uvalue = read_leb128 (data, & bytes_read, 0);
7818 data += bytes_read;
7819 break;
7820
7821 case DW_FORM_indirect:
7822 form = read_leb128 (data, & bytes_read, 0);
7823 data += bytes_read;
7824 printf (" %s", get_FORM_name (form));
7825 return read_and_display_attr_value (attribute, form, data, cu_offset,
7826 pointer_size);
7827 }
7828
7829 switch (form)
7830 {
7831 case DW_FORM_ref_addr:
7832 printf (" <#%lx>", uvalue);
7833 break;
7834
7835 case DW_FORM_ref1:
7836 case DW_FORM_ref2:
7837 case DW_FORM_ref4:
7838 case DW_FORM_ref_udata:
7839 printf (" <%lx>", uvalue + cu_offset);
7840 break;
7841
7842 case DW_FORM_addr:
7843 printf (" %#lx", uvalue);
7844
7845 case DW_FORM_flag:
7846 case DW_FORM_data1:
7847 case DW_FORM_data2:
7848 case DW_FORM_data4:
7849 case DW_FORM_sdata:
7850 case DW_FORM_udata:
7851 printf (" %ld", uvalue);
7852 break;
7853
7854 case DW_FORM_ref8:
7855 case DW_FORM_data8:
7856 uvalue = byte_get (data, 4);
7857 printf (" %lx", uvalue);
7858 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7859 data += 8;
7860 break;
7861
7862 case DW_FORM_string:
7863 printf (" %s", data);
7864 data += strlen ((char *) data) + 1;
7865 break;
7866
7867 case DW_FORM_block:
7868 uvalue = read_leb128 (data, & bytes_read, 0);
7869 block_start = data + bytes_read;
7870 data = display_block (block_start, uvalue);
7871 break;
7872
7873 case DW_FORM_block1:
7874 uvalue = byte_get (data, 1);
7875 block_start = data + 1;
7876 data = display_block (block_start, uvalue);
7877 break;
7878
7879 case DW_FORM_block2:
7880 uvalue = byte_get (data, 2);
7881 block_start = data + 2;
7882 data = display_block (block_start, uvalue);
7883 break;
7884
7885 case DW_FORM_block4:
7886 uvalue = byte_get (data, 4);
7887 block_start = data + 4;
7888 data = display_block (block_start, uvalue);
7889 break;
7890
7891 case DW_FORM_strp:
7892 printf (_(" (indirect string, offset: 0x%lx): %s"),
7893 uvalue, fetch_indirect_string (uvalue));
7894 break;
7895
7896 case DW_FORM_indirect:
7897 /* Handled above. */
7898 break;
7899
7900 default:
7901 warn (_("Unrecognized form: %d\n"), form);
7902 break;
7903 }
7904
7905 /* For some attributes we can display futher information. */
7906
7907 printf ("\t");
7908
7909 switch (attribute)
7910 {
7911 case DW_AT_inline:
7912 switch (uvalue)
7913 {
7914 case DW_INL_not_inlined:
7915 printf (_("(not inlined)"));
7916 break;
7917 case DW_INL_inlined:
7918 printf (_("(inlined)"));
7919 break;
7920 case DW_INL_declared_not_inlined:
7921 printf (_("(declared as inline but ignored)"));
7922 break;
7923 case DW_INL_declared_inlined:
7924 printf (_("(declared as inline and inlined)"));
7925 break;
7926 default:
7927 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
7928 break;
7929 }
7930 break;
7931
7932 case DW_AT_language:
7933 switch (uvalue)
7934 {
7935 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7936 case DW_LANG_C89: printf ("(ANSI C)"); break;
7937 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7938 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7939 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7940 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7941 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7942 case DW_LANG_Ada83: printf ("(Ada)"); break;
7943 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7944 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7945 /* DWARF 2.1 values. */
7946 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7947 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7948 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7949 /* MIPS extension. */
7950 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7951 /* UPC extension. */
7952 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
7953 default:
7954 printf ("(Unknown: %lx)", uvalue);
7955 break;
7956 }
7957 break;
7958
7959 case DW_AT_encoding:
7960 switch (uvalue)
7961 {
7962 case DW_ATE_void: printf ("(void)"); break;
7963 case DW_ATE_address: printf ("(machine address)"); break;
7964 case DW_ATE_boolean: printf ("(boolean)"); break;
7965 case DW_ATE_complex_float: printf ("(complex float)"); break;
7966 case DW_ATE_float: printf ("(float)"); break;
7967 case DW_ATE_signed: printf ("(signed)"); break;
7968 case DW_ATE_signed_char: printf ("(signed char)"); break;
7969 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7970 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7971 /* DWARF 2.1 value. */
7972 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7973 default:
7974 if (uvalue >= DW_ATE_lo_user
7975 && uvalue <= DW_ATE_hi_user)
7976 printf ("(user defined type)");
7977 else
7978 printf ("(unknown type)");
7979 break;
7980 }
7981 break;
7982
7983 case DW_AT_accessibility:
7984 switch (uvalue)
7985 {
7986 case DW_ACCESS_public: printf ("(public)"); break;
7987 case DW_ACCESS_protected: printf ("(protected)"); break;
7988 case DW_ACCESS_private: printf ("(private)"); break;
7989 default:
7990 printf ("(unknown accessibility)");
7991 break;
7992 }
7993 break;
7994
7995 case DW_AT_visibility:
7996 switch (uvalue)
7997 {
7998 case DW_VIS_local: printf ("(local)"); break;
7999 case DW_VIS_exported: printf ("(exported)"); break;
8000 case DW_VIS_qualified: printf ("(qualified)"); break;
8001 default: printf ("(unknown visibility)"); break;
8002 }
8003 break;
8004
8005 case DW_AT_virtuality:
8006 switch (uvalue)
8007 {
8008 case DW_VIRTUALITY_none: printf ("(none)"); break;
8009 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8010 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8011 default: printf ("(unknown virtuality)"); break;
8012 }
8013 break;
8014
8015 case DW_AT_identifier_case:
8016 switch (uvalue)
8017 {
8018 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8019 case DW_ID_up_case: printf ("(up_case)"); break;
8020 case DW_ID_down_case: printf ("(down_case)"); break;
8021 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8022 default: printf ("(unknown case)"); break;
8023 }
8024 break;
8025
8026 case DW_AT_calling_convention:
8027 switch (uvalue)
8028 {
8029 case DW_CC_normal: printf ("(normal)"); break;
8030 case DW_CC_program: printf ("(program)"); break;
8031 case DW_CC_nocall: printf ("(nocall)"); break;
8032 default:
8033 if (uvalue >= DW_CC_lo_user
8034 && uvalue <= DW_CC_hi_user)
8035 printf ("(user defined)");
8036 else
8037 printf ("(unknown convention)");
8038 }
8039 break;
8040
8041 case DW_AT_ordering:
8042 switch (uvalue)
8043 {
8044 case -1: printf ("(undefined)"); break;
8045 case 0: printf ("(row major)"); break;
8046 case 1: printf ("(column major)"); break;
8047 }
8048 break;
8049
8050 case DW_AT_frame_base:
8051 case DW_AT_location:
8052 case DW_AT_data_member_location:
8053 case DW_AT_vtable_elem_location:
8054 case DW_AT_allocated:
8055 case DW_AT_associated:
8056 case DW_AT_data_location:
8057 case DW_AT_stride:
8058 case DW_AT_upper_bound:
8059 case DW_AT_lower_bound:
8060 if (block_start)
8061 {
8062 printf ("(");
8063 decode_location_expression (block_start, pointer_size, uvalue);
8064 printf (")");
8065 }
8066 else if (form == DW_FORM_data4)
8067 {
8068 printf ("(");
8069 printf ("location list");
8070 printf (")");
8071 }
8072 break;
8073
8074 default:
8075 break;
8076 }
8077
8078 return data;
8079 }
8080
8081 static unsigned char *
8082 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
8083 unsigned long attribute;
8084 unsigned long form;
8085 unsigned char *data;
8086 unsigned long cu_offset;
8087 unsigned long pointer_size;
8088 {
8089 printf (" %-18s:", get_AT_name (attribute));
8090 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8091 pointer_size);
8092 printf ("\n");
8093 return data;
8094 }
8095
8096 static int
8097 display_debug_info (section, start, file)
8098 Elf_Internal_Shdr *section;
8099 unsigned char *start;
8100 FILE *file;
8101 {
8102 unsigned char *end = start + section->sh_size;
8103 unsigned char *section_begin = start;
8104
8105 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8106
8107 load_debug_str (file);
8108 load_debug_loc (file);
8109
8110 while (start < end)
8111 {
8112 DWARF2_External_CompUnit *external;
8113 DWARF2_Internal_CompUnit compunit;
8114 Elf_Internal_Shdr *relsec;
8115 unsigned char *tags;
8116 unsigned int i;
8117 int level;
8118 unsigned long cu_offset;
8119
8120 external = (DWARF2_External_CompUnit *) start;
8121
8122 compunit.cu_length = BYTE_GET (external->cu_length);
8123 compunit.cu_version = BYTE_GET (external->cu_version);
8124 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
8125 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
8126
8127 if (compunit.cu_length == 0xffffffff)
8128 {
8129 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8130 break;
8131 }
8132
8133 /* Check for RELA relocations in the
8134 abbrev_offset address, and apply them. */
8135 for (relsec = section_headers;
8136 relsec < section_headers + elf_header.e_shnum;
8137 ++relsec)
8138 {
8139 unsigned long nrelas;
8140 Elf_Internal_Rela *rela, *rp;
8141 Elf_Internal_Shdr *symsec;
8142 Elf_Internal_Sym *symtab;
8143 Elf_Internal_Sym *sym;
8144
8145 if (relsec->sh_type != SHT_RELA
8146 || SECTION_HEADER (relsec->sh_info) != section
8147 || relsec->sh_size == 0)
8148 continue;
8149
8150 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8151 & rela, & nrelas))
8152 return 0;
8153
8154 symsec = SECTION_HEADER (relsec->sh_link);
8155 symtab = GET_ELF_SYMBOLS (file, symsec);
8156
8157 for (rp = rela; rp < rela + nrelas; ++rp)
8158 {
8159 if (rp->r_offset
8160 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
8161 - section_begin))
8162 continue;
8163
8164 if (is_32bit_elf)
8165 {
8166 sym = symtab + ELF32_R_SYM (rp->r_info);
8167
8168 if (ELF32_R_SYM (rp->r_info) != 0
8169 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
8170 {
8171 warn (_("Skipping unexpected symbol type %u\n"),
8172 ELF32_ST_TYPE (sym->st_info));
8173 continue;
8174 }
8175 }
8176 else
8177 {
8178 sym = symtab + ELF64_R_SYM (rp->r_info);
8179
8180 if (ELF64_R_SYM (rp->r_info) != 0
8181 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
8182 {
8183 warn (_("Skipping unexpected symbol type %u\n"),
8184 ELF64_ST_TYPE (sym->st_info));
8185 continue;
8186 }
8187 }
8188
8189 compunit.cu_abbrev_offset = rp->r_addend;
8190 break;
8191 }
8192
8193 free (rela);
8194 break;
8195 }
8196
8197 tags = start + sizeof (*external);
8198 cu_offset = start - section_begin;
8199 start += compunit.cu_length + sizeof (external->cu_length);
8200
8201 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8202 printf (_(" Length: %ld\n"), compunit.cu_length);
8203 printf (_(" Version: %d\n"), compunit.cu_version);
8204 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8205 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8206
8207 if (compunit.cu_version != 2)
8208 {
8209 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8210 continue;
8211 }
8212
8213 free_abbrevs ();
8214
8215 /* Read in the abbrevs used by this compilation unit. */
8216 {
8217 Elf_Internal_Shdr *sec;
8218 unsigned char *begin;
8219
8220 /* Locate the .debug_abbrev section and process it. */
8221 for (i = 0, sec = section_headers;
8222 i < elf_header.e_shnum;
8223 i++, sec++)
8224 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
8225 break;
8226
8227 if (i == elf_header.e_shnum || sec->sh_size == 0)
8228 {
8229 warn (_("Unable to locate .debug_abbrev section!\n"));
8230 return 0;
8231 }
8232
8233 begin = ((unsigned char *)
8234 get_data (NULL, file, sec->sh_offset, sec->sh_size,
8235 _("debug_abbrev section data")));
8236 if (!begin)
8237 return 0;
8238
8239 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8240 begin + sec->sh_size);
8241
8242 free (begin);
8243 }
8244
8245 level = 0;
8246 while (tags < start)
8247 {
8248 int bytes_read;
8249 unsigned long abbrev_number;
8250 abbrev_entry *entry;
8251 abbrev_attr *attr;
8252
8253 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8254 tags += bytes_read;
8255
8256 /* A null DIE marks the end of a list of children. */
8257 if (abbrev_number == 0)
8258 {
8259 --level;
8260 continue;
8261 }
8262
8263 /* Scan through the abbreviation list until we reach the
8264 correct entry. */
8265 for (entry = first_abbrev;
8266 entry && entry->entry != abbrev_number;
8267 entry = entry->next)
8268 continue;
8269
8270 if (entry == NULL)
8271 {
8272 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8273 abbrev_number);
8274 return 0;
8275 }
8276
8277 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8278 level,
8279 (unsigned long) (tags - section_begin - bytes_read),
8280 abbrev_number,
8281 get_TAG_name (entry->tag));
8282
8283 for (attr = entry->first_attr; attr; attr = attr->next)
8284 tags = read_and_display_attr (attr->attribute,
8285 attr->form,
8286 tags, cu_offset,
8287 compunit.cu_pointer_size);
8288
8289 if (entry->children)
8290 ++level;
8291 }
8292 }
8293
8294 free_debug_str ();
8295 free_debug_loc ();
8296
8297 printf ("\n");
8298
8299 return 1;
8300 }
8301
8302 static int
8303 display_debug_aranges (section, start, file)
8304 Elf_Internal_Shdr *section;
8305 unsigned char *start;
8306 FILE *file ATTRIBUTE_UNUSED;
8307 {
8308 unsigned char *end = start + section->sh_size;
8309
8310 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8311
8312 while (start < end)
8313 {
8314 DWARF2_External_ARange *external;
8315 DWARF2_Internal_ARange arange;
8316 unsigned char *ranges;
8317 unsigned long length;
8318 unsigned long address;
8319 int excess;
8320
8321 external = (DWARF2_External_ARange *) start;
8322
8323 arange.ar_length = BYTE_GET (external->ar_length);
8324 arange.ar_version = BYTE_GET (external->ar_version);
8325 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
8326 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
8327 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
8328
8329 if (arange.ar_length == 0xffffffff)
8330 {
8331 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8332 break;
8333 }
8334
8335 if (arange.ar_version != 2)
8336 {
8337 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8338 break;
8339 }
8340
8341 printf (_(" Length: %ld\n"), arange.ar_length);
8342 printf (_(" Version: %d\n"), arange.ar_version);
8343 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8344 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8345 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8346
8347 printf (_("\n Address Length\n"));
8348
8349 ranges = start + sizeof (*external);
8350
8351 /* Must pad to an alignment boundary that is twice the pointer size. */
8352 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
8353 if (excess)
8354 ranges += (2 * arange.ar_pointer_size) - excess;
8355
8356 for (;;)
8357 {
8358 address = byte_get (ranges, arange.ar_pointer_size);
8359
8360 ranges += arange.ar_pointer_size;
8361
8362 length = byte_get (ranges, arange.ar_pointer_size);
8363
8364 ranges += arange.ar_pointer_size;
8365
8366 /* A pair of zeros marks the end of the list. */
8367 if (address == 0 && length == 0)
8368 break;
8369
8370 printf (" %8.8lx %lu\n", address, length);
8371 }
8372
8373 start += arange.ar_length + sizeof (external->ar_length);
8374 }
8375
8376 printf ("\n");
8377
8378 return 1;
8379 }
8380
8381 typedef struct Frame_Chunk
8382 {
8383 struct Frame_Chunk *next;
8384 unsigned char *chunk_start;
8385 int ncols;
8386 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8387 short int *col_type;
8388 int *col_offset;
8389 char *augmentation;
8390 unsigned int code_factor;
8391 int data_factor;
8392 unsigned long pc_begin;
8393 unsigned long pc_range;
8394 int cfa_reg;
8395 int cfa_offset;
8396 int ra;
8397 unsigned char fde_encoding;
8398 }
8399 Frame_Chunk;
8400
8401 /* A marker for a col_type that means this column was never referenced
8402 in the frame info. */
8403 #define DW_CFA_unreferenced (-1)
8404
8405 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8406 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8407 static int size_of_encoded_value PARAMS ((int));
8408
8409 static void
8410 frame_need_space (fc, reg)
8411 Frame_Chunk *fc;
8412 int reg;
8413 {
8414 int prev = fc->ncols;
8415
8416 if (reg < fc->ncols)
8417 return;
8418
8419 fc->ncols = reg + 1;
8420 fc->col_type = (short int *) xrealloc (fc->col_type,
8421 fc->ncols * sizeof (short int));
8422 fc->col_offset = (int *) xrealloc (fc->col_offset,
8423 fc->ncols * sizeof (int));
8424
8425 while (prev < fc->ncols)
8426 {
8427 fc->col_type[prev] = DW_CFA_unreferenced;
8428 fc->col_offset[prev] = 0;
8429 prev++;
8430 }
8431 }
8432
8433 static void
8434 frame_display_row (fc, need_col_headers, max_regs)
8435 Frame_Chunk *fc;
8436 int *need_col_headers;
8437 int *max_regs;
8438 {
8439 int r;
8440 char tmp[100];
8441
8442 if (*max_regs < fc->ncols)
8443 *max_regs = fc->ncols;
8444
8445 if (*need_col_headers)
8446 {
8447 *need_col_headers = 0;
8448
8449 printf (" LOC CFA ");
8450
8451 for (r = 0; r < *max_regs; r++)
8452 if (fc->col_type[r] != DW_CFA_unreferenced)
8453 {
8454 if (r == fc->ra)
8455 printf ("ra ");
8456 else
8457 printf ("r%-4d", r);
8458 }
8459
8460 printf ("\n");
8461 }
8462
8463 printf ("%08lx ", fc->pc_begin);
8464 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8465 printf ("%-8s ", tmp);
8466
8467 for (r = 0; r < fc->ncols; r++)
8468 {
8469 if (fc->col_type[r] != DW_CFA_unreferenced)
8470 {
8471 switch (fc->col_type[r])
8472 {
8473 case DW_CFA_undefined:
8474 strcpy (tmp, "u");
8475 break;
8476 case DW_CFA_same_value:
8477 strcpy (tmp, "s");
8478 break;
8479 case DW_CFA_offset:
8480 sprintf (tmp, "c%+d", fc->col_offset[r]);
8481 break;
8482 case DW_CFA_register:
8483 sprintf (tmp, "r%d", fc->col_offset[r]);
8484 break;
8485 default:
8486 strcpy (tmp, "n/a");
8487 break;
8488 }
8489 printf ("%-5s", tmp);
8490 }
8491 }
8492 printf ("\n");
8493 }
8494
8495 static int
8496 size_of_encoded_value (encoding)
8497 int encoding;
8498 {
8499 switch (encoding & 0x7)
8500 {
8501 default: /* ??? */
8502 case 0: return is_32bit_elf ? 4 : 8;
8503 case 2: return 2;
8504 case 3: return 4;
8505 case 4: return 8;
8506 }
8507 }
8508
8509 #define GET(N) byte_get (start, N); start += N
8510 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8511 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8512
8513 static int
8514 display_debug_frames (section, start, file)
8515 Elf_Internal_Shdr *section;
8516 unsigned char *start;
8517 FILE *file ATTRIBUTE_UNUSED;
8518 {
8519 unsigned char *end = start + section->sh_size;
8520 unsigned char *section_start = start;
8521 Frame_Chunk *chunks = 0;
8522 Frame_Chunk *remembered_state = 0;
8523 Frame_Chunk *rs;
8524 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8525 int length_return;
8526 int max_regs = 0;
8527 int addr_size = is_32bit_elf ? 4 : 8;
8528
8529 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8530
8531 while (start < end)
8532 {
8533 unsigned char *saved_start;
8534 unsigned char *block_end;
8535 unsigned long length;
8536 unsigned long cie_id;
8537 Frame_Chunk *fc;
8538 Frame_Chunk *cie;
8539 int need_col_headers = 1;
8540 unsigned char *augmentation_data = NULL;
8541 unsigned long augmentation_data_len = 0;
8542 int encoded_ptr_size = addr_size;
8543
8544 saved_start = start;
8545 length = byte_get (start, 4); start += 4;
8546
8547 if (length == 0)
8548 {
8549 printf ("\n%08lx ZERO terminator\n\n",
8550 (unsigned long)(saved_start - section_start));
8551 return 1;
8552 }
8553
8554 if (length == 0xffffffff)
8555 {
8556 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8557 break;
8558 }
8559
8560 block_end = saved_start + length + 4;
8561 cie_id = byte_get (start, 4); start += 4;
8562
8563 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8564 {
8565 int version;
8566
8567 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8568 memset (fc, 0, sizeof (Frame_Chunk));
8569
8570 fc->next = chunks;
8571 chunks = fc;
8572 fc->chunk_start = saved_start;
8573 fc->ncols = 0;
8574 fc->col_type = (short int *) xmalloc (sizeof (short int));
8575 fc->col_offset = (int *) xmalloc (sizeof (int));
8576 frame_need_space (fc, max_regs-1);
8577
8578 version = *start++;
8579
8580 fc->augmentation = start;
8581 start = strchr (start, '\0') + 1;
8582
8583 if (fc->augmentation[0] == 'z')
8584 {
8585 fc->code_factor = LEB ();
8586 fc->data_factor = SLEB ();
8587 fc->ra = byte_get (start, 1); start += 1;
8588 augmentation_data_len = LEB ();
8589 augmentation_data = start;
8590 start += augmentation_data_len;
8591 }
8592 else if (strcmp (fc->augmentation, "eh") == 0)
8593 {
8594 start += addr_size;
8595 fc->code_factor = LEB ();
8596 fc->data_factor = SLEB ();
8597 fc->ra = byte_get (start, 1); start += 1;
8598 }
8599 else
8600 {
8601 fc->code_factor = LEB ();
8602 fc->data_factor = SLEB ();
8603 fc->ra = byte_get (start, 1); start += 1;
8604 }
8605 cie = fc;
8606
8607 if (do_debug_frames_interp)
8608 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8609 (unsigned long)(saved_start - section_start), length, cie_id,
8610 fc->augmentation, fc->code_factor, fc->data_factor,
8611 fc->ra);
8612 else
8613 {
8614 printf ("\n%08lx %08lx %08lx CIE\n",
8615 (unsigned long)(saved_start - section_start), length, cie_id);
8616 printf (" Version: %d\n", version);
8617 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8618 printf (" Code alignment factor: %u\n", fc->code_factor);
8619 printf (" Data alignment factor: %d\n", fc->data_factor);
8620 printf (" Return address column: %d\n", fc->ra);
8621
8622 if (augmentation_data_len)
8623 {
8624 unsigned long i;
8625 printf (" Augmentation data: ");
8626 for (i = 0; i < augmentation_data_len; ++i)
8627 printf (" %02x", augmentation_data[i]);
8628 putchar ('\n');
8629 }
8630 putchar ('\n');
8631 }
8632
8633 if (augmentation_data_len)
8634 {
8635 unsigned char *p, *q;
8636 p = fc->augmentation + 1;
8637 q = augmentation_data;
8638
8639 while (1)
8640 {
8641 if (*p == 'L')
8642 q++;
8643 else if (*p == 'P')
8644 q += 1 + size_of_encoded_value (*q);
8645 else if (*p == 'R')
8646 fc->fde_encoding = *q++;
8647 else
8648 break;
8649 p++;
8650 }
8651
8652 if (fc->fde_encoding)
8653 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8654 }
8655
8656 frame_need_space (fc, fc->ra);
8657 }
8658 else
8659 {
8660 unsigned char *look_for;
8661 static Frame_Chunk fde_fc;
8662
8663 fc = & fde_fc;
8664 memset (fc, 0, sizeof (Frame_Chunk));
8665
8666 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8667
8668 for (cie = chunks; cie ; cie = cie->next)
8669 if (cie->chunk_start == look_for)
8670 break;
8671
8672 if (!cie)
8673 {
8674 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8675 cie_id, saved_start);
8676 start = block_end;
8677 fc->ncols = 0;
8678 fc->col_type = (short int *) xmalloc (sizeof (short int));
8679 fc->col_offset = (int *) xmalloc (sizeof (int));
8680 frame_need_space (fc, max_regs - 1);
8681 cie = fc;
8682 fc->augmentation = "";
8683 fc->fde_encoding = 0;
8684 }
8685 else
8686 {
8687 fc->ncols = cie->ncols;
8688 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8689 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8690 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8691 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8692 fc->augmentation = cie->augmentation;
8693 fc->code_factor = cie->code_factor;
8694 fc->data_factor = cie->data_factor;
8695 fc->cfa_reg = cie->cfa_reg;
8696 fc->cfa_offset = cie->cfa_offset;
8697 fc->ra = cie->ra;
8698 frame_need_space (fc, max_regs-1);
8699 fc->fde_encoding = cie->fde_encoding;
8700 }
8701
8702 if (fc->fde_encoding)
8703 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8704
8705 fc->pc_begin = byte_get (start, encoded_ptr_size);
8706 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8707 fc->pc_begin += section->sh_addr + (start - section_start);
8708 start += encoded_ptr_size;
8709 fc->pc_range = byte_get (start, encoded_ptr_size);
8710 start += encoded_ptr_size;
8711
8712 if (cie->augmentation[0] == 'z')
8713 {
8714 augmentation_data_len = LEB ();
8715 augmentation_data = start;
8716 start += augmentation_data_len;
8717 }
8718
8719 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8720 (unsigned long)(saved_start - section_start), length, cie_id,
8721 (unsigned long)(cie->chunk_start - section_start),
8722 fc->pc_begin, fc->pc_begin + fc->pc_range);
8723 if (! do_debug_frames_interp && augmentation_data_len)
8724 {
8725 unsigned long i;
8726 printf (" Augmentation data: ");
8727 for (i = 0; i < augmentation_data_len; ++i)
8728 printf (" %02x", augmentation_data[i]);
8729 putchar ('\n');
8730 putchar ('\n');
8731 }
8732 }
8733
8734 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8735 about to interpret instructions for the chunk. */
8736
8737 if (do_debug_frames_interp)
8738 {
8739 /* Start by making a pass over the chunk, allocating storage
8740 and taking note of what registers are used. */
8741 unsigned char *tmp = start;
8742
8743 while (start < block_end)
8744 {
8745 unsigned op, opa;
8746 unsigned long reg;
8747
8748 op = *start++;
8749 opa = op & 0x3f;
8750 if (op & 0xc0)
8751 op &= 0xc0;
8752
8753 /* Warning: if you add any more cases to this switch, be
8754 sure to add them to the corresponding switch below. */
8755 switch (op)
8756 {
8757 case DW_CFA_advance_loc:
8758 break;
8759 case DW_CFA_offset:
8760 LEB ();
8761 frame_need_space (fc, opa);
8762 fc->col_type[opa] = DW_CFA_undefined;
8763 break;
8764 case DW_CFA_restore:
8765 frame_need_space (fc, opa);
8766 fc->col_type[opa] = DW_CFA_undefined;
8767 break;
8768 case DW_CFA_set_loc:
8769 start += encoded_ptr_size;
8770 break;
8771 case DW_CFA_advance_loc1:
8772 start += 1;
8773 break;
8774 case DW_CFA_advance_loc2:
8775 start += 2;
8776 break;
8777 case DW_CFA_advance_loc4:
8778 start += 4;
8779 break;
8780 case DW_CFA_offset_extended:
8781 reg = LEB (); LEB ();
8782 frame_need_space (fc, reg);
8783 fc->col_type[reg] = DW_CFA_undefined;
8784 break;
8785 case DW_CFA_restore_extended:
8786 reg = LEB ();
8787 frame_need_space (fc, reg);
8788 fc->col_type[reg] = DW_CFA_undefined;
8789 break;
8790 case DW_CFA_undefined:
8791 reg = LEB ();
8792 frame_need_space (fc, reg);
8793 fc->col_type[reg] = DW_CFA_undefined;
8794 break;
8795 case DW_CFA_same_value:
8796 reg = LEB ();
8797 frame_need_space (fc, reg);
8798 fc->col_type[reg] = DW_CFA_undefined;
8799 break;
8800 case DW_CFA_register:
8801 reg = LEB (); LEB ();
8802 frame_need_space (fc, reg);
8803 fc->col_type[reg] = DW_CFA_undefined;
8804 break;
8805 case DW_CFA_def_cfa:
8806 LEB (); LEB ();
8807 break;
8808 case DW_CFA_def_cfa_register:
8809 LEB ();
8810 break;
8811 case DW_CFA_def_cfa_offset:
8812 LEB ();
8813 break;
8814 case DW_CFA_offset_extended_sf:
8815 reg = LEB (); SLEB ();
8816 frame_need_space (fc, reg);
8817 fc->col_type[reg] = DW_CFA_undefined;
8818 break;
8819 case DW_CFA_def_cfa_sf:
8820 LEB (); SLEB ();
8821 break;
8822 case DW_CFA_def_cfa_offset_sf:
8823 SLEB ();
8824 break;
8825 case DW_CFA_GNU_args_size:
8826 LEB ();
8827 break;
8828 case DW_CFA_GNU_negative_offset_extended:
8829 reg = LEB (); LEB ();
8830 frame_need_space (fc, reg);
8831 fc->col_type[reg] = DW_CFA_undefined;
8832
8833 default:
8834 break;
8835 }
8836 }
8837 start = tmp;
8838 }
8839
8840 /* Now we know what registers are used, make a second pass over
8841 the chunk, this time actually printing out the info. */
8842
8843 while (start < block_end)
8844 {
8845 unsigned op, opa;
8846 unsigned long ul, reg, roffs;
8847 long l, ofs;
8848 bfd_vma vma;
8849
8850 op = *start++;
8851 opa = op & 0x3f;
8852 if (op & 0xc0)
8853 op &= 0xc0;
8854
8855 /* Warning: if you add any more cases to this switch, be
8856 sure to add them to the corresponding switch above. */
8857 switch (op)
8858 {
8859 case DW_CFA_advance_loc:
8860 if (do_debug_frames_interp)
8861 frame_display_row (fc, &need_col_headers, &max_regs);
8862 else
8863 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8864 opa * fc->code_factor,
8865 fc->pc_begin + opa * fc->code_factor);
8866 fc->pc_begin += opa * fc->code_factor;
8867 break;
8868
8869 case DW_CFA_offset:
8870 roffs = LEB ();
8871 if (! do_debug_frames_interp)
8872 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8873 opa, roffs * fc->data_factor);
8874 fc->col_type[opa] = DW_CFA_offset;
8875 fc->col_offset[opa] = roffs * fc->data_factor;
8876 break;
8877
8878 case DW_CFA_restore:
8879 if (! do_debug_frames_interp)
8880 printf (" DW_CFA_restore: r%d\n", opa);
8881 fc->col_type[opa] = cie->col_type[opa];
8882 fc->col_offset[opa] = cie->col_offset[opa];
8883 break;
8884
8885 case DW_CFA_set_loc:
8886 vma = byte_get (start, encoded_ptr_size);
8887 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8888 vma += section->sh_addr + (start - section_start);
8889 start += encoded_ptr_size;
8890 if (do_debug_frames_interp)
8891 frame_display_row (fc, &need_col_headers, &max_regs);
8892 else
8893 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8894 fc->pc_begin = vma;
8895 break;
8896
8897 case DW_CFA_advance_loc1:
8898 ofs = byte_get (start, 1); start += 1;
8899 if (do_debug_frames_interp)
8900 frame_display_row (fc, &need_col_headers, &max_regs);
8901 else
8902 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8903 ofs * fc->code_factor,
8904 fc->pc_begin + ofs * fc->code_factor);
8905 fc->pc_begin += ofs * fc->code_factor;
8906 break;
8907
8908 case DW_CFA_advance_loc2:
8909 ofs = byte_get (start, 2); start += 2;
8910 if (do_debug_frames_interp)
8911 frame_display_row (fc, &need_col_headers, &max_regs);
8912 else
8913 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8914 ofs * fc->code_factor,
8915 fc->pc_begin + ofs * fc->code_factor);
8916 fc->pc_begin += ofs * fc->code_factor;
8917 break;
8918
8919 case DW_CFA_advance_loc4:
8920 ofs = byte_get (start, 4); start += 4;
8921 if (do_debug_frames_interp)
8922 frame_display_row (fc, &need_col_headers, &max_regs);
8923 else
8924 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8925 ofs * fc->code_factor,
8926 fc->pc_begin + ofs * fc->code_factor);
8927 fc->pc_begin += ofs * fc->code_factor;
8928 break;
8929
8930 case DW_CFA_offset_extended:
8931 reg = LEB ();
8932 roffs = LEB ();
8933 if (! do_debug_frames_interp)
8934 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8935 reg, roffs * fc->data_factor);
8936 fc->col_type[reg] = DW_CFA_offset;
8937 fc->col_offset[reg] = roffs * fc->data_factor;
8938 break;
8939
8940 case DW_CFA_restore_extended:
8941 reg = LEB ();
8942 if (! do_debug_frames_interp)
8943 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8944 fc->col_type[reg] = cie->col_type[reg];
8945 fc->col_offset[reg] = cie->col_offset[reg];
8946 break;
8947
8948 case DW_CFA_undefined:
8949 reg = LEB ();
8950 if (! do_debug_frames_interp)
8951 printf (" DW_CFA_undefined: r%ld\n", reg);
8952 fc->col_type[reg] = DW_CFA_undefined;
8953 fc->col_offset[reg] = 0;
8954 break;
8955
8956 case DW_CFA_same_value:
8957 reg = LEB ();
8958 if (! do_debug_frames_interp)
8959 printf (" DW_CFA_same_value: r%ld\n", reg);
8960 fc->col_type[reg] = DW_CFA_same_value;
8961 fc->col_offset[reg] = 0;
8962 break;
8963
8964 case DW_CFA_register:
8965 reg = LEB ();
8966 roffs = LEB ();
8967 if (! do_debug_frames_interp)
8968 printf (" DW_CFA_register: r%ld\n", reg);
8969 fc->col_type[reg] = DW_CFA_register;
8970 fc->col_offset[reg] = roffs;
8971 break;
8972
8973 case DW_CFA_remember_state:
8974 if (! do_debug_frames_interp)
8975 printf (" DW_CFA_remember_state\n");
8976 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8977 rs->ncols = fc->ncols;
8978 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8979 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8980 memcpy (rs->col_type, fc->col_type, rs->ncols);
8981 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8982 rs->next = remembered_state;
8983 remembered_state = rs;
8984 break;
8985
8986 case DW_CFA_restore_state:
8987 if (! do_debug_frames_interp)
8988 printf (" DW_CFA_restore_state\n");
8989 rs = remembered_state;
8990 remembered_state = rs->next;
8991 frame_need_space (fc, rs->ncols-1);
8992 memcpy (fc->col_type, rs->col_type, rs->ncols);
8993 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8994 free (rs->col_type);
8995 free (rs->col_offset);
8996 free (rs);
8997 break;
8998
8999 case DW_CFA_def_cfa:
9000 fc->cfa_reg = LEB ();
9001 fc->cfa_offset = LEB ();
9002 if (! do_debug_frames_interp)
9003 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9004 fc->cfa_reg, fc->cfa_offset);
9005 break;
9006
9007 case DW_CFA_def_cfa_register:
9008 fc->cfa_reg = LEB ();
9009 if (! do_debug_frames_interp)
9010 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
9011 break;
9012
9013 case DW_CFA_def_cfa_offset:
9014 fc->cfa_offset = LEB ();
9015 if (! do_debug_frames_interp)
9016 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
9017 break;
9018
9019 case DW_CFA_nop:
9020 if (! do_debug_frames_interp)
9021 printf (" DW_CFA_nop\n");
9022 break;
9023
9024 case DW_CFA_offset_extended_sf:
9025 reg = LEB ();
9026 l = SLEB ();
9027 frame_need_space (fc, reg);
9028 if (! do_debug_frames_interp)
9029 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9030 reg, l * fc->data_factor);
9031 fc->col_type[reg] = DW_CFA_offset;
9032 fc->col_offset[reg] = l * fc->data_factor;
9033 break;
9034
9035 case DW_CFA_def_cfa_sf:
9036 fc->cfa_reg = LEB ();
9037 fc->cfa_offset = SLEB ();
9038 if (! do_debug_frames_interp)
9039 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9040 fc->cfa_reg, fc->cfa_offset);
9041 break;
9042
9043 case DW_CFA_def_cfa_offset_sf:
9044 fc->cfa_offset = SLEB ();
9045 if (! do_debug_frames_interp)
9046 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
9047 break;
9048
9049 case DW_CFA_GNU_window_save:
9050 if (! do_debug_frames_interp)
9051 printf (" DW_CFA_GNU_window_save\n");
9052 break;
9053
9054 case DW_CFA_GNU_args_size:
9055 ul = LEB ();
9056 if (! do_debug_frames_interp)
9057 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
9058 break;
9059
9060 case DW_CFA_GNU_negative_offset_extended:
9061 reg = LEB ();
9062 l = - LEB ();
9063 frame_need_space (fc, reg);
9064 if (! do_debug_frames_interp)
9065 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9066 reg, l * fc->data_factor);
9067 fc->col_type[reg] = DW_CFA_offset;
9068 fc->col_offset[reg] = l * fc->data_factor;
9069 break;
9070
9071 /* FIXME: How do we handle these? */
9072 case DW_CFA_def_cfa_expression:
9073 fprintf (stderr, "unsupported DW_CFA_def_cfa_expression\n");
9074 start = block_end;
9075 break;
9076
9077 case DW_CFA_expression:
9078 fprintf (stderr, "unsupported DW_CFA_expression\n");
9079 start = block_end;
9080 break;
9081
9082 default:
9083 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
9084 start = block_end;
9085 }
9086 }
9087
9088 if (do_debug_frames_interp)
9089 frame_display_row (fc, &need_col_headers, &max_regs);
9090
9091 start = block_end;
9092 }
9093
9094 printf ("\n");
9095
9096 return 1;
9097 }
9098
9099 #undef GET
9100 #undef LEB
9101 #undef SLEB
9102
9103 static int
9104 display_debug_not_supported (section, start, file)
9105 Elf_Internal_Shdr *section;
9106 unsigned char *start ATTRIBUTE_UNUSED;
9107 FILE *file ATTRIBUTE_UNUSED;
9108 {
9109 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9110 SECTION_NAME (section));
9111
9112 return 1;
9113 }
9114
9115 /* Pre-scan the .debug_info section to record the size of address.
9116 When dumping the .debug_line, we use that size information, assuming
9117 that all compilation units have the same address size. */
9118 static int
9119 prescan_debug_info (section, start, file)
9120 Elf_Internal_Shdr *section ATTRIBUTE_UNUSED;
9121 unsigned char *start;
9122 FILE *file ATTRIBUTE_UNUSED;
9123 {
9124 DWARF2_External_CompUnit *external;
9125
9126 external = (DWARF2_External_CompUnit *) start;
9127
9128 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
9129 return 0;
9130 }
9131
9132 /* A structure containing the name of a debug section and a pointer
9133 to a function that can decode it. The third field is a prescan
9134 function to be run over the section before displaying any of the
9135 sections. */
9136 struct
9137 {
9138 const char *const name;
9139 int (*display) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9140 int (*prescan) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9141 }
9142 debug_displays[] =
9143 {
9144 { ".debug_abbrev", display_debug_abbrev, NULL },
9145 { ".debug_aranges", display_debug_aranges, NULL },
9146 { ".debug_frame", display_debug_frames, NULL },
9147 { ".debug_info", display_debug_info, prescan_debug_info },
9148 { ".debug_line", display_debug_lines, NULL },
9149 { ".debug_pubnames", display_debug_pubnames, NULL },
9150 { ".eh_frame", display_debug_frames, NULL },
9151 { ".debug_macinfo", display_debug_macinfo, NULL },
9152 { ".debug_str", display_debug_str, NULL },
9153 { ".debug_loc", display_debug_loc, NULL },
9154 { ".debug_pubtypes", display_debug_not_supported, NULL },
9155 { ".debug_ranges", display_debug_not_supported, NULL },
9156 { ".debug_static_func", display_debug_not_supported, NULL },
9157 { ".debug_static_vars", display_debug_not_supported, NULL },
9158 { ".debug_types", display_debug_not_supported, NULL },
9159 { ".debug_weaknames", display_debug_not_supported, NULL }
9160 };
9161
9162 static int
9163 display_debug_section (section, file)
9164 Elf_Internal_Shdr *section;
9165 FILE *file;
9166 {
9167 char *name = SECTION_NAME (section);
9168 bfd_size_type length;
9169 unsigned char *start;
9170 int i;
9171
9172 length = section->sh_size;
9173 if (length == 0)
9174 {
9175 printf (_("\nSection '%s' has no debugging data.\n"), name);
9176 return 0;
9177 }
9178
9179 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
9180 _("debug section data"));
9181 if (!start)
9182 return 0;
9183
9184 /* See if we know how to display the contents of this section. */
9185 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
9186 name = ".debug_info";
9187
9188 for (i = NUM_ELEM (debug_displays); i--;)
9189 if (strcmp (debug_displays[i].name, name) == 0)
9190 {
9191 debug_displays[i].display (section, start, file);
9192 break;
9193 }
9194
9195 if (i == -1)
9196 printf (_("Unrecognized debug section: %s\n"), name);
9197
9198 free (start);
9199
9200 /* If we loaded in the abbrev section at some point,
9201 we must release it here. */
9202 free_abbrevs ();
9203
9204 return 1;
9205 }
9206
9207 static int
9208 process_section_contents (file)
9209 FILE *file;
9210 {
9211 Elf_Internal_Shdr *section;
9212 unsigned int i;
9213
9214 if (! do_dump)
9215 return 1;
9216
9217 /* Pre-scan the debug sections to find some debug information not
9218 present in some of them. For the .debug_line, we must find out the
9219 size of address (specified in .debug_info and .debug_aranges). */
9220 for (i = 0, section = section_headers;
9221 i < elf_header.e_shnum && i < num_dump_sects;
9222 i++, section++)
9223 {
9224 char *name = SECTION_NAME (section);
9225 int j;
9226
9227 if (section->sh_size == 0)
9228 continue;
9229
9230 /* See if there is some pre-scan operation for this section. */
9231 for (j = NUM_ELEM (debug_displays); j--;)
9232 if (strcmp (debug_displays[j].name, name) == 0)
9233 {
9234 if (debug_displays[j].prescan != NULL)
9235 {
9236 bfd_size_type length;
9237 unsigned char *start;
9238
9239 length = section->sh_size;
9240 start = ((unsigned char *)
9241 get_data (NULL, file, section->sh_offset, length,
9242 _("debug section data")));
9243 if (!start)
9244 return 0;
9245
9246 debug_displays[j].prescan (section, start, file);
9247 free (start);
9248 }
9249
9250 break;
9251 }
9252 }
9253
9254 for (i = 0, section = section_headers;
9255 i < elf_header.e_shnum && i < num_dump_sects;
9256 i++, section++)
9257 {
9258 #ifdef SUPPORT_DISASSEMBLY
9259 if (dump_sects[i] & DISASS_DUMP)
9260 disassemble_section (section, file);
9261 #endif
9262 if (dump_sects[i] & HEX_DUMP)
9263 dump_section (section, file);
9264
9265 if (dump_sects[i] & DEBUG_DUMP)
9266 display_debug_section (section, file);
9267 }
9268
9269 if (i < num_dump_sects)
9270 warn (_("Some sections were not dumped because they do not exist!\n"));
9271
9272 return 1;
9273 }
9274
9275 static void
9276 process_mips_fpe_exception (mask)
9277 int mask;
9278 {
9279 if (mask)
9280 {
9281 int first = 1;
9282 if (mask & OEX_FPU_INEX)
9283 fputs ("INEX", stdout), first = 0;
9284 if (mask & OEX_FPU_UFLO)
9285 printf ("%sUFLO", first ? "" : "|"), first = 0;
9286 if (mask & OEX_FPU_OFLO)
9287 printf ("%sOFLO", first ? "" : "|"), first = 0;
9288 if (mask & OEX_FPU_DIV0)
9289 printf ("%sDIV0", first ? "" : "|"), first = 0;
9290 if (mask & OEX_FPU_INVAL)
9291 printf ("%sINVAL", first ? "" : "|");
9292 }
9293 else
9294 fputs ("0", stdout);
9295 }
9296
9297 static int
9298 process_mips_specific (file)
9299 FILE *file;
9300 {
9301 Elf_Internal_Dyn *entry;
9302 size_t liblist_offset = 0;
9303 size_t liblistno = 0;
9304 size_t conflictsno = 0;
9305 size_t options_offset = 0;
9306 size_t conflicts_offset = 0;
9307
9308 /* We have a lot of special sections. Thanks SGI! */
9309 if (dynamic_segment == NULL)
9310 /* No information available. */
9311 return 0;
9312
9313 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
9314 switch (entry->d_tag)
9315 {
9316 case DT_MIPS_LIBLIST:
9317 liblist_offset = entry->d_un.d_val - loadaddr;
9318 break;
9319 case DT_MIPS_LIBLISTNO:
9320 liblistno = entry->d_un.d_val;
9321 break;
9322 case DT_MIPS_OPTIONS:
9323 options_offset = entry->d_un.d_val - loadaddr;
9324 break;
9325 case DT_MIPS_CONFLICT:
9326 conflicts_offset = entry->d_un.d_val - loadaddr;
9327 break;
9328 case DT_MIPS_CONFLICTNO:
9329 conflictsno = entry->d_un.d_val;
9330 break;
9331 default:
9332 break;
9333 }
9334
9335 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9336 {
9337 Elf32_External_Lib *elib;
9338 size_t cnt;
9339
9340 elib = ((Elf32_External_Lib *)
9341 get_data (NULL, file, liblist_offset,
9342 liblistno * sizeof (Elf32_External_Lib),
9343 _("liblist")));
9344 if (elib)
9345 {
9346 printf ("\nSection '.liblist' contains %lu entries:\n",
9347 (unsigned long) liblistno);
9348 fputs (" Library Time Stamp Checksum Version Flags\n",
9349 stdout);
9350
9351 for (cnt = 0; cnt < liblistno; ++cnt)
9352 {
9353 Elf32_Lib liblist;
9354 time_t time;
9355 char timebuf[20];
9356 struct tm *tmp;
9357
9358 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9359 time = BYTE_GET (elib[cnt].l_time_stamp);
9360 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9361 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9362 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9363
9364 tmp = gmtime (&time);
9365 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9366 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9367 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9368
9369 printf ("%3lu: ", (unsigned long) cnt);
9370 print_symbol (20, dynamic_strings + liblist.l_name);
9371 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9372 liblist.l_version);
9373
9374 if (liblist.l_flags == 0)
9375 puts (" NONE");
9376 else
9377 {
9378 static const struct
9379 {
9380 const char *name;
9381 int bit;
9382 }
9383 l_flags_vals[] =
9384 {
9385 { " EXACT_MATCH", LL_EXACT_MATCH },
9386 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9387 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9388 { " EXPORTS", LL_EXPORTS },
9389 { " DELAY_LOAD", LL_DELAY_LOAD },
9390 { " DELTA", LL_DELTA }
9391 };
9392 int flags = liblist.l_flags;
9393 size_t fcnt;
9394
9395 for (fcnt = 0;
9396 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9397 ++fcnt)
9398 if ((flags & l_flags_vals[fcnt].bit) != 0)
9399 {
9400 fputs (l_flags_vals[fcnt].name, stdout);
9401 flags ^= l_flags_vals[fcnt].bit;
9402 }
9403 if (flags != 0)
9404 printf (" %#x", (unsigned int) flags);
9405
9406 puts ("");
9407 }
9408 }
9409
9410 free (elib);
9411 }
9412 }
9413
9414 if (options_offset != 0)
9415 {
9416 Elf_External_Options *eopt;
9417 Elf_Internal_Shdr *sect = section_headers;
9418 Elf_Internal_Options *iopt;
9419 Elf_Internal_Options *option;
9420 size_t offset;
9421 int cnt;
9422
9423 /* Find the section header so that we get the size. */
9424 while (sect->sh_type != SHT_MIPS_OPTIONS)
9425 ++sect;
9426
9427 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9428 sect->sh_size, _("options"));
9429 if (eopt)
9430 {
9431 iopt = ((Elf_Internal_Options *)
9432 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt)));
9433 if (iopt == NULL)
9434 {
9435 error (_("Out of memory"));
9436 return 0;
9437 }
9438
9439 offset = cnt = 0;
9440 option = iopt;
9441
9442 while (offset < sect->sh_size)
9443 {
9444 Elf_External_Options *eoption;
9445
9446 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9447
9448 option->kind = BYTE_GET (eoption->kind);
9449 option->size = BYTE_GET (eoption->size);
9450 option->section = BYTE_GET (eoption->section);
9451 option->info = BYTE_GET (eoption->info);
9452
9453 offset += option->size;
9454
9455 ++option;
9456 ++cnt;
9457 }
9458
9459 printf (_("\nSection '%s' contains %d entries:\n"),
9460 SECTION_NAME (sect), cnt);
9461
9462 option = iopt;
9463
9464 while (cnt-- > 0)
9465 {
9466 size_t len;
9467
9468 switch (option->kind)
9469 {
9470 case ODK_NULL:
9471 /* This shouldn't happen. */
9472 printf (" NULL %d %lx", option->section, option->info);
9473 break;
9474 case ODK_REGINFO:
9475 printf (" REGINFO ");
9476 if (elf_header.e_machine == EM_MIPS)
9477 {
9478 /* 32bit form. */
9479 Elf32_External_RegInfo *ereg;
9480 Elf32_RegInfo reginfo;
9481
9482 ereg = (Elf32_External_RegInfo *) (option + 1);
9483 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9484 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9485 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9486 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9487 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9488 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9489
9490 printf ("GPR %08lx GP 0x%lx\n",
9491 reginfo.ri_gprmask,
9492 (unsigned long) reginfo.ri_gp_value);
9493 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9494 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9495 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9496 }
9497 else
9498 {
9499 /* 64 bit form. */
9500 Elf64_External_RegInfo *ereg;
9501 Elf64_Internal_RegInfo reginfo;
9502
9503 ereg = (Elf64_External_RegInfo *) (option + 1);
9504 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9505 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9506 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9507 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9508 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9509 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9510
9511 printf ("GPR %08lx GP 0x",
9512 reginfo.ri_gprmask);
9513 printf_vma (reginfo.ri_gp_value);
9514 printf ("\n");
9515
9516 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9517 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9518 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9519 }
9520 ++option;
9521 continue;
9522 case ODK_EXCEPTIONS:
9523 fputs (" EXCEPTIONS fpe_min(", stdout);
9524 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9525 fputs (") fpe_max(", stdout);
9526 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9527 fputs (")", stdout);
9528
9529 if (option->info & OEX_PAGE0)
9530 fputs (" PAGE0", stdout);
9531 if (option->info & OEX_SMM)
9532 fputs (" SMM", stdout);
9533 if (option->info & OEX_FPDBUG)
9534 fputs (" FPDBUG", stdout);
9535 if (option->info & OEX_DISMISS)
9536 fputs (" DISMISS", stdout);
9537 break;
9538 case ODK_PAD:
9539 fputs (" PAD ", stdout);
9540 if (option->info & OPAD_PREFIX)
9541 fputs (" PREFIX", stdout);
9542 if (option->info & OPAD_POSTFIX)
9543 fputs (" POSTFIX", stdout);
9544 if (option->info & OPAD_SYMBOL)
9545 fputs (" SYMBOL", stdout);
9546 break;
9547 case ODK_HWPATCH:
9548 fputs (" HWPATCH ", stdout);
9549 if (option->info & OHW_R4KEOP)
9550 fputs (" R4KEOP", stdout);
9551 if (option->info & OHW_R8KPFETCH)
9552 fputs (" R8KPFETCH", stdout);
9553 if (option->info & OHW_R5KEOP)
9554 fputs (" R5KEOP", stdout);
9555 if (option->info & OHW_R5KCVTL)
9556 fputs (" R5KCVTL", stdout);
9557 break;
9558 case ODK_FILL:
9559 fputs (" FILL ", stdout);
9560 /* XXX Print content of info word? */
9561 break;
9562 case ODK_TAGS:
9563 fputs (" TAGS ", stdout);
9564 /* XXX Print content of info word? */
9565 break;
9566 case ODK_HWAND:
9567 fputs (" HWAND ", stdout);
9568 if (option->info & OHWA0_R4KEOP_CHECKED)
9569 fputs (" R4KEOP_CHECKED", stdout);
9570 if (option->info & OHWA0_R4KEOP_CLEAN)
9571 fputs (" R4KEOP_CLEAN", stdout);
9572 break;
9573 case ODK_HWOR:
9574 fputs (" HWOR ", stdout);
9575 if (option->info & OHWA0_R4KEOP_CHECKED)
9576 fputs (" R4KEOP_CHECKED", stdout);
9577 if (option->info & OHWA0_R4KEOP_CLEAN)
9578 fputs (" R4KEOP_CLEAN", stdout);
9579 break;
9580 case ODK_GP_GROUP:
9581 printf (" GP_GROUP %#06lx self-contained %#06lx",
9582 option->info & OGP_GROUP,
9583 (option->info & OGP_SELF) >> 16);
9584 break;
9585 case ODK_IDENT:
9586 printf (" IDENT %#06lx self-contained %#06lx",
9587 option->info & OGP_GROUP,
9588 (option->info & OGP_SELF) >> 16);
9589 break;
9590 default:
9591 /* This shouldn't happen. */
9592 printf (" %3d ??? %d %lx",
9593 option->kind, option->section, option->info);
9594 break;
9595 }
9596
9597 len = sizeof (*eopt);
9598 while (len < option->size)
9599 if (((char *) option)[len] >= ' '
9600 && ((char *) option)[len] < 0x7f)
9601 printf ("%c", ((char *) option)[len++]);
9602 else
9603 printf ("\\%03o", ((char *) option)[len++]);
9604
9605 fputs ("\n", stdout);
9606 ++option;
9607 }
9608
9609 free (eopt);
9610 }
9611 }
9612
9613 if (conflicts_offset != 0 && conflictsno != 0)
9614 {
9615 Elf32_Conflict *iconf;
9616 size_t cnt;
9617
9618 if (dynamic_symbols == NULL)
9619 {
9620 error (_("conflict list found without a dynamic symbol table"));
9621 return 0;
9622 }
9623
9624 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
9625 if (iconf == NULL)
9626 {
9627 error (_("Out of memory"));
9628 return 0;
9629 }
9630
9631 if (is_32bit_elf)
9632 {
9633 Elf32_External_Conflict *econf32;
9634
9635 econf32 = ((Elf32_External_Conflict *)
9636 get_data (NULL, file, conflicts_offset,
9637 conflictsno * sizeof (*econf32),
9638 _("conflict")));
9639 if (!econf32)
9640 return 0;
9641
9642 for (cnt = 0; cnt < conflictsno; ++cnt)
9643 iconf[cnt] = BYTE_GET (econf32[cnt]);
9644
9645 free (econf32);
9646 }
9647 else
9648 {
9649 Elf64_External_Conflict *econf64;
9650
9651 econf64 = ((Elf64_External_Conflict *)
9652 get_data (NULL, file, conflicts_offset,
9653 conflictsno * sizeof (*econf64),
9654 _("conflict")));
9655 if (!econf64)
9656 return 0;
9657
9658 for (cnt = 0; cnt < conflictsno; ++cnt)
9659 iconf[cnt] = BYTE_GET (econf64[cnt]);
9660
9661 free (econf64);
9662 }
9663
9664 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9665 (long) conflictsno);
9666 puts (_(" Num: Index Value Name"));
9667
9668 for (cnt = 0; cnt < conflictsno; ++cnt)
9669 {
9670 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
9671
9672 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
9673 print_vma (psym->st_value, FULL_HEX);
9674 putchar (' ');
9675 print_symbol (25, dynamic_strings + psym->st_name);
9676 putchar ('\n');
9677 }
9678
9679 free (iconf);
9680 }
9681
9682 return 1;
9683 }
9684
9685 static int
9686 process_gnu_liblist (file)
9687 FILE *file;
9688 {
9689 Elf_Internal_Shdr *section, *string_sec;
9690 Elf32_External_Lib *elib;
9691 char *strtab;
9692 size_t cnt;
9693 unsigned i;
9694
9695 if (! do_arch)
9696 return 0;
9697
9698 for (i = 0, section = section_headers;
9699 i < elf_header.e_shnum;
9700 i++, section++)
9701 {
9702 switch (section->sh_type)
9703 {
9704 case SHT_GNU_LIBLIST:
9705 elib = ((Elf32_External_Lib *)
9706 get_data (NULL, file, section->sh_offset, section->sh_size,
9707 _("liblist")));
9708
9709 if (elib == NULL)
9710 break;
9711 string_sec = SECTION_HEADER (section->sh_link);
9712
9713 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9714 string_sec->sh_size,
9715 _("liblist string table"));
9716
9717 if (strtab == NULL
9718 || section->sh_entsize != sizeof (Elf32_External_Lib))
9719 {
9720 free (elib);
9721 break;
9722 }
9723
9724 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9725 SECTION_NAME (section),
9726 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9727
9728 puts (" Library Time Stamp Checksum Version Flags");
9729
9730 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9731 ++cnt)
9732 {
9733 Elf32_Lib liblist;
9734 time_t time;
9735 char timebuf[20];
9736 struct tm *tmp;
9737
9738 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9739 time = BYTE_GET (elib[cnt].l_time_stamp);
9740 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9741 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9742 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9743
9744 tmp = gmtime (&time);
9745 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9746 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9747 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9748
9749 printf ("%3lu: ", (unsigned long) cnt);
9750 if (do_wide)
9751 printf ("%-20s", strtab + liblist.l_name);
9752 else
9753 printf ("%-20.20s", strtab + liblist.l_name);
9754 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9755 liblist.l_version, liblist.l_flags);
9756 }
9757
9758 free (elib);
9759 }
9760 }
9761
9762 return 1;
9763 }
9764
9765 static const char *
9766 get_note_type (e_type)
9767 unsigned e_type;
9768 {
9769 static char buff[64];
9770
9771 switch (e_type)
9772 {
9773 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9774 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9775 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9776 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9777 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9778 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9779 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9780 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9781 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9782 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9783 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9784 default:
9785 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9786 return buff;
9787 }
9788 }
9789
9790 static const char *
9791 get_netbsd_elfcore_note_type (e_type)
9792 unsigned e_type;
9793 {
9794 static char buff[64];
9795
9796 if (e_type == NT_NETBSDCORE_PROCINFO)
9797 {
9798 /* NetBSD core "procinfo" structure. */
9799 return _("NetBSD procinfo structure");
9800 }
9801
9802 /* As of Jan 2002 there are no other machine-independent notes
9803 defined for NetBSD core files. If the note type is less
9804 than the start of the machine-dependent note types, we don't
9805 understand it. */
9806
9807 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9808 {
9809 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9810 return buff;
9811 }
9812
9813 switch (elf_header.e_machine)
9814 {
9815 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9816 and PT_GETFPREGS == mach+2. */
9817
9818 case EM_OLD_ALPHA:
9819 case EM_ALPHA:
9820 case EM_SPARC:
9821 case EM_SPARC32PLUS:
9822 case EM_SPARCV9:
9823 switch (e_type)
9824 {
9825 case NT_NETBSDCORE_FIRSTMACH+0:
9826 return _("PT_GETREGS (reg structure)");
9827 case NT_NETBSDCORE_FIRSTMACH+2:
9828 return _("PT_GETFPREGS (fpreg structure)");
9829 default:
9830 break;
9831 }
9832 break;
9833
9834 /* On all other arch's, PT_GETREGS == mach+1 and
9835 PT_GETFPREGS == mach+3. */
9836 default:
9837 switch (e_type)
9838 {
9839 case NT_NETBSDCORE_FIRSTMACH+1:
9840 return _("PT_GETREGS (reg structure)");
9841 case NT_NETBSDCORE_FIRSTMACH+3:
9842 return _("PT_GETFPREGS (fpreg structure)");
9843 default:
9844 break;
9845 }
9846 }
9847
9848 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9849 return buff;
9850 }
9851
9852 /* Note that by the ELF standard, the name field is already null byte
9853 terminated, and namesz includes the terminating null byte.
9854 I.E. the value of namesz for the name "FSF" is 4.
9855
9856 If the value of namesz is zero, there is no name present. */
9857 static int
9858 process_note (pnote)
9859 Elf_Internal_Note *pnote;
9860 {
9861 const char *nt;
9862
9863 if (pnote->namesz == 0)
9864 {
9865 /* If there is no note name, then use the default set of
9866 note type strings. */
9867 nt = get_note_type (pnote->type);
9868 }
9869 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9870 {
9871 /* NetBSD-specific core file notes. */
9872 nt = get_netbsd_elfcore_note_type (pnote->type);
9873 }
9874 else
9875 {
9876 /* Don't recognize this note name; just use the default set of
9877 note type strings. */
9878 nt = get_note_type (pnote->type);
9879 }
9880
9881 printf (" %s\t\t0x%08lx\t%s\n",
9882 pnote->namesz ? pnote->namedata : "(NONE)",
9883 pnote->descsz, nt);
9884 return 1;
9885 }
9886
9887
9888 static int
9889 process_corefile_note_segment (file, offset, length)
9890 FILE *file;
9891 bfd_vma offset;
9892 bfd_vma length;
9893 {
9894 Elf_External_Note *pnotes;
9895 Elf_External_Note *external;
9896 int res = 1;
9897
9898 if (length <= 0)
9899 return 0;
9900
9901 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9902 _("notes"));
9903 if (!pnotes)
9904 return 0;
9905
9906 external = pnotes;
9907
9908 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9909 (unsigned long) offset, (unsigned long) length);
9910 printf (_(" Owner\t\tData size\tDescription\n"));
9911
9912 while (external < (Elf_External_Note *)((char *) pnotes + length))
9913 {
9914 Elf_External_Note *next;
9915 Elf_Internal_Note inote;
9916 char *temp = NULL;
9917
9918 inote.type = BYTE_GET (external->type);
9919 inote.namesz = BYTE_GET (external->namesz);
9920 inote.namedata = external->name;
9921 inote.descsz = BYTE_GET (external->descsz);
9922 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9923 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9924
9925 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9926
9927 if (((char *) next) > (((char *) pnotes) + length))
9928 {
9929 warn (_("corrupt note found at offset %x into core notes\n"),
9930 ((char *) external) - ((char *) pnotes));
9931 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9932 inote.type, inote.namesz, inote.descsz);
9933 break;
9934 }
9935
9936 external = next;
9937
9938 /* Verify that name is null terminated. It appears that at least
9939 one version of Linux (RedHat 6.0) generates corefiles that don't
9940 comply with the ELF spec by failing to include the null byte in
9941 namesz. */
9942 if (inote.namedata[inote.namesz] != '\0')
9943 {
9944 temp = malloc (inote.namesz + 1);
9945
9946 if (temp == NULL)
9947 {
9948 error (_("Out of memory\n"));
9949 res = 0;
9950 break;
9951 }
9952
9953 strncpy (temp, inote.namedata, inote.namesz);
9954 temp[inote.namesz] = 0;
9955
9956 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9957 inote.namedata = temp;
9958 }
9959
9960 res &= process_note (& inote);
9961
9962 if (temp != NULL)
9963 {
9964 free (temp);
9965 temp = NULL;
9966 }
9967 }
9968
9969 free (pnotes);
9970
9971 return res;
9972 }
9973
9974 static int
9975 process_corefile_note_segments (file)
9976 FILE *file;
9977 {
9978 Elf_Internal_Phdr *program_headers;
9979 Elf_Internal_Phdr *segment;
9980 unsigned int i;
9981 int res = 1;
9982
9983 program_headers = (Elf_Internal_Phdr *) malloc
9984 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9985
9986 if (program_headers == NULL)
9987 {
9988 error (_("Out of memory\n"));
9989 return 0;
9990 }
9991
9992 if (is_32bit_elf)
9993 i = get_32bit_program_headers (file, program_headers);
9994 else
9995 i = get_64bit_program_headers (file, program_headers);
9996
9997 if (i == 0)
9998 {
9999 free (program_headers);
10000 return 0;
10001 }
10002
10003 for (i = 0, segment = program_headers;
10004 i < elf_header.e_phnum;
10005 i++, segment++)
10006 {
10007 if (segment->p_type == PT_NOTE)
10008 res &= process_corefile_note_segment (file,
10009 (bfd_vma) segment->p_offset,
10010 (bfd_vma) segment->p_filesz);
10011 }
10012
10013 free (program_headers);
10014
10015 return res;
10016 }
10017
10018 static int
10019 process_corefile_contents (file)
10020 FILE *file;
10021 {
10022 /* If we have not been asked to display the notes then do nothing. */
10023 if (! do_notes)
10024 return 1;
10025
10026 /* If file is not a core file then exit. */
10027 if (elf_header.e_type != ET_CORE)
10028 return 1;
10029
10030 /* No program headers means no NOTE segment. */
10031 if (elf_header.e_phnum == 0)
10032 {
10033 printf (_("No note segments present in the core file.\n"));
10034 return 1;
10035 }
10036
10037 return process_corefile_note_segments (file);
10038 }
10039
10040 static int
10041 process_arch_specific (file)
10042 FILE *file;
10043 {
10044 if (! do_arch)
10045 return 1;
10046
10047 switch (elf_header.e_machine)
10048 {
10049 case EM_MIPS:
10050 case EM_MIPS_RS3_LE:
10051 return process_mips_specific (file);
10052 break;
10053 default:
10054 break;
10055 }
10056 return 1;
10057 }
10058
10059 static int
10060 get_file_header (file)
10061 FILE *file;
10062 {
10063 /* Read in the identity array. */
10064 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
10065 return 0;
10066
10067 /* Determine how to read the rest of the header. */
10068 switch (elf_header.e_ident[EI_DATA])
10069 {
10070 default: /* fall through */
10071 case ELFDATANONE: /* fall through */
10072 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
10073 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
10074 }
10075
10076 /* For now we only support 32 bit and 64 bit ELF files. */
10077 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
10078
10079 /* Read in the rest of the header. */
10080 if (is_32bit_elf)
10081 {
10082 Elf32_External_Ehdr ehdr32;
10083
10084 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
10085 return 0;
10086
10087 elf_header.e_type = BYTE_GET (ehdr32.e_type);
10088 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
10089 elf_header.e_version = BYTE_GET (ehdr32.e_version);
10090 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
10091 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
10092 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
10093 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
10094 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
10095 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
10096 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
10097 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
10098 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
10099 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
10100 }
10101 else
10102 {
10103 Elf64_External_Ehdr ehdr64;
10104
10105 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10106 we will not be able to cope with the 64bit data found in
10107 64 ELF files. Detect this now and abort before we start
10108 overwritting things. */
10109 if (sizeof (bfd_vma) < 8)
10110 {
10111 error (_("This instance of readelf has been built without support for a\n\
10112 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10113 return 0;
10114 }
10115
10116 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
10117 return 0;
10118
10119 elf_header.e_type = BYTE_GET (ehdr64.e_type);
10120 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
10121 elf_header.e_version = BYTE_GET (ehdr64.e_version);
10122 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
10123 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
10124 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
10125 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
10126 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
10127 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
10128 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
10129 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
10130 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
10131 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
10132 }
10133
10134 if (elf_header.e_shoff)
10135 {
10136 /* There may be some extensions in the first section header. Don't
10137 bomb if we can't read it. */
10138 if (is_32bit_elf)
10139 get_32bit_section_headers (file, 1);
10140 else
10141 get_64bit_section_headers (file, 1);
10142 }
10143
10144 return 1;
10145 }
10146
10147 static int
10148 process_file (file_name)
10149 char *file_name;
10150 {
10151 FILE *file;
10152 struct stat statbuf;
10153 unsigned int i;
10154
10155 if (stat (file_name, & statbuf) < 0)
10156 {
10157 error (_("Cannot stat input file %s.\n"), file_name);
10158 return 1;
10159 }
10160
10161 file = fopen (file_name, "rb");
10162 if (file == NULL)
10163 {
10164 error (_("Input file %s not found.\n"), file_name);
10165 return 1;
10166 }
10167
10168 if (! get_file_header (file))
10169 {
10170 error (_("%s: Failed to read file header\n"), file_name);
10171 fclose (file);
10172 return 1;
10173 }
10174
10175 /* Initialise per file variables. */
10176 for (i = NUM_ELEM (version_info); i--;)
10177 version_info[i] = 0;
10178
10179 for (i = NUM_ELEM (dynamic_info); i--;)
10180 dynamic_info[i] = 0;
10181
10182 /* Process the file. */
10183 if (show_name)
10184 printf (_("\nFile: %s\n"), file_name);
10185
10186 if (! process_file_header ())
10187 {
10188 fclose (file);
10189 return 1;
10190 }
10191
10192 if (! process_section_headers (file))
10193 {
10194 /* Without loaded section headers we
10195 cannot process lots of things. */
10196 do_unwind = do_version = do_dump = do_arch = 0;
10197
10198 if (! do_using_dynamic)
10199 do_syms = do_reloc = 0;
10200 }
10201
10202 if (process_program_headers (file))
10203 process_dynamic_segment (file);
10204
10205 process_relocs (file);
10206
10207 process_unwind (file);
10208
10209 process_symbol_table (file);
10210
10211 process_syminfo (file);
10212
10213 process_version_sections (file);
10214
10215 process_section_contents (file);
10216
10217 process_corefile_contents (file);
10218
10219 process_gnu_liblist (file);
10220
10221 process_arch_specific (file);
10222
10223 fclose (file);
10224
10225 if (section_headers)
10226 {
10227 free (section_headers);
10228 section_headers = NULL;
10229 }
10230
10231 if (string_table)
10232 {
10233 free (string_table);
10234 string_table = NULL;
10235 string_table_length = 0;
10236 }
10237
10238 if (dynamic_strings)
10239 {
10240 free (dynamic_strings);
10241 dynamic_strings = NULL;
10242 }
10243
10244 if (dynamic_symbols)
10245 {
10246 free (dynamic_symbols);
10247 dynamic_symbols = NULL;
10248 num_dynamic_syms = 0;
10249 }
10250
10251 if (dynamic_syminfo)
10252 {
10253 free (dynamic_syminfo);
10254 dynamic_syminfo = NULL;
10255 }
10256
10257 return 0;
10258 }
10259
10260 #ifdef SUPPORT_DISASSEMBLY
10261 /* Needed by the i386 disassembler. For extra credit, someone could
10262 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10263 symbols. */
10264
10265 void
10266 print_address (unsigned int addr, FILE *outfile)
10267 {
10268 fprintf (outfile,"0x%8.8x", addr);
10269 }
10270
10271 /* Needed by the i386 disassembler. */
10272 void
10273 db_task_printsym (unsigned int addr)
10274 {
10275 print_address (addr, stderr);
10276 }
10277 #endif
10278
10279 int main PARAMS ((int, char **));
10280
10281 int
10282 main (argc, argv)
10283 int argc;
10284 char **argv;
10285 {
10286 int err;
10287 char *cmdline_dump_sects = NULL;
10288 unsigned num_cmdline_dump_sects = 0;
10289
10290 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10291 setlocale (LC_MESSAGES, "");
10292 #endif
10293 #if defined (HAVE_SETLOCALE)
10294 setlocale (LC_CTYPE, "");
10295 #endif
10296 bindtextdomain (PACKAGE, LOCALEDIR);
10297 textdomain (PACKAGE);
10298
10299 parse_args (argc, argv);
10300
10301 if (optind < (argc - 1))
10302 show_name = 1;
10303
10304 /* When processing more than one file remember the dump requests
10305 issued on command line to reset them after each file. */
10306 if (optind + 1 < argc && dump_sects != NULL)
10307 {
10308 cmdline_dump_sects = malloc (num_dump_sects);
10309 if (cmdline_dump_sects == NULL)
10310 error (_("Out of memory allocating dump request table."));
10311 else
10312 {
10313 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
10314 num_cmdline_dump_sects = num_dump_sects;
10315 }
10316 }
10317
10318 err = 0;
10319 while (optind < argc)
10320 {
10321 err |= process_file (argv[optind++]);
10322
10323 /* Reset dump requests. */
10324 if (optind < argc && dump_sects != NULL)
10325 {
10326 num_dump_sects = num_cmdline_dump_sects;
10327 if (num_cmdline_dump_sects > 0)
10328 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
10329 }
10330 }
10331
10332 if (dump_sects != NULL)
10333 free (dump_sects);
10334 if (cmdline_dump_sects != NULL)
10335 free (cmdline_dump_sects);
10336
10337 return err;
10338 }