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