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