IA-64 ELF support.
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 99, 2000 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.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 belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
36 #define BFD64
37 #endif
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/i386.h"
53 #include "elf/v850.h"
54 #include "elf/ppc.h"
55 #include "elf/mips.h"
56 #include "elf/alpha.h"
57 #include "elf/arm.h"
58 #include "elf/m68k.h"
59 #include "elf/sparc.h"
60 #include "elf/m32r.h"
61 #include "elf/d10v.h"
62 #include "elf/d30v.h"
63 #include "elf/sh.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
66 #include "elf/hppa.h"
67 #include "elf/arc.h"
68 #include "elf/fr30.h"
69 #include "elf/mcore.h"
70 #include "elf/i960.h"
71 #include "elf/pj.h"
72 #include "elf/avr.h"
73 #include "elf/ia64.h"
74
75 #include "bucomm.h"
76 #include "getopt.h"
77
78 char * program_name = "readelf";
79 unsigned int dynamic_addr;
80 bfd_size_type dynamic_size;
81 unsigned int rela_addr;
82 unsigned int rela_size;
83 char * dynamic_strings;
84 char * string_table;
85 unsigned long num_dynamic_syms;
86 Elf_Internal_Sym * dynamic_symbols;
87 Elf_Internal_Syminfo * dynamic_syminfo;
88 unsigned long dynamic_syminfo_offset;
89 unsigned int dynamic_syminfo_nent;
90 char program_interpreter [64];
91 int dynamic_info[DT_JMPREL + 1];
92 int version_info[16];
93 int loadaddr = 0;
94 Elf_Internal_Ehdr elf_header;
95 Elf_Internal_Shdr * section_headers;
96 Elf_Internal_Dyn * dynamic_segment;
97 int show_name;
98 int do_dynamic;
99 int do_syms;
100 int do_reloc;
101 int do_sections;
102 int do_segments;
103 int do_using_dynamic;
104 int do_header;
105 int do_dump;
106 int do_version;
107 int do_histogram;
108 int do_debugging;
109 int do_debug_info;
110 int do_debug_abbrevs;
111 int do_debug_lines;
112 int do_debug_pubnames;
113 int do_debug_aranges;
114 int do_arch;
115 int do_notes;
116 int is_32bit_elf;
117
118 /* A dynamic array of flags indicating which sections require dumping. */
119 char * dump_sects = NULL;
120 unsigned int num_dump_sects = 0;
121
122 #define HEX_DUMP (1 << 0)
123 #define DISASS_DUMP (1 << 1)
124 #define DEBUG_DUMP (1 << 2)
125
126 /* How to rpint a vma value. */
127 typedef enum print_mode
128 {
129 HEX,
130 DEC,
131 DEC_5,
132 UNSIGNED,
133 PREFIX_HEX,
134 FULL_HEX,
135 LONG_HEX
136 }
137 print_mode;
138
139 /* Forward declarations for dumb compilers. */
140 static void print_vma PARAMS ((bfd_vma, print_mode));
141 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
142 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
143 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
144 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
145 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
146 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
147 static const char * get_dynamic_type PARAMS ((unsigned long));
148 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
149 static char * get_file_type PARAMS ((unsigned));
150 static char * get_machine_name PARAMS ((unsigned));
151 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
152 static char * get_machine_flags PARAMS ((unsigned, unsigned));
153 static const char * get_mips_segment_type PARAMS ((unsigned long));
154 static const char * get_parisc_segment_type PARAMS ((unsigned long));
155 static const char * get_segment_type PARAMS ((unsigned long));
156 static const char * get_mips_section_type_name PARAMS ((unsigned int));
157 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
158 static const char * get_section_type_name PARAMS ((unsigned int));
159 static const char * get_symbol_binding PARAMS ((unsigned int));
160 static const char * get_symbol_type PARAMS ((unsigned int));
161 static const char * get_symbol_visibility PARAMS ((unsigned int));
162 static const char * get_symbol_index_type PARAMS ((unsigned int));
163 static const char * get_dynamic_flags PARAMS ((bfd_vma));
164 static void usage PARAMS ((void));
165 static void parse_args PARAMS ((int, char **));
166 static int process_file_header PARAMS ((void));
167 static int process_program_headers PARAMS ((FILE *));
168 static int process_section_headers PARAMS ((FILE *));
169 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
170 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
171 static int process_dynamic_segment PARAMS ((FILE *));
172 static int process_symbol_table PARAMS ((FILE *));
173 static int process_section_contents PARAMS ((FILE *));
174 static void process_file PARAMS ((char *));
175 static int process_relocs PARAMS ((FILE *));
176 static int process_version_sections PARAMS ((FILE *));
177 static char * get_ver_flags PARAMS ((unsigned int));
178 static int get_32bit_section_headers PARAMS ((FILE *));
179 static int get_64bit_section_headers PARAMS ((FILE *));
180 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
181 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
182 static int get_file_header PARAMS ((FILE *));
183 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
184 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
185 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
186 static int get_32bit_dynamic_segment PARAMS ((FILE *));
187 static int get_64bit_dynamic_segment PARAMS ((FILE *));
188 #ifdef SUPPORT_DISASSEMBLY
189 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
190 #endif
191 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
192 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
193 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
194 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
195 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
196 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
199 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
200 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
201 static void reset_state_machine PARAMS ((int));
202 static char * get_TAG_name PARAMS ((unsigned long));
203 static char * get_AT_name PARAMS ((unsigned long));
204 static char * get_FORM_name PARAMS ((unsigned long));
205 static void free_abbrevs PARAMS ((void));
206 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
207 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
208 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
209 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
210 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
211 static void request_dump PARAMS ((unsigned int, char));
212 static const char * get_elf_class PARAMS ((unsigned char));
213 static const char * get_data_encoding PARAMS ((unsigned char));
214 static const char * get_osabi_name PARAMS ((unsigned char));
215 static int guess_is_rela PARAMS ((unsigned long));
216 static char * get_note_type PARAMS ((unsigned int));
217 static int process_note PARAMS ((Elf32_Internal_Note *));
218 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
219 static int process_corefile_note_segments PARAMS ((FILE *));
220 static int process_corefile_contents PARAMS ((FILE *));
221
222 typedef int Elf32_Word;
223
224 #ifndef TRUE
225 #define TRUE 1
226 #define FALSE 0
227 #endif
228 #define UNKNOWN -1
229
230 #define SECTION_NAME(X) (string_table + (X)->sh_name)
231
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
233
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
235
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extact all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
244 #ifdef BFD64
245 #define BYTE_GET8(field) byte_get (field, -8)
246 #else
247 #define BYTE_GET8(field) byte_get (field, 8)
248 #endif
249
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
251
252 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
253 if (fseek (file, offset, SEEK_SET)) \
254 { \
255 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
256 return 0; \
257 } \
258 \
259 var = (type) malloc (size); \
260 \
261 if (var == NULL) \
262 { \
263 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
264 return 0; \
265 } \
266 \
267 if (fread (var, size, 1, file) != 1) \
268 { \
269 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
270 free (var); \
271 var = NULL; \
272 return 0; \
273 }
274
275
276 #define GET_DATA(offset, var, reason) \
277 if (fseek (file, offset, SEEK_SET)) \
278 { \
279 error (_("Unable to seek to %x for %s\n"), offset, reason); \
280 return 0; \
281 } \
282 else if (fread (& var, sizeof (var), 1, file) != 1) \
283 { \
284 error (_("Unable to read data at %x for %s\n"), offset, reason); \
285 return 0; \
286 }
287
288 #define GET_ELF_SYMBOLS(file, offset, size) \
289 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
290 : get_64bit_elf_symbols (file, offset, size))
291
292
293 #ifdef ANSI_PROTOTYPES
294 static void
295 error (const char * message, ...)
296 {
297 va_list args;
298
299 fprintf (stderr, _("%s: Error: "), program_name);
300 va_start (args, message);
301 vfprintf (stderr, message, args);
302 va_end (args);
303 return;
304 }
305
306 static void
307 warn (const char * message, ...)
308 {
309 va_list args;
310
311 fprintf (stderr, _("%s: Warning: "), program_name);
312 va_start (args, message);
313 vfprintf (stderr, message, args);
314 va_end (args);
315 return;
316 }
317 #else
318 static void
319 error (va_alist)
320 va_dcl
321 {
322 char * message;
323 va_list args;
324
325 fprintf (stderr, _("%s: Error: "), program_name);
326 va_start (args);
327 message = va_arg (args, char *);
328 vfprintf (stderr, message, args);
329 va_end (args);
330 return;
331 }
332
333 static void
334 warn (va_alist)
335 va_dcl
336 {
337 char * message;
338 va_list args;
339
340 fprintf (stderr, _("%s: Warning: "), program_name);
341 va_start (args);
342 message = va_arg (args, char *);
343 vfprintf (stderr, message, args);
344 va_end (args);
345 return;
346 }
347 #endif
348
349 static bfd_vma
350 byte_get_little_endian (field, size)
351 unsigned char * field;
352 int size;
353 {
354 switch (size)
355 {
356 case 1:
357 return * field;
358
359 case 2:
360 return ((unsigned int) (field [0]))
361 | (((unsigned int) (field [1])) << 8);
362
363 case 8:
364 /* We want to extract data from an 8 byte wide field and
365 place it into a 4 byte wide field. Since this is a little
366 endian source we can juts use the 4 byte extraction code. */
367 /* Fall through. */
368 case 4:
369 return ((unsigned long) (field [0]))
370 | (((unsigned long) (field [1])) << 8)
371 | (((unsigned long) (field [2])) << 16)
372 | (((unsigned long) (field [3])) << 24);
373
374 #ifdef BFD64
375 case -8:
376 /* This is a special case, generated by the BYTE_GET8 macro.
377 It means that we are loading an 8 byte value from a field
378 in an external structure into an 8 byte value in a field
379 in an internal strcuture. */
380 return ((bfd_vma) (field [0]))
381 | (((bfd_vma) (field [1])) << 8)
382 | (((bfd_vma) (field [2])) << 16)
383 | (((bfd_vma) (field [3])) << 24)
384 | (((bfd_vma) (field [4])) << 32)
385 | (((bfd_vma) (field [5])) << 40)
386 | (((bfd_vma) (field [6])) << 48)
387 | (((bfd_vma) (field [7])) << 56);
388 #endif
389 default:
390 error (_("Unhandled data length: %d\n"), size);
391 abort ();
392 }
393 }
394
395 /* Print a VMA value. */
396 static void
397 print_vma (vma, mode)
398 bfd_vma vma;
399 print_mode mode;
400 {
401 #ifdef BFD64
402 if (is_32bit_elf)
403 #endif
404 {
405 switch (mode)
406 {
407 case FULL_HEX: printf ("0x"); /* drop through */
408 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
409 case PREFIX_HEX: printf ("0x"); /* drop through */
410 case HEX: printf ("%lx", (unsigned long) vma); break;
411 case DEC: printf ("%ld", (unsigned long) vma); break;
412 case DEC_5: printf ("%5ld", (long) vma); break;
413 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
414 }
415 }
416 #ifdef BFD64
417 else
418 {
419 switch (mode)
420 {
421 case FULL_HEX:
422 printf ("0x");
423 /* drop through */
424
425 case LONG_HEX:
426 printf_vma (vma);
427 break;
428
429 case PREFIX_HEX:
430 printf ("0x");
431 /* drop through */
432
433 case HEX:
434 #if BFD_HOST_64BIT_LONG
435 printf ("%lx", vma);
436 #else
437 if (_bfd_int64_high (vma))
438 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
439 else
440 printf ("%lx", _bfd_int64_low (vma));
441 #endif
442 break;
443
444 case DEC:
445 #if BFD_HOST_64BIT_LONG
446 printf ("%ld", vma);
447 #else
448 if (_bfd_int64_high (vma))
449 /* ugg */
450 printf ("++%ld", _bfd_int64_low (vma));
451 else
452 printf ("%ld", _bfd_int64_low (vma));
453 #endif
454 break;
455
456 case DEC_5:
457 #if BFD_HOST_64BIT_LONG
458 printf ("%5ld", vma);
459 #else
460 if (_bfd_int64_high (vma))
461 /* ugg */
462 printf ("++%ld", _bfd_int64_low (vma));
463 else
464 printf ("%5ld", _bfd_int64_low (vma));
465 #endif
466 break;
467
468 case UNSIGNED:
469 #if BFD_HOST_64BIT_LONG
470 printf ("%lu", vma);
471 #else
472 if (_bfd_int64_high (vma))
473 /* ugg */
474 printf ("++%lu", _bfd_int64_low (vma));
475 else
476 printf ("%lu", _bfd_int64_low (vma));
477 #endif
478 break;
479 }
480 }
481 #endif
482 }
483
484 static bfd_vma
485 byte_get_big_endian (field, size)
486 unsigned char * field;
487 int size;
488 {
489 switch (size)
490 {
491 case 1:
492 return * field;
493
494 case 2:
495 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
496
497 case 4:
498 return ((unsigned long) (field [3]))
499 | (((unsigned long) (field [2])) << 8)
500 | (((unsigned long) (field [1])) << 16)
501 | (((unsigned long) (field [0])) << 24);
502
503 case 8:
504 /* Although we are extracing data from an 8 byte wide field, we
505 are returning only 4 bytes of data. */
506 return ((unsigned long) (field [7]))
507 | (((unsigned long) (field [6])) << 8)
508 | (((unsigned long) (field [5])) << 16)
509 | (((unsigned long) (field [4])) << 24);
510
511 #ifdef BFD64
512 case -8:
513 /* This is a special case, generated by the BYTE_GET8 macro.
514 It means that we are loading an 8 byte value from a field
515 in an external structure into an 8 byte value in a field
516 in an internal strcuture. */
517 return ((bfd_vma) (field [7]))
518 | (((bfd_vma) (field [6])) << 8)
519 | (((bfd_vma) (field [5])) << 16)
520 | (((bfd_vma) (field [4])) << 24)
521 | (((bfd_vma) (field [3])) << 32)
522 | (((bfd_vma) (field [2])) << 40)
523 | (((bfd_vma) (field [1])) << 48)
524 | (((bfd_vma) (field [0])) << 56);
525 #endif
526
527 default:
528 error (_("Unhandled data length: %d\n"), size);
529 abort ();
530 }
531 }
532
533
534 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
535 static int
536 guess_is_rela (e_machine)
537 unsigned long e_machine;
538 {
539 switch (e_machine)
540 {
541 /* Targets that use REL relocations. */
542 case EM_ARM:
543 case EM_386:
544 case EM_486:
545 case EM_960:
546 case EM_CYGNUS_M32R:
547 case EM_CYGNUS_D10V:
548 case EM_MIPS:
549 case EM_MIPS_RS4_BE:
550 return FALSE;
551
552 /* Targets that use RELA relocations. */
553 case EM_68K:
554 case EM_SPARC32PLUS:
555 case EM_SPARCV9:
556 case EM_SPARC:
557 case EM_PPC:
558 case EM_CYGNUS_V850:
559 case EM_CYGNUS_D30V:
560 case EM_CYGNUS_MN10200:
561 case EM_CYGNUS_MN10300:
562 case EM_CYGNUS_FR30:
563 case EM_SH:
564 case EM_ALPHA:
565 case EM_MCORE:
566 case EM_IA_64:
567 return TRUE;
568
569 case EM_MMA:
570 case EM_PCP:
571 case EM_NCPU:
572 case EM_NDR1:
573 case EM_STARCORE:
574 case EM_ME16:
575 case EM_ST100:
576 case EM_TINYJ:
577 case EM_FX66:
578 case EM_ST9PLUS:
579 case EM_ST7:
580 case EM_68HC16:
581 case EM_68HC11:
582 case EM_68HC08:
583 case EM_68HC05:
584 case EM_SVX:
585 case EM_ST19:
586 case EM_VAX:
587 default:
588 warn (_("Don't know about relocations on this machine architecture\n"));
589 return FALSE;
590 }
591 }
592
593 /* Display the contents of the relocation data found at the specified offset. */
594 static int
595 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
596 FILE * file;
597 unsigned long rel_offset;
598 unsigned long rel_size;
599 Elf_Internal_Sym * symtab;
600 unsigned long nsyms;
601 char * strtab;
602 int is_rela;
603 {
604 unsigned int i;
605 Elf_Internal_Rel * rels;
606 Elf_Internal_Rela * relas;
607
608
609 if (is_rela == UNKNOWN)
610 is_rela = guess_is_rela (elf_header.e_machine);
611
612 if (is_rela)
613 {
614 if (is_32bit_elf)
615 {
616 Elf32_External_Rela * erelas;
617
618 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
619 Elf32_External_Rela *, "relocs");
620
621 rel_size = rel_size / sizeof (Elf32_External_Rela);
622
623 relas = (Elf_Internal_Rela *)
624 malloc (rel_size * sizeof (Elf_Internal_Rela));
625
626 if (relas == NULL)
627 {
628 error(_("out of memory parsing relocs"));
629 return 0;
630 }
631
632 for (i = 0; i < rel_size; i++)
633 {
634 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
635 relas[i].r_info = BYTE_GET (erelas[i].r_info);
636 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
637 }
638
639 free (erelas);
640
641 rels = (Elf_Internal_Rel *) relas;
642 }
643 else
644 {
645 Elf64_External_Rela * erelas;
646
647 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
648 Elf64_External_Rela *, "relocs");
649
650 rel_size = rel_size / sizeof (Elf64_External_Rela);
651
652 relas = (Elf_Internal_Rela *)
653 malloc (rel_size * sizeof (Elf_Internal_Rela));
654
655 if (relas == NULL)
656 {
657 error(_("out of memory parsing relocs"));
658 return 0;
659 }
660
661 for (i = 0; i < rel_size; i++)
662 {
663 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
664 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
665 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
666 }
667
668 free (erelas);
669
670 rels = (Elf_Internal_Rel *) relas;
671 }
672 }
673 else
674 {
675 if (is_32bit_elf)
676 {
677 Elf32_External_Rel * erels;
678
679 GET_DATA_ALLOC (rel_offset, rel_size, erels,
680 Elf32_External_Rel *, "relocs");
681
682 rel_size = rel_size / sizeof (Elf32_External_Rel);
683
684 rels = (Elf_Internal_Rel *)
685 malloc (rel_size * sizeof (Elf_Internal_Rel));
686
687 if (rels == NULL)
688 {
689 error(_("out of memory parsing relocs"));
690 return 0;
691 }
692
693 for (i = 0; i < rel_size; i++)
694 {
695 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
696 rels[i].r_info = BYTE_GET (erels[i].r_info);
697 }
698
699 free (erels);
700
701 relas = (Elf_Internal_Rela *) rels;
702 }
703 else
704 {
705 Elf64_External_Rel * erels;
706
707 GET_DATA_ALLOC (rel_offset, rel_size, erels,
708 Elf64_External_Rel *, "relocs");
709
710 rel_size = rel_size / sizeof (Elf64_External_Rel);
711
712 rels = (Elf_Internal_Rel *)
713 malloc (rel_size * sizeof (Elf_Internal_Rel));
714
715 if (rels == NULL)
716 {
717 error(_("out of memory parsing relocs"));
718 return 0;
719 }
720
721 for (i = 0; i < rel_size; i++)
722 {
723 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
724 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
725 }
726
727 free (erels);
728
729 relas = (Elf_Internal_Rela *) rels;
730 }
731 }
732
733 if (is_rela)
734 printf
735 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
736 else
737 printf
738 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
739
740 for (i = 0; i < rel_size; i++)
741 {
742 const char * rtype;
743 bfd_vma offset;
744 bfd_vma info;
745 bfd_vma symtab_index;
746 bfd_vma type;
747
748 if (is_rela)
749 {
750 offset = relas [i].r_offset;
751 info = relas [i].r_info;
752 }
753 else
754 {
755 offset = rels [i].r_offset;
756 info = rels [i].r_info;
757 }
758
759 if (is_32bit_elf)
760 {
761 type = ELF32_R_TYPE (info);
762 symtab_index = ELF32_R_SYM (info);
763 }
764 else
765 {
766 if (elf_header.e_machine == EM_SPARCV9)
767 type = ELF64_R_TYPE_ID (info);
768 else
769 type = ELF64_R_TYPE (info);
770 /* The #ifdef BFD64 below is to prevent a compile time warning.
771 We know that if we do not have a 64 bit data type that we
772 will never execute this code anyway. */
773 #ifdef BFD64
774 symtab_index = ELF64_R_SYM (info);
775 #endif
776 }
777
778 #ifdef _bfd_int64_low
779 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
780 #else
781 printf (" %8.8lx %5.5lx ", offset, info);
782 #endif
783
784 switch (elf_header.e_machine)
785 {
786 default:
787 rtype = NULL;
788 break;
789
790 case EM_CYGNUS_M32R:
791 rtype = elf_m32r_reloc_type (type);
792 break;
793
794 case EM_386:
795 case EM_486:
796 rtype = elf_i386_reloc_type (type);
797 break;
798
799 case EM_68K:
800 rtype = elf_m68k_reloc_type (type);
801 break;
802
803 case EM_960:
804 rtype = elf_i960_reloc_type (type);
805 break;
806
807 case EM_AVR:
808 rtype = elf_avr_reloc_type (type);
809 break;
810
811 case EM_OLD_SPARCV9:
812 case EM_SPARC32PLUS:
813 case EM_SPARCV9:
814 case EM_SPARC:
815 rtype = elf_sparc_reloc_type (type);
816 break;
817
818 case EM_CYGNUS_V850:
819 rtype = v850_reloc_type (type);
820 break;
821
822 case EM_CYGNUS_D10V:
823 rtype = elf_d10v_reloc_type (type);
824 break;
825
826 case EM_CYGNUS_D30V:
827 rtype = elf_d30v_reloc_type (type);
828 break;
829
830 case EM_SH:
831 rtype = elf_sh_reloc_type (type);
832 break;
833
834 case EM_CYGNUS_MN10300:
835 rtype = elf_mn10300_reloc_type (type);
836 break;
837
838 case EM_CYGNUS_MN10200:
839 rtype = elf_mn10200_reloc_type (type);
840 break;
841
842 case EM_CYGNUS_FR30:
843 rtype = elf_fr30_reloc_type (type);
844 break;
845
846 case EM_MCORE:
847 rtype = elf_mcore_reloc_type (type);
848 break;
849
850 case EM_PPC:
851 rtype = elf_ppc_reloc_type (type);
852 break;
853
854 case EM_MIPS:
855 case EM_MIPS_RS4_BE:
856 rtype = elf_mips_reloc_type (type);
857 break;
858
859 case EM_ALPHA:
860 rtype = elf_alpha_reloc_type (type);
861 break;
862
863 case EM_ARM:
864 rtype = elf_arm_reloc_type (type);
865 break;
866
867 case EM_CYGNUS_ARC:
868 rtype = elf_arc_reloc_type (type);
869 break;
870
871 case EM_PARISC:
872 rtype = elf_hppa_reloc_type (type);
873 break;
874
875 case EM_PJ:
876 rtype = elf_pj_reloc_type (type);
877 break;
878 case EM_IA_64:
879 rtype = elf_ia64_reloc_type (type);
880 break;
881 }
882
883 if (rtype == NULL)
884 #ifdef _bfd_int64_low
885 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
886 #else
887 printf (_("unrecognised: %-7lx"), type);
888 #endif
889 else
890 printf ("%-21.21s", rtype);
891
892 if (symtab_index)
893 {
894 if (symtab != NULL)
895 {
896 if (symtab_index >= nsyms)
897 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
898 else
899 {
900 Elf_Internal_Sym * psym;
901
902 psym = symtab + symtab_index;
903
904 printf (" ");
905 print_vma (psym->st_value, LONG_HEX);
906 printf (" ");
907
908 if (psym->st_name == 0)
909 printf ("%-25.25s",
910 SECTION_NAME (section_headers + psym->st_shndx));
911 else if (strtab == NULL)
912 printf (_("<string table index %3ld>"), psym->st_name);
913 else
914 printf ("%-25.25s", strtab + psym->st_name);
915
916 if (is_rela)
917 printf (" + %lx", (unsigned long) relas [i].r_addend);
918 }
919 }
920 }
921 else if (is_rela)
922 {
923 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
924 print_vma (relas[i].r_addend, LONG_HEX);
925 }
926
927 if (elf_header.e_machine == EM_SPARCV9
928 && !strcmp (rtype, "R_SPARC_OLO10"))
929 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
930
931 putchar ('\n');
932 }
933
934 free (relas);
935
936 return 1;
937 }
938
939 static const char *
940 get_mips_dynamic_type (type)
941 unsigned long type;
942 {
943 switch (type)
944 {
945 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
946 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
947 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
948 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
949 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
950 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
951 case DT_MIPS_MSYM: return "MIPS_MSYM";
952 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
953 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
954 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
955 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
956 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
957 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
958 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
959 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
960 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
961 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
962 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
963 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
964 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
965 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
966 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
967 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
968 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
969 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
970 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
971 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
972 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
973 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
974 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
975 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
976 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
977 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
978 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
979 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
980 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
981 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
982 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
983 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
984 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
985 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
986 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
987 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
988 default:
989 return NULL;
990 }
991 }
992
993 static const char *
994 get_sparc64_dynamic_type (type)
995 unsigned long type;
996 {
997 switch (type)
998 {
999 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1000 default:
1001 return NULL;
1002 }
1003 }
1004
1005 static const char *
1006 get_parisc_dynamic_type (type)
1007 unsigned long type;
1008 {
1009 switch (type)
1010 {
1011 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1012 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1013 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1014 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1015 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1016 case DT_HP_PREINIT: return "HP_PREINIT";
1017 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1018 case DT_HP_NEEDED: return "HP_NEEDED";
1019 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1020 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1021 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1022 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1023 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1024 default:
1025 return NULL;
1026 }
1027 }
1028
1029 static const char *
1030 get_dynamic_type (type)
1031 unsigned long type;
1032 {
1033 static char buff [32];
1034
1035 switch (type)
1036 {
1037 case DT_NULL: return "NULL";
1038 case DT_NEEDED: return "NEEDED";
1039 case DT_PLTRELSZ: return "PLTRELSZ";
1040 case DT_PLTGOT: return "PLTGOT";
1041 case DT_HASH: return "HASH";
1042 case DT_STRTAB: return "STRTAB";
1043 case DT_SYMTAB: return "SYMTAB";
1044 case DT_RELA: return "RELA";
1045 case DT_RELASZ: return "RELASZ";
1046 case DT_RELAENT: return "RELAENT";
1047 case DT_STRSZ: return "STRSZ";
1048 case DT_SYMENT: return "SYMENT";
1049 case DT_INIT: return "INIT";
1050 case DT_FINI: return "FINI";
1051 case DT_SONAME: return "SONAME";
1052 case DT_RPATH: return "RPATH";
1053 case DT_SYMBOLIC: return "SYMBOLIC";
1054 case DT_REL: return "REL";
1055 case DT_RELSZ: return "RELSZ";
1056 case DT_RELENT: return "RELENT";
1057 case DT_PLTREL: return "PLTREL";
1058 case DT_DEBUG: return "DEBUG";
1059 case DT_TEXTREL: return "TEXTREL";
1060 case DT_JMPREL: return "JMPREL";
1061 case DT_BIND_NOW: return "BIND_NOW";
1062 case DT_INIT_ARRAY: return "INIT_ARRAY";
1063 case DT_FINI_ARRAY: return "FINI_ARRAY";
1064 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1065 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1066 case DT_RUNPATH: return "RUNPATH";
1067 case DT_FLAGS: return "FLAGS";
1068
1069 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1070 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1071
1072 case DT_PLTPADSZ: return "PLTPADSZ";
1073 case DT_MOVEENT: return "MOVEENT";
1074 case DT_MOVESZ: return "MOVESZ";
1075 case DT_FEATURE_1: return "FEATURE_1";
1076 case DT_POSFLAG_1: return "POSFLAG_1";
1077 case DT_SYMINSZ: return "SYMINSZ";
1078 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1079
1080 case DT_ADDRRNGLO: return "ADDRRNGLO";
1081 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1082
1083 case DT_VERSYM: return "VERSYM";
1084
1085 case DT_RELACOUNT: return "RELACOUNT";
1086 case DT_RELCOUNT: return "RELCOUNT";
1087 case DT_FLAGS_1: return "FLAGS_1";
1088 case DT_VERDEF: return "VERDEF";
1089 case DT_VERDEFNUM: return "VERDEFNUM";
1090 case DT_VERNEED: return "VERNEED";
1091 case DT_VERNEEDNUM: return "VERNEEDNUM";
1092
1093 case DT_AUXILIARY: return "AUXILARY";
1094 case DT_USED: return "USED";
1095 case DT_FILTER: return "FILTER";
1096
1097 default:
1098 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1099 {
1100 const char * result;
1101
1102 switch (elf_header.e_machine)
1103 {
1104 case EM_MIPS:
1105 case EM_MIPS_RS4_BE:
1106 result = get_mips_dynamic_type (type);
1107 break;
1108 case EM_SPARCV9:
1109 result = get_sparc64_dynamic_type (type);
1110 break;
1111 default:
1112 result = NULL;
1113 break;
1114 }
1115
1116 if (result != NULL)
1117 return result;
1118
1119 sprintf (buff, _("Processor Specific: %lx"), type);
1120 }
1121 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1122 {
1123 const char * result;
1124
1125 switch (elf_header.e_machine)
1126 {
1127 case EM_PARISC:
1128 result = get_parisc_dynamic_type (type);
1129 break;
1130 default:
1131 result = NULL;
1132 break;
1133 }
1134
1135 if (result != NULL)
1136 return result;
1137
1138 sprintf (buff, _("Operating System specific: %lx"), type);
1139 }
1140 else
1141 sprintf (buff, _("<unknown>: %lx"), type);
1142
1143 return buff;
1144 }
1145 }
1146
1147 static char *
1148 get_file_type (e_type)
1149 unsigned e_type;
1150 {
1151 static char buff [32];
1152
1153 switch (e_type)
1154 {
1155 case ET_NONE: return _("NONE (None)");
1156 case ET_REL: return _("REL (Relocatable file)");
1157 case ET_EXEC: return _("EXEC (Executable file)");
1158 case ET_DYN: return _("DYN (Shared object file)");
1159 case ET_CORE: return _("CORE (Core file)");
1160
1161 default:
1162 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1163 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1164 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1165 sprintf (buff, _("OS Specific: (%x)"), e_type);
1166 else
1167 sprintf (buff, _("<unknown>: %x"), e_type);
1168 return buff;
1169 }
1170 }
1171
1172 static char *
1173 get_machine_name (e_machine)
1174 unsigned e_machine;
1175 {
1176 static char buff [64]; /* XXX */
1177
1178 switch (e_machine)
1179 {
1180 case EM_NONE: return _("None");
1181 case EM_M32: return "WE32100";
1182 case EM_SPARC: return "Sparc";
1183 case EM_386: return "Intel 80386";
1184 case EM_68K: return "MC68000";
1185 case EM_88K: return "MC88000";
1186 case EM_486: return "Intel 80486";
1187 case EM_860: return "Intel 80860";
1188 case EM_MIPS: return "MIPS R3000";
1189 case EM_S370: return "IBM System/370";
1190 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1191 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1192 case EM_PARISC: return "HPPA";
1193 case EM_PPC_OLD: return "Power PC (old)";
1194 case EM_SPARC32PLUS: return "Sparc v8+" ;
1195 case EM_960: return "Intel 90860";
1196 case EM_PPC: return "PowerPC";
1197 case EM_V800: return "NEC V800";
1198 case EM_FR20: return "Fujitsu FR20";
1199 case EM_RH32: return "TRW RH32";
1200 case EM_MCORE: return "MCORE";
1201 case EM_ARM: return "ARM";
1202 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1203 case EM_SH: return "Hitachi SH";
1204 case EM_SPARCV9: return "Sparc v9";
1205 case EM_TRICORE: return "Siemens Tricore";
1206 case EM_ARC: return "Argonaut RISC Core";
1207 case EM_H8_300: return "Hitachi H8/300";
1208 case EM_H8_300H: return "Hitachi H8/300H";
1209 case EM_H8S: return "Hitachi H8S";
1210 case EM_H8_500: return "Hitachi H8/500";
1211 case EM_IA_64: return "Intel IA-64";
1212 case EM_MIPS_X: return "Stanford MIPS-X";
1213 case EM_COLDFIRE: return "Motorola Coldfire";
1214 case EM_68HC12: return "Motorola M68HC12";
1215 case EM_ALPHA: return "Alpha";
1216 case EM_CYGNUS_D10V: return "d10v";
1217 case EM_CYGNUS_D30V: return "d30v";
1218 case EM_CYGNUS_ARC: return "Arc";
1219 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1220 case EM_CYGNUS_V850: return "NEC v850";
1221 case EM_CYGNUS_MN10300: return "mn10300";
1222 case EM_CYGNUS_MN10200: return "mn10200";
1223 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1224 case EM_PJ: return "picoJava";
1225 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1226 case EM_PCP: return "Siemens PCP";
1227 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1228 case EM_NDR1: return "Denso NDR1 microprocesspr";
1229 case EM_STARCORE: return "Motorola Star*Core processor";
1230 case EM_ME16: return "Toyota ME16 processor";
1231 case EM_ST100: return "STMicroelectronics ST100 processor";
1232 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1233 case EM_FX66: return "Siemens FX66 microcontroller";
1234 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1235 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1236 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1237 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1238 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1239 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1240 case EM_SVX: return "Silicon Graphics SVx";
1241 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1242 case EM_VAX: return "Digital VAX";
1243 case EM_AVR: return "AVR";
1244 default:
1245 sprintf (buff, _("<unknown>: %x"), e_machine);
1246 return buff;
1247 }
1248 }
1249
1250 static void
1251 decode_ARM_machine_flags (e_flags, buf)
1252 unsigned e_flags;
1253 char buf[];
1254 {
1255 unsigned eabi;
1256 int unknown = 0;
1257
1258 eabi = EF_ARM_EABI_VERSION (e_flags);
1259 e_flags &= ~ EF_ARM_EABIMASK;
1260
1261 /* Handle "generic" ARM flags. */
1262 if (e_flags & EF_ARM_RELEXEC)
1263 {
1264 strcat (buf, ", relocatable executable");
1265 e_flags &= ~ EF_ARM_RELEXEC;
1266 }
1267
1268 if (e_flags & EF_ARM_HASENTRY)
1269 {
1270 strcat (buf, ", has entry point");
1271 e_flags &= ~ EF_ARM_HASENTRY;
1272 }
1273
1274 /* Now handle EABI specific flags. */
1275 switch (eabi)
1276 {
1277 default:
1278 strcat (buf, ", <unknown EABI>");
1279 if (e_flags)
1280 unknown = 1;
1281 break;
1282
1283 case EF_ARM_EABI_VER1:
1284 while (e_flags)
1285 {
1286 unsigned flag;
1287
1288 /* Process flags one bit at a time. */
1289 flag = e_flags & - e_flags;
1290 e_flags &= ~ flag;
1291
1292 switch (flag)
1293 {
1294 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1295 strcat (buf, ", sorted symbol tables");
1296 break;
1297
1298 default:
1299 unknown = 1;
1300 break;
1301 }
1302 }
1303 break;
1304
1305 case EF_ARM_EABI_UNKNOWN:
1306 while (e_flags)
1307 {
1308 unsigned flag;
1309
1310 /* Process flags one bit at a time. */
1311 flag = e_flags & - e_flags;
1312 e_flags &= ~ flag;
1313
1314 switch (flag)
1315 {
1316 case EF_INTERWORK:
1317 strcat (buf, ", interworking enabled");
1318 break;
1319
1320 case EF_APCS_26:
1321 strcat (buf, ", uses APCS/26");
1322 break;
1323
1324 case EF_APCS_FLOAT:
1325 strcat (buf, ", uses APCS/float");
1326 break;
1327
1328 case EF_PIC:
1329 strcat (buf, ", position independent");
1330 break;
1331
1332 case EF_ALIGN8:
1333 strcat (buf, ", 8 bit structure alignment");
1334 break;
1335
1336 case EF_NEW_ABI:
1337 strcat (buf, ", uses new ABI");
1338 break;
1339
1340 case EF_OLD_ABI:
1341 strcat (buf, ", uses old ABI");
1342 break;
1343
1344 case EF_SOFT_FLOAT:
1345 strcat (buf, ", software FP");
1346 break;
1347
1348 default:
1349 unknown = 1;
1350 break;
1351 }
1352 }
1353 }
1354
1355 if (unknown)
1356 strcat (buf,", <unknown>");
1357 }
1358
1359 static char *
1360 get_machine_flags (e_flags, e_machine)
1361 unsigned e_flags;
1362 unsigned e_machine;
1363 {
1364 static char buf [1024];
1365
1366 buf[0] = '\0';
1367
1368 if (e_flags)
1369 {
1370 switch (e_machine)
1371 {
1372 default:
1373 break;
1374
1375 case EM_ARM:
1376 decode_ARM_machine_flags (e_flags, buf);
1377 break;
1378
1379 case EM_68K:
1380 if (e_flags & EF_CPU32)
1381 strcat (buf, ", cpu32");
1382 break;
1383
1384 case EM_PPC:
1385 if (e_flags & EF_PPC_EMB)
1386 strcat (buf, ", emb");
1387
1388 if (e_flags & EF_PPC_RELOCATABLE)
1389 strcat (buf, ", relocatable");
1390
1391 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1392 strcat (buf, ", relocatable-lib");
1393 break;
1394
1395 case EM_CYGNUS_V850:
1396 switch (e_flags & EF_V850_ARCH)
1397 {
1398 case E_V850E_ARCH:
1399 strcat (buf, ", v850e");
1400 break;
1401 case E_V850EA_ARCH:
1402 strcat (buf, ", v850ea");
1403 break;
1404 case E_V850_ARCH:
1405 strcat (buf, ", v850");
1406 break;
1407 default:
1408 strcat (buf, ", unknown v850 architecture variant");
1409 break;
1410 }
1411 break;
1412
1413 case EM_CYGNUS_M32R:
1414 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1415 strcat (buf, ", m32r");
1416
1417 break;
1418
1419 case EM_MIPS:
1420 case EM_MIPS_RS4_BE:
1421 if (e_flags & EF_MIPS_NOREORDER)
1422 strcat (buf, ", noreorder");
1423
1424 if (e_flags & EF_MIPS_PIC)
1425 strcat (buf, ", pic");
1426
1427 if (e_flags & EF_MIPS_CPIC)
1428 strcat (buf, ", cpic");
1429
1430 if (e_flags & EF_MIPS_ABI2)
1431 strcat (buf, ", abi2");
1432
1433 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1434 strcat (buf, ", mips1");
1435
1436 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1437 strcat (buf, ", mips2");
1438
1439 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1440 strcat (buf, ", mips3");
1441
1442 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1443 strcat (buf, ", mips4");
1444 break;
1445
1446 case EM_SPARCV9:
1447 if (e_flags & EF_SPARC_32PLUS)
1448 strcat (buf, ", v8+");
1449
1450 if (e_flags & EF_SPARC_SUN_US1)
1451 strcat (buf, ", ultrasparcI");
1452
1453 if (e_flags & EF_SPARC_SUN_US3)
1454 strcat (buf, ", ultrasparcIII");
1455
1456 if (e_flags & EF_SPARC_HAL_R1)
1457 strcat (buf, ", halr1");
1458
1459 if (e_flags & EF_SPARC_LEDATA)
1460 strcat (buf, ", ledata");
1461
1462 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1463 strcat (buf, ", tso");
1464
1465 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1466 strcat (buf, ", pso");
1467
1468 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1469 strcat (buf, ", rmo");
1470 break;
1471
1472 case EM_PARISC:
1473 switch (e_flags & EF_PARISC_ARCH)
1474 {
1475 case EFA_PARISC_1_0:
1476 strcpy (buf, ", PA-RISC 1.0");
1477 break;
1478 case EFA_PARISC_1_1:
1479 strcpy (buf, ", PA-RISC 1.1");
1480 break;
1481 case EFA_PARISC_2_0:
1482 strcpy (buf, ", PA-RISC 2.0");
1483 break;
1484 default:
1485 break;
1486 }
1487 if (e_flags & EF_PARISC_TRAPNIL)
1488 strcat (buf, ", trapnil");
1489 if (e_flags & EF_PARISC_EXT)
1490 strcat (buf, ", ext");
1491 if (e_flags & EF_PARISC_LSB)
1492 strcat (buf, ", lsb");
1493 if (e_flags & EF_PARISC_WIDE)
1494 strcat (buf, ", wide");
1495 if (e_flags & EF_PARISC_NO_KABP)
1496 strcat (buf, ", no kabp");
1497 if (e_flags & EF_PARISC_LAZYSWAP)
1498 strcat (buf, ", lazyswap");
1499 break;
1500
1501 case EM_PJ:
1502 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1503 strcat (buf, ", new calling convention");
1504
1505 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1506 strcat (buf, ", gnu calling convention");
1507 break;
1508 }
1509 }
1510
1511 return buf;
1512 }
1513
1514 static const char *
1515 get_mips_segment_type (type)
1516 unsigned long type;
1517 {
1518 switch (type)
1519 {
1520 case PT_MIPS_REGINFO:
1521 return "REGINFO";
1522 case PT_MIPS_RTPROC:
1523 return "RTPROC";
1524 case PT_MIPS_OPTIONS:
1525 return "OPTIONS";
1526 default:
1527 break;
1528 }
1529
1530 return NULL;
1531 }
1532
1533 static const char *
1534 get_parisc_segment_type (type)
1535 unsigned long type;
1536 {
1537 switch (type)
1538 {
1539 case PT_HP_TLS: return "HP_TLS";
1540 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1541 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1542 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1543 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1544 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1545 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1546 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1547 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1548 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1549 case PT_HP_PARALLEL: return "HP_PARALLEL";
1550 case PT_HP_FASTBIND: return "HP_FASTBIND";
1551 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1552 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1553 default:
1554 break;
1555 }
1556
1557 return NULL;
1558 }
1559
1560 static const char *
1561 get_segment_type (p_type)
1562 unsigned long p_type;
1563 {
1564 static char buff [32];
1565
1566 switch (p_type)
1567 {
1568 case PT_NULL: return "NULL";
1569 case PT_LOAD: return "LOAD";
1570 case PT_DYNAMIC: return "DYNAMIC";
1571 case PT_INTERP: return "INTERP";
1572 case PT_NOTE: return "NOTE";
1573 case PT_SHLIB: return "SHLIB";
1574 case PT_PHDR: return "PHDR";
1575
1576 default:
1577 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1578 {
1579 const char * result;
1580
1581 switch (elf_header.e_machine)
1582 {
1583 case EM_MIPS:
1584 case EM_MIPS_RS4_BE:
1585 result = get_mips_segment_type (p_type);
1586 break;
1587 case EM_PARISC:
1588 result = get_parisc_segment_type (p_type);
1589 break;
1590 default:
1591 result = NULL;
1592 break;
1593 }
1594
1595 if (result != NULL)
1596 return result;
1597
1598 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1599 }
1600 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1601 {
1602 const char * result;
1603
1604 switch (elf_header.e_machine)
1605 {
1606 case EM_PARISC:
1607 result = get_parisc_segment_type (p_type);
1608 break;
1609 default:
1610 result = NULL;
1611 break;
1612 }
1613
1614 if (result != NULL)
1615 return result;
1616
1617 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1618 }
1619 else
1620 sprintf (buff, _("<unknown>: %lx"), p_type);
1621
1622 return buff;
1623 }
1624 }
1625
1626 static const char *
1627 get_mips_section_type_name (sh_type)
1628 unsigned int sh_type;
1629 {
1630 switch (sh_type)
1631 {
1632 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1633 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1634 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1635 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1636 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1637 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1638 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1639 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1640 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1641 case SHT_MIPS_RELD: return "MIPS_RELD";
1642 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1643 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1644 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1645 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1646 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1647 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1648 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1649 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1650 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1651 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1652 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1653 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1654 case SHT_MIPS_LINE: return "MIPS_LINE";
1655 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1656 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1657 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1658 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1659 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1660 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1661 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1662 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1663 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1664 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1665 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1666 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1667 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1668 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1669 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1670 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1671 default:
1672 break;
1673 }
1674 return NULL;
1675 }
1676
1677 static const char *
1678 get_parisc_section_type_name (sh_type)
1679 unsigned int sh_type;
1680 {
1681 switch (sh_type)
1682 {
1683 case SHT_PARISC_EXT: return "PARISC_EXT";
1684 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1685 case SHT_PARISC_DOC: return "PARISC_DOC";
1686 default:
1687 break;
1688 }
1689 return NULL;
1690 }
1691
1692 static const char *
1693 get_section_type_name (sh_type)
1694 unsigned int sh_type;
1695 {
1696 static char buff [32];
1697
1698 switch (sh_type)
1699 {
1700 case SHT_NULL: return "NULL";
1701 case SHT_PROGBITS: return "PROGBITS";
1702 case SHT_SYMTAB: return "SYMTAB";
1703 case SHT_STRTAB: return "STRTAB";
1704 case SHT_RELA: return "RELA";
1705 case SHT_HASH: return "HASH";
1706 case SHT_DYNAMIC: return "DYNAMIC";
1707 case SHT_NOTE: return "NOTE";
1708 case SHT_NOBITS: return "NOBITS";
1709 case SHT_REL: return "REL";
1710 case SHT_SHLIB: return "SHLIB";
1711 case SHT_DYNSYM: return "DYNSYM";
1712 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1713 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1714 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1715 case SHT_GNU_verdef: return "VERDEF";
1716 case SHT_GNU_verneed: return "VERNEED";
1717 case SHT_GNU_versym: return "VERSYM";
1718 case 0x6ffffff0: return "VERSYM";
1719 case 0x6ffffffc: return "VERDEF";
1720 case 0x7ffffffd: return "AUXILIARY";
1721 case 0x7fffffff: return "FILTER";
1722
1723 default:
1724 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1725 {
1726 const char * result;
1727
1728 switch (elf_header.e_machine)
1729 {
1730 case EM_MIPS:
1731 case EM_MIPS_RS4_BE:
1732 result = get_mips_section_type_name (sh_type);
1733 break;
1734 case EM_PARISC:
1735 result = get_parisc_section_type_name (sh_type);
1736 break;
1737 default:
1738 result = NULL;
1739 break;
1740 }
1741
1742 if (result != NULL)
1743 return result;
1744
1745 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1746 }
1747 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1748 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1749 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1750 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1751 else
1752 sprintf (buff, _("<unknown>: %x"), sh_type);
1753
1754 return buff;
1755 }
1756 }
1757
1758 struct option options [] =
1759 {
1760 {"all", no_argument, 0, 'a'},
1761 {"file-header", no_argument, 0, 'h'},
1762 {"program-headers", no_argument, 0, 'l'},
1763 {"headers", no_argument, 0, 'e'},
1764 {"histogram", no_argument, 0, 'I'},
1765 {"segments", no_argument, 0, 'l'},
1766 {"sections", no_argument, 0, 'S'},
1767 {"section-headers", no_argument, 0, 'S'},
1768 {"symbols", no_argument, 0, 's'},
1769 {"syms", no_argument, 0, 's'},
1770 {"relocs", no_argument, 0, 'r'},
1771 {"notes", no_argument, 0, 'n'},
1772 {"dynamic", no_argument, 0, 'd'},
1773 {"arch-specific", no_argument, 0, 'A'},
1774 {"version-info", no_argument, 0, 'V'},
1775 {"use-dynamic", no_argument, 0, 'D'},
1776 {"hex-dump", required_argument, 0, 'x'},
1777 {"debug-dump", optional_argument, 0, 'w'},
1778 #ifdef SUPPORT_DISASSEMBLY
1779 {"instruction-dump", required_argument, 0, 'i'},
1780 #endif
1781
1782 {"version", no_argument, 0, 'v'},
1783 {"help", no_argument, 0, 'H'},
1784 {0, no_argument, 0, 0}
1785 };
1786
1787 static void
1788 usage ()
1789 {
1790 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1791 fprintf (stdout, _(" Options are:\n"));
1792 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1793 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1794 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1795 fprintf (stdout, _(" Display the program headers\n"));
1796 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1797 fprintf (stdout, _(" Display the sections' header\n"));
1798 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1799 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1800 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1801 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1802 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1803 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1804 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1805 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1806 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1807 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1808 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1809 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1810 #ifdef SUPPORT_DISASSEMBLY
1811 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1812 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1813 #endif
1814 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1815 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1816 fprintf (stdout, _(" -H or --help Display this information\n"));
1817 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1818
1819 exit (0);
1820 }
1821
1822 static void
1823 request_dump (section, type)
1824 unsigned int section;
1825 char type;
1826 {
1827 if (section >= num_dump_sects)
1828 {
1829 char * new_dump_sects;
1830
1831 new_dump_sects = (char *) calloc (section + 1, 1);
1832
1833 if (new_dump_sects == NULL)
1834 error (_("Out of memory allocating dump request table."));
1835 else
1836 {
1837 /* Copy current flag settings. */
1838 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1839
1840 free (dump_sects);
1841
1842 dump_sects = new_dump_sects;
1843 num_dump_sects = section + 1;
1844 }
1845 }
1846
1847 if (dump_sects)
1848 dump_sects [section] |= type;
1849
1850 return;
1851 }
1852
1853 static void
1854 parse_args (argc, argv)
1855 int argc;
1856 char ** argv;
1857 {
1858 int c;
1859
1860 if (argc < 2)
1861 usage ();
1862
1863 while ((c = getopt_long
1864 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1865 {
1866 char * cp;
1867 int section;
1868
1869 switch (c)
1870 {
1871 case 0:
1872 /* Long options. */
1873 break;
1874 case 'H':
1875 usage ();
1876 break;
1877
1878 case 'a':
1879 do_syms ++;
1880 do_reloc ++;
1881 do_dynamic ++;
1882 do_header ++;
1883 do_sections ++;
1884 do_segments ++;
1885 do_version ++;
1886 do_histogram ++;
1887 do_arch ++;
1888 do_notes ++;
1889 break;
1890 case 'e':
1891 do_header ++;
1892 do_sections ++;
1893 do_segments ++;
1894 break;
1895 case 'A':
1896 do_arch ++;
1897 break;
1898 case 'D':
1899 do_using_dynamic ++;
1900 break;
1901 case 'r':
1902 do_reloc ++;
1903 break;
1904 case 'h':
1905 do_header ++;
1906 break;
1907 case 'l':
1908 do_segments ++;
1909 break;
1910 case 's':
1911 do_syms ++;
1912 break;
1913 case 'S':
1914 do_sections ++;
1915 break;
1916 case 'd':
1917 do_dynamic ++;
1918 break;
1919 case 'I':
1920 do_histogram ++;
1921 break;
1922 case 'n':
1923 do_notes ++;
1924 break;
1925 case 'x':
1926 do_dump ++;
1927 section = strtoul (optarg, & cp, 0);
1928 if (! * cp && section >= 0)
1929 {
1930 request_dump (section, HEX_DUMP);
1931 break;
1932 }
1933 goto oops;
1934 case 'w':
1935 do_dump ++;
1936 if (optarg == 0)
1937 do_debugging = 1;
1938 else
1939 {
1940 do_debugging = 0;
1941 switch (optarg[0])
1942 {
1943 case 'i':
1944 case 'I':
1945 do_debug_info = 1;
1946 break;
1947
1948 case 'a':
1949 case 'A':
1950 do_debug_abbrevs = 1;
1951 break;
1952
1953 case 'l':
1954 case 'L':
1955 do_debug_lines = 1;
1956 break;
1957
1958 case 'p':
1959 case 'P':
1960 do_debug_pubnames = 1;
1961 break;
1962
1963 case 'r':
1964 case 'R':
1965 do_debug_aranges = 1;
1966 break;
1967
1968 default:
1969 warn (_("Unrecognised debug option '%s'\n"), optarg);
1970 break;
1971 }
1972 }
1973 break;
1974 #ifdef SUPPORT_DISASSEMBLY
1975 case 'i':
1976 do_dump ++;
1977 section = strtoul (optarg, & cp, 0);
1978 if (! * cp && section >= 0)
1979 {
1980 request_dump (section, DISASS_DUMP);
1981 break;
1982 }
1983 goto oops;
1984 #endif
1985 case 'v':
1986 print_version (program_name);
1987 break;
1988 case 'V':
1989 do_version ++;
1990 break;
1991 default:
1992 oops:
1993 /* xgettext:c-format */
1994 error (_("Invalid option '-%c'\n"), c);
1995 /* Drop through. */
1996 case '?':
1997 usage ();
1998 }
1999 }
2000
2001 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
2002 && !do_segments && !do_header && !do_dump && !do_version
2003 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2004 usage ();
2005 else if (argc < 3)
2006 {
2007 warn (_("Nothing to do.\n"));
2008 usage();
2009 }
2010 }
2011
2012 static const char *
2013 get_elf_class (elf_class)
2014 unsigned char elf_class;
2015 {
2016 static char buff [32];
2017
2018 switch (elf_class)
2019 {
2020 case ELFCLASSNONE: return _("none");
2021 case ELFCLASS32: return _("ELF32");
2022 case ELFCLASS64: return _("ELF64");
2023 default:
2024 sprintf (buff, _("<unknown: %x>"), elf_class);
2025 return buff;
2026 }
2027 }
2028
2029 static const char *
2030 get_data_encoding (encoding)
2031 unsigned char encoding;
2032 {
2033 static char buff [32];
2034
2035 switch (encoding)
2036 {
2037 case ELFDATANONE: return _("none");
2038 case ELFDATA2LSB: return _("2's complement, little endian");
2039 case ELFDATA2MSB: return _("2's complement, big endian");
2040 default:
2041 sprintf (buff, _("<unknown: %x>"), encoding);
2042 return buff;
2043 }
2044 }
2045
2046 static const char *
2047 get_osabi_name (osabi)
2048 unsigned char osabi;
2049 {
2050 static char buff [32];
2051
2052 switch (osabi)
2053 {
2054 case ELFOSABI_SYSV: return _("UNIX - System V");
2055 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2056 case ELFOSABI_LINUX: return _("UNIX - Linux");
2057 case ELFOSABI_STANDALONE: return _("Standalone App");
2058 case ELFOSABI_ARM: return _("ARM");
2059 default:
2060 sprintf (buff, _("<unknown: %x>"), osabi);
2061 return buff;
2062 }
2063 }
2064
2065 /* Decode the data held in 'elf_header'. */
2066 static int
2067 process_file_header ()
2068 {
2069 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2070 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2071 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2072 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2073 {
2074 error
2075 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2076 return 0;
2077 }
2078
2079 if (do_header)
2080 {
2081 int i;
2082
2083 printf (_("ELF Header:\n"));
2084 printf (_(" Magic: "));
2085 for (i = 0; i < EI_NIDENT; i ++)
2086 printf ("%2.2x ", elf_header.e_ident [i]);
2087 printf ("\n");
2088 printf (_(" Class: %s\n"),
2089 get_elf_class (elf_header.e_ident [EI_CLASS]));
2090 printf (_(" Data: %s\n"),
2091 get_data_encoding (elf_header.e_ident [EI_DATA]));
2092 printf (_(" Version: %d %s\n"),
2093 elf_header.e_ident [EI_VERSION],
2094 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2095 ? "(current)"
2096 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2097 ? "<unknown: %lx>"
2098 : "")));
2099 printf (_(" OS/ABI: %s\n"),
2100 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2101 printf (_(" ABI Version: %d\n"),
2102 elf_header.e_ident [EI_ABIVERSION]);
2103 printf (_(" Type: %s\n"),
2104 get_file_type (elf_header.e_type));
2105 printf (_(" Machine: %s\n"),
2106 get_machine_name (elf_header.e_machine));
2107 printf (_(" Version: 0x%lx\n"),
2108 (unsigned long) elf_header.e_version);
2109
2110 printf (_(" Entry point address: "));
2111 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2112 printf (_("\n Start of program headers: "));
2113 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2114 printf (_(" (bytes into file)\n Start of section headers: "));
2115 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2116 printf (_(" (bytes into file)\n"));
2117
2118 printf (_(" Flags: 0x%lx%s\n"),
2119 (unsigned long) elf_header.e_flags,
2120 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2121 printf (_(" Size of this header: %ld (bytes)\n"),
2122 (long) elf_header.e_ehsize);
2123 printf (_(" Size of program headers: %ld (bytes)\n"),
2124 (long) elf_header.e_phentsize);
2125 printf (_(" Number of program headers: %ld\n"),
2126 (long) elf_header.e_phnum);
2127 printf (_(" Size of section headers: %ld (bytes)\n"),
2128 (long) elf_header.e_shentsize);
2129 printf (_(" Number of section headers: %ld\n"),
2130 (long) elf_header.e_shnum);
2131 printf (_(" Section header string table index: %ld\n"),
2132 (long) elf_header.e_shstrndx);
2133 }
2134
2135 return 1;
2136 }
2137
2138
2139 static int
2140 get_32bit_program_headers (file, program_headers)
2141 FILE * file;
2142 Elf_Internal_Phdr * program_headers;
2143 {
2144 Elf32_External_Phdr * phdrs;
2145 Elf32_External_Phdr * external;
2146 Elf32_Internal_Phdr * internal;
2147 unsigned int i;
2148
2149 GET_DATA_ALLOC (elf_header.e_phoff,
2150 elf_header.e_phentsize * elf_header.e_phnum,
2151 phdrs, Elf32_External_Phdr *, "program headers");
2152
2153 for (i = 0, internal = program_headers, external = phdrs;
2154 i < elf_header.e_phnum;
2155 i ++, internal ++, external ++)
2156 {
2157 internal->p_type = BYTE_GET (external->p_type);
2158 internal->p_offset = BYTE_GET (external->p_offset);
2159 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2160 internal->p_paddr = BYTE_GET (external->p_paddr);
2161 internal->p_filesz = BYTE_GET (external->p_filesz);
2162 internal->p_memsz = BYTE_GET (external->p_memsz);
2163 internal->p_flags = BYTE_GET (external->p_flags);
2164 internal->p_align = BYTE_GET (external->p_align);
2165 }
2166
2167 free (phdrs);
2168
2169 return 1;
2170 }
2171
2172 static int
2173 get_64bit_program_headers (file, program_headers)
2174 FILE * file;
2175 Elf_Internal_Phdr * program_headers;
2176 {
2177 Elf64_External_Phdr * phdrs;
2178 Elf64_External_Phdr * external;
2179 Elf64_Internal_Phdr * internal;
2180 unsigned int i;
2181
2182 GET_DATA_ALLOC (elf_header.e_phoff,
2183 elf_header.e_phentsize * elf_header.e_phnum,
2184 phdrs, Elf64_External_Phdr *, "program headers");
2185
2186 for (i = 0, internal = program_headers, external = phdrs;
2187 i < elf_header.e_phnum;
2188 i ++, internal ++, external ++)
2189 {
2190 internal->p_type = BYTE_GET (external->p_type);
2191 internal->p_flags = BYTE_GET (external->p_flags);
2192 internal->p_offset = BYTE_GET8 (external->p_offset);
2193 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2194 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2195 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2196 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2197 internal->p_align = BYTE_GET8 (external->p_align);
2198 }
2199
2200 free (phdrs);
2201
2202 return 1;
2203 }
2204
2205 static int
2206 process_program_headers (file)
2207 FILE * file;
2208 {
2209 Elf_Internal_Phdr * program_headers;
2210 Elf_Internal_Phdr * segment;
2211 unsigned int i;
2212
2213 if (elf_header.e_phnum == 0)
2214 {
2215 if (do_segments)
2216 printf (_("\nThere are no program headers in this file.\n"));
2217 return 1;
2218 }
2219
2220 if (do_segments && !do_header)
2221 {
2222 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2223 printf (_("Entry point "));
2224 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2225 printf (_("\nThere are %d program headers, starting at offset "),
2226 elf_header.e_phnum);
2227 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2228 printf ("\n");
2229 }
2230
2231 program_headers = (Elf_Internal_Phdr *) malloc
2232 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2233
2234 if (program_headers == NULL)
2235 {
2236 error (_("Out of memory\n"));
2237 return 0;
2238 }
2239
2240 if (is_32bit_elf)
2241 i = get_32bit_program_headers (file, program_headers);
2242 else
2243 i = get_64bit_program_headers (file, program_headers);
2244
2245 if (i == 0)
2246 {
2247 free (program_headers);
2248 return 0;
2249 }
2250
2251 if (do_segments)
2252 {
2253 printf
2254 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2255
2256 if (is_32bit_elf)
2257 printf
2258 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2259 else
2260 {
2261 printf
2262 (_(" Type Offset VirtAddr PhysAddr\n"));
2263 printf
2264 (_(" FileSiz MemSiz Flags Align\n"));
2265 }
2266 }
2267
2268 loadaddr = -1;
2269 dynamic_addr = 0;
2270 dynamic_size = 0;
2271
2272 for (i = 0, segment = program_headers;
2273 i < elf_header.e_phnum;
2274 i ++, segment ++)
2275 {
2276 if (do_segments)
2277 {
2278 printf (" %-14.14s ", get_segment_type (segment->p_type));
2279
2280 if (is_32bit_elf)
2281 {
2282 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2283 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2284 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2285 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2286 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2287 printf ("%c%c%c ",
2288 (segment->p_flags & PF_R ? 'R' : ' '),
2289 (segment->p_flags & PF_W ? 'W' : ' '),
2290 (segment->p_flags & PF_X ? 'E' : ' '));
2291 printf ("%#lx", (unsigned long) segment->p_align);
2292 }
2293 else
2294 {
2295 print_vma (segment->p_offset, FULL_HEX);
2296 putchar (' ');
2297 print_vma (segment->p_vaddr, FULL_HEX);
2298 putchar (' ');
2299 print_vma (segment->p_paddr, FULL_HEX);
2300 printf ("\n ");
2301 print_vma (segment->p_filesz, FULL_HEX);
2302 putchar (' ');
2303 print_vma (segment->p_memsz, FULL_HEX);
2304 printf (" %c%c%c ",
2305 (segment->p_flags & PF_R ? 'R' : ' '),
2306 (segment->p_flags & PF_W ? 'W' : ' '),
2307 (segment->p_flags & PF_X ? 'E' : ' '));
2308 print_vma (segment->p_align, HEX);
2309 }
2310 }
2311
2312 switch (segment->p_type)
2313 {
2314 case PT_LOAD:
2315 if (loadaddr == -1)
2316 loadaddr = (segment->p_vaddr & 0xfffff000)
2317 - (segment->p_offset & 0xfffff000);
2318 break;
2319
2320 case PT_DYNAMIC:
2321 if (dynamic_addr)
2322 error (_("more than one dynamic segment\n"));
2323
2324 dynamic_addr = segment->p_offset;
2325 dynamic_size = segment->p_filesz;
2326 break;
2327
2328 case PT_INTERP:
2329 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2330 error (_("Unable to find program interpreter name\n"));
2331 else
2332 {
2333 program_interpreter[0] = 0;
2334 fscanf (file, "%63s", program_interpreter);
2335
2336 if (do_segments)
2337 printf (_("\n [Requesting program interpreter: %s]"),
2338 program_interpreter);
2339 }
2340 break;
2341 }
2342
2343 if (do_segments)
2344 putc ('\n', stdout);
2345 }
2346
2347 if (loadaddr == -1)
2348 {
2349 /* Very strange. */
2350 loadaddr = 0;
2351 }
2352
2353 if (do_segments && section_headers != NULL)
2354 {
2355 printf (_("\n Section to Segment mapping:\n"));
2356 printf (_(" Segment Sections...\n"));
2357
2358 assert (string_table != NULL);
2359
2360 for (i = 0; i < elf_header.e_phnum; i++)
2361 {
2362 int j;
2363 Elf_Internal_Shdr * section;
2364
2365 segment = program_headers + i;
2366 section = section_headers;
2367
2368 printf (" %2.2d ", i);
2369
2370 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2371 {
2372 if (section->sh_size > 0
2373 /* Compare allocated sections by VMA, unallocated
2374 sections by file offset. */
2375 && (section->sh_flags & SHF_ALLOC
2376 ? (section->sh_addr >= segment->p_vaddr
2377 && section->sh_addr + section->sh_size
2378 <= segment->p_vaddr + segment->p_memsz)
2379 : ((bfd_vma) section->sh_offset >= segment->p_offset
2380 && (section->sh_offset + section->sh_size
2381 <= segment->p_offset + segment->p_filesz))))
2382 printf ("%s ", SECTION_NAME (section));
2383 }
2384
2385 putc ('\n',stdout);
2386 }
2387 }
2388
2389 free (program_headers);
2390
2391 return 1;
2392 }
2393
2394
2395 static int
2396 get_32bit_section_headers (file)
2397 FILE * file;
2398 {
2399 Elf32_External_Shdr * shdrs;
2400 Elf32_Internal_Shdr * internal;
2401 unsigned int i;
2402
2403 GET_DATA_ALLOC (elf_header.e_shoff,
2404 elf_header.e_shentsize * elf_header.e_shnum,
2405 shdrs, Elf32_External_Shdr *, "section headers");
2406
2407 section_headers = (Elf_Internal_Shdr *) malloc
2408 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2409
2410 if (section_headers == NULL)
2411 {
2412 error (_("Out of memory\n"));
2413 return 0;
2414 }
2415
2416 for (i = 0, internal = section_headers;
2417 i < elf_header.e_shnum;
2418 i ++, internal ++)
2419 {
2420 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2421 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2422 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2423 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2424 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2425 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2426 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2427 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2428 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2429 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2430 }
2431
2432 free (shdrs);
2433
2434 return 1;
2435 }
2436
2437 static int
2438 get_64bit_section_headers (file)
2439 FILE * file;
2440 {
2441 Elf64_External_Shdr * shdrs;
2442 Elf64_Internal_Shdr * internal;
2443 unsigned int i;
2444
2445 GET_DATA_ALLOC (elf_header.e_shoff,
2446 elf_header.e_shentsize * elf_header.e_shnum,
2447 shdrs, Elf64_External_Shdr *, "section headers");
2448
2449 section_headers = (Elf_Internal_Shdr *) malloc
2450 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2451
2452 if (section_headers == NULL)
2453 {
2454 error (_("Out of memory\n"));
2455 return 0;
2456 }
2457
2458 for (i = 0, internal = section_headers;
2459 i < elf_header.e_shnum;
2460 i ++, internal ++)
2461 {
2462 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2463 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2464 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2465 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2466 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2467 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2468 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2469 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2470 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2471 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2472 }
2473
2474 free (shdrs);
2475
2476 return 1;
2477 }
2478
2479 static Elf_Internal_Sym *
2480 get_32bit_elf_symbols (file, offset, number)
2481 FILE * file;
2482 unsigned long offset;
2483 unsigned long number;
2484 {
2485 Elf32_External_Sym * esyms;
2486 Elf_Internal_Sym * isyms;
2487 Elf_Internal_Sym * psym;
2488 unsigned int j;
2489
2490 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2491 esyms, Elf32_External_Sym *, "symbols");
2492
2493 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2494
2495 if (isyms == NULL)
2496 {
2497 error (_("Out of memory\n"));
2498 free (esyms);
2499
2500 return NULL;
2501 }
2502
2503 for (j = 0, psym = isyms;
2504 j < number;
2505 j ++, psym ++)
2506 {
2507 psym->st_name = BYTE_GET (esyms[j].st_name);
2508 psym->st_value = BYTE_GET (esyms[j].st_value);
2509 psym->st_size = BYTE_GET (esyms[j].st_size);
2510 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2511 psym->st_info = BYTE_GET (esyms[j].st_info);
2512 psym->st_other = BYTE_GET (esyms[j].st_other);
2513 }
2514
2515 free (esyms);
2516
2517 return isyms;
2518 }
2519
2520 static Elf_Internal_Sym *
2521 get_64bit_elf_symbols (file, offset, number)
2522 FILE * file;
2523 unsigned long offset;
2524 unsigned long number;
2525 {
2526 Elf64_External_Sym * esyms;
2527 Elf_Internal_Sym * isyms;
2528 Elf_Internal_Sym * psym;
2529 unsigned int j;
2530
2531 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2532 esyms, Elf64_External_Sym *, "symbols");
2533
2534 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2535
2536 if (isyms == NULL)
2537 {
2538 error (_("Out of memory\n"));
2539 free (esyms);
2540
2541 return NULL;
2542 }
2543
2544 for (j = 0, psym = isyms;
2545 j < number;
2546 j ++, psym ++)
2547 {
2548 psym->st_name = BYTE_GET (esyms[j].st_name);
2549 psym->st_info = BYTE_GET (esyms[j].st_info);
2550 psym->st_other = BYTE_GET (esyms[j].st_other);
2551 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2552 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2553 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2554 }
2555
2556 free (esyms);
2557
2558 return isyms;
2559 }
2560
2561 static const char *
2562 get_elf_section_flags (sh_flags)
2563 bfd_vma sh_flags;
2564 {
2565 static char buff [32];
2566
2567 * buff = 0;
2568
2569 while (sh_flags)
2570 {
2571 bfd_vma flag;
2572
2573 flag = sh_flags & - sh_flags;
2574 sh_flags &= ~ flag;
2575
2576 switch (flag)
2577 {
2578 case SHF_WRITE: strcat (buff, "W"); break;
2579 case SHF_ALLOC: strcat (buff, "A"); break;
2580 case SHF_EXECINSTR: strcat (buff, "X"); break;
2581 case SHF_MERGE: strcat (buff, "M"); break;
2582 case SHF_STRINGS: strcat (buff, "S"); break;
2583 case SHF_INFO_LINK: strcat (buff, "I"); break;
2584 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2585 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2586
2587 default:
2588 if (flag & SHF_MASKOS)
2589 {
2590 strcat (buff, "o");
2591 sh_flags &= ~ SHF_MASKOS;
2592 }
2593 else if (flag & SHF_MASKPROC)
2594 {
2595 strcat (buff, "p");
2596 sh_flags &= ~ SHF_MASKPROC;
2597 }
2598 else
2599 strcat (buff, "x");
2600 break;
2601 }
2602 }
2603
2604 return buff;
2605 }
2606
2607 static int
2608 process_section_headers (file)
2609 FILE * file;
2610 {
2611 Elf_Internal_Shdr * section;
2612 int i;
2613
2614 section_headers = NULL;
2615
2616 if (elf_header.e_shnum == 0)
2617 {
2618 if (do_sections)
2619 printf (_("\nThere are no sections in this file.\n"));
2620
2621 return 1;
2622 }
2623
2624 if (do_sections && !do_header)
2625 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2626 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2627
2628 if (is_32bit_elf)
2629 {
2630 if (! get_32bit_section_headers (file))
2631 return 0;
2632 }
2633 else if (! get_64bit_section_headers (file))
2634 return 0;
2635
2636 /* Read in the string table, so that we have names to display. */
2637 section = section_headers + elf_header.e_shstrndx;
2638
2639 if (section->sh_size != 0)
2640 {
2641 unsigned long string_table_offset;
2642
2643 string_table_offset = section->sh_offset;
2644
2645 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2646 string_table, char *, "string table");
2647 }
2648
2649 /* Scan the sections for the dynamic symbol table
2650 and dynamic string table and debug sections. */
2651 dynamic_symbols = NULL;
2652 dynamic_strings = NULL;
2653 dynamic_syminfo = NULL;
2654
2655 for (i = 0, section = section_headers;
2656 i < elf_header.e_shnum;
2657 i ++, section ++)
2658 {
2659 char * name = SECTION_NAME (section);
2660
2661 if (section->sh_type == SHT_DYNSYM)
2662 {
2663 if (dynamic_symbols != NULL)
2664 {
2665 error (_("File contains multiple dynamic symbol tables\n"));
2666 continue;
2667 }
2668
2669 num_dynamic_syms = section->sh_size / section->sh_entsize;
2670 dynamic_symbols =
2671 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2672 }
2673 else if (section->sh_type == SHT_STRTAB
2674 && strcmp (name, ".dynstr") == 0)
2675 {
2676 if (dynamic_strings != NULL)
2677 {
2678 error (_("File contains multiple dynamic string tables\n"));
2679 continue;
2680 }
2681
2682 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2683 dynamic_strings, char *, "dynamic strings");
2684 }
2685 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2686 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2687 && strncmp (name, ".debug_", 7) == 0)
2688 {
2689 name += 7;
2690
2691 if (do_debugging
2692 || (do_debug_info && (strcmp (name, "info") == 0))
2693 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2694 || (do_debug_lines && (strcmp (name, "line") == 0))
2695 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2696 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2697 )
2698 request_dump (i, DEBUG_DUMP);
2699 }
2700 }
2701
2702 if (! do_sections)
2703 return 1;
2704
2705 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2706
2707 if (is_32bit_elf)
2708 printf
2709 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2710 else
2711 {
2712 printf (_(" [Nr] Name Type Address Offset\n"));
2713 printf (_(" Size EntSize Flags Link Info Align\n"));
2714 }
2715
2716 for (i = 0, section = section_headers;
2717 i < elf_header.e_shnum;
2718 i ++, section ++)
2719 {
2720 printf (" [%2d] %-17.17s %-15.15s ",
2721 i,
2722 SECTION_NAME (section),
2723 get_section_type_name (section->sh_type));
2724
2725 if (is_32bit_elf)
2726 {
2727 print_vma (section->sh_addr, LONG_HEX);
2728
2729 printf ( " %6.6lx %6.6lx %2.2lx",
2730 (unsigned long) section->sh_offset,
2731 (unsigned long) section->sh_size,
2732 (unsigned long) section->sh_entsize);
2733
2734 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2735
2736 printf (" %2ld %3lx %ld\n",
2737 (unsigned long) section->sh_link,
2738 (unsigned long) section->sh_info,
2739 (unsigned long) section->sh_addralign);
2740 }
2741 else
2742 {
2743 putchar (' ');
2744 print_vma (section->sh_addr, LONG_HEX);
2745 printf (" %8.8lx", section->sh_offset);
2746 printf ("\n ");
2747 print_vma (section->sh_size, LONG_HEX);
2748 printf (" ");
2749 print_vma (section->sh_entsize, LONG_HEX);
2750
2751 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2752
2753 printf (" %2ld %3lx %ld\n",
2754 (unsigned long) section->sh_link,
2755 (unsigned long) section->sh_info,
2756 (unsigned long) section->sh_addralign);
2757 }
2758 }
2759
2760 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2761 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2762 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2763
2764 return 1;
2765 }
2766
2767 /* Process the reloc section. */
2768 static int
2769 process_relocs (file)
2770 FILE * file;
2771 {
2772 unsigned long rel_size;
2773 unsigned long rel_offset;
2774
2775
2776 if (!do_reloc)
2777 return 1;
2778
2779 if (do_using_dynamic)
2780 {
2781 int is_rela = FALSE;
2782
2783 rel_size = 0;
2784 rel_offset = 0;
2785
2786 if (dynamic_info[DT_REL])
2787 {
2788 rel_offset = dynamic_info[DT_REL];
2789 rel_size = dynamic_info[DT_RELSZ];
2790 is_rela = FALSE;
2791 }
2792 else if (dynamic_info [DT_RELA])
2793 {
2794 rel_offset = dynamic_info[DT_RELA];
2795 rel_size = dynamic_info[DT_RELASZ];
2796 is_rela = TRUE;
2797 }
2798 else if (dynamic_info[DT_JMPREL])
2799 {
2800 rel_offset = dynamic_info[DT_JMPREL];
2801 rel_size = dynamic_info[DT_PLTRELSZ];
2802
2803 switch (dynamic_info[DT_PLTREL])
2804 {
2805 case DT_REL:
2806 is_rela = FALSE;
2807 break;
2808 case DT_RELA:
2809 is_rela = TRUE;
2810 break;
2811 default:
2812 is_rela = UNKNOWN;
2813 break;
2814 }
2815 }
2816
2817 if (rel_size)
2818 {
2819 printf
2820 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2821 rel_offset, rel_size);
2822
2823 dump_relocations (file, rel_offset - loadaddr, rel_size,
2824 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2825 }
2826 else
2827 printf (_("\nThere are no dynamic relocations in this file.\n"));
2828 }
2829 else
2830 {
2831 Elf32_Internal_Shdr * section;
2832 unsigned long i;
2833 int found = 0;
2834
2835 for (i = 0, section = section_headers;
2836 i < elf_header.e_shnum;
2837 i++, section ++)
2838 {
2839 if ( section->sh_type != SHT_RELA
2840 && section->sh_type != SHT_REL)
2841 continue;
2842
2843 rel_offset = section->sh_offset;
2844 rel_size = section->sh_size;
2845
2846 if (rel_size)
2847 {
2848 Elf32_Internal_Shdr * strsec;
2849 Elf32_Internal_Shdr * symsec;
2850 Elf_Internal_Sym * symtab;
2851 char * strtab;
2852 int is_rela;
2853 unsigned long nsyms;
2854
2855 printf (_("\nRelocation section "));
2856
2857 if (string_table == NULL)
2858 printf ("%d", section->sh_name);
2859 else
2860 printf ("'%s'", SECTION_NAME (section));
2861
2862 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2863 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2864
2865 symsec = section_headers + section->sh_link;
2866
2867 nsyms = symsec->sh_size / symsec->sh_entsize;
2868 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2869
2870 if (symtab == NULL)
2871 continue;
2872
2873 strsec = section_headers + symsec->sh_link;
2874
2875 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2876 char *, "string table");
2877
2878 is_rela = section->sh_type == SHT_RELA;
2879
2880 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2881
2882 free (strtab);
2883 free (symtab);
2884
2885 found = 1;
2886 }
2887 }
2888
2889 if (! found)
2890 printf (_("\nThere are no relocations in this file.\n"));
2891 }
2892
2893 return 1;
2894 }
2895
2896
2897 static void
2898 dynamic_segment_mips_val (entry)
2899 Elf_Internal_Dyn * entry;
2900 {
2901 switch (entry->d_tag)
2902 {
2903 case DT_MIPS_FLAGS:
2904 if (entry->d_un.d_val == 0)
2905 printf ("NONE\n");
2906 else
2907 {
2908 static const char * opts[] =
2909 {
2910 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2911 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2912 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2913 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2914 "RLD_ORDER_SAFE"
2915 };
2916 unsigned int cnt;
2917 int first = 1;
2918 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2919 if (entry->d_un.d_val & (1 << cnt))
2920 {
2921 printf ("%s%s", first ? "" : " ", opts[cnt]);
2922 first = 0;
2923 }
2924 puts ("");
2925 }
2926 break;
2927
2928 case DT_MIPS_IVERSION:
2929 if (dynamic_strings != NULL)
2930 printf ("Interface Version: %s\n",
2931 dynamic_strings + entry->d_un.d_val);
2932 else
2933 printf ("%ld\n", (long) entry->d_un.d_ptr);
2934 break;
2935
2936 case DT_MIPS_TIME_STAMP:
2937 {
2938 char timebuf[20];
2939 struct tm * tmp;
2940
2941 time_t time = entry->d_un.d_val;
2942 tmp = gmtime (&time);
2943 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
2944 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
2945 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2946 printf ("Time Stamp: %s\n", timebuf);
2947 }
2948 break;
2949
2950 case DT_MIPS_RLD_VERSION:
2951 case DT_MIPS_LOCAL_GOTNO:
2952 case DT_MIPS_CONFLICTNO:
2953 case DT_MIPS_LIBLISTNO:
2954 case DT_MIPS_SYMTABNO:
2955 case DT_MIPS_UNREFEXTNO:
2956 case DT_MIPS_HIPAGENO:
2957 case DT_MIPS_DELTA_CLASS_NO:
2958 case DT_MIPS_DELTA_INSTANCE_NO:
2959 case DT_MIPS_DELTA_RELOC_NO:
2960 case DT_MIPS_DELTA_SYM_NO:
2961 case DT_MIPS_DELTA_CLASSSYM_NO:
2962 case DT_MIPS_COMPACT_SIZE:
2963 printf ("%ld\n", (long) entry->d_un.d_ptr);
2964 break;
2965
2966 default:
2967 printf ("%#lx\n", (long) entry->d_un.d_ptr);
2968 }
2969 }
2970
2971
2972 static void
2973 dynamic_segment_parisc_val (entry)
2974 Elf_Internal_Dyn * entry;
2975 {
2976 switch (entry->d_tag)
2977 {
2978 case DT_HP_DLD_FLAGS:
2979 {
2980 static struct
2981 {
2982 long int bit;
2983 const char * str;
2984 }
2985 flags[] =
2986 {
2987 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
2988 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
2989 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
2990 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
2991 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
2992 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
2993 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
2994 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
2995 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
2996 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
2997 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
2998 };
2999 int first = 1;
3000 size_t cnt;
3001 bfd_vma val = entry->d_un.d_val;
3002
3003 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3004 if (val & flags[cnt].bit)
3005 {
3006 if (! first)
3007 putchar (' ');
3008 fputs (flags[cnt].str, stdout);
3009 first = 0;
3010 val ^= flags[cnt].bit;
3011 }
3012
3013 if (val != 0 || first)
3014 {
3015 if (! first)
3016 putchar (' ');
3017 print_vma (val, HEX);
3018 }
3019 }
3020 break;
3021
3022 default:
3023 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3024 break;
3025 }
3026 }
3027
3028 static int
3029 get_32bit_dynamic_segment (file)
3030 FILE * file;
3031 {
3032 Elf32_External_Dyn * edyn;
3033 Elf_Internal_Dyn * entry;
3034 bfd_size_type i;
3035
3036 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3037 edyn, Elf32_External_Dyn *, "dynamic segment");
3038
3039 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3040 how large this .dynamic is now. We can do this even before the byte
3041 swapping since the DT_NULL tag is recognizable. */
3042 dynamic_size = 0;
3043 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3044 ;
3045
3046 dynamic_segment = (Elf_Internal_Dyn *)
3047 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3048
3049 if (dynamic_segment == NULL)
3050 {
3051 error (_("Out of memory\n"));
3052 free (edyn);
3053 return 0;
3054 }
3055
3056 for (i = 0, entry = dynamic_segment;
3057 i < dynamic_size;
3058 i ++, entry ++)
3059 {
3060 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3061 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3062 }
3063
3064 free (edyn);
3065
3066 return 1;
3067 }
3068
3069 static int
3070 get_64bit_dynamic_segment (file)
3071 FILE * file;
3072 {
3073 Elf64_External_Dyn * edyn;
3074 Elf_Internal_Dyn * entry;
3075 bfd_size_type i;
3076
3077 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3078 edyn, Elf64_External_Dyn *, "dynamic segment");
3079
3080 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3081 how large this .dynamic is now. We can do this even before the byte
3082 swapping since the DT_NULL tag is recognizable. */
3083 dynamic_size = 0;
3084 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3085 ;
3086
3087 dynamic_segment = (Elf_Internal_Dyn *)
3088 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3089
3090 if (dynamic_segment == NULL)
3091 {
3092 error (_("Out of memory\n"));
3093 free (edyn);
3094 return 0;
3095 }
3096
3097 for (i = 0, entry = dynamic_segment;
3098 i < dynamic_size;
3099 i ++, entry ++)
3100 {
3101 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3102 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3103 }
3104
3105 free (edyn);
3106
3107 return 1;
3108 }
3109
3110 static const char *
3111 get_dynamic_flags (flags)
3112 bfd_vma flags;
3113 {
3114 static char buff [64];
3115 while (flags)
3116 {
3117 bfd_vma flag;
3118
3119 flag = flags & - flags;
3120 flags &= ~ flag;
3121
3122 switch (flag)
3123 {
3124 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3125 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3126 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3127 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3128 default: strcat (buff, "unknown "); break;
3129 }
3130 }
3131 return buff;
3132 }
3133
3134 /* Parse and display the contents of the dynamic segment. */
3135 static int
3136 process_dynamic_segment (file)
3137 FILE * file;
3138 {
3139 Elf_Internal_Dyn * entry;
3140 bfd_size_type i;
3141
3142 if (dynamic_size == 0)
3143 {
3144 if (do_dynamic)
3145 printf (_("\nThere is no dynamic segment in this file.\n"));
3146
3147 return 1;
3148 }
3149
3150 if (is_32bit_elf)
3151 {
3152 if (! get_32bit_dynamic_segment (file))
3153 return 0;
3154 }
3155 else if (! get_64bit_dynamic_segment (file))
3156 return 0;
3157
3158 /* Find the appropriate symbol table. */
3159 if (dynamic_symbols == NULL)
3160 {
3161 for (i = 0, entry = dynamic_segment;
3162 i < dynamic_size;
3163 ++i, ++ entry)
3164 {
3165 unsigned long offset;
3166
3167 if (entry->d_tag != DT_SYMTAB)
3168 continue;
3169
3170 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3171
3172 /* Since we do not know how big the symbol table is,
3173 we default to reading in the entire file (!) and
3174 processing that. This is overkill, I know, but it
3175 should work. */
3176 offset = entry->d_un.d_val - loadaddr;
3177
3178 if (fseek (file, 0, SEEK_END))
3179 error (_("Unable to seek to end of file!"));
3180
3181 if (is_32bit_elf)
3182 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3183 else
3184 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3185
3186 if (num_dynamic_syms < 1)
3187 {
3188 error (_("Unable to determine the number of symbols to load\n"));
3189 continue;
3190 }
3191
3192 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3193 }
3194 }
3195
3196 /* Similarly find a string table. */
3197 if (dynamic_strings == NULL)
3198 {
3199 for (i = 0, entry = dynamic_segment;
3200 i < dynamic_size;
3201 ++i, ++ entry)
3202 {
3203 unsigned long offset;
3204 long str_tab_len;
3205
3206 if (entry->d_tag != DT_STRTAB)
3207 continue;
3208
3209 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3210
3211 /* Since we do not know how big the string table is,
3212 we default to reading in the entire file (!) and
3213 processing that. This is overkill, I know, but it
3214 should work. */
3215
3216 offset = entry->d_un.d_val - loadaddr;
3217 if (fseek (file, 0, SEEK_END))
3218 error (_("Unable to seek to end of file\n"));
3219 str_tab_len = ftell (file) - offset;
3220
3221 if (str_tab_len < 1)
3222 {
3223 error
3224 (_("Unable to determine the length of the dynamic string table\n"));
3225 continue;
3226 }
3227
3228 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3229 "dynamic string table");
3230
3231 break;
3232 }
3233 }
3234
3235 /* And find the syminfo section if available. */
3236 if (dynamic_syminfo == NULL)
3237 {
3238 unsigned int syminsz = 0;
3239
3240 for (i = 0, entry = dynamic_segment;
3241 i < dynamic_size;
3242 ++i, ++ entry)
3243 {
3244 if (entry->d_tag == DT_SYMINENT)
3245 {
3246 /* Note: these braces are necessary to avoid a syntax
3247 error from the SunOS4 C compiler. */
3248 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3249 }
3250 else if (entry->d_tag == DT_SYMINSZ)
3251 syminsz = entry->d_un.d_val;
3252 else if (entry->d_tag == DT_SYMINFO)
3253 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3254 }
3255
3256 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3257 {
3258 Elf_External_Syminfo * extsyminfo;
3259 Elf_Internal_Syminfo * syminfo;
3260
3261 /* There is a syminfo section. Read the data. */
3262 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3263 Elf_External_Syminfo *, "symbol information");
3264
3265 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3266 if (dynamic_syminfo == NULL)
3267 {
3268 error (_("Out of memory\n"));
3269 return 0;
3270 }
3271
3272 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3273 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3274 ++i, ++syminfo)
3275 {
3276 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3277 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3278 }
3279
3280 free (extsyminfo);
3281 }
3282 }
3283
3284 if (do_dynamic && dynamic_addr)
3285 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3286 dynamic_addr, (long) dynamic_size);
3287 if (do_dynamic)
3288 printf (_(" Tag Type Name/Value\n"));
3289
3290 for (i = 0, entry = dynamic_segment;
3291 i < dynamic_size;
3292 i++, entry ++)
3293 {
3294 if (do_dynamic)
3295 {
3296 const char * dtype;
3297
3298 putchar (' ');
3299 print_vma (entry->d_tag, FULL_HEX);
3300 dtype = get_dynamic_type (entry->d_tag);
3301 printf (" (%s)%*s", dtype,
3302 ((is_32bit_elf ? 27 : 19)
3303 - (int) strlen (dtype)),
3304 " ");
3305 }
3306
3307 switch (entry->d_tag)
3308 {
3309 case DT_FLAGS:
3310 if (do_dynamic)
3311 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3312 break;
3313
3314 case DT_AUXILIARY:
3315 case DT_FILTER:
3316 if (do_dynamic)
3317 {
3318 if (entry->d_tag == DT_AUXILIARY)
3319 printf (_("Auxiliary library"));
3320 else
3321 printf (_("Filter library"));
3322
3323 if (dynamic_strings)
3324 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3325 else
3326 {
3327 printf (": ");
3328 print_vma (entry->d_un.d_val, PREFIX_HEX);
3329 putchar ('\n');
3330 }
3331 }
3332 break;
3333
3334 case DT_FEATURE_1:
3335 if (do_dynamic)
3336 {
3337 printf (_("Flags:"));
3338 if (entry->d_un.d_val == 0)
3339 printf (_(" None\n"));
3340 else
3341 {
3342 unsigned long int val = entry->d_un.d_val;
3343 if (val & DTF_1_PARINIT)
3344 {
3345 printf (" PARINIT");
3346 val ^= DTF_1_PARINIT;
3347 }
3348 if (val != 0)
3349 printf (" %lx", val);
3350 puts ("");
3351 }
3352 }
3353 break;
3354
3355 case DT_POSFLAG_1:
3356 if (do_dynamic)
3357 {
3358 printf (_("Flags:"));
3359 if (entry->d_un.d_val == 0)
3360 printf (_(" None\n"));
3361 else
3362 {
3363 unsigned long int val = entry->d_un.d_val;
3364 if (val & DF_P1_LAZYLOAD)
3365 {
3366 printf (" LAZYLOAD");
3367 val ^= DF_P1_LAZYLOAD;
3368 }
3369 if (val & DF_P1_GROUPPERM)
3370 {
3371 printf (" GROUPPERM");
3372 val ^= DF_P1_GROUPPERM;
3373 }
3374 if (val != 0)
3375 printf (" %lx", val);
3376 puts ("");
3377 }
3378 }
3379 break;
3380
3381 case DT_FLAGS_1:
3382 if (do_dynamic)
3383 {
3384 printf (_("Flags:"));
3385 if (entry->d_un.d_val == 0)
3386 printf (_(" None\n"));
3387 else
3388 {
3389 unsigned long int val = entry->d_un.d_val;
3390 if (val & DF_1_NOW)
3391 {
3392 printf (" NOW");
3393 val ^= DF_1_NOW;
3394 }
3395 if (val & DF_1_GLOBAL)
3396 {
3397 printf (" GLOBAL");
3398 val ^= DF_1_GLOBAL;
3399 }
3400 if (val & DF_1_GROUP)
3401 {
3402 printf (" GROUP");
3403 val ^= DF_1_GROUP;
3404 }
3405 if (val & DF_1_NODELETE)
3406 {
3407 printf (" NODELETE");
3408 val ^= DF_1_NODELETE;
3409 }
3410 if (val & DF_1_LOADFLTR)
3411 {
3412 printf (" LOADFLTR");
3413 val ^= DF_1_LOADFLTR;
3414 }
3415 if (val & DF_1_INITFIRST)
3416 {
3417 printf (" INITFIRST");
3418 val ^= DF_1_INITFIRST;
3419 }
3420 if (val & DF_1_NOOPEN)
3421 {
3422 printf (" NOOPEN");
3423 val ^= DF_1_NOOPEN;
3424 }
3425 if (val & DF_1_ORIGIN)
3426 {
3427 printf (" ORIGIN");
3428 val ^= DF_1_ORIGIN;
3429 }
3430 if (val & DF_1_DIRECT)
3431 {
3432 printf (" DIRECT");
3433 val ^= DF_1_DIRECT;
3434 }
3435 if (val & DF_1_TRANS)
3436 {
3437 printf (" TRANS");
3438 val ^= DF_1_TRANS;
3439 }
3440 if (val & DF_1_INTERPOSE)
3441 {
3442 printf (" INTERPOSE");
3443 val ^= DF_1_INTERPOSE;
3444 }
3445 if (val != 0)
3446 printf (" %lx", val);
3447 puts ("");
3448 }
3449 }
3450 break;
3451
3452 case DT_PLTREL:
3453 if (do_dynamic)
3454 puts (get_dynamic_type (entry->d_un.d_val));
3455 break;
3456
3457 case DT_NULL :
3458 case DT_NEEDED :
3459 case DT_PLTGOT :
3460 case DT_HASH :
3461 case DT_STRTAB :
3462 case DT_SYMTAB :
3463 case DT_RELA :
3464 case DT_INIT :
3465 case DT_FINI :
3466 case DT_SONAME :
3467 case DT_RPATH :
3468 case DT_SYMBOLIC:
3469 case DT_REL :
3470 case DT_DEBUG :
3471 case DT_TEXTREL :
3472 case DT_JMPREL :
3473 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3474
3475 if (do_dynamic)
3476 {
3477 char * name;
3478
3479 if (dynamic_strings == NULL)
3480 name = NULL;
3481 else
3482 name = dynamic_strings + entry->d_un.d_val;
3483
3484 if (name)
3485 {
3486 switch (entry->d_tag)
3487 {
3488 case DT_NEEDED:
3489 printf (_("Shared library: [%s]"), name);
3490
3491 if (strcmp (name, program_interpreter) == 0)
3492 printf (_(" program interpreter"));
3493 break;
3494
3495 case DT_SONAME:
3496 printf (_("Library soname: [%s]"), name);
3497 break;
3498
3499 case DT_RPATH:
3500 printf (_("Library rpath: [%s]"), name);
3501 break;
3502
3503 default:
3504 print_vma (entry->d_un.d_val, PREFIX_HEX);
3505 break;
3506 }
3507 }
3508 else
3509 print_vma (entry->d_un.d_val, PREFIX_HEX);
3510
3511 putchar ('\n');
3512 }
3513 break;
3514
3515 case DT_PLTRELSZ:
3516 case DT_RELASZ :
3517 case DT_STRSZ :
3518 case DT_RELSZ :
3519 case DT_RELAENT :
3520 case DT_SYMENT :
3521 case DT_RELENT :
3522 case DT_PLTPADSZ:
3523 case DT_MOVEENT :
3524 case DT_MOVESZ :
3525 case DT_INIT_ARRAYSZ:
3526 case DT_FINI_ARRAYSZ:
3527 if (do_dynamic)
3528 {
3529 print_vma (entry->d_un.d_val, UNSIGNED);
3530 printf (" (bytes)\n");
3531 }
3532 break;
3533
3534 case DT_VERDEFNUM:
3535 case DT_VERNEEDNUM:
3536 case DT_RELACOUNT:
3537 case DT_RELCOUNT:
3538 if (do_dynamic)
3539 {
3540 print_vma (entry->d_un.d_val, UNSIGNED);
3541 putchar ('\n');
3542 }
3543 break;
3544
3545 case DT_SYMINSZ:
3546 case DT_SYMINENT:
3547 case DT_SYMINFO:
3548 case DT_USED:
3549 case DT_INIT_ARRAY:
3550 case DT_FINI_ARRAY:
3551 if (do_dynamic)
3552 {
3553 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3554 {
3555 char * name;
3556
3557 name = dynamic_strings + entry->d_un.d_val;
3558
3559 if (* name)
3560 {
3561 printf (_("Not needed object: [%s]\n"), name);
3562 break;
3563 }
3564 }
3565
3566 print_vma (entry->d_un.d_val, PREFIX_HEX);
3567 putchar ('\n');
3568 }
3569 break;
3570
3571 case DT_BIND_NOW:
3572 /* The value of this entry is ignored. */
3573 break;
3574
3575 default:
3576 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3577 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3578 entry->d_un.d_val;
3579
3580 if (do_dynamic)
3581 {
3582 switch (elf_header.e_machine)
3583 {
3584 case EM_MIPS:
3585 case EM_MIPS_RS4_BE:
3586 dynamic_segment_mips_val (entry);
3587 break;
3588 case EM_PARISC:
3589 dynamic_segment_parisc_val (entry);
3590 break;
3591 default:
3592 print_vma (entry->d_un.d_val, PREFIX_HEX);
3593 putchar ('\n');
3594 }
3595 }
3596 break;
3597 }
3598 }
3599
3600 return 1;
3601 }
3602
3603 static char *
3604 get_ver_flags (flags)
3605 unsigned int flags;
3606 {
3607 static char buff [32];
3608
3609 buff[0] = 0;
3610
3611 if (flags == 0)
3612 return _("none");
3613
3614 if (flags & VER_FLG_BASE)
3615 strcat (buff, "BASE ");
3616
3617 if (flags & VER_FLG_WEAK)
3618 {
3619 if (flags & VER_FLG_BASE)
3620 strcat (buff, "| ");
3621
3622 strcat (buff, "WEAK ");
3623 }
3624
3625 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3626 strcat (buff, "| <unknown>");
3627
3628 return buff;
3629 }
3630
3631 /* Display the contents of the version sections. */
3632 static int
3633 process_version_sections (file)
3634 FILE * file;
3635 {
3636 Elf32_Internal_Shdr * section;
3637 unsigned i;
3638 int found = 0;
3639
3640 if (! do_version)
3641 return 1;
3642
3643 for (i = 0, section = section_headers;
3644 i < elf_header.e_shnum;
3645 i++, section ++)
3646 {
3647 switch (section->sh_type)
3648 {
3649 case SHT_GNU_verdef:
3650 {
3651 Elf_External_Verdef * edefs;
3652 unsigned int idx;
3653 unsigned int cnt;
3654
3655 found = 1;
3656
3657 printf
3658 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3659 SECTION_NAME (section), section->sh_info);
3660
3661 printf (_(" Addr: 0x"));
3662 printf_vma (section->sh_addr);
3663 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3664 (unsigned long) section->sh_offset, section->sh_link,
3665 SECTION_NAME (section_headers + section->sh_link));
3666
3667 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3668 edefs, Elf_External_Verdef *,
3669 "version definition section");
3670
3671 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3672 {
3673 char * vstart;
3674 Elf_External_Verdef * edef;
3675 Elf_Internal_Verdef ent;
3676 Elf_External_Verdaux * eaux;
3677 Elf_Internal_Verdaux aux;
3678 int j;
3679 int isum;
3680
3681 vstart = ((char *) edefs) + idx;
3682
3683 edef = (Elf_External_Verdef *) vstart;
3684
3685 ent.vd_version = BYTE_GET (edef->vd_version);
3686 ent.vd_flags = BYTE_GET (edef->vd_flags);
3687 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3688 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3689 ent.vd_hash = BYTE_GET (edef->vd_hash);
3690 ent.vd_aux = BYTE_GET (edef->vd_aux);
3691 ent.vd_next = BYTE_GET (edef->vd_next);
3692
3693 printf (_(" %#06x: Rev: %d Flags: %s"),
3694 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3695
3696 printf (_(" Index: %d Cnt: %d "),
3697 ent.vd_ndx, ent.vd_cnt);
3698
3699 vstart += ent.vd_aux;
3700
3701 eaux = (Elf_External_Verdaux *) vstart;
3702
3703 aux.vda_name = BYTE_GET (eaux->vda_name);
3704 aux.vda_next = BYTE_GET (eaux->vda_next);
3705
3706 if (dynamic_strings)
3707 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3708 else
3709 printf (_("Name index: %ld\n"), aux.vda_name);
3710
3711 isum = idx + ent.vd_aux;
3712
3713 for (j = 1; j < ent.vd_cnt; j ++)
3714 {
3715 isum += aux.vda_next;
3716 vstart += aux.vda_next;
3717
3718 eaux = (Elf_External_Verdaux *) vstart;
3719
3720 aux.vda_name = BYTE_GET (eaux->vda_name);
3721 aux.vda_next = BYTE_GET (eaux->vda_next);
3722
3723 if (dynamic_strings)
3724 printf (_(" %#06x: Parent %d: %s\n"),
3725 isum, j, dynamic_strings + aux.vda_name);
3726 else
3727 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3728 isum, j, aux.vda_name);
3729 }
3730
3731 idx += ent.vd_next;
3732 }
3733
3734 free (edefs);
3735 }
3736 break;
3737
3738 case SHT_GNU_verneed:
3739 {
3740 Elf_External_Verneed * eneed;
3741 unsigned int idx;
3742 unsigned int cnt;
3743
3744 found = 1;
3745
3746 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3747 SECTION_NAME (section), section->sh_info);
3748
3749 printf (_(" Addr: 0x"));
3750 printf_vma (section->sh_addr);
3751 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3752 (unsigned long) section->sh_offset, section->sh_link,
3753 SECTION_NAME (section_headers + section->sh_link));
3754
3755 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3756 eneed, Elf_External_Verneed *,
3757 "version need section");
3758
3759 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3760 {
3761 Elf_External_Verneed * entry;
3762 Elf_Internal_Verneed ent;
3763 int j;
3764 int isum;
3765 char * vstart;
3766
3767 vstart = ((char *) eneed) + idx;
3768
3769 entry = (Elf_External_Verneed *) vstart;
3770
3771 ent.vn_version = BYTE_GET (entry->vn_version);
3772 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3773 ent.vn_file = BYTE_GET (entry->vn_file);
3774 ent.vn_aux = BYTE_GET (entry->vn_aux);
3775 ent.vn_next = BYTE_GET (entry->vn_next);
3776
3777 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3778
3779 if (dynamic_strings)
3780 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3781 else
3782 printf (_(" File: %lx"), ent.vn_file);
3783
3784 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3785
3786 vstart += ent.vn_aux;
3787
3788 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3789 {
3790 Elf_External_Vernaux * eaux;
3791 Elf_Internal_Vernaux aux;
3792
3793 eaux = (Elf_External_Vernaux *) vstart;
3794
3795 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3796 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3797 aux.vna_other = BYTE_GET (eaux->vna_other);
3798 aux.vna_name = BYTE_GET (eaux->vna_name);
3799 aux.vna_next = BYTE_GET (eaux->vna_next);
3800
3801 if (dynamic_strings)
3802 printf (_(" %#06x: Name: %s"),
3803 isum, dynamic_strings + aux.vna_name);
3804 else
3805 printf (_(" %#06x: Name index: %lx"),
3806 isum, aux.vna_name);
3807
3808 printf (_(" Flags: %s Version: %d\n"),
3809 get_ver_flags (aux.vna_flags), aux.vna_other);
3810
3811 isum += aux.vna_next;
3812 vstart += aux.vna_next;
3813 }
3814
3815 idx += ent.vn_next;
3816 }
3817
3818 free (eneed);
3819 }
3820 break;
3821
3822 case SHT_GNU_versym:
3823 {
3824 Elf32_Internal_Shdr * link_section;
3825 int total;
3826 int cnt;
3827 unsigned char * edata;
3828 unsigned short * data;
3829 char * strtab;
3830 Elf_Internal_Sym * symbols;
3831 Elf32_Internal_Shdr * string_sec;
3832
3833 link_section = section_headers + section->sh_link;
3834 total = section->sh_size / section->sh_entsize;
3835
3836 found = 1;
3837
3838 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3839 link_section->sh_size / link_section->sh_entsize);
3840
3841 string_sec = section_headers + link_section->sh_link;
3842
3843 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3844 strtab, char *, "version string table");
3845
3846 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3847 SECTION_NAME (section), total);
3848
3849 printf (_(" Addr: "));
3850 printf_vma (section->sh_addr);
3851 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3852 (unsigned long) section->sh_offset, section->sh_link,
3853 SECTION_NAME (link_section));
3854
3855 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3856 - loadaddr,
3857 total * sizeof (short), edata,
3858 unsigned char *, "version symbol data");
3859
3860 data = (unsigned short *) malloc (total * sizeof (short));
3861
3862 for (cnt = total; cnt --;)
3863 data [cnt] = byte_get (edata + cnt * sizeof (short),
3864 sizeof (short));
3865
3866 free (edata);
3867
3868 for (cnt = 0; cnt < total; cnt += 4)
3869 {
3870 int j, nn;
3871 char * name;
3872
3873 printf (" %03x:", cnt);
3874
3875 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3876 switch (data [cnt + j])
3877 {
3878 case 0:
3879 fputs (_(" 0 (*local*) "), stdout);
3880 break;
3881
3882 case 1:
3883 fputs (_(" 1 (*global*) "), stdout);
3884 break;
3885
3886 default:
3887 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3888 data [cnt + j] & 0x8000 ? 'h' : ' ');
3889
3890 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3891 && section_headers[symbols [cnt + j].st_shndx].sh_type
3892 == SHT_NOBITS)
3893 {
3894 /* We must test both. */
3895 Elf_Internal_Verneed ivn;
3896 unsigned long offset;
3897
3898 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3899 - loadaddr;
3900
3901 do
3902 {
3903 Elf_External_Verneed evn;
3904 Elf_External_Vernaux evna;
3905 Elf_Internal_Vernaux ivna;
3906 unsigned long vna_off;
3907
3908 GET_DATA (offset, evn, "version need");
3909
3910 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3911 ivn.vn_next = BYTE_GET (evn.vn_next);
3912
3913 vna_off = offset + ivn.vn_aux;
3914
3915 do
3916 {
3917 GET_DATA (vna_off, evna,
3918 "version need aux (1)");
3919
3920 ivna.vna_next = BYTE_GET (evna.vna_next);
3921 ivna.vna_other = BYTE_GET (evna.vna_other);
3922
3923 vna_off += ivna.vna_next;
3924 }
3925 while (ivna.vna_other != data [cnt + j]
3926 && ivna.vna_next != 0);
3927
3928 if (ivna.vna_other == data [cnt + j])
3929 {
3930 ivna.vna_name = BYTE_GET (evna.vna_name);
3931
3932 name = strtab + ivna.vna_name;
3933 nn += printf ("(%s%-*s",
3934 name,
3935 12 - (int) strlen (name),
3936 ")");
3937 break;
3938 }
3939 else if (ivn.vn_next == 0)
3940 {
3941 if (data [cnt + j] != 0x8001)
3942 {
3943 Elf_Internal_Verdef ivd;
3944 Elf_External_Verdef evd;
3945
3946 offset = version_info
3947 [DT_VERSIONTAGIDX (DT_VERDEF)]
3948 - loadaddr;
3949
3950 do
3951 {
3952 GET_DATA (offset, evd,
3953 "version definition");
3954
3955 ivd.vd_next = BYTE_GET (evd.vd_next);
3956 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
3957
3958 offset += ivd.vd_next;
3959 }
3960 while (ivd.vd_ndx
3961 != (data [cnt + j] & 0x7fff)
3962 && ivd.vd_next != 0);
3963
3964 if (ivd.vd_ndx
3965 == (data [cnt + j] & 0x7fff))
3966 {
3967 Elf_External_Verdaux evda;
3968 Elf_Internal_Verdaux ivda;
3969
3970 ivd.vd_aux = BYTE_GET (evd.vd_aux);
3971
3972 GET_DATA (offset + ivd.vd_aux, evda,
3973 "version definition aux");
3974
3975 ivda.vda_name =
3976 BYTE_GET (evda.vda_name);
3977
3978 name = strtab + ivda.vda_name;
3979 nn +=
3980 printf ("(%s%-*s",
3981 name,
3982 12 - (int) strlen (name),
3983 ")");
3984 }
3985 }
3986
3987 break;
3988 }
3989 else
3990 offset += ivn.vn_next;
3991 }
3992 while (ivn.vn_next);
3993 }
3994 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
3995 {
3996 Elf_Internal_Verneed ivn;
3997 unsigned long offset;
3998
3999 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4000 - loadaddr;
4001
4002 do
4003 {
4004 Elf_Internal_Vernaux ivna;
4005 Elf_External_Verneed evn;
4006 Elf_External_Vernaux evna;
4007 unsigned long a_off;
4008
4009 GET_DATA (offset, evn, "version need");
4010
4011 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4012 ivn.vn_next = BYTE_GET (evn.vn_next);
4013
4014 a_off = offset + ivn.vn_aux;
4015
4016 do
4017 {
4018 GET_DATA (a_off, evna,
4019 "version need aux (2)");
4020
4021 ivna.vna_next = BYTE_GET (evna.vna_next);
4022 ivna.vna_other = BYTE_GET (evna.vna_other);
4023
4024 a_off += ivna.vna_next;
4025 }
4026 while (ivna.vna_other != data [cnt + j]
4027 && ivna.vna_next != 0);
4028
4029 if (ivna.vna_other == data [cnt + j])
4030 {
4031 ivna.vna_name = BYTE_GET (evna.vna_name);
4032
4033 name = strtab + ivna.vna_name;
4034 nn += printf ("(%s%-*s",
4035 name,
4036 12 - (int) strlen (name),
4037 ")");
4038 break;
4039 }
4040
4041 offset += ivn.vn_next;
4042 }
4043 while (ivn.vn_next);
4044 }
4045 else if (data [cnt + j] != 0x8001)
4046 {
4047 Elf_Internal_Verdef ivd;
4048 Elf_External_Verdef evd;
4049 unsigned long offset;
4050
4051 offset = version_info
4052 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4053
4054 do
4055 {
4056 GET_DATA (offset, evd, "version def");
4057
4058 ivd.vd_next = BYTE_GET (evd.vd_next);
4059 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4060
4061 offset += ivd.vd_next;
4062 }
4063 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4064 && ivd.vd_next != 0);
4065
4066 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4067 {
4068 Elf_External_Verdaux evda;
4069 Elf_Internal_Verdaux ivda;
4070
4071 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4072
4073 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4074 evda, "version def aux");
4075
4076 ivda.vda_name = BYTE_GET (evda.vda_name);
4077
4078 name = strtab + ivda.vda_name;
4079 nn += printf ("(%s%-*s",
4080 name,
4081 12 - (int) strlen (name),
4082 ")");
4083 }
4084 }
4085
4086 if (nn < 18)
4087 printf ("%*c", 18 - nn, ' ');
4088 }
4089
4090 putchar ('\n');
4091 }
4092
4093 free (data);
4094 free (strtab);
4095 free (symbols);
4096 }
4097 break;
4098
4099 default:
4100 break;
4101 }
4102 }
4103
4104 if (! found)
4105 printf (_("\nNo version information found in this file.\n"));
4106
4107 return 1;
4108 }
4109
4110 static const char *
4111 get_symbol_binding (binding)
4112 unsigned int binding;
4113 {
4114 static char buff [32];
4115
4116 switch (binding)
4117 {
4118 case STB_LOCAL: return "LOCAL";
4119 case STB_GLOBAL: return "GLOBAL";
4120 case STB_WEAK: return "WEAK";
4121 default:
4122 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4123 sprintf (buff, _("<processor specific>: %d"), binding);
4124 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4125 sprintf (buff, _("<OS specific>: %d"), binding);
4126 else
4127 sprintf (buff, _("<unknown>: %d"), binding);
4128 return buff;
4129 }
4130 }
4131
4132 static const char *
4133 get_symbol_type (type)
4134 unsigned int type;
4135 {
4136 static char buff [32];
4137
4138 switch (type)
4139 {
4140 case STT_NOTYPE: return "NOTYPE";
4141 case STT_OBJECT: return "OBJECT";
4142 case STT_FUNC: return "FUNC";
4143 case STT_SECTION: return "SECTION";
4144 case STT_FILE: return "FILE";
4145 case STT_COMMON: return "COMMON";
4146 default:
4147 if (type >= STT_LOPROC && type <= STT_HIPROC)
4148 {
4149 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4150 return "THUMB_FUNC";
4151
4152 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4153 return "REGISTER";
4154
4155 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4156 return "PARISC_MILLI";
4157
4158 sprintf (buff, _("<processor specific>: %d"), type);
4159 }
4160 else if (type >= STT_LOOS && type <= STT_HIOS)
4161 {
4162 if (elf_header.e_machine == EM_PARISC)
4163 {
4164 if (type == STT_HP_OPAQUE)
4165 return "HP_OPAQUE";
4166 if (type == STT_HP_STUB)
4167 return "HP_STUB";
4168 }
4169
4170 sprintf (buff, _("<OS specific>: %d"), type);
4171 }
4172 else
4173 sprintf (buff, _("<unknown>: %d"), type);
4174 return buff;
4175 }
4176 }
4177
4178 static const char *
4179 get_symbol_visibility (visibility)
4180 unsigned int visibility;
4181 {
4182 switch (visibility)
4183 {
4184 case STV_DEFAULT: return "DEFAULT";
4185 case STV_INTERNAL: return "INTERNAL";
4186 case STV_HIDDEN: return "HIDDEN";
4187 case STV_PROTECTED: return "PROTECTED";
4188 default: abort ();
4189 }
4190 }
4191
4192 static const char *
4193 get_symbol_index_type (type)
4194 unsigned int type;
4195 {
4196 switch (type)
4197 {
4198 case SHN_UNDEF: return "UND";
4199 case SHN_ABS: return "ABS";
4200 case SHN_COMMON: return "COM";
4201 default:
4202 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4203 return "PRC";
4204 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4205 return "RSV";
4206 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4207 return "OS ";
4208 else
4209 {
4210 static char buff [32];
4211
4212 sprintf (buff, "%3d", type);
4213 return buff;
4214 }
4215 }
4216 }
4217
4218 static int *
4219 get_dynamic_data (file, number)
4220 FILE * file;
4221 unsigned int number;
4222 {
4223 char * e_data;
4224 int * i_data;
4225
4226 e_data = (char *) malloc (number * 4);
4227
4228 if (e_data == NULL)
4229 {
4230 error (_("Out of memory\n"));
4231 return NULL;
4232 }
4233
4234 if (fread (e_data, 4, number, file) != number)
4235 {
4236 error (_("Unable to read in dynamic data\n"));
4237 return NULL;
4238 }
4239
4240 i_data = (int *) malloc (number * sizeof (* i_data));
4241
4242 if (i_data == NULL)
4243 {
4244 error (_("Out of memory\n"));
4245 free (e_data);
4246 return NULL;
4247 }
4248
4249 while (number--)
4250 i_data [number] = byte_get (e_data + number * 4, 4);
4251
4252 free (e_data);
4253
4254 return i_data;
4255 }
4256
4257 /* Dump the symbol table */
4258 static int
4259 process_symbol_table (file)
4260 FILE * file;
4261 {
4262 Elf32_Internal_Shdr * section;
4263 char nb [4];
4264 char nc [4];
4265 int nbuckets = 0;
4266 int nchains = 0;
4267 int * buckets = NULL;
4268 int * chains = NULL;
4269
4270 if (! do_syms && !do_histogram)
4271 return 1;
4272
4273 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4274 || do_histogram))
4275 {
4276 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4277 {
4278 error (_("Unable to seek to start of dynamic information"));
4279 return 0;
4280 }
4281
4282 if (fread (nb, sizeof (nb), 1, file) != 1)
4283 {
4284 error (_("Failed to read in number of buckets\n"));
4285 return 0;
4286 }
4287
4288 if (fread (nc, sizeof (nc), 1, file) != 1)
4289 {
4290 error (_("Failed to read in number of chains\n"));
4291 return 0;
4292 }
4293
4294 nbuckets = byte_get (nb, 4);
4295 nchains = byte_get (nc, 4);
4296
4297 buckets = get_dynamic_data (file, nbuckets);
4298 chains = get_dynamic_data (file, nchains);
4299
4300 if (buckets == NULL || chains == NULL)
4301 return 0;
4302 }
4303
4304 if (do_syms
4305 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4306 {
4307 int hn;
4308 int si;
4309
4310 printf (_("\nSymbol table for image:\n"));
4311 if (is_32bit_elf)
4312 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4313 else
4314 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4315
4316 for (hn = 0; hn < nbuckets; hn++)
4317 {
4318 if (! buckets [hn])
4319 continue;
4320
4321 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4322 {
4323 Elf_Internal_Sym * psym;
4324
4325 psym = dynamic_symbols + si;
4326
4327 printf (" %3d %3d: ", si, hn);
4328 print_vma (psym->st_value, LONG_HEX);
4329 putchar (' ' );
4330 print_vma (psym->st_size, DEC_5);
4331
4332 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4333 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4334 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4335 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4336 printf (" %s\n", dynamic_strings + psym->st_name);
4337 }
4338 }
4339 }
4340 else if (do_syms && !do_using_dynamic)
4341 {
4342 unsigned int i;
4343
4344 for (i = 0, section = section_headers;
4345 i < elf_header.e_shnum;
4346 i++, section++)
4347 {
4348 unsigned int si;
4349 char * strtab;
4350 Elf_Internal_Sym * symtab;
4351 Elf_Internal_Sym * psym;
4352
4353
4354 if ( section->sh_type != SHT_SYMTAB
4355 && section->sh_type != SHT_DYNSYM)
4356 continue;
4357
4358 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4359 SECTION_NAME (section),
4360 (unsigned long) (section->sh_size / section->sh_entsize));
4361 if (is_32bit_elf)
4362 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4363 else
4364 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4365
4366 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4367 section->sh_size / section->sh_entsize);
4368 if (symtab == NULL)
4369 continue;
4370
4371 if (section->sh_link == elf_header.e_shstrndx)
4372 strtab = string_table;
4373 else
4374 {
4375 Elf32_Internal_Shdr * string_sec;
4376
4377 string_sec = section_headers + section->sh_link;
4378
4379 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4380 strtab, char *, "string table");
4381 }
4382
4383 for (si = 0, psym = symtab;
4384 si < section->sh_size / section->sh_entsize;
4385 si ++, psym ++)
4386 {
4387 printf ("%6d: ", si);
4388 print_vma (psym->st_value, LONG_HEX);
4389 putchar (' ');
4390 print_vma (psym->st_size, DEC_5);
4391 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4392 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4393 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4394 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4395 printf (" %s", strtab + psym->st_name);
4396
4397 if (section->sh_type == SHT_DYNSYM &&
4398 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4399 {
4400 unsigned char data[2];
4401 unsigned short vers_data;
4402 unsigned long offset;
4403 int is_nobits;
4404 int check_def;
4405
4406 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4407 - loadaddr;
4408
4409 GET_DATA (offset + si * sizeof (vers_data), data,
4410 "version data");
4411
4412 vers_data = byte_get (data, 2);
4413
4414 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4415 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4416 : 0;
4417
4418 check_def = (psym->st_shndx != SHN_UNDEF);
4419
4420 if ((vers_data & 0x8000) || vers_data > 1)
4421 {
4422 if (is_nobits || ! check_def)
4423 {
4424 Elf_External_Verneed evn;
4425 Elf_Internal_Verneed ivn;
4426 Elf_Internal_Vernaux ivna;
4427
4428 /* We must test both. */
4429 offset = version_info
4430 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4431
4432 do
4433 {
4434 unsigned long vna_off;
4435
4436 GET_DATA (offset, evn, "version need");
4437
4438 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4439 ivn.vn_next = BYTE_GET (evn.vn_next);
4440
4441 vna_off = offset + ivn.vn_aux;
4442
4443 do
4444 {
4445 Elf_External_Vernaux evna;
4446
4447 GET_DATA (vna_off, evna,
4448 "version need aux (3)");
4449
4450 ivna.vna_other = BYTE_GET (evna.vna_other);
4451 ivna.vna_next = BYTE_GET (evna.vna_next);
4452 ivna.vna_name = BYTE_GET (evna.vna_name);
4453
4454 vna_off += ivna.vna_next;
4455 }
4456 while (ivna.vna_other != vers_data
4457 && ivna.vna_next != 0);
4458
4459 if (ivna.vna_other == vers_data)
4460 break;
4461
4462 offset += ivn.vn_next;
4463 }
4464 while (ivn.vn_next != 0);
4465
4466 if (ivna.vna_other == vers_data)
4467 {
4468 printf ("@%s (%d)",
4469 strtab + ivna.vna_name, ivna.vna_other);
4470 check_def = 0;
4471 }
4472 else if (! is_nobits)
4473 error (_("bad dynamic symbol"));
4474 else
4475 check_def = 1;
4476 }
4477
4478 if (check_def)
4479 {
4480 if (vers_data != 0x8001)
4481 {
4482 Elf_Internal_Verdef ivd;
4483 Elf_Internal_Verdaux ivda;
4484 Elf_External_Verdaux evda;
4485 unsigned long offset;
4486
4487 offset =
4488 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4489 - loadaddr;
4490
4491 do
4492 {
4493 Elf_External_Verdef evd;
4494
4495 GET_DATA (offset, evd, "version def");
4496
4497 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4498 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4499 ivd.vd_next = BYTE_GET (evd.vd_next);
4500
4501 offset += ivd.vd_next;
4502 }
4503 while (ivd.vd_ndx != (vers_data & 0x7fff)
4504 && ivd.vd_next != 0);
4505
4506 offset -= ivd.vd_next;
4507 offset += ivd.vd_aux;
4508
4509 GET_DATA (offset, evda, "version def aux");
4510
4511 ivda.vda_name = BYTE_GET (evda.vda_name);
4512
4513 if (psym->st_name != ivda.vda_name)
4514 printf ((vers_data & 0x8000)
4515 ? "@%s" : "@@%s",
4516 strtab + ivda.vda_name);
4517 }
4518 }
4519 }
4520 }
4521
4522 putchar ('\n');
4523 }
4524
4525 free (symtab);
4526 if (strtab != string_table)
4527 free (strtab);
4528 }
4529 }
4530 else if (do_syms)
4531 printf
4532 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4533
4534 if (do_histogram && buckets != NULL)
4535 {
4536 int *lengths;
4537 int *counts;
4538 int hn;
4539 int si;
4540 int maxlength = 0;
4541 int nzero_counts = 0;
4542 int nsyms = 0;
4543
4544 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4545 nbuckets);
4546 printf (_(" Length Number %% of total Coverage\n"));
4547
4548 lengths = (int *) calloc (nbuckets, sizeof (int));
4549 if (lengths == NULL)
4550 {
4551 error (_("Out of memory"));
4552 return 0;
4553 }
4554 for (hn = 0; hn < nbuckets; ++hn)
4555 {
4556 if (! buckets [hn])
4557 continue;
4558
4559 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4560 {
4561 ++ nsyms;
4562 if (maxlength < ++lengths[hn])
4563 ++ maxlength;
4564 }
4565 }
4566
4567 counts = (int *) calloc (maxlength + 1, sizeof (int));
4568 if (counts == NULL)
4569 {
4570 error (_("Out of memory"));
4571 return 0;
4572 }
4573
4574 for (hn = 0; hn < nbuckets; ++hn)
4575 ++ counts [lengths [hn]];
4576
4577 if (nbuckets > 0)
4578 {
4579 printf (" 0 %-10d (%5.1f%%)\n",
4580 counts[0], (counts[0] * 100.0) / nbuckets);
4581 for (si = 1; si <= maxlength; ++si)
4582 {
4583 nzero_counts += counts[si] * si;
4584 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4585 si, counts[si], (counts[si] * 100.0) / nbuckets,
4586 (nzero_counts * 100.0) / nsyms);
4587 }
4588 }
4589
4590 free (counts);
4591 free (lengths);
4592 }
4593
4594 if (buckets != NULL)
4595 {
4596 free (buckets);
4597 free (chains);
4598 }
4599
4600 return 1;
4601 }
4602
4603 static int
4604 process_syminfo (file)
4605 FILE * file ATTRIBUTE_UNUSED;
4606 {
4607 unsigned int i;
4608
4609 if (dynamic_syminfo == NULL
4610 || !do_dynamic)
4611 /* No syminfo, this is ok. */
4612 return 1;
4613
4614 /* There better should be a dynamic symbol section. */
4615 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4616 return 0;
4617
4618 if (dynamic_addr)
4619 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4620 dynamic_syminfo_offset, dynamic_syminfo_nent);
4621
4622 printf (_(" Num: Name BoundTo Flags\n"));
4623 for (i = 0; i < dynamic_syminfo_nent; ++i)
4624 {
4625 unsigned short int flags = dynamic_syminfo[i].si_flags;
4626
4627 printf ("%4d: %-30s ", i,
4628 dynamic_strings + dynamic_symbols[i].st_name);
4629
4630 switch (dynamic_syminfo[i].si_boundto)
4631 {
4632 case SYMINFO_BT_SELF:
4633 fputs ("SELF ", stdout);
4634 break;
4635 case SYMINFO_BT_PARENT:
4636 fputs ("PARENT ", stdout);
4637 break;
4638 default:
4639 if (dynamic_syminfo[i].si_boundto > 0
4640 && dynamic_syminfo[i].si_boundto < dynamic_size)
4641 printf ("%-10s ",
4642 dynamic_strings
4643 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4644 else
4645 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4646 break;
4647 }
4648
4649 if (flags & SYMINFO_FLG_DIRECT)
4650 printf (" DIRECT");
4651 if (flags & SYMINFO_FLG_PASSTHRU)
4652 printf (" PASSTHRU");
4653 if (flags & SYMINFO_FLG_COPY)
4654 printf (" COPY");
4655 if (flags & SYMINFO_FLG_LAZYLOAD)
4656 printf (" LAZYLOAD");
4657
4658 puts ("");
4659 }
4660
4661 return 1;
4662 }
4663
4664 #ifdef SUPPORT_DISASSEMBLY
4665 static void
4666 disassemble_section (section, file)
4667 Elf32_Internal_Shdr * section;
4668 FILE * file;
4669 {
4670 printf (_("\nAssembly dump of section %s\n"),
4671 SECTION_NAME (section));
4672
4673 /* XXX -- to be done --- XXX */
4674
4675 return 1;
4676 }
4677 #endif
4678
4679 static int
4680 dump_section (section, file)
4681 Elf32_Internal_Shdr * section;
4682 FILE * file;
4683 {
4684 bfd_size_type bytes;
4685 bfd_vma addr;
4686 unsigned char * data;
4687 unsigned char * start;
4688
4689 bytes = section->sh_size;
4690
4691 if (bytes == 0)
4692 {
4693 printf (_("\nSection '%s' has no data to dump.\n"),
4694 SECTION_NAME (section));
4695 return 0;
4696 }
4697 else
4698 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4699
4700 addr = section->sh_addr;
4701
4702 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4703 "section data");
4704
4705 data = start;
4706
4707 while (bytes)
4708 {
4709 int j;
4710 int k;
4711 int lbytes;
4712
4713 lbytes = (bytes > 16 ? 16 : bytes);
4714
4715 printf (" 0x%8.8lx ", (unsigned long) addr);
4716
4717 switch (elf_header.e_ident [EI_DATA])
4718 {
4719 default:
4720 case ELFDATA2LSB:
4721 for (j = 15; j >= 0; j --)
4722 {
4723 if (j < lbytes)
4724 printf ("%2.2x", data [j]);
4725 else
4726 printf (" ");
4727
4728 if (!(j & 0x3))
4729 printf (" ");
4730 }
4731 break;
4732
4733 case ELFDATA2MSB:
4734 for (j = 0; j < 16; j++)
4735 {
4736 if (j < lbytes)
4737 printf ("%2.2x", data [j]);
4738 else
4739 printf (" ");
4740
4741 if ((j & 3) == 3)
4742 printf (" ");
4743 }
4744 break;
4745 }
4746
4747 for (j = 0; j < lbytes; j++)
4748 {
4749 k = data [j];
4750 if (k >= ' ' && k < 0x80)
4751 printf ("%c", k);
4752 else
4753 printf (".");
4754 }
4755
4756 putchar ('\n');
4757
4758 data += lbytes;
4759 addr += lbytes;
4760 bytes -= lbytes;
4761 }
4762
4763 free (start);
4764
4765 return 1;
4766 }
4767
4768
4769 static unsigned long int
4770 read_leb128 (data, length_return, sign)
4771 unsigned char * data;
4772 int * length_return;
4773 int sign;
4774 {
4775 unsigned long int result = 0;
4776 unsigned int num_read = 0;
4777 int shift = 0;
4778 unsigned char byte;
4779
4780 do
4781 {
4782 byte = * data ++;
4783 num_read ++;
4784
4785 result |= (byte & 0x7f) << shift;
4786
4787 shift += 7;
4788
4789 }
4790 while (byte & 0x80);
4791
4792 if (length_return != NULL)
4793 * length_return = num_read;
4794
4795 if (sign && (shift < 32) && (byte & 0x40))
4796 result |= -1 << shift;
4797
4798 return result;
4799 }
4800
4801 typedef struct State_Machine_Registers
4802 {
4803 unsigned long address;
4804 unsigned int file;
4805 unsigned int line;
4806 unsigned int column;
4807 int is_stmt;
4808 int basic_block;
4809 int end_sequence;
4810 /* This variable hold the number of the last entry seen
4811 in the File Table. */
4812 unsigned int last_file_entry;
4813 } SMR;
4814
4815 static SMR state_machine_regs;
4816
4817 static void
4818 reset_state_machine (is_stmt)
4819 int is_stmt;
4820 {
4821 state_machine_regs.address = 0;
4822 state_machine_regs.file = 1;
4823 state_machine_regs.line = 1;
4824 state_machine_regs.column = 0;
4825 state_machine_regs.is_stmt = is_stmt;
4826 state_machine_regs.basic_block = 0;
4827 state_machine_regs.end_sequence = 0;
4828 state_machine_regs.last_file_entry = 0;
4829 }
4830
4831 /* Handled an extend line op. Returns true if this is the end
4832 of sequence. */
4833 static int
4834 process_extended_line_op (data, is_stmt, pointer_size)
4835 unsigned char * data;
4836 int is_stmt;
4837 int pointer_size;
4838 {
4839 unsigned char op_code;
4840 int bytes_read;
4841 unsigned int len;
4842 unsigned char * name;
4843 unsigned long adr;
4844
4845 len = read_leb128 (data, & bytes_read, 0);
4846 data += bytes_read;
4847
4848 if (len == 0)
4849 {
4850 warn (_("badly formed extended line op encountered!"));
4851 return bytes_read;
4852 }
4853
4854 len += bytes_read;
4855 op_code = * data ++;
4856
4857 printf (_(" Extended opcode %d: "), op_code);
4858
4859 switch (op_code)
4860 {
4861 case DW_LNE_end_sequence:
4862 printf (_("End of Sequence\n\n"));
4863 reset_state_machine (is_stmt);
4864 break;
4865
4866 case DW_LNE_set_address:
4867 adr = byte_get (data, pointer_size);
4868 printf (_("set Address to 0x%lx\n"), adr);
4869 state_machine_regs.address = adr;
4870 break;
4871
4872 case DW_LNE_define_file:
4873 printf (_(" define new File Table entry\n"));
4874 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4875
4876 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4877 name = data;
4878 data += strlen (data) + 1;
4879 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4880 data += bytes_read;
4881 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4882 data += bytes_read;
4883 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4884 printf (_("%s\n\n"), name);
4885 break;
4886
4887 default:
4888 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4889 break;
4890 }
4891
4892 return len;
4893 }
4894
4895 /* Size of pointers in the .debug_line section. This information is not
4896 really present in that section. It's obtained before dumping the debug
4897 sections by doing some pre-scan of the .debug_info section. */
4898 static int debug_line_pointer_size = 4;
4899
4900 static int
4901 display_debug_lines (section, start, file)
4902 Elf32_Internal_Shdr * section;
4903 unsigned char * start;
4904 FILE * file ATTRIBUTE_UNUSED;
4905 {
4906 DWARF2_External_LineInfo * external;
4907 DWARF2_Internal_LineInfo info;
4908 unsigned char * standard_opcodes;
4909 unsigned char * data = start;
4910 unsigned char * end = start + section->sh_size;
4911 unsigned char * end_of_sequence;
4912 int i;
4913
4914 printf (_("\nDump of debug contents of section %s:\n\n"),
4915 SECTION_NAME (section));
4916
4917 while (data < end)
4918 {
4919 external = (DWARF2_External_LineInfo *) data;
4920
4921 /* Check the length of the block. */
4922 info.li_length = BYTE_GET (external->li_length);
4923 if (info.li_length > section->sh_size)
4924 {
4925 warn
4926 (_("The line info appears to be corrupt - the section is too small\n"));
4927 return 0;
4928 }
4929
4930 /* Check its version number. */
4931 info.li_version = BYTE_GET (external->li_version);
4932 if (info.li_version != 2)
4933 {
4934 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4935 return 0;
4936 }
4937
4938 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
4939 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
4940 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
4941 info.li_line_base = BYTE_GET (external->li_line_base);
4942 info.li_line_range = BYTE_GET (external->li_line_range);
4943 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
4944
4945 /* Sign extend the line base field. */
4946 info.li_line_base <<= 24;
4947 info.li_line_base >>= 24;
4948
4949 printf (_(" Length: %ld\n"), info.li_length);
4950 printf (_(" DWARF Version: %d\n"), info.li_version);
4951 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
4952 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
4953 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
4954 printf (_(" Line Base: %d\n"), info.li_line_base);
4955 printf (_(" Line Range: %d\n"), info.li_line_range);
4956 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
4957
4958 end_of_sequence = data + info.li_length + sizeof (info.li_length);
4959
4960 reset_state_machine (info.li_default_is_stmt);
4961
4962 /* Display the contents of the Opcodes table. */
4963 standard_opcodes = data + sizeof (* external);
4964
4965 printf (_("\n Opcodes:\n"));
4966
4967 for (i = 1; i < info.li_opcode_base; i++)
4968 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
4969
4970 /* Display the contents of the Directory table. */
4971 data = standard_opcodes + info.li_opcode_base - 1;
4972
4973 if (* data == 0)
4974 printf (_("\n The Directory Table is empty.\n"));
4975 else
4976 {
4977 printf (_("\n The Directory Table:\n"));
4978
4979 while (* data != 0)
4980 {
4981 printf (_(" %s\n"), data);
4982
4983 data += strlen (data) + 1;
4984 }
4985 }
4986
4987 /* Skip the NUL at the end of the table. */
4988 data ++;
4989
4990 /* Display the contents of the File Name table. */
4991 if (* data == 0)
4992 printf (_("\n The File Name Table is empty.\n"));
4993 else
4994 {
4995 printf (_("\n The File Name Table:\n"));
4996 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4997
4998 while (* data != 0)
4999 {
5000 char * name;
5001 int bytes_read;
5002
5003 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5004 name = data;
5005
5006 data += strlen (data) + 1;
5007
5008 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5009 data += bytes_read;
5010 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5011 data += bytes_read;
5012 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5013 data += bytes_read;
5014 printf (_("%s\n"), name);
5015 }
5016 }
5017
5018 /* Skip the NUL at the end of the table. */
5019 data ++;
5020
5021 /* Now display the statements. */
5022 printf (_("\n Line Number Statements:\n"));
5023
5024
5025 while (data < end_of_sequence)
5026 {
5027 unsigned char op_code;
5028 int adv;
5029 int bytes_read;
5030
5031 op_code = * data ++;
5032
5033 switch (op_code)
5034 {
5035 case DW_LNS_extended_op:
5036 data += process_extended_line_op (data, info.li_default_is_stmt,
5037 debug_line_pointer_size);
5038 break;
5039
5040 case DW_LNS_copy:
5041 printf (_(" Copy\n"));
5042 break;
5043
5044 case DW_LNS_advance_pc:
5045 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5046 data += bytes_read;
5047 state_machine_regs.address += adv;
5048 printf (_(" Advance PC by %d to %lx\n"), adv,
5049 state_machine_regs.address);
5050 break;
5051
5052 case DW_LNS_advance_line:
5053 adv = read_leb128 (data, & bytes_read, 1);
5054 data += bytes_read;
5055 state_machine_regs.line += adv;
5056 printf (_(" Advance Line by %d to %d\n"), adv,
5057 state_machine_regs.line);
5058 break;
5059
5060 case DW_LNS_set_file:
5061 adv = read_leb128 (data, & bytes_read, 0);
5062 data += bytes_read;
5063 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5064 adv);
5065 state_machine_regs.file = adv;
5066 break;
5067
5068 case DW_LNS_set_column:
5069 adv = read_leb128 (data, & bytes_read, 0);
5070 data += bytes_read;
5071 printf (_(" Set column to %d\n"), adv);
5072 state_machine_regs.column = adv;
5073 break;
5074
5075 case DW_LNS_negate_stmt:
5076 adv = state_machine_regs.is_stmt;
5077 adv = ! adv;
5078 printf (_(" Set is_stmt to %d\n"), adv);
5079 state_machine_regs.is_stmt = adv;
5080 break;
5081
5082 case DW_LNS_set_basic_block:
5083 printf (_(" Set basic block\n"));
5084 state_machine_regs.basic_block = 1;
5085 break;
5086
5087 case DW_LNS_const_add_pc:
5088 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5089 * info.li_min_insn_length);
5090 state_machine_regs.address += adv;
5091 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5092 state_machine_regs.address);
5093 break;
5094
5095 case DW_LNS_fixed_advance_pc:
5096 adv = byte_get (data, 2);
5097 data += 2;
5098 state_machine_regs.address += adv;
5099 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5100 adv, state_machine_regs.address);
5101 break;
5102
5103 default:
5104 op_code -= info.li_opcode_base;
5105 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5106 state_machine_regs.address += adv;
5107 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5108 op_code, adv, state_machine_regs.address);
5109 adv = (op_code % info.li_line_range) + info.li_line_base;
5110 state_machine_regs.line += adv;
5111 printf (_(" and Line by %d to %d\n"),
5112 adv, state_machine_regs.line);
5113 break;
5114 }
5115 }
5116 printf ("\n");
5117 }
5118
5119 return 1;
5120 }
5121
5122 static int
5123 display_debug_pubnames (section, start, file)
5124 Elf32_Internal_Shdr * section;
5125 unsigned char * start;
5126 FILE * file ATTRIBUTE_UNUSED;
5127 {
5128 DWARF2_External_PubNames * external;
5129 DWARF2_Internal_PubNames pubnames;
5130 unsigned char * end;
5131
5132 end = start + section->sh_size;
5133
5134 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5135
5136 while (start < end)
5137 {
5138 unsigned char * data;
5139 unsigned long offset;
5140
5141 external = (DWARF2_External_PubNames *) start;
5142
5143 pubnames.pn_length = BYTE_GET (external->pn_length);
5144 pubnames.pn_version = BYTE_GET (external->pn_version);
5145 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5146 pubnames.pn_size = BYTE_GET (external->pn_size);
5147
5148 data = start + sizeof (* external);
5149 start += pubnames.pn_length + sizeof (external->pn_length);
5150
5151 if (pubnames.pn_version != 2)
5152 {
5153 warn (_("Only DWARF 2 pubnames are currently supported"));
5154 continue;
5155 }
5156
5157 printf (_(" Length: %ld\n"),
5158 pubnames.pn_length);
5159 printf (_(" Version: %d\n"),
5160 pubnames.pn_version);
5161 printf (_(" Offset into .debug_info section: %ld\n"),
5162 pubnames.pn_offset);
5163 printf (_(" Size of area in .debug_info section: %ld\n"),
5164 pubnames.pn_size);
5165
5166 printf (_("\n Offset\tName\n"));
5167
5168 do
5169 {
5170 offset = byte_get (data, 4);
5171
5172 if (offset != 0)
5173 {
5174 data += 4;
5175 printf (" %ld\t\t%s\n", offset, data);
5176 data += strlen (data) + 1;
5177 }
5178 }
5179 while (offset != 0);
5180 }
5181
5182 printf ("\n");
5183 return 1;
5184 }
5185
5186 static char *
5187 get_TAG_name (tag)
5188 unsigned long tag;
5189 {
5190 switch (tag)
5191 {
5192 case DW_TAG_padding: return "DW_TAG_padding";
5193 case DW_TAG_array_type: return "DW_TAG_array_type";
5194 case DW_TAG_class_type: return "DW_TAG_class_type";
5195 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5196 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5197 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5198 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5199 case DW_TAG_label: return "DW_TAG_label";
5200 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5201 case DW_TAG_member: return "DW_TAG_member";
5202 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5203 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5204 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5205 case DW_TAG_string_type: return "DW_TAG_string_type";
5206 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5207 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5208 case DW_TAG_typedef: return "DW_TAG_typedef";
5209 case DW_TAG_union_type: return "DW_TAG_union_type";
5210 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5211 case DW_TAG_variant: return "DW_TAG_variant";
5212 case DW_TAG_common_block: return "DW_TAG_common_block";
5213 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5214 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5215 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5216 case DW_TAG_module: return "DW_TAG_module";
5217 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5218 case DW_TAG_set_type: return "DW_TAG_set_type";
5219 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5220 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5221 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5222 case DW_TAG_base_type: return "DW_TAG_base_type";
5223 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5224 case DW_TAG_const_type: return "DW_TAG_const_type";
5225 case DW_TAG_constant: return "DW_TAG_constant";
5226 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5227 case DW_TAG_file_type: return "DW_TAG_file_type";
5228 case DW_TAG_friend: return "DW_TAG_friend";
5229 case DW_TAG_namelist: return "DW_TAG_namelist";
5230 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5231 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5232 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5233 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5234 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5235 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5236 case DW_TAG_try_block: return "DW_TAG_try_block";
5237 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5238 case DW_TAG_variable: return "DW_TAG_variable";
5239 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5240 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5241 case DW_TAG_format_label: return "DW_TAG_format_label";
5242 case DW_TAG_function_template: return "DW_TAG_function_template";
5243 case DW_TAG_class_template: return "DW_TAG_class_template";
5244 default:
5245 {
5246 static char buffer [100];
5247
5248 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5249 return buffer;
5250 }
5251 }
5252 }
5253
5254 static char *
5255 get_AT_name (attribute)
5256 unsigned long attribute;
5257 {
5258 switch (attribute)
5259 {
5260 case DW_AT_sibling: return "DW_AT_sibling";
5261 case DW_AT_location: return "DW_AT_location";
5262 case DW_AT_name: return "DW_AT_name";
5263 case DW_AT_ordering: return "DW_AT_ordering";
5264 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5265 case DW_AT_byte_size: return "DW_AT_byte_size";
5266 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5267 case DW_AT_bit_size: return "DW_AT_bit_size";
5268 case DW_AT_element_list: return "DW_AT_element_list";
5269 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5270 case DW_AT_low_pc: return "DW_AT_low_pc";
5271 case DW_AT_high_pc: return "DW_AT_high_pc";
5272 case DW_AT_language: return "DW_AT_language";
5273 case DW_AT_member: return "DW_AT_member";
5274 case DW_AT_discr: return "DW_AT_discr";
5275 case DW_AT_discr_value: return "DW_AT_discr_value";
5276 case DW_AT_visibility: return "DW_AT_visibility";
5277 case DW_AT_import: return "DW_AT_import";
5278 case DW_AT_string_length: return "DW_AT_string_length";
5279 case DW_AT_common_reference: return "DW_AT_common_reference";
5280 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5281 case DW_AT_const_value: return "DW_AT_const_value";
5282 case DW_AT_containing_type: return "DW_AT_containing_type";
5283 case DW_AT_default_value: return "DW_AT_default_value";
5284 case DW_AT_inline: return "DW_AT_inline";
5285 case DW_AT_is_optional: return "DW_AT_is_optional";
5286 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5287 case DW_AT_producer: return "DW_AT_producer";
5288 case DW_AT_prototyped: return "DW_AT_prototyped";
5289 case DW_AT_return_addr: return "DW_AT_return_addr";
5290 case DW_AT_start_scope: return "DW_AT_start_scope";
5291 case DW_AT_stride_size: return "DW_AT_stride_size";
5292 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5293 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5294 case DW_AT_accessibility: return "DW_AT_accessibility";
5295 case DW_AT_address_class: return "DW_AT_address_class";
5296 case DW_AT_artificial: return "DW_AT_artificial";
5297 case DW_AT_base_types: return "DW_AT_base_types";
5298 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5299 case DW_AT_count: return "DW_AT_count";
5300 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5301 case DW_AT_decl_column: return "DW_AT_decl_column";
5302 case DW_AT_decl_file: return "DW_AT_decl_file";
5303 case DW_AT_decl_line: return "DW_AT_decl_line";
5304 case DW_AT_declaration: return "DW_AT_declaration";
5305 case DW_AT_discr_list: return "DW_AT_discr_list";
5306 case DW_AT_encoding: return "DW_AT_encoding";
5307 case DW_AT_external: return "DW_AT_external";
5308 case DW_AT_frame_base: return "DW_AT_frame_base";
5309 case DW_AT_friend: return "DW_AT_friend";
5310 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5311 case DW_AT_macro_info: return "DW_AT_macro_info";
5312 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5313 case DW_AT_priority: return "DW_AT_priority";
5314 case DW_AT_segment: return "DW_AT_segment";
5315 case DW_AT_specification: return "DW_AT_specification";
5316 case DW_AT_static_link: return "DW_AT_static_link";
5317 case DW_AT_type: return "DW_AT_type";
5318 case DW_AT_use_location: return "DW_AT_use_location";
5319 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5320 case DW_AT_virtuality: return "DW_AT_virtuality";
5321 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5322 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5323 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5324 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5325 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5326 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5327 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5328 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5329 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5330 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5331 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5332 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5333 case DW_AT_sf_names: return "DW_AT_sf_names";
5334 case DW_AT_src_info: return "DW_AT_src_info";
5335 case DW_AT_mac_info: return "DW_AT_mac_info";
5336 case DW_AT_src_coords: return "DW_AT_src_coords";
5337 case DW_AT_body_begin: return "DW_AT_body_begin";
5338 case DW_AT_body_end: return "DW_AT_body_end";
5339 default:
5340 {
5341 static char buffer [100];
5342
5343 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5344 return buffer;
5345 }
5346 }
5347 }
5348
5349 static char *
5350 get_FORM_name (form)
5351 unsigned long form;
5352 {
5353 switch (form)
5354 {
5355 case DW_FORM_addr: return "DW_FORM_addr";
5356 case DW_FORM_block2: return "DW_FORM_block2";
5357 case DW_FORM_block4: return "DW_FORM_block4";
5358 case DW_FORM_data2: return "DW_FORM_data2";
5359 case DW_FORM_data4: return "DW_FORM_data4";
5360 case DW_FORM_data8: return "DW_FORM_data8";
5361 case DW_FORM_string: return "DW_FORM_string";
5362 case DW_FORM_block: return "DW_FORM_block";
5363 case DW_FORM_block1: return "DW_FORM_block1";
5364 case DW_FORM_data1: return "DW_FORM_data1";
5365 case DW_FORM_flag: return "DW_FORM_flag";
5366 case DW_FORM_sdata: return "DW_FORM_sdata";
5367 case DW_FORM_strp: return "DW_FORM_strp";
5368 case DW_FORM_udata: return "DW_FORM_udata";
5369 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5370 case DW_FORM_ref1: return "DW_FORM_ref1";
5371 case DW_FORM_ref2: return "DW_FORM_ref2";
5372 case DW_FORM_ref4: return "DW_FORM_ref4";
5373 case DW_FORM_ref8: return "DW_FORM_ref8";
5374 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5375 case DW_FORM_indirect: return "DW_FORM_indirect";
5376 default:
5377 {
5378 static char buffer [100];
5379
5380 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5381 return buffer;
5382 }
5383 }
5384 }
5385
5386 /* FIXME: There are better and more effiecint ways to handle
5387 these structures. For now though, I just want something that
5388 is simple to implement. */
5389 typedef struct abbrev_attr
5390 {
5391 unsigned long attribute;
5392 unsigned long form;
5393 struct abbrev_attr * next;
5394 }
5395 abbrev_attr;
5396
5397 typedef struct abbrev_entry
5398 {
5399 unsigned long entry;
5400 unsigned long tag;
5401 int children;
5402 struct abbrev_attr * first_attr;
5403 struct abbrev_attr * last_attr;
5404 struct abbrev_entry * next;
5405 }
5406 abbrev_entry;
5407
5408 static abbrev_entry * first_abbrev = NULL;
5409 static abbrev_entry * last_abbrev = NULL;
5410
5411 static void
5412 free_abbrevs PARAMS ((void))
5413 {
5414 abbrev_entry * abbrev;
5415
5416 for (abbrev = first_abbrev; abbrev;)
5417 {
5418 abbrev_entry * next = abbrev->next;
5419 abbrev_attr * attr;
5420
5421 for (attr = abbrev->first_attr; attr;)
5422 {
5423 abbrev_attr * next = attr->next;
5424
5425 free (attr);
5426 attr = next;
5427 }
5428
5429 free (abbrev);
5430 abbrev = next;
5431 }
5432
5433 last_abbrev = first_abbrev = NULL;
5434 }
5435
5436 static void
5437 add_abbrev (number, tag, children)
5438 unsigned long number;
5439 unsigned long tag;
5440 int children;
5441 {
5442 abbrev_entry * entry;
5443
5444 entry = (abbrev_entry *) malloc (sizeof (* entry));
5445
5446 if (entry == NULL)
5447 /* ugg */
5448 return;
5449
5450 entry->entry = number;
5451 entry->tag = tag;
5452 entry->children = children;
5453 entry->first_attr = NULL;
5454 entry->last_attr = NULL;
5455 entry->next = NULL;
5456
5457 if (first_abbrev == NULL)
5458 first_abbrev = entry;
5459 else
5460 last_abbrev->next = entry;
5461
5462 last_abbrev = entry;
5463 }
5464
5465 static void
5466 add_abbrev_attr (attribute, form)
5467 unsigned long attribute;
5468 unsigned long form;
5469 {
5470 abbrev_attr * attr;
5471
5472 attr = (abbrev_attr *) malloc (sizeof (* attr));
5473
5474 if (attr == NULL)
5475 /* ugg */
5476 return;
5477
5478 attr->attribute = attribute;
5479 attr->form = form;
5480 attr->next = NULL;
5481
5482 if (last_abbrev->first_attr == NULL)
5483 last_abbrev->first_attr = attr;
5484 else
5485 last_abbrev->last_attr->next = attr;
5486
5487 last_abbrev->last_attr = attr;
5488 }
5489
5490 /* Processes the (partial) contents of a .debug_abbrev section.
5491 Returns NULL if the end of the section was encountered.
5492 Returns the address after the last byte read if the end of
5493 an abbreviation set was found. */
5494
5495 static unsigned char *
5496 process_abbrev_section (start, end)
5497 unsigned char * start;
5498 unsigned char * end;
5499 {
5500 if (first_abbrev != NULL)
5501 return NULL;
5502
5503 while (start < end)
5504 {
5505 int bytes_read;
5506 unsigned long entry;
5507 unsigned long tag;
5508 unsigned long attribute;
5509 int children;
5510
5511 entry = read_leb128 (start, & bytes_read, 0);
5512 start += bytes_read;
5513
5514 /* A single zero is supposed to end the section according
5515 to the standard. If there's more, then signal that to
5516 the caller. */
5517 if (entry == 0)
5518 return start == end ? NULL : start;
5519
5520 tag = read_leb128 (start, & bytes_read, 0);
5521 start += bytes_read;
5522
5523 children = * start ++;
5524
5525 add_abbrev (entry, tag, children);
5526
5527 do
5528 {
5529 unsigned long form;
5530
5531 attribute = read_leb128 (start, & bytes_read, 0);
5532 start += bytes_read;
5533
5534 form = read_leb128 (start, & bytes_read, 0);
5535 start += bytes_read;
5536
5537 if (attribute != 0)
5538 add_abbrev_attr (attribute, form);
5539 }
5540 while (attribute != 0);
5541 }
5542
5543 return NULL;
5544 }
5545
5546
5547 static int
5548 display_debug_abbrev (section, start, file)
5549 Elf32_Internal_Shdr * section;
5550 unsigned char * start;
5551 FILE * file ATTRIBUTE_UNUSED;
5552 {
5553 abbrev_entry * entry;
5554 unsigned char * end = start + section->sh_size;
5555
5556 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5557
5558 do
5559 {
5560 start = process_abbrev_section (start, end);
5561
5562 printf (_(" Number TAG\n"));
5563
5564 for (entry = first_abbrev; entry; entry = entry->next)
5565 {
5566 abbrev_attr * attr;
5567
5568 printf (_(" %ld %s [%s]\n"),
5569 entry->entry,
5570 get_TAG_name (entry->tag),
5571 entry->children ? _("has children") : _("no children"));
5572
5573 for (attr = entry->first_attr; attr; attr = attr->next)
5574 {
5575 printf (_(" %-18s %s\n"),
5576 get_AT_name (attr->attribute),
5577 get_FORM_name (attr->form));
5578 }
5579 }
5580 }
5581 while (start);
5582
5583 printf ("\n");
5584
5585 return 1;
5586 }
5587
5588
5589 static unsigned char *
5590 display_block (data, length)
5591 unsigned char * data;
5592 unsigned long length;
5593 {
5594 printf (_(" %lu byte block: "), length);
5595
5596 while (length --)
5597 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5598
5599 return data;
5600 }
5601
5602 static void
5603 decode_location_expression (data, pointer_size, length)
5604 unsigned char * data;
5605 unsigned int pointer_size;
5606 unsigned long length;
5607 {
5608 unsigned op;
5609 int bytes_read;
5610 unsigned long uvalue;
5611 unsigned char *end = data + length;
5612
5613 while (data < end)
5614 {
5615 op = * data ++;
5616
5617 switch (op)
5618 {
5619 case DW_OP_addr:
5620 printf ("DW_OP_addr: %lx",
5621 (unsigned long) byte_get (data, pointer_size));
5622 data += pointer_size;
5623 break;
5624 case DW_OP_deref:
5625 printf ("DW_OP_deref");
5626 break;
5627 case DW_OP_const1u:
5628 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
5629 break;
5630 case DW_OP_const1s:
5631 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
5632 break;
5633 case DW_OP_const2u:
5634 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5635 data += 2;
5636 break;
5637 case DW_OP_const2s:
5638 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5639 data += 2;
5640 break;
5641 case DW_OP_const4u:
5642 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5643 data += 4;
5644 break;
5645 case DW_OP_const4s:
5646 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5647 data += 4;
5648 break;
5649 case DW_OP_const8u:
5650 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5651 (unsigned long) byte_get (data + 4, 4));
5652 data += 8;
5653 break;
5654 case DW_OP_const8s:
5655 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5656 (long) byte_get (data + 4, 4));
5657 data += 8;
5658 break;
5659 case DW_OP_constu:
5660 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
5661 data += bytes_read;
5662 break;
5663 case DW_OP_consts:
5664 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
5665 data += bytes_read;
5666 break;
5667 case DW_OP_dup:
5668 printf ("DW_OP_dup");
5669 break;
5670 case DW_OP_drop:
5671 printf ("DW_OP_drop");
5672 break;
5673 case DW_OP_over:
5674 printf ("DW_OP_over");
5675 break;
5676 case DW_OP_pick:
5677 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
5678 break;
5679 case DW_OP_swap:
5680 printf ("DW_OP_swap");
5681 break;
5682 case DW_OP_rot:
5683 printf ("DW_OP_rot");
5684 break;
5685 case DW_OP_xderef:
5686 printf ("DW_OP_xderef");
5687 break;
5688 case DW_OP_abs:
5689 printf ("DW_OP_abs");
5690 break;
5691 case DW_OP_and:
5692 printf ("DW_OP_and");
5693 break;
5694 case DW_OP_div:
5695 printf ("DW_OP_div");
5696 break;
5697 case DW_OP_minus:
5698 printf ("DW_OP_minus");
5699 break;
5700 case DW_OP_mod:
5701 printf ("DW_OP_mod");
5702 break;
5703 case DW_OP_mul:
5704 printf ("DW_OP_mul");
5705 break;
5706 case DW_OP_neg:
5707 printf ("DW_OP_neg");
5708 break;
5709 case DW_OP_not:
5710 printf ("DW_OP_not");
5711 break;
5712 case DW_OP_or:
5713 printf ("DW_OP_or");
5714 break;
5715 case DW_OP_plus:
5716 printf ("DW_OP_plus");
5717 break;
5718 case DW_OP_plus_uconst:
5719 printf ("DW_OP_plus_uconst: %lu",
5720 read_leb128 (data, &bytes_read, 0));
5721 data += bytes_read;
5722 break;
5723 case DW_OP_shl:
5724 printf ("DW_OP_shl");
5725 break;
5726 case DW_OP_shr:
5727 printf ("DW_OP_shr");
5728 break;
5729 case DW_OP_shra:
5730 printf ("DW_OP_shra");
5731 break;
5732 case DW_OP_xor:
5733 printf ("DW_OP_xor");
5734 break;
5735 case DW_OP_bra:
5736 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5737 data += 2;
5738 break;
5739 case DW_OP_eq:
5740 printf ("DW_OP_eq");
5741 break;
5742 case DW_OP_ge:
5743 printf ("DW_OP_ge");
5744 break;
5745 case DW_OP_gt:
5746 printf ("DW_OP_gt");
5747 break;
5748 case DW_OP_le:
5749 printf ("DW_OP_le");
5750 break;
5751 case DW_OP_lt:
5752 printf ("DW_OP_lt");
5753 break;
5754 case DW_OP_ne:
5755 printf ("DW_OP_ne");
5756 break;
5757 case DW_OP_skip:
5758 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5759 data += 2;
5760 break;
5761
5762 case DW_OP_lit0:
5763 case DW_OP_lit1:
5764 case DW_OP_lit2:
5765 case DW_OP_lit3:
5766 case DW_OP_lit4:
5767 case DW_OP_lit5:
5768 case DW_OP_lit6:
5769 case DW_OP_lit7:
5770 case DW_OP_lit8:
5771 case DW_OP_lit9:
5772 case DW_OP_lit10:
5773 case DW_OP_lit11:
5774 case DW_OP_lit12:
5775 case DW_OP_lit13:
5776 case DW_OP_lit14:
5777 case DW_OP_lit15:
5778 case DW_OP_lit16:
5779 case DW_OP_lit17:
5780 case DW_OP_lit18:
5781 case DW_OP_lit19:
5782 case DW_OP_lit20:
5783 case DW_OP_lit21:
5784 case DW_OP_lit22:
5785 case DW_OP_lit23:
5786 case DW_OP_lit24:
5787 case DW_OP_lit25:
5788 case DW_OP_lit26:
5789 case DW_OP_lit27:
5790 case DW_OP_lit28:
5791 case DW_OP_lit29:
5792 case DW_OP_lit30:
5793 case DW_OP_lit31:
5794 printf ("DW_OP_lit%d", op - DW_OP_lit0);
5795 break;
5796
5797 case DW_OP_reg0:
5798 case DW_OP_reg1:
5799 case DW_OP_reg2:
5800 case DW_OP_reg3:
5801 case DW_OP_reg4:
5802 case DW_OP_reg5:
5803 case DW_OP_reg6:
5804 case DW_OP_reg7:
5805 case DW_OP_reg8:
5806 case DW_OP_reg9:
5807 case DW_OP_reg10:
5808 case DW_OP_reg11:
5809 case DW_OP_reg12:
5810 case DW_OP_reg13:
5811 case DW_OP_reg14:
5812 case DW_OP_reg15:
5813 case DW_OP_reg16:
5814 case DW_OP_reg17:
5815 case DW_OP_reg18:
5816 case DW_OP_reg19:
5817 case DW_OP_reg20:
5818 case DW_OP_reg21:
5819 case DW_OP_reg22:
5820 case DW_OP_reg23:
5821 case DW_OP_reg24:
5822 case DW_OP_reg25:
5823 case DW_OP_reg26:
5824 case DW_OP_reg27:
5825 case DW_OP_reg28:
5826 case DW_OP_reg29:
5827 case DW_OP_reg30:
5828 case DW_OP_reg31:
5829 printf ("DW_OP_reg%d", op - DW_OP_reg0);
5830 break;
5831
5832 case DW_OP_breg0:
5833 case DW_OP_breg1:
5834 case DW_OP_breg2:
5835 case DW_OP_breg3:
5836 case DW_OP_breg4:
5837 case DW_OP_breg5:
5838 case DW_OP_breg6:
5839 case DW_OP_breg7:
5840 case DW_OP_breg8:
5841 case DW_OP_breg9:
5842 case DW_OP_breg10:
5843 case DW_OP_breg11:
5844 case DW_OP_breg12:
5845 case DW_OP_breg13:
5846 case DW_OP_breg14:
5847 case DW_OP_breg15:
5848 case DW_OP_breg16:
5849 case DW_OP_breg17:
5850 case DW_OP_breg18:
5851 case DW_OP_breg19:
5852 case DW_OP_breg20:
5853 case DW_OP_breg21:
5854 case DW_OP_breg22:
5855 case DW_OP_breg23:
5856 case DW_OP_breg24:
5857 case DW_OP_breg25:
5858 case DW_OP_breg26:
5859 case DW_OP_breg27:
5860 case DW_OP_breg28:
5861 case DW_OP_breg29:
5862 case DW_OP_breg30:
5863 case DW_OP_breg31:
5864 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
5865 read_leb128 (data, &bytes_read, 1));
5866 data += bytes_read;
5867 break;
5868
5869 case DW_OP_regx:
5870 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
5871 data += bytes_read;
5872 break;
5873 case DW_OP_fbreg:
5874 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
5875 data += bytes_read;
5876 break;
5877 case DW_OP_bregx:
5878 uvalue = read_leb128 (data, &bytes_read, 0);
5879 data += bytes_read;
5880 printf ("DW_OP_bregx: %lu %ld", uvalue,
5881 read_leb128 (data, &bytes_read, 1));
5882 data += bytes_read;
5883 break;
5884 case DW_OP_piece:
5885 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
5886 data += bytes_read;
5887 break;
5888 case DW_OP_deref_size:
5889 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
5890 break;
5891 case DW_OP_xderef_size:
5892 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
5893 break;
5894 case DW_OP_nop:
5895 printf ("DW_OP_nop");
5896 break;
5897
5898 default:
5899 if (op >= DW_OP_lo_user
5900 && op <= DW_OP_hi_user)
5901 printf (_("(User defined location op)"));
5902 else
5903 printf (_("(Unknown location op)"));
5904 /* No way to tell where the next op is, so just bail. */
5905 return;
5906 }
5907 }
5908 }
5909
5910
5911 static unsigned char *
5912 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
5913 unsigned long attribute;
5914 unsigned long form;
5915 unsigned char * data;
5916 unsigned long cu_offset;
5917 unsigned long pointer_size;
5918 {
5919 unsigned long uvalue = 0;
5920 unsigned char * block_start = NULL;
5921 int bytes_read;
5922
5923 printf (" %-18s:", get_AT_name (attribute));
5924
5925 switch (form)
5926 {
5927 case DW_FORM_ref_addr:
5928 case DW_FORM_addr:
5929 uvalue = byte_get (data, pointer_size);
5930 data += pointer_size;
5931 break;
5932
5933 case DW_FORM_ref1:
5934 case DW_FORM_flag:
5935 case DW_FORM_data1:
5936 uvalue = byte_get (data ++, 1);
5937 break;
5938
5939 case DW_FORM_ref2:
5940 case DW_FORM_data2:
5941 uvalue = byte_get (data, 2);
5942 data += 2;
5943 break;
5944
5945 case DW_FORM_ref4:
5946 case DW_FORM_data4:
5947 uvalue = byte_get (data, 4);
5948 data += 4;
5949 break;
5950
5951 case DW_FORM_sdata:
5952 uvalue = read_leb128 (data, & bytes_read, 1);
5953 data += bytes_read;
5954 break;
5955
5956 case DW_FORM_ref_udata:
5957 case DW_FORM_udata:
5958 uvalue = read_leb128 (data, & bytes_read, 0);
5959 data += bytes_read;
5960 break;
5961 }
5962
5963 switch (form)
5964 {
5965 case DW_FORM_ref_addr:
5966 printf (" <#%lx>", uvalue);
5967 break;
5968
5969 case DW_FORM_ref1:
5970 case DW_FORM_ref2:
5971 case DW_FORM_ref4:
5972 case DW_FORM_ref_udata:
5973 printf (" <%lx>", uvalue + cu_offset);
5974 break;
5975
5976 case DW_FORM_addr:
5977 printf (" %#lx", uvalue);
5978
5979 case DW_FORM_flag:
5980 case DW_FORM_data1:
5981 case DW_FORM_data2:
5982 case DW_FORM_data4:
5983 case DW_FORM_sdata:
5984 case DW_FORM_udata:
5985 printf (" %ld", uvalue);
5986 break;
5987
5988 case DW_FORM_ref8:
5989 case DW_FORM_data8:
5990 uvalue = byte_get (data, 4);
5991 printf (" %lx", uvalue);
5992 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
5993 data += 8;
5994 break;
5995
5996 case DW_FORM_string:
5997 printf (" %s", data);
5998 data += strlen (data) + 1;
5999 break;
6000
6001 case DW_FORM_block:
6002 uvalue = read_leb128 (data, & bytes_read, 0);
6003 block_start = data + bytes_read;
6004 data = display_block (block_start, uvalue);
6005 break;
6006
6007 case DW_FORM_block1:
6008 uvalue = byte_get (data, 1);
6009 block_start = data + 1;
6010 data = display_block (block_start, uvalue);
6011 break;
6012
6013 case DW_FORM_block2:
6014 uvalue = byte_get (data, 2);
6015 block_start = data + 2;
6016 data = display_block (block_start, uvalue);
6017 break;
6018
6019 case DW_FORM_block4:
6020 uvalue = byte_get (data, 4);
6021 block_start = data + 4;
6022 data = display_block (block_start, uvalue);
6023 break;
6024
6025 case DW_FORM_strp:
6026 case DW_FORM_indirect:
6027 warn (_("Unable to handle FORM: %d"), form);
6028 break;
6029
6030 default:
6031 warn (_("Unrecognised form: %d"), form);
6032 break;
6033 }
6034
6035 /* For some attributes we can display futher information. */
6036
6037 printf ("\t");
6038
6039 switch (attribute)
6040 {
6041 case DW_AT_inline:
6042 switch (uvalue)
6043 {
6044 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6045 case DW_INL_inlined: printf (_("(inlined)")); break;
6046 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6047 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6048 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6049 }
6050 break;
6051
6052 case DW_AT_language:
6053 switch (uvalue)
6054 {
6055 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6056 case DW_LANG_C89: printf ("(ANSI C)"); break;
6057 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6058 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6059 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6060 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6061 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6062 case DW_LANG_Ada83: printf ("(Ada)"); break;
6063 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6064 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6065 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6066 default: printf ("(Unknown: %lx)", uvalue); break;
6067 }
6068 break;
6069
6070 case DW_AT_encoding:
6071 switch (uvalue)
6072 {
6073 case DW_ATE_void: printf ("(void)"); break;
6074 case DW_ATE_address: printf ("(machine address)"); break;
6075 case DW_ATE_boolean: printf ("(boolean)"); break;
6076 case DW_ATE_complex_float: printf ("(complex float)"); break;
6077 case DW_ATE_float: printf ("(float)"); break;
6078 case DW_ATE_signed: printf ("(signed)"); break;
6079 case DW_ATE_signed_char: printf ("(signed char)"); break;
6080 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6081 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6082 default:
6083 if (uvalue >= DW_ATE_lo_user
6084 && uvalue <= DW_ATE_hi_user)
6085 printf ("(user defined type)");
6086 else
6087 printf ("(unknown type)");
6088 break;
6089 }
6090 break;
6091
6092 case DW_AT_accessibility:
6093 switch (uvalue)
6094 {
6095 case DW_ACCESS_public: printf ("(public)"); break;
6096 case DW_ACCESS_protected: printf ("(protected)"); break;
6097 case DW_ACCESS_private: printf ("(private)"); break;
6098 default: printf ("(unknown accessibility)"); break;
6099 }
6100 break;
6101
6102 case DW_AT_visibility:
6103 switch (uvalue)
6104 {
6105 case DW_VIS_local: printf ("(local)"); break;
6106 case DW_VIS_exported: printf ("(exported)"); break;
6107 case DW_VIS_qualified: printf ("(qualified)"); break;
6108 default: printf ("(unknown visibility)"); break;
6109 }
6110 break;
6111
6112 case DW_AT_virtuality:
6113 switch (uvalue)
6114 {
6115 case DW_VIRTUALITY_none: printf ("(none)"); break;
6116 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6117 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6118 default: printf ("(unknown virtuality)"); break;
6119 }
6120 break;
6121
6122 case DW_AT_identifier_case:
6123 switch (uvalue)
6124 {
6125 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6126 case DW_ID_up_case: printf ("(up_case)"); break;
6127 case DW_ID_down_case: printf ("(down_case)"); break;
6128 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6129 default: printf ("(unknown case)"); break;
6130 }
6131 break;
6132
6133 case DW_AT_calling_convention:
6134 switch (uvalue)
6135 {
6136 case DW_CC_normal: printf ("(normal)"); break;
6137 case DW_CC_program: printf ("(program)"); break;
6138 case DW_CC_nocall: printf ("(nocall)"); break;
6139 default:
6140 if (uvalue >= DW_CC_lo_user
6141 && uvalue <= DW_CC_hi_user)
6142 printf ("(user defined)");
6143 else
6144 printf ("(unknown convention)");
6145 }
6146 break;
6147
6148 case DW_AT_frame_base:
6149 case DW_AT_location:
6150 case DW_AT_data_member_location:
6151 case DW_AT_vtable_elem_location:
6152 if (block_start)
6153 {
6154 printf ("(");
6155 decode_location_expression (block_start, pointer_size, uvalue);
6156 printf (")");
6157 }
6158 break;
6159
6160 default:
6161 break;
6162 }
6163
6164 printf ("\n");
6165 return data;
6166 }
6167
6168 static int
6169 display_debug_info (section, start, file)
6170 Elf32_Internal_Shdr * section;
6171 unsigned char * start;
6172 FILE * file;
6173 {
6174 unsigned char * end = start + section->sh_size;
6175 unsigned char * section_begin = start;
6176
6177 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6178
6179 while (start < end)
6180 {
6181 DWARF2_External_CompUnit * external;
6182 DWARF2_Internal_CompUnit compunit;
6183 unsigned char * tags;
6184 int i;
6185 int level;
6186 unsigned long cu_offset;
6187
6188 external = (DWARF2_External_CompUnit *) start;
6189
6190 compunit.cu_length = BYTE_GET (external->cu_length);
6191 compunit.cu_version = BYTE_GET (external->cu_version);
6192 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6193 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6194
6195 tags = start + sizeof (* external);
6196 cu_offset = start - section_begin;
6197 start += compunit.cu_length + sizeof (external->cu_length);
6198
6199 if (compunit.cu_version != 2)
6200 {
6201 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6202 continue;
6203 }
6204
6205 printf (_(" Compilation Unit:\n"));
6206 printf (_(" Length: %ld\n"), compunit.cu_length);
6207 printf (_(" Version: %d\n"), compunit.cu_version);
6208 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6209 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6210
6211 if (first_abbrev != NULL)
6212 free_abbrevs ();
6213
6214 /* Read in the abbrevs used by this compilation unit. */
6215
6216 {
6217 Elf32_Internal_Shdr * sec;
6218 unsigned char * begin;
6219
6220 /* Locate the .debug_abbrev section and process it. */
6221 for (i = 0, sec = section_headers;
6222 i < elf_header.e_shnum;
6223 i ++, sec ++)
6224 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6225 break;
6226
6227 if (i == -1 || sec->sh_size == 0)
6228 {
6229 warn (_("Unable to locate .debug_abbrev section!\n"));
6230 return 0;
6231 }
6232
6233 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6234 "debug_abbrev section data");
6235
6236 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6237 begin + sec->sh_size);
6238
6239 free (begin);
6240 }
6241
6242 level = 0;
6243 while (tags < start)
6244 {
6245 int bytes_read;
6246 unsigned long abbrev_number;
6247 abbrev_entry * entry;
6248 abbrev_attr * attr;
6249
6250 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6251 tags += bytes_read;
6252
6253 /* A null DIE marks the end of a list of children. */
6254 if (abbrev_number == 0)
6255 {
6256 --level;
6257 continue;
6258 }
6259
6260 /* Scan through the abbreviation list until we reach the
6261 correct entry. */
6262 for (entry = first_abbrev;
6263 entry && entry->entry != abbrev_number;
6264 entry = entry->next)
6265 continue;
6266
6267 if (entry == NULL)
6268 {
6269 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6270 abbrev_number);
6271 return 0;
6272 }
6273
6274 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6275 level, tags - section_begin - bytes_read,
6276 abbrev_number,
6277 get_TAG_name (entry->tag));
6278
6279 for (attr = entry->first_attr; attr; attr = attr->next)
6280 tags = read_and_display_attr (attr->attribute,
6281 attr->form,
6282 tags, cu_offset,
6283 compunit.cu_pointer_size);
6284
6285 if (entry->children)
6286 ++level;
6287 }
6288 }
6289
6290 printf ("\n");
6291
6292 return 1;
6293 }
6294
6295 static int
6296 display_debug_aranges (section, start, file)
6297 Elf32_Internal_Shdr * section;
6298 unsigned char * start;
6299 FILE * file ATTRIBUTE_UNUSED;
6300 {
6301 unsigned char * end = start + section->sh_size;
6302
6303 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6304
6305 while (start < end)
6306 {
6307 DWARF2_External_ARange * external;
6308 DWARF2_Internal_ARange arange;
6309 unsigned char * ranges;
6310 unsigned long length;
6311 unsigned long address;
6312 int excess;
6313
6314 external = (DWARF2_External_ARange *) start;
6315
6316 arange.ar_length = BYTE_GET (external->ar_length);
6317 arange.ar_version = BYTE_GET (external->ar_version);
6318 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6319 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6320 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6321
6322 printf (_(" Length: %ld\n"), arange.ar_length);
6323 printf (_(" Version: %d\n"), arange.ar_version);
6324 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6325 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6326 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6327
6328 printf (_("\n Address Length\n"));
6329
6330 ranges = start + sizeof (* external);
6331
6332 /* Must pad to an alignment boundary that is twice the pointer size. */
6333 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6334 if (excess)
6335 ranges += (2 * arange.ar_pointer_size) - excess;
6336
6337 for (;;)
6338 {
6339 address = byte_get (ranges, arange.ar_pointer_size);
6340
6341 ranges += arange.ar_pointer_size;
6342
6343 length = byte_get (ranges, arange.ar_pointer_size);
6344
6345 ranges += arange.ar_pointer_size;
6346
6347 /* A pair of zeros marks the end of the list. */
6348 if (address == 0 && length == 0)
6349 break;
6350
6351 printf (" %8.8lx %lu\n", address, length);
6352 }
6353
6354 start += arange.ar_length + sizeof (external->ar_length);
6355 }
6356
6357 printf ("\n");
6358
6359 return 1;
6360 }
6361
6362
6363 static int
6364 display_debug_not_supported (section, start, file)
6365 Elf32_Internal_Shdr * section;
6366 unsigned char * start ATTRIBUTE_UNUSED;
6367 FILE * file ATTRIBUTE_UNUSED;
6368 {
6369 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6370 SECTION_NAME (section));
6371
6372 return 1;
6373 }
6374
6375 /* Pre-scan the .debug_info section to record the size of address.
6376 When dumping the .debug_line, we use that size information, assuming
6377 that all compilation units have the same address size. */
6378 static int
6379 prescan_debug_info (section, start, file)
6380 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6381 unsigned char * start;
6382 FILE * file ATTRIBUTE_UNUSED;
6383 {
6384 DWARF2_External_CompUnit * external;
6385
6386 external = (DWARF2_External_CompUnit *) start;
6387
6388 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6389 return 0;
6390 }
6391
6392 /* A structure containing the name of a debug section and a pointer
6393 to a function that can decode it. The third field is a prescan
6394 function to be run over the section before displaying any of the
6395 sections. */
6396 struct
6397 {
6398 char * name;
6399 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6400 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6401 }
6402 debug_displays[] =
6403 {
6404 { ".debug_info", display_debug_info, prescan_debug_info },
6405 { ".debug_abbrev", display_debug_abbrev, NULL },
6406 { ".debug_line", display_debug_lines, NULL },
6407 { ".debug_aranges", display_debug_aranges, NULL },
6408 { ".debug_pubnames", display_debug_pubnames, NULL },
6409 { ".debug_macinfo", display_debug_not_supported, NULL },
6410 { ".debug_frame", display_debug_not_supported, NULL },
6411 { ".debug_str", display_debug_not_supported, NULL },
6412 { ".debug_static_func", display_debug_not_supported, NULL },
6413 { ".debug_static_vars", display_debug_not_supported, NULL },
6414 { ".debug_types", display_debug_not_supported, NULL },
6415 { ".debug_weaknames", display_debug_not_supported, NULL }
6416 };
6417
6418 static int
6419 display_debug_section (section, file)
6420 Elf32_Internal_Shdr * section;
6421 FILE * file;
6422 {
6423 char * name = SECTION_NAME (section);
6424 bfd_size_type length;
6425 unsigned char * start;
6426 int i;
6427
6428 length = section->sh_size;
6429 if (length == 0)
6430 {
6431 printf (_("\nSection '%s' has no debugging data.\n"), name);
6432 return 0;
6433 }
6434
6435 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6436 "debug section data");
6437
6438 /* See if we know how to display the contents of this section. */
6439 for (i = NUM_ELEM (debug_displays); i--;)
6440 if (strcmp (debug_displays[i].name, name) == 0)
6441 {
6442 debug_displays[i].display (section, start, file);
6443 break;
6444 }
6445
6446 if (i == -1)
6447 printf (_("Unrecognised debug section: %s\n"), name);
6448
6449 free (start);
6450
6451 /* If we loaded in the abbrev section at some point,
6452 we must release it here. */
6453 if (first_abbrev != NULL)
6454 free_abbrevs ();
6455
6456 return 1;
6457 }
6458
6459 static int
6460 process_section_contents (file)
6461 FILE * file;
6462 {
6463 Elf32_Internal_Shdr * section;
6464 unsigned int i;
6465
6466 if (! do_dump)
6467 return 1;
6468
6469 /* Pre-scan the debug sections to find some debug information not
6470 present in some of them. For the .debug_line, we must find out the
6471 size of address (specified in .debug_info and .debug_aranges). */
6472 for (i = 0, section = section_headers;
6473 i < elf_header.e_shnum && i < num_dump_sects;
6474 i ++, section ++)
6475 {
6476 char * name = SECTION_NAME (section);
6477 int j;
6478
6479 if (section->sh_size == 0)
6480 continue;
6481
6482 /* See if there is some pre-scan operation for this section. */
6483 for (j = NUM_ELEM (debug_displays); j--;)
6484 if (strcmp (debug_displays[j].name, name) == 0)
6485 {
6486 if (debug_displays[j].prescan != NULL)
6487 {
6488 bfd_size_type length;
6489 unsigned char * start;
6490
6491 length = section->sh_size;
6492 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6493 "debug section data");
6494
6495 debug_displays[j].prescan (section, start, file);
6496 free (start);
6497 }
6498
6499 break;
6500 }
6501 }
6502
6503 for (i = 0, section = section_headers;
6504 i < elf_header.e_shnum && i < num_dump_sects;
6505 i ++, section ++)
6506 {
6507 #ifdef SUPPORT_DISASSEMBLY
6508 if (dump_sects[i] & DISASS_DUMP)
6509 disassemble_section (section, file);
6510 #endif
6511 if (dump_sects[i] & HEX_DUMP)
6512 dump_section (section, file);
6513
6514 if (dump_sects[i] & DEBUG_DUMP)
6515 display_debug_section (section, file);
6516 }
6517
6518 if (i < num_dump_sects)
6519 warn (_("Some sections were not dumped because they do not exist!\n"));
6520
6521 return 1;
6522 }
6523
6524 static void
6525 process_mips_fpe_exception (mask)
6526 int mask;
6527 {
6528 if (mask)
6529 {
6530 int first = 1;
6531 if (mask & OEX_FPU_INEX)
6532 fputs ("INEX", stdout), first = 0;
6533 if (mask & OEX_FPU_UFLO)
6534 printf ("%sUFLO", first ? "" : "|"), first = 0;
6535 if (mask & OEX_FPU_OFLO)
6536 printf ("%sOFLO", first ? "" : "|"), first = 0;
6537 if (mask & OEX_FPU_DIV0)
6538 printf ("%sDIV0", first ? "" : "|"), first = 0;
6539 if (mask & OEX_FPU_INVAL)
6540 printf ("%sINVAL", first ? "" : "|");
6541 }
6542 else
6543 fputs ("0", stdout);
6544 }
6545
6546 static int
6547 process_mips_specific (file)
6548 FILE * file;
6549 {
6550 Elf_Internal_Dyn * entry;
6551 size_t liblist_offset = 0;
6552 size_t liblistno = 0;
6553 size_t conflictsno = 0;
6554 size_t options_offset = 0;
6555 size_t conflicts_offset = 0;
6556
6557 /* We have a lot of special sections. Thanks SGI! */
6558 if (dynamic_segment == NULL)
6559 /* No information available. */
6560 return 0;
6561
6562 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6563 switch (entry->d_tag)
6564 {
6565 case DT_MIPS_LIBLIST:
6566 liblist_offset = entry->d_un.d_val - loadaddr;
6567 break;
6568 case DT_MIPS_LIBLISTNO:
6569 liblistno = entry->d_un.d_val;
6570 break;
6571 case DT_MIPS_OPTIONS:
6572 options_offset = entry->d_un.d_val - loadaddr;
6573 break;
6574 case DT_MIPS_CONFLICT:
6575 conflicts_offset = entry->d_un.d_val - loadaddr;
6576 break;
6577 case DT_MIPS_CONFLICTNO:
6578 conflictsno = entry->d_un.d_val;
6579 break;
6580 default:
6581 break;
6582 }
6583
6584 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6585 {
6586 Elf32_External_Lib * elib;
6587 size_t cnt;
6588
6589 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6590 elib, Elf32_External_Lib *, "liblist");
6591
6592 printf ("\nSection '.liblist' contains %lu entries:\n",
6593 (unsigned long) liblistno);
6594 fputs (" Library Time Stamp Checksum Version Flags\n",
6595 stdout);
6596
6597 for (cnt = 0; cnt < liblistno; ++cnt)
6598 {
6599 Elf32_Lib liblist;
6600 time_t time;
6601 char timebuf[20];
6602 struct tm * tmp;
6603
6604 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6605 time = BYTE_GET (elib[cnt].l_time_stamp);
6606 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6607 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6608 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6609
6610 tmp = gmtime (&time);
6611 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
6612 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6613 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6614
6615 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
6616 dynamic_strings + liblist.l_name, timebuf,
6617 liblist.l_checksum, liblist.l_version);
6618
6619 if (liblist.l_flags == 0)
6620 puts (" NONE");
6621 else
6622 {
6623 static const struct
6624 {
6625 const char * name;
6626 int bit;
6627 }
6628 l_flags_vals[] =
6629 {
6630 { " EXACT_MATCH", LL_EXACT_MATCH },
6631 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6632 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6633 { " EXPORTS", LL_EXPORTS },
6634 { " DELAY_LOAD", LL_DELAY_LOAD },
6635 { " DELTA", LL_DELTA }
6636 };
6637 int flags = liblist.l_flags;
6638 size_t fcnt;
6639
6640 for (fcnt = 0;
6641 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6642 ++fcnt)
6643 if ((flags & l_flags_vals[fcnt].bit) != 0)
6644 {
6645 fputs (l_flags_vals[fcnt].name, stdout);
6646 flags ^= l_flags_vals[fcnt].bit;
6647 }
6648 if (flags != 0)
6649 printf (" %#x", (unsigned int) flags);
6650
6651 puts ("");
6652 }
6653 }
6654
6655 free (elib);
6656 }
6657
6658 if (options_offset != 0)
6659 {
6660 Elf_External_Options * eopt;
6661 Elf_Internal_Shdr * sect = section_headers;
6662 Elf_Internal_Options * iopt;
6663 Elf_Internal_Options * option;
6664 size_t offset;
6665 int cnt;
6666
6667 /* Find the section header so that we get the size. */
6668 while (sect->sh_type != SHT_MIPS_OPTIONS)
6669 ++ sect;
6670
6671 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6672 Elf_External_Options *, "options");
6673
6674 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6675 * sizeof (*iopt));
6676 if (iopt == NULL)
6677 {
6678 error (_("Out of memory"));
6679 return 0;
6680 }
6681
6682 offset = cnt = 0;
6683 option = iopt;
6684
6685 while (offset < sect->sh_size)
6686 {
6687 Elf_External_Options * eoption;
6688
6689 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6690
6691 option->kind = BYTE_GET (eoption->kind);
6692 option->size = BYTE_GET (eoption->size);
6693 option->section = BYTE_GET (eoption->section);
6694 option->info = BYTE_GET (eoption->info);
6695
6696 offset += option->size;
6697
6698 ++option;
6699 ++cnt;
6700 }
6701
6702 printf (_("\nSection '%s' contains %d entries:\n"),
6703 string_table + sect->sh_name, cnt);
6704
6705 option = iopt;
6706
6707 while (cnt-- > 0)
6708 {
6709 size_t len;
6710
6711 switch (option->kind)
6712 {
6713 case ODK_NULL:
6714 /* This shouldn't happen. */
6715 printf (" NULL %d %lx", option->section, option->info);
6716 break;
6717 case ODK_REGINFO:
6718 printf (" REGINFO ");
6719 if (elf_header.e_machine == EM_MIPS)
6720 {
6721 /* 32bit form. */
6722 Elf32_External_RegInfo *ereg;
6723 Elf32_RegInfo reginfo;
6724
6725 ereg = (Elf32_External_RegInfo *) (option + 1);
6726 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6727 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6728 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6729 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6730 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6731 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6732
6733 printf ("GPR %08lx GP 0x%lx\n",
6734 reginfo.ri_gprmask,
6735 (unsigned long) reginfo.ri_gp_value);
6736 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6737 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6738 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6739 }
6740 else
6741 {
6742 /* 64 bit form. */
6743 Elf64_External_RegInfo * ereg;
6744 Elf64_Internal_RegInfo reginfo;
6745
6746 ereg = (Elf64_External_RegInfo *) (option + 1);
6747 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6748 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6749 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6750 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6751 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6752 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6753
6754 printf ("GPR %08lx GP 0x",
6755 reginfo.ri_gprmask);
6756 printf_vma (reginfo.ri_gp_value);
6757 printf ("\n");
6758
6759 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6760 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6761 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6762 }
6763 ++option;
6764 continue;
6765 case ODK_EXCEPTIONS:
6766 fputs (" EXCEPTIONS fpe_min(", stdout);
6767 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6768 fputs (") fpe_max(", stdout);
6769 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6770 fputs (")", stdout);
6771
6772 if (option->info & OEX_PAGE0)
6773 fputs (" PAGE0", stdout);
6774 if (option->info & OEX_SMM)
6775 fputs (" SMM", stdout);
6776 if (option->info & OEX_FPDBUG)
6777 fputs (" FPDBUG", stdout);
6778 if (option->info & OEX_DISMISS)
6779 fputs (" DISMISS", stdout);
6780 break;
6781 case ODK_PAD:
6782 fputs (" PAD ", stdout);
6783 if (option->info & OPAD_PREFIX)
6784 fputs (" PREFIX", stdout);
6785 if (option->info & OPAD_POSTFIX)
6786 fputs (" POSTFIX", stdout);
6787 if (option->info & OPAD_SYMBOL)
6788 fputs (" SYMBOL", stdout);
6789 break;
6790 case ODK_HWPATCH:
6791 fputs (" HWPATCH ", stdout);
6792 if (option->info & OHW_R4KEOP)
6793 fputs (" R4KEOP", stdout);
6794 if (option->info & OHW_R8KPFETCH)
6795 fputs (" R8KPFETCH", stdout);
6796 if (option->info & OHW_R5KEOP)
6797 fputs (" R5KEOP", stdout);
6798 if (option->info & OHW_R5KCVTL)
6799 fputs (" R5KCVTL", stdout);
6800 break;
6801 case ODK_FILL:
6802 fputs (" FILL ", stdout);
6803 /* XXX Print content of info word? */
6804 break;
6805 case ODK_TAGS:
6806 fputs (" TAGS ", stdout);
6807 /* XXX Print content of info word? */
6808 break;
6809 case ODK_HWAND:
6810 fputs (" HWAND ", stdout);
6811 if (option->info & OHWA0_R4KEOP_CHECKED)
6812 fputs (" R4KEOP_CHECKED", stdout);
6813 if (option->info & OHWA0_R4KEOP_CLEAN)
6814 fputs (" R4KEOP_CLEAN", stdout);
6815 break;
6816 case ODK_HWOR:
6817 fputs (" HWOR ", stdout);
6818 if (option->info & OHWA0_R4KEOP_CHECKED)
6819 fputs (" R4KEOP_CHECKED", stdout);
6820 if (option->info & OHWA0_R4KEOP_CLEAN)
6821 fputs (" R4KEOP_CLEAN", stdout);
6822 break;
6823 case ODK_GP_GROUP:
6824 printf (" GP_GROUP %#06lx self-contained %#06lx",
6825 option->info & OGP_GROUP,
6826 (option->info & OGP_SELF) >> 16);
6827 break;
6828 case ODK_IDENT:
6829 printf (" IDENT %#06lx self-contained %#06lx",
6830 option->info & OGP_GROUP,
6831 (option->info & OGP_SELF) >> 16);
6832 break;
6833 default:
6834 /* This shouldn't happen. */
6835 printf (" %3d ??? %d %lx",
6836 option->kind, option->section, option->info);
6837 break;
6838 }
6839
6840 len = sizeof (*eopt);
6841 while (len < option->size)
6842 if (((char *) option)[len] >= ' '
6843 && ((char *) option)[len] < 0x7f)
6844 printf ("%c", ((char *) option)[len++]);
6845 else
6846 printf ("\\%03o", ((char *) option)[len++]);
6847
6848 fputs ("\n", stdout);
6849 ++option;
6850 }
6851
6852 free (eopt);
6853 }
6854
6855 if (conflicts_offset != 0 && conflictsno != 0)
6856 {
6857 Elf32_External_Conflict * econf32;
6858 Elf64_External_Conflict * econf64;
6859 Elf32_Conflict * iconf;
6860 size_t cnt;
6861
6862 if (dynamic_symbols == NULL)
6863 {
6864 error (_("conflict list with without table"));
6865 return 0;
6866 }
6867
6868 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6869 if (iconf == NULL)
6870 {
6871 error (_("Out of memory"));
6872 return 0;
6873 }
6874
6875 if (is_32bit_elf)
6876 {
6877 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6878 econf32, Elf32_External_Conflict *, "conflict");
6879
6880 for (cnt = 0; cnt < conflictsno; ++cnt)
6881 iconf[cnt] = BYTE_GET (econf32[cnt]);
6882 }
6883 else
6884 {
6885 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6886 econf64, Elf64_External_Conflict *, "conflict");
6887
6888 for (cnt = 0; cnt < conflictsno; ++cnt)
6889 iconf[cnt] = BYTE_GET (econf64[cnt]);
6890 }
6891
6892 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6893 puts (_(" Num: Index Value Name"));
6894
6895 for (cnt = 0; cnt < conflictsno; ++cnt)
6896 {
6897 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
6898
6899 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
6900 print_vma (psym->st_value, FULL_HEX);
6901 printf (" %s\n", dynamic_strings + psym->st_name);
6902 }
6903
6904 free (iconf);
6905 }
6906
6907 return 1;
6908 }
6909
6910 static char *
6911 get_note_type (e_type)
6912 unsigned e_type;
6913 {
6914 static char buff[64];
6915
6916 switch (e_type)
6917 {
6918 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
6919 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
6920 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
6921 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
6922 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
6923 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
6924 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
6925 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
6926 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6927 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6928 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
6929 default:
6930 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
6931 return buff;
6932 }
6933 }
6934
6935 /* Note that by the ELF standard, the name field is already null byte
6936 terminated, and namesz includes the terminating null byte.
6937 I.E. the value of namesz for the name "FSF" is 4.
6938
6939 If the value of namesz is zero, there is no name present. */
6940 static int
6941 process_note (pnote)
6942 Elf32_Internal_Note * pnote;
6943 {
6944 printf (" %s\t\t0x%08lx\t%s\n",
6945 pnote->namesz ? pnote->namedata : "(NONE)",
6946 pnote->descsz, get_note_type (pnote->type));
6947 return 1;
6948 }
6949
6950
6951 static int
6952 process_corefile_note_segment (file, offset, length)
6953 FILE * file;
6954 bfd_vma offset;
6955 bfd_vma length;
6956 {
6957 Elf_External_Note * pnotes;
6958 Elf_External_Note * external;
6959 int res = 1;
6960
6961 if (length <= 0)
6962 return 0;
6963
6964 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
6965
6966 external = pnotes;
6967
6968 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
6969 (unsigned long) offset, (unsigned long) length);
6970 printf (_(" Owner\t\tData size\tDescription\n"));
6971
6972 while (external < (Elf_External_Note *)((char *) pnotes + length))
6973 {
6974 Elf32_Internal_Note inote;
6975 char * temp = NULL;
6976
6977 inote.type = BYTE_GET (external->type);
6978 inote.namesz = BYTE_GET (external->namesz);
6979 inote.namedata = external->name;
6980 inote.descsz = BYTE_GET (external->descsz);
6981 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
6982 inote.descpos = offset + (inote.descdata - (char *) pnotes);
6983
6984 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
6985
6986 /* Verify that name is null terminated. It appears that at least
6987 one version of Linux (RedHat 6.0) generates corefiles that don't
6988 comply with the ELF spec by failing to include the null byte in
6989 namesz. */
6990 if (inote.namedata[inote.namesz] != '\0')
6991 {
6992 temp = malloc (inote.namesz + 1);
6993
6994 if (temp == NULL)
6995 {
6996 error (_("Out of memory\n"));
6997 res = 0;
6998 break;
6999 }
7000
7001 strncpy (temp, inote.namedata, inote.namesz);
7002 temp[inote.namesz] = 0;
7003
7004 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7005 inote.namedata = temp;
7006 }
7007
7008 res &= process_note (& inote);
7009
7010 if (temp != NULL)
7011 {
7012 free (temp);
7013 temp = NULL;
7014 }
7015 }
7016
7017 free (pnotes);
7018
7019 return res;
7020 }
7021
7022 static int
7023 process_corefile_note_segments (file)
7024 FILE * file;
7025 {
7026 Elf_Internal_Phdr * program_headers;
7027 Elf_Internal_Phdr * segment;
7028 unsigned int i;
7029 int res = 1;
7030
7031 program_headers = (Elf_Internal_Phdr *) malloc
7032 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7033
7034 if (program_headers == NULL)
7035 {
7036 error (_("Out of memory\n"));
7037 return 0;
7038 }
7039
7040 if (is_32bit_elf)
7041 i = get_32bit_program_headers (file, program_headers);
7042 else
7043 i = get_64bit_program_headers (file, program_headers);
7044
7045 if (i == 0)
7046 {
7047 free (program_headers);
7048 return 0;
7049 }
7050
7051 for (i = 0, segment = program_headers;
7052 i < elf_header.e_phnum;
7053 i ++, segment ++)
7054 {
7055 if (segment->p_type == PT_NOTE)
7056 res &= process_corefile_note_segment (file,
7057 (bfd_vma) segment->p_offset,
7058 (bfd_vma) segment->p_filesz);
7059 }
7060
7061 free (program_headers);
7062
7063 return res;
7064 }
7065
7066 static int
7067 process_corefile_contents (file)
7068 FILE * file;
7069 {
7070 /* If we have not been asked to display the notes then do nothing. */
7071 if (! do_notes)
7072 return 1;
7073
7074 /* If file is not a core file then exit. */
7075 if (elf_header.e_type != ET_CORE)
7076 return 1;
7077
7078 /* No program headers means no NOTE segment. */
7079 if (elf_header.e_phnum == 0)
7080 {
7081 printf (_("No note segments present in the core file.\n"));
7082 return 1;
7083 }
7084
7085 return process_corefile_note_segments (file);
7086 }
7087
7088 static int
7089 process_arch_specific (file)
7090 FILE * file;
7091 {
7092 if (! do_arch)
7093 return 1;
7094
7095 switch (elf_header.e_machine)
7096 {
7097 case EM_MIPS:
7098 case EM_MIPS_RS4_BE:
7099 return process_mips_specific (file);
7100 break;
7101 default:
7102 break;
7103 }
7104 return 1;
7105 }
7106
7107 static int
7108 get_file_header (file)
7109 FILE * file;
7110 {
7111 /* Read in the identity array. */
7112 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7113 return 0;
7114
7115 /* Determine how to read the rest of the header. */
7116 switch (elf_header.e_ident [EI_DATA])
7117 {
7118 default: /* fall through */
7119 case ELFDATANONE: /* fall through */
7120 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7121 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7122 }
7123
7124 /* For now we only support 32 bit and 64 bit ELF files. */
7125 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7126
7127 /* Read in the rest of the header. */
7128 if (is_32bit_elf)
7129 {
7130 Elf32_External_Ehdr ehdr32;
7131
7132 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7133 return 0;
7134
7135 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7136 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7137 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7138 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7139 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7140 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7141 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7142 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7143 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7144 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7145 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7146 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7147 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7148 }
7149 else
7150 {
7151 Elf64_External_Ehdr ehdr64;
7152
7153 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7154 we will not be able to cope with the 64bit data found in
7155 64 ELF files. Detect this now and abort before we start
7156 overwritting things. */
7157 if (sizeof (bfd_vma) < 8)
7158 {
7159 error (_("This instance of readelf has been built without support for a\n"));
7160 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7161 return 0;
7162 }
7163
7164 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7165 return 0;
7166
7167 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7168 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7169 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7170 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7171 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7172 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7173 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7174 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7175 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7176 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7177 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7178 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7179 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7180 }
7181
7182 return 1;
7183 }
7184
7185 static void
7186 process_file (file_name)
7187 char * file_name;
7188 {
7189 FILE * file;
7190 struct stat statbuf;
7191 unsigned int i;
7192
7193 if (stat (file_name, & statbuf) < 0)
7194 {
7195 error (_("Cannot stat input file %s.\n"), file_name);
7196 return;
7197 }
7198
7199 file = fopen (file_name, "rb");
7200 if (file == NULL)
7201 {
7202 error (_("Input file %s not found.\n"), file_name);
7203 return;
7204 }
7205
7206 if (! get_file_header (file))
7207 {
7208 error (_("%s: Failed to read file header\n"), file_name);
7209 fclose (file);
7210 return;
7211 }
7212
7213 /* Initialise per file variables. */
7214 for (i = NUM_ELEM (version_info); i--;)
7215 version_info[i] = 0;
7216
7217 for (i = NUM_ELEM (dynamic_info); i--;)
7218 dynamic_info[i] = 0;
7219
7220 /* Process the file. */
7221 if (show_name)
7222 printf (_("\nFile: %s\n"), file_name);
7223
7224 if (! process_file_header ())
7225 {
7226 fclose (file);
7227 return;
7228 }
7229
7230 process_section_headers (file);
7231
7232 process_program_headers (file);
7233
7234 process_dynamic_segment (file);
7235
7236 process_relocs (file);
7237
7238 process_symbol_table (file);
7239
7240 process_syminfo (file);
7241
7242 process_version_sections (file);
7243
7244 process_section_contents (file);
7245
7246 process_corefile_contents (file);
7247
7248 process_arch_specific (file);
7249
7250 fclose (file);
7251
7252 if (section_headers)
7253 {
7254 free (section_headers);
7255 section_headers = NULL;
7256 }
7257
7258 if (string_table)
7259 {
7260 free (string_table);
7261 string_table = NULL;
7262 }
7263
7264 if (dynamic_strings)
7265 {
7266 free (dynamic_strings);
7267 dynamic_strings = NULL;
7268 }
7269
7270 if (dynamic_symbols)
7271 {
7272 free (dynamic_symbols);
7273 dynamic_symbols = NULL;
7274 num_dynamic_syms = 0;
7275 }
7276
7277 if (dynamic_syminfo)
7278 {
7279 free (dynamic_syminfo);
7280 dynamic_syminfo = NULL;
7281 }
7282 }
7283
7284 #ifdef SUPPORT_DISASSEMBLY
7285 /* Needed by the i386 disassembler. For extra credit, someone could
7286 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7287 symbols */
7288
7289 void
7290 print_address (unsigned int addr, FILE * outfile)
7291 {
7292 fprintf (outfile,"0x%8.8x", addr);
7293 }
7294
7295 /* Needed by the i386 disassembler. */
7296 void
7297 db_task_printsym (unsigned int addr)
7298 {
7299 print_address (addr, stderr);
7300 }
7301 #endif
7302
7303 int
7304 main (argc, argv)
7305 int argc;
7306 char ** argv;
7307 {
7308 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7309 setlocale (LC_MESSAGES, "");
7310 #endif
7311 bindtextdomain (PACKAGE, LOCALEDIR);
7312 textdomain (PACKAGE);
7313
7314 parse_args (argc, argv);
7315
7316 if (optind < (argc - 1))
7317 show_name = 1;
7318
7319 while (optind < argc)
7320 process_file (argv [optind ++]);
7321
7322 if (dump_sects != NULL)
7323 free (dump_sects);
7324
7325 return 0;
7326 }
This page took 0.203582 seconds and 5 git commands to generate.