* elf/external.h (GRP_ENTRY_SIZE): Define.
[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 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3875 do \
3876 { \
3877 size_t expected_entsize \
3878 = is_32bit_elf ? size32 : size64; \
3879 if (section->sh_entsize != expected_entsize) \
3880 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3881 i, (unsigned long int) section->sh_entsize, \
3882 (unsigned long int) expected_entsize); \
3883 section->sh_entsize = expected_entsize; \
3884 } \
3885 while (0)
3886 #define CHECK_ENTSIZE(section, i, type) \
3887 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3888 sizeof (Elf64_External_##type))
3889
3890 for (i = 0, section = section_headers;
3891 i < elf_header.e_shnum;
3892 i++, section++)
3893 {
3894 char *name = SECTION_NAME (section);
3895
3896 if (section->sh_type == SHT_DYNSYM)
3897 {
3898 if (dynamic_symbols != NULL)
3899 {
3900 error (_("File contains multiple dynamic symbol tables\n"));
3901 continue;
3902 }
3903
3904 CHECK_ENTSIZE (section, i, Sym);
3905 num_dynamic_syms = section->sh_size / section->sh_entsize;
3906 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3907 }
3908 else if (section->sh_type == SHT_STRTAB
3909 && streq (name, ".dynstr"))
3910 {
3911 if (dynamic_strings != NULL)
3912 {
3913 error (_("File contains multiple dynamic string tables\n"));
3914 continue;
3915 }
3916
3917 dynamic_strings = get_data (NULL, file, section->sh_offset,
3918 1, section->sh_size, _("dynamic strings"));
3919 dynamic_strings_length = section->sh_size;
3920 }
3921 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3922 {
3923 if (symtab_shndx_hdr != NULL)
3924 {
3925 error (_("File contains multiple symtab shndx tables\n"));
3926 continue;
3927 }
3928 symtab_shndx_hdr = section;
3929 }
3930 else if (section->sh_type == SHT_SYMTAB)
3931 CHECK_ENTSIZE (section, i, Sym);
3932 else if (section->sh_type == SHT_GROUP)
3933 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
3934 else if (section->sh_type == SHT_REL)
3935 CHECK_ENTSIZE (section, i, Rel);
3936 else if (section->sh_type == SHT_RELA)
3937 CHECK_ENTSIZE (section, i, Rela);
3938 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3939 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3940 || do_debug_frames || do_debug_macinfo || do_debug_str
3941 || do_debug_loc || do_debug_ranges)
3942 && strneq (name, ".debug_", 7))
3943 {
3944 name += 7;
3945
3946 if (do_debugging
3947 || (do_debug_info && streq (name, "info"))
3948 || (do_debug_abbrevs && streq (name, "abbrev"))
3949 || (do_debug_lines && streq (name, "line"))
3950 || (do_debug_pubnames && streq (name, "pubnames"))
3951 || (do_debug_aranges && streq (name, "aranges"))
3952 || (do_debug_ranges && streq (name, "ranges"))
3953 || (do_debug_frames && streq (name, "frame"))
3954 || (do_debug_macinfo && streq (name, "macinfo"))
3955 || (do_debug_str && streq (name, "str"))
3956 || (do_debug_loc && streq (name, "loc"))
3957 )
3958 request_dump (i, DEBUG_DUMP);
3959 }
3960 /* linkonce section to be combined with .debug_info at link time. */
3961 else if ((do_debugging || do_debug_info)
3962 && strneq (name, ".gnu.linkonce.wi.", 17))
3963 request_dump (i, DEBUG_DUMP);
3964 else if (do_debug_frames && streq (name, ".eh_frame"))
3965 request_dump (i, DEBUG_DUMP);
3966 }
3967
3968 if (! do_sections)
3969 return 1;
3970
3971 if (elf_header.e_shnum > 1)
3972 printf (_("\nSection Headers:\n"));
3973 else
3974 printf (_("\nSection Header:\n"));
3975
3976 if (is_32bit_elf)
3977 {
3978 if (do_full_section_name)
3979 {
3980 printf (_(" [Nr] Name\n"));
3981 printf (_(" Type Addr Off Size ES Flg Lk Inf Al\n"));
3982 }
3983 else
3984 printf
3985 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3986 }
3987 else if (do_wide)
3988 {
3989 if (do_full_section_name)
3990 {
3991 printf (_(" [Nr] Name\n"));
3992 printf (_(" Type Address Off Size ES Flg Lk Inf Al\n"));
3993 }
3994 else
3995 printf
3996 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3997 }
3998 else
3999 {
4000 if (do_full_section_name)
4001 {
4002 printf (_(" [Nr] Name\n"));
4003 printf (_(" Flags Type Address Offset\n"));
4004 printf (_(" Size EntSize Link Info Align\n"));
4005 }
4006 else
4007 {
4008 printf (_(" [Nr] Name Type Address Offset\n"));
4009 printf (_(" Size EntSize Flags Link Info Align\n"));
4010 }
4011 }
4012
4013 for (i = 0, section = section_headers;
4014 i < elf_header.e_shnum;
4015 i++, section++)
4016 {
4017 if (do_full_section_name)
4018 {
4019 printf (" [%2u] %s\n",
4020 SECTION_HEADER_NUM (i),
4021 SECTION_NAME (section));
4022 if (is_32bit_elf || do_wide)
4023 printf (" %-15.15s ",
4024 get_section_type_name (section->sh_type));
4025 }
4026 else
4027 printf (" [%2u] %-17.17s %-15.15s ",
4028 SECTION_HEADER_NUM (i),
4029 SECTION_NAME (section),
4030 get_section_type_name (section->sh_type));
4031
4032 if (is_32bit_elf)
4033 {
4034 print_vma (section->sh_addr, LONG_HEX);
4035
4036 printf ( " %6.6lx %6.6lx %2.2lx",
4037 (unsigned long) section->sh_offset,
4038 (unsigned long) section->sh_size,
4039 (unsigned long) section->sh_entsize);
4040
4041 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4042
4043 printf ("%2ld %3lu %2ld\n",
4044 (unsigned long) section->sh_link,
4045 (unsigned long) section->sh_info,
4046 (unsigned long) section->sh_addralign);
4047 }
4048 else if (do_wide)
4049 {
4050 print_vma (section->sh_addr, LONG_HEX);
4051
4052 if ((long) section->sh_offset == section->sh_offset)
4053 printf (" %6.6lx", (unsigned long) section->sh_offset);
4054 else
4055 {
4056 putchar (' ');
4057 print_vma (section->sh_offset, LONG_HEX);
4058 }
4059
4060 if ((unsigned long) section->sh_size == section->sh_size)
4061 printf (" %6.6lx", (unsigned long) section->sh_size);
4062 else
4063 {
4064 putchar (' ');
4065 print_vma (section->sh_size, LONG_HEX);
4066 }
4067
4068 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4069 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4070 else
4071 {
4072 putchar (' ');
4073 print_vma (section->sh_entsize, LONG_HEX);
4074 }
4075
4076 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4077
4078 printf ("%2ld %3lu ",
4079 (unsigned long) section->sh_link,
4080 (unsigned long) section->sh_info);
4081
4082 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4083 printf ("%2ld\n", (unsigned long) section->sh_addralign);
4084 else
4085 {
4086 print_vma (section->sh_addralign, DEC);
4087 putchar ('\n');
4088 }
4089 }
4090 else if (do_full_section_name)
4091 {
4092 printf (" %-15.15s %-15.15s ",
4093 get_elf_section_flags (section->sh_flags),
4094 get_section_type_name (section->sh_type));
4095 putchar (' ');
4096 print_vma (section->sh_addr, LONG_HEX);
4097 if ((long) section->sh_offset == section->sh_offset)
4098 printf (" %8.8lx", (unsigned long) section->sh_offset);
4099 else
4100 {
4101 printf (" ");
4102 print_vma (section->sh_offset, LONG_HEX);
4103 }
4104 printf ("\n ");
4105 print_vma (section->sh_size, LONG_HEX);
4106 printf (" ");
4107 print_vma (section->sh_entsize, LONG_HEX);
4108
4109 printf (" %2ld %3lu %ld\n",
4110 (unsigned long) section->sh_link,
4111 (unsigned long) section->sh_info,
4112 (unsigned long) section->sh_addralign);
4113 }
4114 else
4115 {
4116 putchar (' ');
4117 print_vma (section->sh_addr, LONG_HEX);
4118 if ((long) section->sh_offset == section->sh_offset)
4119 printf (" %8.8lx", (unsigned long) section->sh_offset);
4120 else
4121 {
4122 printf (" ");
4123 print_vma (section->sh_offset, LONG_HEX);
4124 }
4125 printf ("\n ");
4126 print_vma (section->sh_size, LONG_HEX);
4127 printf (" ");
4128 print_vma (section->sh_entsize, LONG_HEX);
4129
4130 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4131
4132 printf (" %2ld %3lu %ld\n",
4133 (unsigned long) section->sh_link,
4134 (unsigned long) section->sh_info,
4135 (unsigned long) section->sh_addralign);
4136 }
4137 }
4138
4139 printf (_("Key to Flags:\n\
4140 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4141 I (info), L (link order), G (group), x (unknown)\n\
4142 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4143
4144 return 1;
4145 }
4146
4147 static const char *
4148 get_group_flags (unsigned int flags)
4149 {
4150 static char buff[32];
4151 switch (flags)
4152 {
4153 case GRP_COMDAT:
4154 return "COMDAT";
4155
4156 default:
4157 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x]"), flags);
4158 break;
4159 }
4160 return buff;
4161 }
4162
4163 static int
4164 process_section_groups (FILE *file)
4165 {
4166 Elf_Internal_Shdr *section;
4167 unsigned int i;
4168 struct group *group;
4169 Elf_Internal_Shdr *symtab_sec, *strtab_sec;
4170 Elf_Internal_Sym *symtab;
4171 char *strtab;
4172 size_t strtab_size;
4173
4174 /* Don't process section groups unless needed. */
4175 if (!do_unwind && !do_section_groups)
4176 return 1;
4177
4178 if (elf_header.e_shnum == 0)
4179 {
4180 if (do_section_groups)
4181 printf (_("\nThere are no sections in this file.\n"));
4182
4183 return 1;
4184 }
4185
4186 if (section_headers == NULL)
4187 {
4188 error (_("Section headers are not available!\n"));
4189 abort ();
4190 }
4191
4192 section_headers_groups = calloc (elf_header.e_shnum,
4193 sizeof (struct group *));
4194
4195 if (section_headers_groups == NULL)
4196 {
4197 error (_("Out of memory\n"));
4198 return 0;
4199 }
4200
4201 /* Scan the sections for the group section. */
4202 group_count = 0;
4203 for (i = 0, section = section_headers;
4204 i < elf_header.e_shnum;
4205 i++, section++)
4206 if (section->sh_type == SHT_GROUP)
4207 group_count++;
4208
4209 if (group_count == 0)
4210 {
4211 if (do_section_groups)
4212 printf (_("\nThere are no section groups in this file.\n"));
4213
4214 return 1;
4215 }
4216
4217 section_groups = calloc (group_count, sizeof (struct group));
4218
4219 if (section_groups == NULL)
4220 {
4221 error (_("Out of memory\n"));
4222 return 0;
4223 }
4224
4225 symtab_sec = NULL;
4226 strtab_sec = NULL;
4227 symtab = NULL;
4228 strtab = NULL;
4229 strtab_size = 0;
4230 for (i = 0, section = section_headers, group = section_groups;
4231 i < elf_header.e_shnum;
4232 i++, section++)
4233 {
4234 if (section->sh_type == SHT_GROUP)
4235 {
4236 char *name = SECTION_NAME (section);
4237 char *group_name;
4238 unsigned char *start, *indices;
4239 unsigned int entry, j, size;
4240 Elf_Internal_Shdr *sec;
4241 Elf_Internal_Sym *sym;
4242
4243 /* Get the symbol table. */
4244 if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum
4245 || ((sec = SECTION_HEADER (section->sh_link))->sh_type
4246 != SHT_SYMTAB))
4247 {
4248 error (_("Bad sh_link in group section `%s'\n"), name);
4249 continue;
4250 }
4251
4252 if (symtab_sec != sec)
4253 {
4254 symtab_sec = sec;
4255 if (symtab)
4256 free (symtab);
4257 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4258 }
4259
4260 sym = symtab + section->sh_info;
4261
4262 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4263 {
4264 bfd_vma sec_index = SECTION_HEADER_INDEX (sym->st_shndx);
4265 if (sec_index == 0)
4266 {
4267 error (_("Bad sh_info in group section `%s'\n"), name);
4268 continue;
4269 }
4270
4271 group_name = SECTION_NAME (section_headers + sec_index);
4272 strtab_sec = NULL;
4273 if (strtab)
4274 free (strtab);
4275 strtab = NULL;
4276 strtab_size = 0;
4277 }
4278 else
4279 {
4280 /* Get the string table. */
4281 if (SECTION_HEADER_INDEX (symtab_sec->sh_link)
4282 >= elf_header.e_shnum)
4283 {
4284 strtab_sec = NULL;
4285 if (strtab)
4286 free (strtab);
4287 strtab = NULL;
4288 strtab_size = 0;
4289 }
4290 else if (strtab_sec
4291 != (sec = SECTION_HEADER (symtab_sec->sh_link)))
4292 {
4293 strtab_sec = sec;
4294 if (strtab)
4295 free (strtab);
4296 strtab = get_data (NULL, file, strtab_sec->sh_offset,
4297 1, strtab_sec->sh_size,
4298 _("string table"));
4299 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
4300 }
4301 group_name = sym->st_name < strtab_size
4302 ? strtab + sym->st_name : "<corrupt>";
4303 }
4304
4305 start = get_data (NULL, file, section->sh_offset,
4306 1, section->sh_size, _("section data"));
4307
4308 indices = start;
4309 size = (section->sh_size / section->sh_entsize) - 1;
4310 entry = byte_get (indices, 4);
4311 indices += 4;
4312
4313 if (do_section_groups)
4314 {
4315 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4316 get_group_flags (entry), i, name, group_name, size);
4317
4318 printf (_(" [Index] Name\n"));
4319 }
4320
4321 group->group_index = i;
4322
4323 for (j = 0; j < size; j++)
4324 {
4325 struct group_list *g;
4326
4327 entry = byte_get (indices, 4);
4328 indices += 4;
4329
4330 if (SECTION_HEADER_INDEX (entry) >= elf_header.e_shnum)
4331 {
4332 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4333 entry, i, elf_header.e_shnum - 1);
4334 continue;
4335 }
4336 else if (entry >= SHN_LORESERVE && entry <= SHN_HIRESERVE)
4337 {
4338 error (_("invalid section [%5u] in group section [%5u]\n"),
4339 entry, i);
4340 continue;
4341 }
4342
4343 if (section_headers_groups [SECTION_HEADER_INDEX (entry)]
4344 != NULL)
4345 {
4346 if (entry)
4347 {
4348 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4349 entry, i,
4350 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4351 continue;
4352 }
4353 else
4354 {
4355 /* Intel C/C++ compiler may put section 0 in a
4356 section group. We just warn it the first time
4357 and ignore it afterwards. */
4358 static int warned = 0;
4359 if (!warned)
4360 {
4361 error (_("section 0 in group section [%5u]\n"),
4362 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4363 warned++;
4364 }
4365 }
4366 }
4367
4368 section_headers_groups [SECTION_HEADER_INDEX (entry)]
4369 = group;
4370
4371 if (do_section_groups)
4372 {
4373 sec = SECTION_HEADER (entry);
4374 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
4375 }
4376
4377 g = xmalloc (sizeof (struct group_list));
4378 g->section_index = entry;
4379 g->next = group->root;
4380 group->root = g;
4381 }
4382
4383 if (start)
4384 free (start);
4385
4386 group++;
4387 }
4388 }
4389
4390 if (symtab)
4391 free (symtab);
4392 if (strtab)
4393 free (strtab);
4394 return 1;
4395 }
4396
4397 static struct
4398 {
4399 const char *name;
4400 int reloc;
4401 int size;
4402 int rela;
4403 } dynamic_relocations [] =
4404 {
4405 { "REL", DT_REL, DT_RELSZ, FALSE },
4406 { "RELA", DT_RELA, DT_RELASZ, TRUE },
4407 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
4408 };
4409
4410 /* Process the reloc section. */
4411
4412 static int
4413 process_relocs (FILE *file)
4414 {
4415 unsigned long rel_size;
4416 unsigned long rel_offset;
4417
4418
4419 if (!do_reloc)
4420 return 1;
4421
4422 if (do_using_dynamic)
4423 {
4424 int is_rela;
4425 const char *name;
4426 int has_dynamic_reloc;
4427 unsigned int i;
4428
4429 has_dynamic_reloc = 0;
4430
4431 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
4432 {
4433 is_rela = dynamic_relocations [i].rela;
4434 name = dynamic_relocations [i].name;
4435 rel_size = dynamic_info [dynamic_relocations [i].size];
4436 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
4437
4438 has_dynamic_reloc |= rel_size;
4439
4440 if (is_rela == UNKNOWN)
4441 {
4442 if (dynamic_relocations [i].reloc == DT_JMPREL)
4443 switch (dynamic_info[DT_PLTREL])
4444 {
4445 case DT_REL:
4446 is_rela = FALSE;
4447 break;
4448 case DT_RELA:
4449 is_rela = TRUE;
4450 break;
4451 }
4452 }
4453
4454 if (rel_size)
4455 {
4456 printf
4457 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4458 name, rel_offset, rel_size);
4459
4460 dump_relocations (file,
4461 offset_from_vma (file, rel_offset, rel_size),
4462 rel_size,
4463 dynamic_symbols, num_dynamic_syms,
4464 dynamic_strings, dynamic_strings_length, is_rela);
4465 }
4466 }
4467
4468 if (! has_dynamic_reloc)
4469 printf (_("\nThere are no dynamic relocations in this file.\n"));
4470 }
4471 else
4472 {
4473 Elf_Internal_Shdr *section;
4474 unsigned long i;
4475 int found = 0;
4476
4477 for (i = 0, section = section_headers;
4478 i < elf_header.e_shnum;
4479 i++, section++)
4480 {
4481 if ( section->sh_type != SHT_RELA
4482 && section->sh_type != SHT_REL)
4483 continue;
4484
4485 rel_offset = section->sh_offset;
4486 rel_size = section->sh_size;
4487
4488 if (rel_size)
4489 {
4490 Elf_Internal_Shdr *strsec;
4491 int is_rela;
4492
4493 printf (_("\nRelocation section "));
4494
4495 if (string_table == NULL)
4496 printf ("%d", section->sh_name);
4497 else
4498 printf (_("'%s'"), SECTION_NAME (section));
4499
4500 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4501 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4502
4503 is_rela = section->sh_type == SHT_RELA;
4504
4505 if (section->sh_link
4506 && SECTION_HEADER_INDEX (section->sh_link)
4507 < elf_header.e_shnum)
4508 {
4509 Elf_Internal_Shdr *symsec;
4510 Elf_Internal_Sym *symtab;
4511 unsigned long nsyms;
4512 unsigned long strtablen = 0;
4513 char *strtab = NULL;
4514
4515 symsec = SECTION_HEADER (section->sh_link);
4516 if (symsec->sh_type != SHT_SYMTAB
4517 && symsec->sh_type != SHT_DYNSYM)
4518 continue;
4519
4520 nsyms = symsec->sh_size / symsec->sh_entsize;
4521 symtab = GET_ELF_SYMBOLS (file, symsec);
4522
4523 if (symtab == NULL)
4524 continue;
4525
4526 if (SECTION_HEADER_INDEX (symsec->sh_link)
4527 < elf_header.e_shnum)
4528 {
4529 strsec = SECTION_HEADER (symsec->sh_link);
4530
4531 strtab = get_data (NULL, file, strsec->sh_offset,
4532 1, strsec->sh_size,
4533 _("string table"));
4534 strtablen = strtab == NULL ? 0 : strsec->sh_size;
4535 }
4536
4537 dump_relocations (file, rel_offset, rel_size,
4538 symtab, nsyms, strtab, strtablen, is_rela);
4539 if (strtab)
4540 free (strtab);
4541 free (symtab);
4542 }
4543 else
4544 dump_relocations (file, rel_offset, rel_size,
4545 NULL, 0, NULL, 0, is_rela);
4546
4547 found = 1;
4548 }
4549 }
4550
4551 if (! found)
4552 printf (_("\nThere are no relocations in this file.\n"));
4553 }
4554
4555 return 1;
4556 }
4557
4558 /* Process the unwind section. */
4559
4560 #include "unwind-ia64.h"
4561
4562 /* An absolute address consists of a section and an offset. If the
4563 section is NULL, the offset itself is the address, otherwise, the
4564 address equals to LOAD_ADDRESS(section) + offset. */
4565
4566 struct absaddr
4567 {
4568 unsigned short section;
4569 bfd_vma offset;
4570 };
4571
4572 struct ia64_unw_aux_info
4573 {
4574 struct ia64_unw_table_entry
4575 {
4576 struct absaddr start;
4577 struct absaddr end;
4578 struct absaddr info;
4579 }
4580 *table; /* Unwind table. */
4581 unsigned long table_len; /* Length of unwind table. */
4582 unsigned char *info; /* Unwind info. */
4583 unsigned long info_size; /* Size of unwind info. */
4584 bfd_vma info_addr; /* starting address of unwind info. */
4585 bfd_vma seg_base; /* Starting address of segment. */
4586 Elf_Internal_Sym *symtab; /* The symbol table. */
4587 unsigned long nsyms; /* Number of symbols. */
4588 char *strtab; /* The string table. */
4589 unsigned long strtab_size; /* Size of string table. */
4590 };
4591
4592 static void
4593 find_symbol_for_address (Elf_Internal_Sym *symtab,
4594 unsigned long nsyms,
4595 const char *strtab,
4596 unsigned long strtab_size,
4597 struct absaddr addr,
4598 const char **symname,
4599 bfd_vma *offset)
4600 {
4601 bfd_vma dist = 0x100000;
4602 Elf_Internal_Sym *sym, *best = NULL;
4603 unsigned long i;
4604
4605 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
4606 {
4607 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4608 && sym->st_name != 0
4609 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4610 && addr.offset >= sym->st_value
4611 && addr.offset - sym->st_value < dist)
4612 {
4613 best = sym;
4614 dist = addr.offset - sym->st_value;
4615 if (!dist)
4616 break;
4617 }
4618 }
4619 if (best)
4620 {
4621 *symname = (best->st_name >= strtab_size
4622 ? "<corrupt>" : strtab + best->st_name);
4623 *offset = dist;
4624 return;
4625 }
4626 *symname = NULL;
4627 *offset = addr.offset;
4628 }
4629
4630 static void
4631 dump_ia64_unwind (struct ia64_unw_aux_info *aux)
4632 {
4633 struct ia64_unw_table_entry *tp;
4634 int in_body;
4635
4636 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4637 {
4638 bfd_vma stamp;
4639 bfd_vma offset;
4640 const unsigned char *dp;
4641 const unsigned char *head;
4642 const char *procname;
4643
4644 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4645 aux->strtab_size, tp->start, &procname, &offset);
4646
4647 fputs ("\n<", stdout);
4648
4649 if (procname)
4650 {
4651 fputs (procname, stdout);
4652
4653 if (offset)
4654 printf ("+%lx", (unsigned long) offset);
4655 }
4656
4657 fputs (">: [", stdout);
4658 print_vma (tp->start.offset, PREFIX_HEX);
4659 fputc ('-', stdout);
4660 print_vma (tp->end.offset, PREFIX_HEX);
4661 printf ("], info at +0x%lx\n",
4662 (unsigned long) (tp->info.offset - aux->seg_base));
4663
4664 head = aux->info + (tp->info.offset - aux->info_addr);
4665 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4666
4667 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4668 (unsigned) UNW_VER (stamp),
4669 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4670 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4671 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4672 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4673
4674 if (UNW_VER (stamp) != 1)
4675 {
4676 printf ("\tUnknown version.\n");
4677 continue;
4678 }
4679
4680 in_body = 0;
4681 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
4682 dp = unw_decode (dp, in_body, & in_body);
4683 }
4684 }
4685
4686 static int
4687 slurp_ia64_unwind_table (FILE *file,
4688 struct ia64_unw_aux_info *aux,
4689 Elf_Internal_Shdr *sec)
4690 {
4691 unsigned long size, nrelas, i;
4692 Elf_Internal_Phdr *seg;
4693 struct ia64_unw_table_entry *tep;
4694 Elf_Internal_Shdr *relsec;
4695 Elf_Internal_Rela *rela, *rp;
4696 unsigned char *table, *tp;
4697 Elf_Internal_Sym *sym;
4698 const char *relname;
4699
4700 /* First, find the starting address of the segment that includes
4701 this section: */
4702
4703 if (elf_header.e_phnum)
4704 {
4705 if (! get_program_headers (file))
4706 return 0;
4707
4708 for (seg = program_headers;
4709 seg < program_headers + elf_header.e_phnum;
4710 ++seg)
4711 {
4712 if (seg->p_type != PT_LOAD)
4713 continue;
4714
4715 if (sec->sh_addr >= seg->p_vaddr
4716 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4717 {
4718 aux->seg_base = seg->p_vaddr;
4719 break;
4720 }
4721 }
4722 }
4723
4724 /* Second, build the unwind table from the contents of the unwind section: */
4725 size = sec->sh_size;
4726 table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
4727 if (!table)
4728 return 0;
4729
4730 aux->table = xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
4731 tep = aux->table;
4732 for (tp = table; tp < table + size; tp += 3 * eh_addr_size, ++tep)
4733 {
4734 tep->start.section = SHN_UNDEF;
4735 tep->end.section = SHN_UNDEF;
4736 tep->info.section = SHN_UNDEF;
4737 if (is_32bit_elf)
4738 {
4739 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4740 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4741 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4742 }
4743 else
4744 {
4745 tep->start.offset = BYTE_GET ((unsigned char *) tp + 0);
4746 tep->end.offset = BYTE_GET ((unsigned char *) tp + 8);
4747 tep->info.offset = BYTE_GET ((unsigned char *) tp + 16);
4748 }
4749 tep->start.offset += aux->seg_base;
4750 tep->end.offset += aux->seg_base;
4751 tep->info.offset += aux->seg_base;
4752 }
4753 free (table);
4754
4755 /* Third, apply any relocations to the unwind table: */
4756
4757 for (relsec = section_headers;
4758 relsec < section_headers + elf_header.e_shnum;
4759 ++relsec)
4760 {
4761 if (relsec->sh_type != SHT_RELA
4762 || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
4763 || SECTION_HEADER (relsec->sh_info) != sec)
4764 continue;
4765
4766 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4767 & rela, & nrelas))
4768 return 0;
4769
4770 for (rp = rela; rp < rela + nrelas; ++rp)
4771 {
4772 if (is_32bit_elf)
4773 {
4774 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4775 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4776 }
4777 else
4778 {
4779 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4780 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4781 }
4782
4783 if (! strneq (relname, "R_IA64_SEGREL", 13))
4784 {
4785 warn (_("Skipping unexpected relocation type %s\n"), relname);
4786 continue;
4787 }
4788
4789 i = rp->r_offset / (3 * eh_addr_size);
4790
4791 switch (rp->r_offset/eh_addr_size % 3)
4792 {
4793 case 0:
4794 aux->table[i].start.section = sym->st_shndx;
4795 aux->table[i].start.offset += rp->r_addend + sym->st_value;
4796 break;
4797 case 1:
4798 aux->table[i].end.section = sym->st_shndx;
4799 aux->table[i].end.offset += rp->r_addend + sym->st_value;
4800 break;
4801 case 2:
4802 aux->table[i].info.section = sym->st_shndx;
4803 aux->table[i].info.offset += rp->r_addend + sym->st_value;
4804 break;
4805 default:
4806 break;
4807 }
4808 }
4809
4810 free (rela);
4811 }
4812
4813 aux->table_len = size / (3 * eh_addr_size);
4814 return 1;
4815 }
4816
4817 static int
4818 ia64_process_unwind (FILE *file)
4819 {
4820 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4821 unsigned long i, unwcount = 0, unwstart = 0;
4822 struct ia64_unw_aux_info aux;
4823
4824 memset (& aux, 0, sizeof (aux));
4825
4826 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4827 {
4828 if (sec->sh_type == SHT_SYMTAB
4829 && SECTION_HEADER_INDEX (sec->sh_link) < elf_header.e_shnum)
4830 {
4831 aux.nsyms = sec->sh_size / sec->sh_entsize;
4832 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4833
4834 strsec = SECTION_HEADER (sec->sh_link);
4835 aux.strtab = get_data (NULL, file, strsec->sh_offset,
4836 1, strsec->sh_size, _("string table"));
4837 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4838 }
4839 else if (sec->sh_type == SHT_IA_64_UNWIND)
4840 unwcount++;
4841 }
4842
4843 if (!unwcount)
4844 printf (_("\nThere are no unwind sections in this file.\n"));
4845
4846 while (unwcount-- > 0)
4847 {
4848 char *suffix;
4849 size_t len, len2;
4850
4851 for (i = unwstart, sec = section_headers + unwstart;
4852 i < elf_header.e_shnum; ++i, ++sec)
4853 if (sec->sh_type == SHT_IA_64_UNWIND)
4854 {
4855 unwsec = sec;
4856 break;
4857 }
4858
4859 unwstart = i + 1;
4860 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4861
4862 if ((unwsec->sh_flags & SHF_GROUP) != 0)
4863 {
4864 /* We need to find which section group it is in. */
4865 struct group_list *g = section_headers_groups [i]->root;
4866
4867 for (; g != NULL; g = g->next)
4868 {
4869 sec = SECTION_HEADER (g->section_index);
4870
4871 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
4872 break;
4873 }
4874
4875 if (g == NULL)
4876 i = elf_header.e_shnum;
4877 }
4878 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
4879 {
4880 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4881 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4882 suffix = SECTION_NAME (unwsec) + len;
4883 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4884 ++i, ++sec)
4885 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
4886 && streq (SECTION_NAME (sec) + len2, suffix))
4887 break;
4888 }
4889 else
4890 {
4891 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4892 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4893 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4894 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4895 suffix = "";
4896 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
4897 suffix = SECTION_NAME (unwsec) + len;
4898 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4899 ++i, ++sec)
4900 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
4901 && streq (SECTION_NAME (sec) + len2, suffix))
4902 break;
4903 }
4904
4905 if (i == elf_header.e_shnum)
4906 {
4907 printf (_("\nCould not find unwind info section for "));
4908
4909 if (string_table == NULL)
4910 printf ("%d", unwsec->sh_name);
4911 else
4912 printf (_("'%s'"), SECTION_NAME (unwsec));
4913 }
4914 else
4915 {
4916 aux.info_size = sec->sh_size;
4917 aux.info_addr = sec->sh_addr;
4918 aux.info = get_data (NULL, file, sec->sh_offset, 1, aux.info_size,
4919 _("unwind info"));
4920
4921 printf (_("\nUnwind section "));
4922
4923 if (string_table == NULL)
4924 printf ("%d", unwsec->sh_name);
4925 else
4926 printf (_("'%s'"), SECTION_NAME (unwsec));
4927
4928 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4929 (unsigned long) unwsec->sh_offset,
4930 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4931
4932 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4933
4934 if (aux.table_len > 0)
4935 dump_ia64_unwind (& aux);
4936
4937 if (aux.table)
4938 free ((char *) aux.table);
4939 if (aux.info)
4940 free ((char *) aux.info);
4941 aux.table = NULL;
4942 aux.info = NULL;
4943 }
4944 }
4945
4946 if (aux.symtab)
4947 free (aux.symtab);
4948 if (aux.strtab)
4949 free ((char *) aux.strtab);
4950
4951 return 1;
4952 }
4953
4954 struct hppa_unw_aux_info
4955 {
4956 struct hppa_unw_table_entry
4957 {
4958 struct absaddr start;
4959 struct absaddr end;
4960 unsigned int Cannot_unwind:1; /* 0 */
4961 unsigned int Millicode:1; /* 1 */
4962 unsigned int Millicode_save_sr0:1; /* 2 */
4963 unsigned int Region_description:2; /* 3..4 */
4964 unsigned int reserved1:1; /* 5 */
4965 unsigned int Entry_SR:1; /* 6 */
4966 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
4967 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
4968 unsigned int Args_stored:1; /* 16 */
4969 unsigned int Variable_Frame:1; /* 17 */
4970 unsigned int Separate_Package_Body:1; /* 18 */
4971 unsigned int Frame_Extension_Millicode:1; /* 19 */
4972 unsigned int Stack_Overflow_Check:1; /* 20 */
4973 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
4974 unsigned int Ada_Region:1; /* 22 */
4975 unsigned int cxx_info:1; /* 23 */
4976 unsigned int cxx_try_catch:1; /* 24 */
4977 unsigned int sched_entry_seq:1; /* 25 */
4978 unsigned int reserved2:1; /* 26 */
4979 unsigned int Save_SP:1; /* 27 */
4980 unsigned int Save_RP:1; /* 28 */
4981 unsigned int Save_MRP_in_frame:1; /* 29 */
4982 unsigned int extn_ptr_defined:1; /* 30 */
4983 unsigned int Cleanup_defined:1; /* 31 */
4984
4985 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
4986 unsigned int HP_UX_interrupt_marker:1; /* 1 */
4987 unsigned int Large_frame:1; /* 2 */
4988 unsigned int Pseudo_SP_Set:1; /* 3 */
4989 unsigned int reserved4:1; /* 4 */
4990 unsigned int Total_frame_size:27; /* 5..31 */
4991 }
4992 *table; /* Unwind table. */
4993 unsigned long table_len; /* Length of unwind table. */
4994 bfd_vma seg_base; /* Starting address of segment. */
4995 Elf_Internal_Sym *symtab; /* The symbol table. */
4996 unsigned long nsyms; /* Number of symbols. */
4997 char *strtab; /* The string table. */
4998 unsigned long strtab_size; /* Size of string table. */
4999 };
5000
5001 static void
5002 dump_hppa_unwind (struct hppa_unw_aux_info *aux)
5003 {
5004 struct hppa_unw_table_entry *tp;
5005
5006 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5007 {
5008 bfd_vma offset;
5009 const char *procname;
5010
5011 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5012 aux->strtab_size, tp->start, &procname,
5013 &offset);
5014
5015 fputs ("\n<", stdout);
5016
5017 if (procname)
5018 {
5019 fputs (procname, stdout);
5020
5021 if (offset)
5022 printf ("+%lx", (unsigned long) offset);
5023 }
5024
5025 fputs (">: [", stdout);
5026 print_vma (tp->start.offset, PREFIX_HEX);
5027 fputc ('-', stdout);
5028 print_vma (tp->end.offset, PREFIX_HEX);
5029 printf ("]\n\t");
5030
5031 #define PF(_m) if (tp->_m) printf (#_m " ");
5032 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5033 PF(Cannot_unwind);
5034 PF(Millicode);
5035 PF(Millicode_save_sr0);
5036 /* PV(Region_description); */
5037 PF(Entry_SR);
5038 PV(Entry_FR);
5039 PV(Entry_GR);
5040 PF(Args_stored);
5041 PF(Variable_Frame);
5042 PF(Separate_Package_Body);
5043 PF(Frame_Extension_Millicode);
5044 PF(Stack_Overflow_Check);
5045 PF(Two_Instruction_SP_Increment);
5046 PF(Ada_Region);
5047 PF(cxx_info);
5048 PF(cxx_try_catch);
5049 PF(sched_entry_seq);
5050 PF(Save_SP);
5051 PF(Save_RP);
5052 PF(Save_MRP_in_frame);
5053 PF(extn_ptr_defined);
5054 PF(Cleanup_defined);
5055 PF(MPE_XL_interrupt_marker);
5056 PF(HP_UX_interrupt_marker);
5057 PF(Large_frame);
5058 PF(Pseudo_SP_Set);
5059 PV(Total_frame_size);
5060 #undef PF
5061 #undef PV
5062 }
5063
5064 printf ("\n");
5065 }
5066
5067 static int
5068 slurp_hppa_unwind_table (FILE *file,
5069 struct hppa_unw_aux_info *aux,
5070 Elf_Internal_Shdr *sec)
5071 {
5072 unsigned long size, unw_ent_size, nrelas, i;
5073 Elf_Internal_Phdr *seg;
5074 struct hppa_unw_table_entry *tep;
5075 Elf_Internal_Shdr *relsec;
5076 Elf_Internal_Rela *rela, *rp;
5077 unsigned char *table, *tp;
5078 Elf_Internal_Sym *sym;
5079 const char *relname;
5080
5081 /* First, find the starting address of the segment that includes
5082 this section. */
5083
5084 if (elf_header.e_phnum)
5085 {
5086 if (! get_program_headers (file))
5087 return 0;
5088
5089 for (seg = program_headers;
5090 seg < program_headers + elf_header.e_phnum;
5091 ++seg)
5092 {
5093 if (seg->p_type != PT_LOAD)
5094 continue;
5095
5096 if (sec->sh_addr >= seg->p_vaddr
5097 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5098 {
5099 aux->seg_base = seg->p_vaddr;
5100 break;
5101 }
5102 }
5103 }
5104
5105 /* Second, build the unwind table from the contents of the unwind
5106 section. */
5107 size = sec->sh_size;
5108 table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
5109 if (!table)
5110 return 0;
5111
5112 unw_ent_size = 2 * eh_addr_size + 8;
5113
5114 tep = aux->table = xcmalloc (size / unw_ent_size, sizeof (aux->table[0]));
5115
5116 for (tp = table; tp < table + size; tp += (2 * eh_addr_size + 8), ++tep)
5117 {
5118 unsigned int tmp1, tmp2;
5119
5120 tep->start.section = SHN_UNDEF;
5121 tep->end.section = SHN_UNDEF;
5122
5123 if (is_32bit_elf)
5124 {
5125 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
5126 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
5127 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
5128 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
5129 }
5130 else
5131 {
5132 tep->start.offset = BYTE_GET ((unsigned char *) tp + 0);
5133 tep->end.offset = BYTE_GET ((unsigned char *) tp + 8);
5134 tmp1 = byte_get ((unsigned char *) tp + 16, 4);
5135 tmp2 = byte_get ((unsigned char *) tp + 20, 4);
5136 }
5137
5138 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
5139 tep->Millicode = (tmp1 >> 30) & 0x1;
5140 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
5141 tep->Region_description = (tmp1 >> 27) & 0x3;
5142 tep->reserved1 = (tmp1 >> 26) & 0x1;
5143 tep->Entry_SR = (tmp1 >> 25) & 0x1;
5144 tep->Entry_FR = (tmp1 >> 21) & 0xf;
5145 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
5146 tep->Args_stored = (tmp1 >> 15) & 0x1;
5147 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
5148 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
5149 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
5150 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
5151 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
5152 tep->Ada_Region = (tmp1 >> 9) & 0x1;
5153 tep->cxx_info = (tmp1 >> 8) & 0x1;
5154 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
5155 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
5156 tep->reserved2 = (tmp1 >> 5) & 0x1;
5157 tep->Save_SP = (tmp1 >> 4) & 0x1;
5158 tep->Save_RP = (tmp1 >> 3) & 0x1;
5159 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
5160 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
5161 tep->Cleanup_defined = tmp1 & 0x1;
5162
5163 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
5164 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
5165 tep->Large_frame = (tmp2 >> 29) & 0x1;
5166 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
5167 tep->reserved4 = (tmp2 >> 27) & 0x1;
5168 tep->Total_frame_size = tmp2 & 0x7ffffff;
5169
5170 tep->start.offset += aux->seg_base;
5171 tep->end.offset += aux->seg_base;
5172 }
5173 free (table);
5174
5175 /* Third, apply any relocations to the unwind table. */
5176
5177 for (relsec = section_headers;
5178 relsec < section_headers + elf_header.e_shnum;
5179 ++relsec)
5180 {
5181 if (relsec->sh_type != SHT_RELA
5182 || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
5183 || SECTION_HEADER (relsec->sh_info) != sec)
5184 continue;
5185
5186 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5187 & rela, & nrelas))
5188 return 0;
5189
5190 for (rp = rela; rp < rela + nrelas; ++rp)
5191 {
5192 if (is_32bit_elf)
5193 {
5194 relname = elf_hppa_reloc_type (ELF32_R_TYPE (rp->r_info));
5195 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
5196 }
5197 else
5198 {
5199 relname = elf_hppa_reloc_type (ELF64_R_TYPE (rp->r_info));
5200 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
5201 }
5202
5203 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5204 if (strncmp (relname, "R_PARISC_SEGREL", 15) != 0)
5205 {
5206 warn (_("Skipping unexpected relocation type %s\n"), relname);
5207 continue;
5208 }
5209
5210 i = rp->r_offset / unw_ent_size;
5211
5212 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
5213 {
5214 case 0:
5215 aux->table[i].start.section = sym->st_shndx;
5216 aux->table[i].start.offset += sym->st_value + rp->r_addend;
5217 break;
5218 case 1:
5219 aux->table[i].end.section = sym->st_shndx;
5220 aux->table[i].end.offset += sym->st_value + rp->r_addend;
5221 break;
5222 default:
5223 break;
5224 }
5225 }
5226
5227 free (rela);
5228 }
5229
5230 aux->table_len = size / unw_ent_size;
5231
5232 return 1;
5233 }
5234
5235 static int
5236 hppa_process_unwind (FILE *file)
5237 {
5238 struct hppa_unw_aux_info aux;
5239 Elf_Internal_Shdr *unwsec = NULL;
5240 Elf_Internal_Shdr *strsec;
5241 Elf_Internal_Shdr *sec;
5242 unsigned long i;
5243
5244 memset (& aux, 0, sizeof (aux));
5245
5246 if (string_table == NULL)
5247 return 1;
5248
5249 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5250 {
5251 if (sec->sh_type == SHT_SYMTAB
5252 && SECTION_HEADER_INDEX (sec->sh_link) < elf_header.e_shnum)
5253 {
5254 aux.nsyms = sec->sh_size / sec->sh_entsize;
5255 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5256
5257 strsec = SECTION_HEADER (sec->sh_link);
5258 aux.strtab = get_data (NULL, file, strsec->sh_offset,
5259 1, strsec->sh_size, _("string table"));
5260 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5261 }
5262 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5263 unwsec = sec;
5264 }
5265
5266 if (!unwsec)
5267 printf (_("\nThere are no unwind sections in this file.\n"));
5268
5269 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5270 {
5271 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5272 {
5273 printf (_("\nUnwind section "));
5274 printf (_("'%s'"), SECTION_NAME (sec));
5275
5276 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5277 (unsigned long) sec->sh_offset,
5278 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
5279
5280 slurp_hppa_unwind_table (file, &aux, sec);
5281 if (aux.table_len > 0)
5282 dump_hppa_unwind (&aux);
5283
5284 if (aux.table)
5285 free ((char *) aux.table);
5286 aux.table = NULL;
5287 }
5288 }
5289
5290 if (aux.symtab)
5291 free (aux.symtab);
5292 if (aux.strtab)
5293 free ((char *) aux.strtab);
5294
5295 return 1;
5296 }
5297
5298 static int
5299 process_unwind (FILE *file)
5300 {
5301 struct unwind_handler {
5302 int machtype;
5303 int (*handler)(FILE *file);
5304 } handlers[] = {
5305 { EM_IA_64, ia64_process_unwind },
5306 { EM_PARISC, hppa_process_unwind },
5307 { 0, 0 }
5308 };
5309 int i;
5310
5311 if (!do_unwind)
5312 return 1;
5313
5314 for (i = 0; handlers[i].handler != NULL; i++)
5315 if (elf_header.e_machine == handlers[i].machtype)
5316 return handlers[i].handler (file);
5317
5318 printf (_("\nThere are no unwind sections in this file.\n"));
5319 return 1;
5320 }
5321
5322 static void
5323 dynamic_section_mips_val (Elf_Internal_Dyn *entry)
5324 {
5325 switch (entry->d_tag)
5326 {
5327 case DT_MIPS_FLAGS:
5328 if (entry->d_un.d_val == 0)
5329 printf ("NONE\n");
5330 else
5331 {
5332 static const char * opts[] =
5333 {
5334 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5335 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5336 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5337 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5338 "RLD_ORDER_SAFE"
5339 };
5340 unsigned int cnt;
5341 int first = 1;
5342 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
5343 if (entry->d_un.d_val & (1 << cnt))
5344 {
5345 printf ("%s%s", first ? "" : " ", opts[cnt]);
5346 first = 0;
5347 }
5348 puts ("");
5349 }
5350 break;
5351
5352 case DT_MIPS_IVERSION:
5353 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5354 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5355 else
5356 printf ("<corrupt: %ld>\n", (long) entry->d_un.d_ptr);
5357 break;
5358
5359 case DT_MIPS_TIME_STAMP:
5360 {
5361 char timebuf[20];
5362 struct tm *tmp;
5363
5364 time_t time = entry->d_un.d_val;
5365 tmp = gmtime (&time);
5366 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
5367 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5368 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5369 printf ("Time Stamp: %s\n", timebuf);
5370 }
5371 break;
5372
5373 case DT_MIPS_RLD_VERSION:
5374 case DT_MIPS_LOCAL_GOTNO:
5375 case DT_MIPS_CONFLICTNO:
5376 case DT_MIPS_LIBLISTNO:
5377 case DT_MIPS_SYMTABNO:
5378 case DT_MIPS_UNREFEXTNO:
5379 case DT_MIPS_HIPAGENO:
5380 case DT_MIPS_DELTA_CLASS_NO:
5381 case DT_MIPS_DELTA_INSTANCE_NO:
5382 case DT_MIPS_DELTA_RELOC_NO:
5383 case DT_MIPS_DELTA_SYM_NO:
5384 case DT_MIPS_DELTA_CLASSSYM_NO:
5385 case DT_MIPS_COMPACT_SIZE:
5386 printf ("%ld\n", (long) entry->d_un.d_ptr);
5387 break;
5388
5389 default:
5390 printf ("%#lx\n", (long) entry->d_un.d_ptr);
5391 }
5392 }
5393
5394
5395 static void
5396 dynamic_section_parisc_val (Elf_Internal_Dyn *entry)
5397 {
5398 switch (entry->d_tag)
5399 {
5400 case DT_HP_DLD_FLAGS:
5401 {
5402 static struct
5403 {
5404 long int bit;
5405 const char *str;
5406 }
5407 flags[] =
5408 {
5409 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
5410 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
5411 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
5412 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
5413 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
5414 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
5415 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
5416 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
5417 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
5418 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
5419 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
5420 };
5421 int first = 1;
5422 size_t cnt;
5423 bfd_vma val = entry->d_un.d_val;
5424
5425 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
5426 if (val & flags[cnt].bit)
5427 {
5428 if (! first)
5429 putchar (' ');
5430 fputs (flags[cnt].str, stdout);
5431 first = 0;
5432 val ^= flags[cnt].bit;
5433 }
5434
5435 if (val != 0 || first)
5436 {
5437 if (! first)
5438 putchar (' ');
5439 print_vma (val, HEX);
5440 }
5441 }
5442 break;
5443
5444 default:
5445 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5446 break;
5447 }
5448 putchar ('\n');
5449 }
5450
5451 static void
5452 dynamic_section_ia64_val (Elf_Internal_Dyn *entry)
5453 {
5454 switch (entry->d_tag)
5455 {
5456 case DT_IA_64_PLT_RESERVE:
5457 /* First 3 slots reserved. */
5458 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5459 printf (" -- ");
5460 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
5461 break;
5462
5463 default:
5464 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5465 break;
5466 }
5467 putchar ('\n');
5468 }
5469
5470 static int
5471 get_32bit_dynamic_section (FILE *file)
5472 {
5473 Elf32_External_Dyn *edyn, *ext;
5474 Elf_Internal_Dyn *entry;
5475
5476 edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5477 _("dynamic section"));
5478 if (!edyn)
5479 return 0;
5480
5481 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5482 might not have the luxury of section headers. Look for the DT_NULL
5483 terminator to determine the number of entries. */
5484 for (ext = edyn, dynamic_nent = 0;
5485 (char *) ext < (char *) edyn + dynamic_size;
5486 ext++)
5487 {
5488 dynamic_nent++;
5489 if (BYTE_GET (ext->d_tag) == DT_NULL)
5490 break;
5491 }
5492
5493 dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5494 if (dynamic_section == NULL)
5495 {
5496 error (_("Out of memory\n"));
5497 free (edyn);
5498 return 0;
5499 }
5500
5501 for (ext = edyn, entry = dynamic_section;
5502 entry < dynamic_section + dynamic_nent;
5503 ext++, entry++)
5504 {
5505 entry->d_tag = BYTE_GET (ext->d_tag);
5506 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5507 }
5508
5509 free (edyn);
5510
5511 return 1;
5512 }
5513
5514 static int
5515 get_64bit_dynamic_section (FILE *file)
5516 {
5517 Elf64_External_Dyn *edyn, *ext;
5518 Elf_Internal_Dyn *entry;
5519
5520 edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5521 _("dynamic section"));
5522 if (!edyn)
5523 return 0;
5524
5525 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5526 might not have the luxury of section headers. Look for the DT_NULL
5527 terminator to determine the number of entries. */
5528 for (ext = edyn, dynamic_nent = 0;
5529 (char *) ext < (char *) edyn + dynamic_size;
5530 ext++)
5531 {
5532 dynamic_nent++;
5533 if (BYTE_GET (ext->d_tag) == DT_NULL)
5534 break;
5535 }
5536
5537 dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5538 if (dynamic_section == NULL)
5539 {
5540 error (_("Out of memory\n"));
5541 free (edyn);
5542 return 0;
5543 }
5544
5545 for (ext = edyn, entry = dynamic_section;
5546 entry < dynamic_section + dynamic_nent;
5547 ext++, entry++)
5548 {
5549 entry->d_tag = BYTE_GET (ext->d_tag);
5550 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5551 }
5552
5553 free (edyn);
5554
5555 return 1;
5556 }
5557
5558 static void
5559 print_dynamic_flags (bfd_vma flags)
5560 {
5561 int first = 1;
5562
5563 while (flags)
5564 {
5565 bfd_vma flag;
5566
5567 flag = flags & - flags;
5568 flags &= ~ flag;
5569
5570 if (first)
5571 first = 0;
5572 else
5573 putc (' ', stdout);
5574
5575 switch (flag)
5576 {
5577 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
5578 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
5579 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
5580 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
5581 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
5582 default: fputs ("unknown", stdout); break;
5583 }
5584 }
5585 puts ("");
5586 }
5587
5588 /* Parse and display the contents of the dynamic section. */
5589
5590 static int
5591 process_dynamic_section (FILE *file)
5592 {
5593 Elf_Internal_Dyn *entry;
5594
5595 if (dynamic_size == 0)
5596 {
5597 if (do_dynamic)
5598 printf (_("\nThere is no dynamic section in this file.\n"));
5599
5600 return 1;
5601 }
5602
5603 if (is_32bit_elf)
5604 {
5605 if (! get_32bit_dynamic_section (file))
5606 return 0;
5607 }
5608 else if (! get_64bit_dynamic_section (file))
5609 return 0;
5610
5611 /* Find the appropriate symbol table. */
5612 if (dynamic_symbols == NULL)
5613 {
5614 for (entry = dynamic_section;
5615 entry < dynamic_section + dynamic_nent;
5616 ++entry)
5617 {
5618 Elf_Internal_Shdr section;
5619
5620 if (entry->d_tag != DT_SYMTAB)
5621 continue;
5622
5623 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
5624
5625 /* Since we do not know how big the symbol table is,
5626 we default to reading in the entire file (!) and
5627 processing that. This is overkill, I know, but it
5628 should work. */
5629 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
5630
5631 if (archive_file_offset != 0)
5632 section.sh_size = archive_file_size - section.sh_offset;
5633 else
5634 {
5635 if (fseek (file, 0, SEEK_END))
5636 error (_("Unable to seek to end of file!"));
5637
5638 section.sh_size = ftell (file) - section.sh_offset;
5639 }
5640
5641 if (is_32bit_elf)
5642 section.sh_entsize = sizeof (Elf32_External_Sym);
5643 else
5644 section.sh_entsize = sizeof (Elf64_External_Sym);
5645
5646 num_dynamic_syms = section.sh_size / section.sh_entsize;
5647 if (num_dynamic_syms < 1)
5648 {
5649 error (_("Unable to determine the number of symbols to load\n"));
5650 continue;
5651 }
5652
5653 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
5654 }
5655 }
5656
5657 /* Similarly find a string table. */
5658 if (dynamic_strings == NULL)
5659 {
5660 for (entry = dynamic_section;
5661 entry < dynamic_section + dynamic_nent;
5662 ++entry)
5663 {
5664 unsigned long offset;
5665 long str_tab_len;
5666
5667 if (entry->d_tag != DT_STRTAB)
5668 continue;
5669
5670 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
5671
5672 /* Since we do not know how big the string table is,
5673 we default to reading in the entire file (!) and
5674 processing that. This is overkill, I know, but it
5675 should work. */
5676
5677 offset = offset_from_vma (file, entry->d_un.d_val, 0);
5678
5679 if (archive_file_offset != 0)
5680 str_tab_len = archive_file_size - offset;
5681 else
5682 {
5683 if (fseek (file, 0, SEEK_END))
5684 error (_("Unable to seek to end of file\n"));
5685 str_tab_len = ftell (file) - offset;
5686 }
5687
5688 if (str_tab_len < 1)
5689 {
5690 error
5691 (_("Unable to determine the length of the dynamic string table\n"));
5692 continue;
5693 }
5694
5695 dynamic_strings = get_data (NULL, file, offset, 1, str_tab_len,
5696 _("dynamic string table"));
5697 dynamic_strings_length = str_tab_len;
5698 break;
5699 }
5700 }
5701
5702 /* And find the syminfo section if available. */
5703 if (dynamic_syminfo == NULL)
5704 {
5705 unsigned long syminsz = 0;
5706
5707 for (entry = dynamic_section;
5708 entry < dynamic_section + dynamic_nent;
5709 ++entry)
5710 {
5711 if (entry->d_tag == DT_SYMINENT)
5712 {
5713 /* Note: these braces are necessary to avoid a syntax
5714 error from the SunOS4 C compiler. */
5715 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
5716 }
5717 else if (entry->d_tag == DT_SYMINSZ)
5718 syminsz = entry->d_un.d_val;
5719 else if (entry->d_tag == DT_SYMINFO)
5720 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
5721 syminsz);
5722 }
5723
5724 if (dynamic_syminfo_offset != 0 && syminsz != 0)
5725 {
5726 Elf_External_Syminfo *extsyminfo, *extsym;
5727 Elf_Internal_Syminfo *syminfo;
5728
5729 /* There is a syminfo section. Read the data. */
5730 extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, 1,
5731 syminsz, _("symbol information"));
5732 if (!extsyminfo)
5733 return 0;
5734
5735 dynamic_syminfo = malloc (syminsz);
5736 if (dynamic_syminfo == NULL)
5737 {
5738 error (_("Out of memory\n"));
5739 return 0;
5740 }
5741
5742 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
5743 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
5744 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
5745 ++syminfo, ++extsym)
5746 {
5747 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
5748 syminfo->si_flags = BYTE_GET (extsym->si_flags);
5749 }
5750
5751 free (extsyminfo);
5752 }
5753 }
5754
5755 if (do_dynamic && dynamic_addr)
5756 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5757 dynamic_addr, dynamic_nent);
5758 if (do_dynamic)
5759 printf (_(" Tag Type Name/Value\n"));
5760
5761 for (entry = dynamic_section;
5762 entry < dynamic_section + dynamic_nent;
5763 entry++)
5764 {
5765 if (do_dynamic)
5766 {
5767 const char *dtype;
5768
5769 putchar (' ');
5770 print_vma (entry->d_tag, FULL_HEX);
5771 dtype = get_dynamic_type (entry->d_tag);
5772 printf (" (%s)%*s", dtype,
5773 ((is_32bit_elf ? 27 : 19)
5774 - (int) strlen (dtype)),
5775 " ");
5776 }
5777
5778 switch (entry->d_tag)
5779 {
5780 case DT_FLAGS:
5781 if (do_dynamic)
5782 print_dynamic_flags (entry->d_un.d_val);
5783 break;
5784
5785 case DT_AUXILIARY:
5786 case DT_FILTER:
5787 case DT_CONFIG:
5788 case DT_DEPAUDIT:
5789 case DT_AUDIT:
5790 if (do_dynamic)
5791 {
5792 switch (entry->d_tag)
5793 {
5794 case DT_AUXILIARY:
5795 printf (_("Auxiliary library"));
5796 break;
5797
5798 case DT_FILTER:
5799 printf (_("Filter library"));
5800 break;
5801
5802 case DT_CONFIG:
5803 printf (_("Configuration file"));
5804 break;
5805
5806 case DT_DEPAUDIT:
5807 printf (_("Dependency audit library"));
5808 break;
5809
5810 case DT_AUDIT:
5811 printf (_("Audit library"));
5812 break;
5813 }
5814
5815 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5816 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5817 else
5818 {
5819 printf (": ");
5820 print_vma (entry->d_un.d_val, PREFIX_HEX);
5821 putchar ('\n');
5822 }
5823 }
5824 break;
5825
5826 case DT_FEATURE:
5827 if (do_dynamic)
5828 {
5829 printf (_("Flags:"));
5830
5831 if (entry->d_un.d_val == 0)
5832 printf (_(" None\n"));
5833 else
5834 {
5835 unsigned long int val = entry->d_un.d_val;
5836
5837 if (val & DTF_1_PARINIT)
5838 {
5839 printf (" PARINIT");
5840 val ^= DTF_1_PARINIT;
5841 }
5842 if (val & DTF_1_CONFEXP)
5843 {
5844 printf (" CONFEXP");
5845 val ^= DTF_1_CONFEXP;
5846 }
5847 if (val != 0)
5848 printf (" %lx", val);
5849 puts ("");
5850 }
5851 }
5852 break;
5853
5854 case DT_POSFLAG_1:
5855 if (do_dynamic)
5856 {
5857 printf (_("Flags:"));
5858
5859 if (entry->d_un.d_val == 0)
5860 printf (_(" None\n"));
5861 else
5862 {
5863 unsigned long int val = entry->d_un.d_val;
5864
5865 if (val & DF_P1_LAZYLOAD)
5866 {
5867 printf (" LAZYLOAD");
5868 val ^= DF_P1_LAZYLOAD;
5869 }
5870 if (val & DF_P1_GROUPPERM)
5871 {
5872 printf (" GROUPPERM");
5873 val ^= DF_P1_GROUPPERM;
5874 }
5875 if (val != 0)
5876 printf (" %lx", val);
5877 puts ("");
5878 }
5879 }
5880 break;
5881
5882 case DT_FLAGS_1:
5883 if (do_dynamic)
5884 {
5885 printf (_("Flags:"));
5886 if (entry->d_un.d_val == 0)
5887 printf (_(" None\n"));
5888 else
5889 {
5890 unsigned long int val = entry->d_un.d_val;
5891
5892 if (val & DF_1_NOW)
5893 {
5894 printf (" NOW");
5895 val ^= DF_1_NOW;
5896 }
5897 if (val & DF_1_GLOBAL)
5898 {
5899 printf (" GLOBAL");
5900 val ^= DF_1_GLOBAL;
5901 }
5902 if (val & DF_1_GROUP)
5903 {
5904 printf (" GROUP");
5905 val ^= DF_1_GROUP;
5906 }
5907 if (val & DF_1_NODELETE)
5908 {
5909 printf (" NODELETE");
5910 val ^= DF_1_NODELETE;
5911 }
5912 if (val & DF_1_LOADFLTR)
5913 {
5914 printf (" LOADFLTR");
5915 val ^= DF_1_LOADFLTR;
5916 }
5917 if (val & DF_1_INITFIRST)
5918 {
5919 printf (" INITFIRST");
5920 val ^= DF_1_INITFIRST;
5921 }
5922 if (val & DF_1_NOOPEN)
5923 {
5924 printf (" NOOPEN");
5925 val ^= DF_1_NOOPEN;
5926 }
5927 if (val & DF_1_ORIGIN)
5928 {
5929 printf (" ORIGIN");
5930 val ^= DF_1_ORIGIN;
5931 }
5932 if (val & DF_1_DIRECT)
5933 {
5934 printf (" DIRECT");
5935 val ^= DF_1_DIRECT;
5936 }
5937 if (val & DF_1_TRANS)
5938 {
5939 printf (" TRANS");
5940 val ^= DF_1_TRANS;
5941 }
5942 if (val & DF_1_INTERPOSE)
5943 {
5944 printf (" INTERPOSE");
5945 val ^= DF_1_INTERPOSE;
5946 }
5947 if (val & DF_1_NODEFLIB)
5948 {
5949 printf (" NODEFLIB");
5950 val ^= DF_1_NODEFLIB;
5951 }
5952 if (val & DF_1_NODUMP)
5953 {
5954 printf (" NODUMP");
5955 val ^= DF_1_NODUMP;
5956 }
5957 if (val & DF_1_CONLFAT)
5958 {
5959 printf (" CONLFAT");
5960 val ^= DF_1_CONLFAT;
5961 }
5962 if (val != 0)
5963 printf (" %lx", val);
5964 puts ("");
5965 }
5966 }
5967 break;
5968
5969 case DT_PLTREL:
5970 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5971 if (do_dynamic)
5972 puts (get_dynamic_type (entry->d_un.d_val));
5973 break;
5974
5975 case DT_NULL :
5976 case DT_NEEDED :
5977 case DT_PLTGOT :
5978 case DT_HASH :
5979 case DT_STRTAB :
5980 case DT_SYMTAB :
5981 case DT_RELA :
5982 case DT_INIT :
5983 case DT_FINI :
5984 case DT_SONAME :
5985 case DT_RPATH :
5986 case DT_SYMBOLIC:
5987 case DT_REL :
5988 case DT_DEBUG :
5989 case DT_TEXTREL :
5990 case DT_JMPREL :
5991 case DT_RUNPATH :
5992 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5993
5994 if (do_dynamic)
5995 {
5996 char *name;
5997
5998 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5999 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6000 else
6001 name = NULL;
6002
6003 if (name)
6004 {
6005 switch (entry->d_tag)
6006 {
6007 case DT_NEEDED:
6008 printf (_("Shared library: [%s]"), name);
6009
6010 if (streq (name, program_interpreter))
6011 printf (_(" program interpreter"));
6012 break;
6013
6014 case DT_SONAME:
6015 printf (_("Library soname: [%s]"), name);
6016 break;
6017
6018 case DT_RPATH:
6019 printf (_("Library rpath: [%s]"), name);
6020 break;
6021
6022 case DT_RUNPATH:
6023 printf (_("Library runpath: [%s]"), name);
6024 break;
6025
6026 default:
6027 print_vma (entry->d_un.d_val, PREFIX_HEX);
6028 break;
6029 }
6030 }
6031 else
6032 print_vma (entry->d_un.d_val, PREFIX_HEX);
6033
6034 putchar ('\n');
6035 }
6036 break;
6037
6038 case DT_PLTRELSZ:
6039 case DT_RELASZ :
6040 case DT_STRSZ :
6041 case DT_RELSZ :
6042 case DT_RELAENT :
6043 case DT_SYMENT :
6044 case DT_RELENT :
6045 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6046 case DT_PLTPADSZ:
6047 case DT_MOVEENT :
6048 case DT_MOVESZ :
6049 case DT_INIT_ARRAYSZ:
6050 case DT_FINI_ARRAYSZ:
6051 case DT_GNU_CONFLICTSZ:
6052 case DT_GNU_LIBLISTSZ:
6053 if (do_dynamic)
6054 {
6055 print_vma (entry->d_un.d_val, UNSIGNED);
6056 printf (" (bytes)\n");
6057 }
6058 break;
6059
6060 case DT_VERDEFNUM:
6061 case DT_VERNEEDNUM:
6062 case DT_RELACOUNT:
6063 case DT_RELCOUNT:
6064 if (do_dynamic)
6065 {
6066 print_vma (entry->d_un.d_val, UNSIGNED);
6067 putchar ('\n');
6068 }
6069 break;
6070
6071 case DT_SYMINSZ:
6072 case DT_SYMINENT:
6073 case DT_SYMINFO:
6074 case DT_USED:
6075 case DT_INIT_ARRAY:
6076 case DT_FINI_ARRAY:
6077 if (do_dynamic)
6078 {
6079 if (entry->d_tag == DT_USED
6080 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
6081 {
6082 char *name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6083
6084 if (*name)
6085 {
6086 printf (_("Not needed object: [%s]\n"), name);
6087 break;
6088 }
6089 }
6090
6091 print_vma (entry->d_un.d_val, PREFIX_HEX);
6092 putchar ('\n');
6093 }
6094 break;
6095
6096 case DT_BIND_NOW:
6097 /* The value of this entry is ignored. */
6098 if (do_dynamic)
6099 putchar ('\n');
6100 break;
6101
6102 case DT_GNU_PRELINKED:
6103 if (do_dynamic)
6104 {
6105 struct tm *tmp;
6106 time_t time = entry->d_un.d_val;
6107
6108 tmp = gmtime (&time);
6109 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6110 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6111 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6112
6113 }
6114 break;
6115
6116 default:
6117 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
6118 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
6119 entry->d_un.d_val;
6120
6121 if (do_dynamic)
6122 {
6123 switch (elf_header.e_machine)
6124 {
6125 case EM_MIPS:
6126 case EM_MIPS_RS3_LE:
6127 dynamic_section_mips_val (entry);
6128 break;
6129 case EM_PARISC:
6130 dynamic_section_parisc_val (entry);
6131 break;
6132 case EM_IA_64:
6133 dynamic_section_ia64_val (entry);
6134 break;
6135 default:
6136 print_vma (entry->d_un.d_val, PREFIX_HEX);
6137 putchar ('\n');
6138 }
6139 }
6140 break;
6141 }
6142 }
6143
6144 return 1;
6145 }
6146
6147 static char *
6148 get_ver_flags (unsigned int flags)
6149 {
6150 static char buff[32];
6151
6152 buff[0] = 0;
6153
6154 if (flags == 0)
6155 return _("none");
6156
6157 if (flags & VER_FLG_BASE)
6158 strcat (buff, "BASE ");
6159
6160 if (flags & VER_FLG_WEAK)
6161 {
6162 if (flags & VER_FLG_BASE)
6163 strcat (buff, "| ");
6164
6165 strcat (buff, "WEAK ");
6166 }
6167
6168 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
6169 strcat (buff, "| <unknown>");
6170
6171 return buff;
6172 }
6173
6174 /* Display the contents of the version sections. */
6175 static int
6176 process_version_sections (FILE *file)
6177 {
6178 Elf_Internal_Shdr *section;
6179 unsigned i;
6180 int found = 0;
6181
6182 if (! do_version)
6183 return 1;
6184
6185 for (i = 0, section = section_headers;
6186 i < elf_header.e_shnum;
6187 i++, section++)
6188 {
6189 switch (section->sh_type)
6190 {
6191 case SHT_GNU_verdef:
6192 {
6193 Elf_External_Verdef *edefs;
6194 unsigned int idx;
6195 unsigned int cnt;
6196
6197 found = 1;
6198
6199 printf
6200 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6201 SECTION_NAME (section), section->sh_info);
6202
6203 printf (_(" Addr: 0x"));
6204 printf_vma (section->sh_addr);
6205 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6206 (unsigned long) section->sh_offset, section->sh_link,
6207 SECTION_HEADER_INDEX (section->sh_link)
6208 < elf_header.e_shnum
6209 ? SECTION_NAME (SECTION_HEADER (section->sh_link))
6210 : "<corrupt>");
6211
6212 edefs = get_data (NULL, file, section->sh_offset, 1,
6213 section->sh_size,
6214 _("version definition section"));
6215 if (!edefs)
6216 break;
6217
6218 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6219 {
6220 char *vstart;
6221 Elf_External_Verdef *edef;
6222 Elf_Internal_Verdef ent;
6223 Elf_External_Verdaux *eaux;
6224 Elf_Internal_Verdaux aux;
6225 int j;
6226 int isum;
6227
6228 vstart = ((char *) edefs) + idx;
6229
6230 edef = (Elf_External_Verdef *) vstart;
6231
6232 ent.vd_version = BYTE_GET (edef->vd_version);
6233 ent.vd_flags = BYTE_GET (edef->vd_flags);
6234 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
6235 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
6236 ent.vd_hash = BYTE_GET (edef->vd_hash);
6237 ent.vd_aux = BYTE_GET (edef->vd_aux);
6238 ent.vd_next = BYTE_GET (edef->vd_next);
6239
6240 printf (_(" %#06x: Rev: %d Flags: %s"),
6241 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
6242
6243 printf (_(" Index: %d Cnt: %d "),
6244 ent.vd_ndx, ent.vd_cnt);
6245
6246 vstart += ent.vd_aux;
6247
6248 eaux = (Elf_External_Verdaux *) vstart;
6249
6250 aux.vda_name = BYTE_GET (eaux->vda_name);
6251 aux.vda_next = BYTE_GET (eaux->vda_next);
6252
6253 if (VALID_DYNAMIC_NAME (aux.vda_name))
6254 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
6255 else
6256 printf (_("Name index: %ld\n"), aux.vda_name);
6257
6258 isum = idx + ent.vd_aux;
6259
6260 for (j = 1; j < ent.vd_cnt; j++)
6261 {
6262 isum += aux.vda_next;
6263 vstart += aux.vda_next;
6264
6265 eaux = (Elf_External_Verdaux *) vstart;
6266
6267 aux.vda_name = BYTE_GET (eaux->vda_name);
6268 aux.vda_next = BYTE_GET (eaux->vda_next);
6269
6270 if (VALID_DYNAMIC_NAME (aux.vda_name))
6271 printf (_(" %#06x: Parent %d: %s\n"),
6272 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
6273 else
6274 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6275 isum, j, aux.vda_name);
6276 }
6277
6278 idx += ent.vd_next;
6279 }
6280
6281 free (edefs);
6282 }
6283 break;
6284
6285 case SHT_GNU_verneed:
6286 {
6287 Elf_External_Verneed *eneed;
6288 unsigned int idx;
6289 unsigned int cnt;
6290
6291 found = 1;
6292
6293 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6294 SECTION_NAME (section), section->sh_info);
6295
6296 printf (_(" Addr: 0x"));
6297 printf_vma (section->sh_addr);
6298 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6299 (unsigned long) section->sh_offset, section->sh_link,
6300 SECTION_HEADER_INDEX (section->sh_link)
6301 < elf_header.e_shnum
6302 ? SECTION_NAME (SECTION_HEADER (section->sh_link))
6303 : "<corrupt>");
6304
6305 eneed = get_data (NULL, file, section->sh_offset, 1,
6306 section->sh_size,
6307 _("version need section"));
6308 if (!eneed)
6309 break;
6310
6311 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6312 {
6313 Elf_External_Verneed *entry;
6314 Elf_Internal_Verneed ent;
6315 int j;
6316 int isum;
6317 char *vstart;
6318
6319 vstart = ((char *) eneed) + idx;
6320
6321 entry = (Elf_External_Verneed *) vstart;
6322
6323 ent.vn_version = BYTE_GET (entry->vn_version);
6324 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
6325 ent.vn_file = BYTE_GET (entry->vn_file);
6326 ent.vn_aux = BYTE_GET (entry->vn_aux);
6327 ent.vn_next = BYTE_GET (entry->vn_next);
6328
6329 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
6330
6331 if (VALID_DYNAMIC_NAME (ent.vn_file))
6332 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
6333 else
6334 printf (_(" File: %lx"), ent.vn_file);
6335
6336 printf (_(" Cnt: %d\n"), ent.vn_cnt);
6337
6338 vstart += ent.vn_aux;
6339
6340 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
6341 {
6342 Elf_External_Vernaux *eaux;
6343 Elf_Internal_Vernaux aux;
6344
6345 eaux = (Elf_External_Vernaux *) vstart;
6346
6347 aux.vna_hash = BYTE_GET (eaux->vna_hash);
6348 aux.vna_flags = BYTE_GET (eaux->vna_flags);
6349 aux.vna_other = BYTE_GET (eaux->vna_other);
6350 aux.vna_name = BYTE_GET (eaux->vna_name);
6351 aux.vna_next = BYTE_GET (eaux->vna_next);
6352
6353 if (VALID_DYNAMIC_NAME (aux.vna_name))
6354 printf (_(" %#06x: Name: %s"),
6355 isum, GET_DYNAMIC_NAME (aux.vna_name));
6356 else
6357 printf (_(" %#06x: Name index: %lx"),
6358 isum, aux.vna_name);
6359
6360 printf (_(" Flags: %s Version: %d\n"),
6361 get_ver_flags (aux.vna_flags), aux.vna_other);
6362
6363 isum += aux.vna_next;
6364 vstart += aux.vna_next;
6365 }
6366
6367 idx += ent.vn_next;
6368 }
6369
6370 free (eneed);
6371 }
6372 break;
6373
6374 case SHT_GNU_versym:
6375 {
6376 Elf_Internal_Shdr *link_section;
6377 int total;
6378 int cnt;
6379 unsigned char *edata;
6380 unsigned short *data;
6381 char *strtab;
6382 Elf_Internal_Sym *symbols;
6383 Elf_Internal_Shdr *string_sec;
6384 long off;
6385
6386 if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum)
6387 break;
6388
6389 link_section = SECTION_HEADER (section->sh_link);
6390 total = section->sh_size / sizeof (Elf_External_Versym);
6391
6392 if (SECTION_HEADER_INDEX (link_section->sh_link)
6393 >= elf_header.e_shnum)
6394 break;
6395
6396 found = 1;
6397
6398 symbols = GET_ELF_SYMBOLS (file, link_section);
6399
6400 string_sec = SECTION_HEADER (link_section->sh_link);
6401
6402 strtab = get_data (NULL, file, string_sec->sh_offset, 1,
6403 string_sec->sh_size, _("version string table"));
6404 if (!strtab)
6405 break;
6406
6407 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6408 SECTION_NAME (section), total);
6409
6410 printf (_(" Addr: "));
6411 printf_vma (section->sh_addr);
6412 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6413 (unsigned long) section->sh_offset, section->sh_link,
6414 SECTION_NAME (link_section));
6415
6416 off = offset_from_vma (file,
6417 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6418 total * sizeof (short));
6419 edata = get_data (NULL, file, off, total, sizeof (short),
6420 _("version symbol data"));
6421 if (!edata)
6422 {
6423 free (strtab);
6424 break;
6425 }
6426
6427 data = cmalloc (total, sizeof (short));
6428
6429 for (cnt = total; cnt --;)
6430 data[cnt] = byte_get (edata + cnt * sizeof (short),
6431 sizeof (short));
6432
6433 free (edata);
6434
6435 for (cnt = 0; cnt < total; cnt += 4)
6436 {
6437 int j, nn;
6438 int check_def, check_need;
6439 char *name;
6440
6441 printf (" %03x:", cnt);
6442
6443 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
6444 switch (data[cnt + j])
6445 {
6446 case 0:
6447 fputs (_(" 0 (*local*) "), stdout);
6448 break;
6449
6450 case 1:
6451 fputs (_(" 1 (*global*) "), stdout);
6452 break;
6453
6454 default:
6455 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
6456 data[cnt + j] & 0x8000 ? 'h' : ' ');
6457
6458 check_def = 1;
6459 check_need = 1;
6460 if (SECTION_HEADER_INDEX (symbols[cnt + j].st_shndx)
6461 >= elf_header.e_shnum
6462 || SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
6463 != SHT_NOBITS)
6464 {
6465 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
6466 check_def = 0;
6467 else
6468 check_need = 0;
6469 }
6470
6471 if (check_need
6472 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
6473 {
6474 Elf_Internal_Verneed ivn;
6475 unsigned long offset;
6476
6477 offset = offset_from_vma
6478 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6479 sizeof (Elf_External_Verneed));
6480
6481 do
6482 {
6483 Elf_Internal_Vernaux ivna;
6484 Elf_External_Verneed evn;
6485 Elf_External_Vernaux evna;
6486 unsigned long a_off;
6487
6488 get_data (&evn, file, offset, sizeof (evn), 1,
6489 _("version need"));
6490
6491 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6492 ivn.vn_next = BYTE_GET (evn.vn_next);
6493
6494 a_off = offset + ivn.vn_aux;
6495
6496 do
6497 {
6498 get_data (&evna, file, a_off, sizeof (evna),
6499 1, _("version need aux (2)"));
6500
6501 ivna.vna_next = BYTE_GET (evna.vna_next);
6502 ivna.vna_other = BYTE_GET (evna.vna_other);
6503
6504 a_off += ivna.vna_next;
6505 }
6506 while (ivna.vna_other != data[cnt + j]
6507 && ivna.vna_next != 0);
6508
6509 if (ivna.vna_other == data[cnt + j])
6510 {
6511 ivna.vna_name = BYTE_GET (evna.vna_name);
6512
6513 name = strtab + ivna.vna_name;
6514 nn += printf ("(%s%-*s",
6515 name,
6516 12 - (int) strlen (name),
6517 ")");
6518 check_def = 0;
6519 break;
6520 }
6521
6522 offset += ivn.vn_next;
6523 }
6524 while (ivn.vn_next);
6525 }
6526
6527 if (check_def && data[cnt + j] != 0x8001
6528 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6529 {
6530 Elf_Internal_Verdef ivd;
6531 Elf_External_Verdef evd;
6532 unsigned long offset;
6533
6534 offset = offset_from_vma
6535 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6536 sizeof evd);
6537
6538 do
6539 {
6540 get_data (&evd, file, offset, sizeof (evd), 1,
6541 _("version def"));
6542
6543 ivd.vd_next = BYTE_GET (evd.vd_next);
6544 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6545
6546 offset += ivd.vd_next;
6547 }
6548 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
6549 && ivd.vd_next != 0);
6550
6551 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
6552 {
6553 Elf_External_Verdaux evda;
6554 Elf_Internal_Verdaux ivda;
6555
6556 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6557
6558 get_data (&evda, file,
6559 offset - ivd.vd_next + ivd.vd_aux,
6560 sizeof (evda), 1,
6561 _("version def aux"));
6562
6563 ivda.vda_name = BYTE_GET (evda.vda_name);
6564
6565 name = strtab + ivda.vda_name;
6566 nn += printf ("(%s%-*s",
6567 name,
6568 12 - (int) strlen (name),
6569 ")");
6570 }
6571 }
6572
6573 if (nn < 18)
6574 printf ("%*c", 18 - nn, ' ');
6575 }
6576
6577 putchar ('\n');
6578 }
6579
6580 free (data);
6581 free (strtab);
6582 free (symbols);
6583 }
6584 break;
6585
6586 default:
6587 break;
6588 }
6589 }
6590
6591 if (! found)
6592 printf (_("\nNo version information found in this file.\n"));
6593
6594 return 1;
6595 }
6596
6597 static const char *
6598 get_symbol_binding (unsigned int binding)
6599 {
6600 static char buff[32];
6601
6602 switch (binding)
6603 {
6604 case STB_LOCAL: return "LOCAL";
6605 case STB_GLOBAL: return "GLOBAL";
6606 case STB_WEAK: return "WEAK";
6607 default:
6608 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
6609 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
6610 binding);
6611 else if (binding >= STB_LOOS && binding <= STB_HIOS)
6612 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
6613 else
6614 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
6615 return buff;
6616 }
6617 }
6618
6619 static const char *
6620 get_symbol_type (unsigned int type)
6621 {
6622 static char buff[32];
6623
6624 switch (type)
6625 {
6626 case STT_NOTYPE: return "NOTYPE";
6627 case STT_OBJECT: return "OBJECT";
6628 case STT_FUNC: return "FUNC";
6629 case STT_SECTION: return "SECTION";
6630 case STT_FILE: return "FILE";
6631 case STT_COMMON: return "COMMON";
6632 case STT_TLS: return "TLS";
6633 default:
6634 if (type >= STT_LOPROC && type <= STT_HIPROC)
6635 {
6636 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
6637 return "THUMB_FUNC";
6638
6639 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
6640 return "REGISTER";
6641
6642 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
6643 return "PARISC_MILLI";
6644
6645 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
6646 }
6647 else if (type >= STT_LOOS && type <= STT_HIOS)
6648 {
6649 if (elf_header.e_machine == EM_PARISC)
6650 {
6651 if (type == STT_HP_OPAQUE)
6652 return "HP_OPAQUE";
6653 if (type == STT_HP_STUB)
6654 return "HP_STUB";
6655 }
6656
6657 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
6658 }
6659 else
6660 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
6661 return buff;
6662 }
6663 }
6664
6665 static const char *
6666 get_symbol_visibility (unsigned int visibility)
6667 {
6668 switch (visibility)
6669 {
6670 case STV_DEFAULT: return "DEFAULT";
6671 case STV_INTERNAL: return "INTERNAL";
6672 case STV_HIDDEN: return "HIDDEN";
6673 case STV_PROTECTED: return "PROTECTED";
6674 default: abort ();
6675 }
6676 }
6677
6678 static const char *
6679 get_symbol_index_type (unsigned int type)
6680 {
6681 static char buff[32];
6682
6683 switch (type)
6684 {
6685 case SHN_UNDEF: return "UND";
6686 case SHN_ABS: return "ABS";
6687 case SHN_COMMON: return "COM";
6688 default:
6689 if (type == SHN_IA_64_ANSI_COMMON
6690 && elf_header.e_machine == EM_IA_64
6691 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
6692 return "ANSI_COM";
6693 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
6694 sprintf (buff, "PRC[0x%04x]", type);
6695 else if (type >= SHN_LOOS && type <= SHN_HIOS)
6696 sprintf (buff, "OS [0x%04x]", type);
6697 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
6698 sprintf (buff, "RSV[0x%04x]", type);
6699 else
6700 sprintf (buff, "%3d", type);
6701 break;
6702 }
6703
6704 return buff;
6705 }
6706
6707 static bfd_vma *
6708 get_dynamic_data (FILE *file, unsigned int number, unsigned int ent_size)
6709 {
6710 unsigned char *e_data;
6711 bfd_vma *i_data;
6712
6713 e_data = cmalloc (number, ent_size);
6714
6715 if (e_data == NULL)
6716 {
6717 error (_("Out of memory\n"));
6718 return NULL;
6719 }
6720
6721 if (fread (e_data, ent_size, number, file) != number)
6722 {
6723 error (_("Unable to read in dynamic data\n"));
6724 return NULL;
6725 }
6726
6727 i_data = cmalloc (number, sizeof (*i_data));
6728
6729 if (i_data == NULL)
6730 {
6731 error (_("Out of memory\n"));
6732 free (e_data);
6733 return NULL;
6734 }
6735
6736 while (number--)
6737 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
6738
6739 free (e_data);
6740
6741 return i_data;
6742 }
6743
6744 /* Dump the symbol table. */
6745 static int
6746 process_symbol_table (FILE *file)
6747 {
6748 Elf_Internal_Shdr *section;
6749 bfd_vma nbuckets = 0;
6750 bfd_vma nchains = 0;
6751 bfd_vma *buckets = NULL;
6752 bfd_vma *chains = NULL;
6753
6754 if (! do_syms && !do_histogram)
6755 return 1;
6756
6757 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
6758 || do_histogram))
6759 {
6760 unsigned char nb[8];
6761 unsigned char nc[8];
6762 int hash_ent_size = 4;
6763
6764 if ((elf_header.e_machine == EM_ALPHA
6765 || elf_header.e_machine == EM_S390
6766 || elf_header.e_machine == EM_S390_OLD)
6767 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
6768 hash_ent_size = 8;
6769
6770 if (fseek (file,
6771 (archive_file_offset
6772 + offset_from_vma (file, dynamic_info[DT_HASH],
6773 sizeof nb + sizeof nc)),
6774 SEEK_SET))
6775 {
6776 error (_("Unable to seek to start of dynamic information"));
6777 return 0;
6778 }
6779
6780 if (fread (nb, hash_ent_size, 1, file) != 1)
6781 {
6782 error (_("Failed to read in number of buckets\n"));
6783 return 0;
6784 }
6785
6786 if (fread (nc, hash_ent_size, 1, file) != 1)
6787 {
6788 error (_("Failed to read in number of chains\n"));
6789 return 0;
6790 }
6791
6792 nbuckets = byte_get (nb, hash_ent_size);
6793 nchains = byte_get (nc, hash_ent_size);
6794
6795 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
6796 chains = get_dynamic_data (file, nchains, hash_ent_size);
6797
6798 if (buckets == NULL || chains == NULL)
6799 return 0;
6800 }
6801
6802 if (do_syms
6803 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
6804 {
6805 unsigned long hn;
6806 bfd_vma si;
6807
6808 printf (_("\nSymbol table for image:\n"));
6809 if (is_32bit_elf)
6810 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6811 else
6812 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6813
6814 for (hn = 0; hn < nbuckets; hn++)
6815 {
6816 if (! buckets[hn])
6817 continue;
6818
6819 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
6820 {
6821 Elf_Internal_Sym *psym;
6822 int n;
6823
6824 psym = dynamic_symbols + si;
6825
6826 n = print_vma (si, DEC_5);
6827 if (n < 5)
6828 fputs (" " + n, stdout);
6829 printf (" %3lu: ", hn);
6830 print_vma (psym->st_value, LONG_HEX);
6831 putchar (' ');
6832 print_vma (psym->st_size, DEC_5);
6833
6834 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6835 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6836 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6837 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
6838 if (VALID_DYNAMIC_NAME (psym->st_name))
6839 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
6840 else
6841 printf (" <corrupt: %14ld>", psym->st_name);
6842 putchar ('\n');
6843 }
6844 }
6845 }
6846 else if (do_syms && !do_using_dynamic)
6847 {
6848 unsigned int i;
6849
6850 for (i = 0, section = section_headers;
6851 i < elf_header.e_shnum;
6852 i++, section++)
6853 {
6854 unsigned int si;
6855 char *strtab = NULL;
6856 unsigned long int strtab_size = 0;
6857 Elf_Internal_Sym *symtab;
6858 Elf_Internal_Sym *psym;
6859
6860
6861 if ( section->sh_type != SHT_SYMTAB
6862 && section->sh_type != SHT_DYNSYM)
6863 continue;
6864
6865 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6866 SECTION_NAME (section),
6867 (unsigned long) (section->sh_size / section->sh_entsize));
6868 if (is_32bit_elf)
6869 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6870 else
6871 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6872
6873 symtab = GET_ELF_SYMBOLS (file, section);
6874 if (symtab == NULL)
6875 continue;
6876
6877 if (section->sh_link == elf_header.e_shstrndx)
6878 {
6879 strtab = string_table;
6880 strtab_size = string_table_length;
6881 }
6882 else if (SECTION_HEADER_INDEX (section->sh_link) < elf_header.e_shnum)
6883 {
6884 Elf_Internal_Shdr *string_sec;
6885
6886 string_sec = SECTION_HEADER (section->sh_link);
6887
6888 strtab = get_data (NULL, file, string_sec->sh_offset,
6889 1, string_sec->sh_size, _("string table"));
6890 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
6891 }
6892
6893 for (si = 0, psym = symtab;
6894 si < section->sh_size / section->sh_entsize;
6895 si++, psym++)
6896 {
6897 printf ("%6d: ", si);
6898 print_vma (psym->st_value, LONG_HEX);
6899 putchar (' ');
6900 print_vma (psym->st_size, DEC_5);
6901 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6902 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6903 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6904 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
6905 print_symbol (25, psym->st_name < strtab_size
6906 ? strtab + psym->st_name : "<corrupt>");
6907
6908 if (section->sh_type == SHT_DYNSYM &&
6909 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
6910 {
6911 unsigned char data[2];
6912 unsigned short vers_data;
6913 unsigned long offset;
6914 int is_nobits;
6915 int check_def;
6916
6917 offset = offset_from_vma
6918 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6919 sizeof data + si * sizeof (vers_data));
6920
6921 get_data (&data, file, offset + si * sizeof (vers_data),
6922 sizeof (data), 1, _("version data"));
6923
6924 vers_data = byte_get (data, 2);
6925
6926 is_nobits = (SECTION_HEADER_INDEX (psym->st_shndx)
6927 < elf_header.e_shnum
6928 && SECTION_HEADER (psym->st_shndx)->sh_type
6929 == SHT_NOBITS);
6930
6931 check_def = (psym->st_shndx != SHN_UNDEF);
6932
6933 if ((vers_data & 0x8000) || vers_data > 1)
6934 {
6935 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
6936 && (is_nobits || ! check_def))
6937 {
6938 Elf_External_Verneed evn;
6939 Elf_Internal_Verneed ivn;
6940 Elf_Internal_Vernaux ivna;
6941
6942 /* We must test both. */
6943 offset = offset_from_vma
6944 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6945 sizeof evn);
6946
6947 do
6948 {
6949 unsigned long vna_off;
6950
6951 get_data (&evn, file, offset, sizeof (evn), 1,
6952 _("version need"));
6953
6954 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6955 ivn.vn_next = BYTE_GET (evn.vn_next);
6956
6957 vna_off = offset + ivn.vn_aux;
6958
6959 do
6960 {
6961 Elf_External_Vernaux evna;
6962
6963 get_data (&evna, file, vna_off,
6964 sizeof (evna), 1,
6965 _("version need aux (3)"));
6966
6967 ivna.vna_other = BYTE_GET (evna.vna_other);
6968 ivna.vna_next = BYTE_GET (evna.vna_next);
6969 ivna.vna_name = BYTE_GET (evna.vna_name);
6970
6971 vna_off += ivna.vna_next;
6972 }
6973 while (ivna.vna_other != vers_data
6974 && ivna.vna_next != 0);
6975
6976 if (ivna.vna_other == vers_data)
6977 break;
6978
6979 offset += ivn.vn_next;
6980 }
6981 while (ivn.vn_next != 0);
6982
6983 if (ivna.vna_other == vers_data)
6984 {
6985 printf ("@%s (%d)",
6986 ivna.vna_name < strtab_size
6987 ? strtab + ivna.vna_name : "<corrupt>",
6988 ivna.vna_other);
6989 check_def = 0;
6990 }
6991 else if (! is_nobits)
6992 error (_("bad dynamic symbol"));
6993 else
6994 check_def = 1;
6995 }
6996
6997 if (check_def)
6998 {
6999 if (vers_data != 0x8001
7000 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
7001 {
7002 Elf_Internal_Verdef ivd;
7003 Elf_Internal_Verdaux ivda;
7004 Elf_External_Verdaux evda;
7005 unsigned long offset;
7006
7007 offset = offset_from_vma
7008 (file,
7009 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
7010 sizeof (Elf_External_Verdef));
7011
7012 do
7013 {
7014 Elf_External_Verdef evd;
7015
7016 get_data (&evd, file, offset, sizeof (evd),
7017 1, _("version def"));
7018
7019 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
7020 ivd.vd_aux = BYTE_GET (evd.vd_aux);
7021 ivd.vd_next = BYTE_GET (evd.vd_next);
7022
7023 offset += ivd.vd_next;
7024 }
7025 while (ivd.vd_ndx != (vers_data & 0x7fff)
7026 && ivd.vd_next != 0);
7027
7028 offset -= ivd.vd_next;
7029 offset += ivd.vd_aux;
7030
7031 get_data (&evda, file, offset, sizeof (evda),
7032 1, _("version def aux"));
7033
7034 ivda.vda_name = BYTE_GET (evda.vda_name);
7035
7036 if (psym->st_name != ivda.vda_name)
7037 printf ((vers_data & 0x8000)
7038 ? "@%s" : "@@%s",
7039 ivda.vda_name < strtab_size
7040 ? strtab + ivda.vda_name : "<corrupt>");
7041 }
7042 }
7043 }
7044 }
7045
7046 putchar ('\n');
7047 }
7048
7049 free (symtab);
7050 if (strtab != string_table)
7051 free (strtab);
7052 }
7053 }
7054 else if (do_syms)
7055 printf
7056 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7057
7058 if (do_histogram && buckets != NULL)
7059 {
7060 unsigned long *lengths;
7061 unsigned long *counts;
7062 unsigned long hn;
7063 bfd_vma si;
7064 unsigned long maxlength = 0;
7065 unsigned long nzero_counts = 0;
7066 unsigned long nsyms = 0;
7067
7068 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7069 (unsigned long) nbuckets);
7070 printf (_(" Length Number %% of total Coverage\n"));
7071
7072 lengths = calloc (nbuckets, sizeof (*lengths));
7073 if (lengths == NULL)
7074 {
7075 error (_("Out of memory"));
7076 return 0;
7077 }
7078 for (hn = 0; hn < nbuckets; ++hn)
7079 {
7080 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
7081 {
7082 ++nsyms;
7083 if (maxlength < ++lengths[hn])
7084 ++maxlength;
7085 }
7086 }
7087
7088 counts = calloc (maxlength + 1, sizeof (*counts));
7089 if (counts == NULL)
7090 {
7091 error (_("Out of memory"));
7092 return 0;
7093 }
7094
7095 for (hn = 0; hn < nbuckets; ++hn)
7096 ++counts[lengths[hn]];
7097
7098 if (nbuckets > 0)
7099 {
7100 unsigned long i;
7101 printf (" 0 %-10lu (%5.1f%%)\n",
7102 counts[0], (counts[0] * 100.0) / nbuckets);
7103 for (i = 1; i <= maxlength; ++i)
7104 {
7105 nzero_counts += counts[i] * i;
7106 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7107 i, counts[i], (counts[i] * 100.0) / nbuckets,
7108 (nzero_counts * 100.0) / nsyms);
7109 }
7110 }
7111
7112 free (counts);
7113 free (lengths);
7114 }
7115
7116 if (buckets != NULL)
7117 {
7118 free (buckets);
7119 free (chains);
7120 }
7121
7122 return 1;
7123 }
7124
7125 static int
7126 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
7127 {
7128 unsigned int i;
7129
7130 if (dynamic_syminfo == NULL
7131 || !do_dynamic)
7132 /* No syminfo, this is ok. */
7133 return 1;
7134
7135 /* There better should be a dynamic symbol section. */
7136 if (dynamic_symbols == NULL || dynamic_strings == NULL)
7137 return 0;
7138
7139 if (dynamic_addr)
7140 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7141 dynamic_syminfo_offset, dynamic_syminfo_nent);
7142
7143 printf (_(" Num: Name BoundTo Flags\n"));
7144 for (i = 0; i < dynamic_syminfo_nent; ++i)
7145 {
7146 unsigned short int flags = dynamic_syminfo[i].si_flags;
7147
7148 printf ("%4d: ", i);
7149 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
7150 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
7151 else
7152 printf ("<corrupt: %19ld>", dynamic_symbols[i].st_name);
7153 putchar (' ');
7154
7155 switch (dynamic_syminfo[i].si_boundto)
7156 {
7157 case SYMINFO_BT_SELF:
7158 fputs ("SELF ", stdout);
7159 break;
7160 case SYMINFO_BT_PARENT:
7161 fputs ("PARENT ", stdout);
7162 break;
7163 default:
7164 if (dynamic_syminfo[i].si_boundto > 0
7165 && dynamic_syminfo[i].si_boundto < dynamic_nent
7166 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
7167 {
7168 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
7169 putchar (' ' );
7170 }
7171 else
7172 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
7173 break;
7174 }
7175
7176 if (flags & SYMINFO_FLG_DIRECT)
7177 printf (" DIRECT");
7178 if (flags & SYMINFO_FLG_PASSTHRU)
7179 printf (" PASSTHRU");
7180 if (flags & SYMINFO_FLG_COPY)
7181 printf (" COPY");
7182 if (flags & SYMINFO_FLG_LAZYLOAD)
7183 printf (" LAZYLOAD");
7184
7185 puts ("");
7186 }
7187
7188 return 1;
7189 }
7190
7191 #ifdef SUPPORT_DISASSEMBLY
7192 static int
7193 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
7194 {
7195 printf (_("\nAssembly dump of section %s\n"),
7196 SECTION_NAME (section));
7197
7198 /* XXX -- to be done --- XXX */
7199
7200 return 1;
7201 }
7202 #endif
7203
7204 static int
7205 dump_section (Elf_Internal_Shdr *section, FILE *file)
7206 {
7207 bfd_size_type bytes;
7208 bfd_vma addr;
7209 unsigned char *data;
7210 unsigned char *start;
7211
7212 bytes = section->sh_size;
7213
7214 if (bytes == 0 || section->sh_type == SHT_NOBITS)
7215 {
7216 printf (_("\nSection '%s' has no data to dump.\n"),
7217 SECTION_NAME (section));
7218 return 0;
7219 }
7220 else
7221 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
7222
7223 addr = section->sh_addr;
7224
7225 start = get_data (NULL, file, section->sh_offset, 1, bytes,
7226 _("section data"));
7227 if (!start)
7228 return 0;
7229
7230 data = start;
7231
7232 while (bytes)
7233 {
7234 int j;
7235 int k;
7236 int lbytes;
7237
7238 lbytes = (bytes > 16 ? 16 : bytes);
7239
7240 printf (" 0x%8.8lx ", (unsigned long) addr);
7241
7242 switch (elf_header.e_ident[EI_DATA])
7243 {
7244 default:
7245 case ELFDATA2LSB:
7246 for (j = 15; j >= 0; j --)
7247 {
7248 if (j < lbytes)
7249 printf ("%2.2x", data[j]);
7250 else
7251 printf (" ");
7252
7253 if (!(j & 0x3))
7254 printf (" ");
7255 }
7256 break;
7257
7258 case ELFDATA2MSB:
7259 for (j = 0; j < 16; j++)
7260 {
7261 if (j < lbytes)
7262 printf ("%2.2x", data[j]);
7263 else
7264 printf (" ");
7265
7266 if ((j & 3) == 3)
7267 printf (" ");
7268 }
7269 break;
7270 }
7271
7272 for (j = 0; j < lbytes; j++)
7273 {
7274 k = data[j];
7275 if (k >= ' ' && k < 0x7f)
7276 printf ("%c", k);
7277 else
7278 printf (".");
7279 }
7280
7281 putchar ('\n');
7282
7283 data += lbytes;
7284 addr += lbytes;
7285 bytes -= lbytes;
7286 }
7287
7288 free (start);
7289
7290 return 1;
7291 }
7292
7293
7294 static unsigned long int
7295 read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
7296 {
7297 unsigned long int result = 0;
7298 unsigned int num_read = 0;
7299 unsigned int shift = 0;
7300 unsigned char byte;
7301
7302 do
7303 {
7304 byte = *data++;
7305 num_read++;
7306
7307 result |= ((unsigned long int) (byte & 0x7f)) << shift;
7308
7309 shift += 7;
7310
7311 }
7312 while (byte & 0x80);
7313
7314 if (length_return != NULL)
7315 *length_return = num_read;
7316
7317 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
7318 result |= -1L << shift;
7319
7320 return result;
7321 }
7322
7323 typedef struct State_Machine_Registers
7324 {
7325 unsigned long address;
7326 unsigned int file;
7327 unsigned int line;
7328 unsigned int column;
7329 int is_stmt;
7330 int basic_block;
7331 int end_sequence;
7332 /* This variable hold the number of the last entry seen
7333 in the File Table. */
7334 unsigned int last_file_entry;
7335 } SMR;
7336
7337 static SMR state_machine_regs;
7338
7339 static void
7340 reset_state_machine (int is_stmt)
7341 {
7342 state_machine_regs.address = 0;
7343 state_machine_regs.file = 1;
7344 state_machine_regs.line = 1;
7345 state_machine_regs.column = 0;
7346 state_machine_regs.is_stmt = is_stmt;
7347 state_machine_regs.basic_block = 0;
7348 state_machine_regs.end_sequence = 0;
7349 state_machine_regs.last_file_entry = 0;
7350 }
7351
7352 /* Handled an extend line op.
7353 Returns the number of bytes read. */
7354
7355 static int
7356 process_extended_line_op (unsigned char *data, int is_stmt, int pointer_size)
7357 {
7358 unsigned char op_code;
7359 unsigned int bytes_read;
7360 unsigned int len;
7361 unsigned char *name;
7362 unsigned long adr;
7363
7364 len = read_leb128 (data, & bytes_read, 0);
7365 data += bytes_read;
7366
7367 if (len == 0)
7368 {
7369 warn (_("badly formed extended line op encountered!\n"));
7370 return bytes_read;
7371 }
7372
7373 len += bytes_read;
7374 op_code = *data++;
7375
7376 printf (_(" Extended opcode %d: "), op_code);
7377
7378 switch (op_code)
7379 {
7380 case DW_LNE_end_sequence:
7381 printf (_("End of Sequence\n\n"));
7382 reset_state_machine (is_stmt);
7383 break;
7384
7385 case DW_LNE_set_address:
7386 adr = byte_get (data, pointer_size);
7387 printf (_("set Address to 0x%lx\n"), adr);
7388 state_machine_regs.address = adr;
7389 break;
7390
7391 case DW_LNE_define_file:
7392 printf (_(" define new File Table entry\n"));
7393 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7394
7395 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
7396 name = data;
7397 data += strlen ((char *) data) + 1;
7398 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7399 data += bytes_read;
7400 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7401 data += bytes_read;
7402 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7403 printf (_("%s\n\n"), name);
7404 break;
7405
7406 default:
7407 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
7408 break;
7409 }
7410
7411 return len;
7412 }
7413
7414 static const char *debug_str_contents;
7415 static bfd_vma debug_str_size;
7416
7417 static void
7418 load_debug_str (FILE *file)
7419 {
7420 Elf_Internal_Shdr *sec;
7421
7422 /* If it is already loaded, do nothing. */
7423 if (debug_str_contents != NULL)
7424 return;
7425
7426 /* Locate the .debug_str section. */
7427 sec = find_section (".debug_str");
7428 if (sec == NULL)
7429 return;
7430
7431 debug_str_size = sec->sh_size;
7432
7433 debug_str_contents = get_data (NULL, file, sec->sh_offset, 1, sec->sh_size,
7434 _("debug_str section data"));
7435 }
7436
7437 static void
7438 free_debug_str (void)
7439 {
7440 if (debug_str_contents == NULL)
7441 return;
7442
7443 free ((char *) debug_str_contents);
7444 debug_str_contents = NULL;
7445 debug_str_size = 0;
7446 }
7447
7448 static const char *
7449 fetch_indirect_string (unsigned long offset)
7450 {
7451 if (debug_str_contents == NULL)
7452 return _("<no .debug_str section>");
7453
7454 if (offset > debug_str_size)
7455 {
7456 warn (_("DW_FORM_strp offset too big: %x\n"), offset);
7457 return _("<offset is too big>");
7458 }
7459
7460 return debug_str_contents + offset;
7461 }
7462
7463 static const char *debug_loc_contents;
7464 static bfd_vma debug_loc_size;
7465
7466 static void
7467 load_debug_loc (FILE *file)
7468 {
7469 Elf_Internal_Shdr *sec;
7470
7471 /* If it is already loaded, do nothing. */
7472 if (debug_loc_contents != NULL)
7473 return;
7474
7475 /* Locate the .debug_loc section. */
7476 sec = find_section (".debug_loc");
7477 if (sec == NULL)
7478 return;
7479
7480 debug_loc_size = sec->sh_size;
7481
7482 debug_loc_contents = get_data (NULL, file, sec->sh_offset, 1, sec->sh_size,
7483 _("debug_loc section data"));
7484 }
7485
7486 static void
7487 free_debug_loc (void)
7488 {
7489 if (debug_loc_contents == NULL)
7490 return;
7491
7492 free ((char *) debug_loc_contents);
7493 debug_loc_contents = NULL;
7494 debug_loc_size = 0;
7495 }
7496
7497 static const char * debug_range_contents;
7498 static unsigned long debug_range_size;
7499
7500 static void
7501 load_debug_range (FILE *file)
7502 {
7503 Elf_Internal_Shdr *sec;
7504
7505 /* If it is already loaded, do nothing. */
7506 if (debug_range_contents != NULL)
7507 return;
7508
7509 /* Locate the .debug_ranges section. */
7510 sec = find_section (".debug_ranges");
7511 if (sec == NULL)
7512 return;
7513
7514 debug_range_size = sec->sh_size;
7515
7516 debug_range_contents = get_data (NULL, file, sec->sh_offset, 1, sec->sh_size,
7517 _("debug_range section data"));
7518 }
7519
7520 static void
7521 free_debug_range (void)
7522 {
7523 if (debug_range_contents == NULL)
7524 return;
7525
7526 free ((char *) debug_range_contents);
7527 debug_range_contents = NULL;
7528 debug_range_size = 0;
7529 }
7530
7531 /* Apply addends of RELA relocations. */
7532
7533 static int
7534 debug_apply_rela_addends (FILE *file,
7535 Elf_Internal_Shdr *section,
7536 int reloc_size,
7537 unsigned char *sec_data,
7538 unsigned char *start,
7539 unsigned char *end)
7540 {
7541 Elf_Internal_Shdr *relsec;
7542
7543 if (end - start < reloc_size)
7544 return 1;
7545
7546 for (relsec = section_headers;
7547 relsec < section_headers + elf_header.e_shnum;
7548 ++relsec)
7549 {
7550 unsigned long nrelas;
7551 Elf_Internal_Rela *rela, *rp;
7552 Elf_Internal_Shdr *symsec;
7553 Elf_Internal_Sym *symtab;
7554 Elf_Internal_Sym *sym;
7555
7556 if (relsec->sh_type != SHT_RELA
7557 || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
7558 || SECTION_HEADER (relsec->sh_info) != section
7559 || relsec->sh_size == 0
7560 || SECTION_HEADER_INDEX (relsec->sh_link) >= elf_header.e_shnum)
7561 continue;
7562
7563 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7564 &rela, &nrelas))
7565 return 0;
7566
7567 symsec = SECTION_HEADER (relsec->sh_link);
7568 symtab = GET_ELF_SYMBOLS (file, symsec);
7569
7570 for (rp = rela; rp < rela + nrelas; ++rp)
7571 {
7572 unsigned char *loc;
7573
7574 if (rp->r_offset >= (bfd_vma) (start - sec_data)
7575 && rp->r_offset < (bfd_vma) (end - sec_data) - reloc_size)
7576 loc = sec_data + rp->r_offset;
7577 else
7578 continue;
7579
7580 if (is_32bit_elf)
7581 {
7582 sym = symtab + ELF32_R_SYM (rp->r_info);
7583
7584 if (ELF32_R_SYM (rp->r_info) != 0
7585 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION
7586 /* Relocations against object symbols can happen,
7587 eg when referencing a global array. For an
7588 example of this see the _clz.o binary in libgcc.a. */
7589 && ELF32_ST_TYPE (sym->st_info) != STT_OBJECT)
7590 {
7591 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7592 get_symbol_type (ELF32_ST_TYPE (sym->st_info)),
7593 SECTION_NAME (section));
7594 continue;
7595 }
7596 }
7597 else
7598 {
7599 /* In MIPS little-endian objects, r_info isn't really a
7600 64-bit little-endian value: it has a 32-bit little-endian
7601 symbol index followed by four individual byte fields.
7602 Reorder INFO accordingly. */
7603 if (elf_header.e_machine == EM_MIPS
7604 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
7605 rp->r_info = (((rp->r_info & 0xffffffff) << 32)
7606 | ((rp->r_info >> 56) & 0xff)
7607 | ((rp->r_info >> 40) & 0xff00)
7608 | ((rp->r_info >> 24) & 0xff0000)
7609 | ((rp->r_info >> 8) & 0xff000000));
7610
7611 sym = symtab + ELF64_R_SYM (rp->r_info);
7612
7613 if (ELF64_R_SYM (rp->r_info) != 0
7614 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION
7615 && ELF64_ST_TYPE (sym->st_info) != STT_OBJECT)
7616 {
7617 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7618 get_symbol_type (ELF64_ST_TYPE (sym->st_info)),
7619 SECTION_NAME (section));
7620 continue;
7621 }
7622 }
7623
7624 byte_put (loc, rp->r_addend, reloc_size);
7625 }
7626
7627 free (symtab);
7628 free (rela);
7629 break;
7630 }
7631 return 1;
7632 }
7633
7634 /* FIXME: There are better and more efficient ways to handle
7635 these structures. For now though, I just want something that
7636 is simple to implement. */
7637 typedef struct abbrev_attr
7638 {
7639 unsigned long attribute;
7640 unsigned long form;
7641 struct abbrev_attr *next;
7642 }
7643 abbrev_attr;
7644
7645 typedef struct abbrev_entry
7646 {
7647 unsigned long entry;
7648 unsigned long tag;
7649 int children;
7650 struct abbrev_attr *first_attr;
7651 struct abbrev_attr *last_attr;
7652 struct abbrev_entry *next;
7653 }
7654 abbrev_entry;
7655
7656 static abbrev_entry *first_abbrev = NULL;
7657 static abbrev_entry *last_abbrev = NULL;
7658
7659 static void
7660 free_abbrevs (void)
7661 {
7662 abbrev_entry *abbrev;
7663
7664 for (abbrev = first_abbrev; abbrev;)
7665 {
7666 abbrev_entry *next = abbrev->next;
7667 abbrev_attr *attr;
7668
7669 for (attr = abbrev->first_attr; attr;)
7670 {
7671 abbrev_attr *next = attr->next;
7672
7673 free (attr);
7674 attr = next;
7675 }
7676
7677 free (abbrev);
7678 abbrev = next;
7679 }
7680
7681 last_abbrev = first_abbrev = NULL;
7682 }
7683
7684 static void
7685 add_abbrev (unsigned long number, unsigned long tag, int children)
7686 {
7687 abbrev_entry *entry;
7688
7689 entry = malloc (sizeof (*entry));
7690
7691 if (entry == NULL)
7692 /* ugg */
7693 return;
7694
7695 entry->entry = number;
7696 entry->tag = tag;
7697 entry->children = children;
7698 entry->first_attr = NULL;
7699 entry->last_attr = NULL;
7700 entry->next = NULL;
7701
7702 if (first_abbrev == NULL)
7703 first_abbrev = entry;
7704 else
7705 last_abbrev->next = entry;
7706
7707 last_abbrev = entry;
7708 }
7709
7710 static void
7711 add_abbrev_attr (unsigned long attribute, unsigned long form)
7712 {
7713 abbrev_attr *attr;
7714
7715 attr = malloc (sizeof (*attr));
7716
7717 if (attr == NULL)
7718 /* ugg */
7719 return;
7720
7721 attr->attribute = attribute;
7722 attr->form = form;
7723 attr->next = NULL;
7724
7725 if (last_abbrev->first_attr == NULL)
7726 last_abbrev->first_attr = attr;
7727 else
7728 last_abbrev->last_attr->next = attr;
7729
7730 last_abbrev->last_attr = attr;
7731 }
7732
7733 /* Processes the (partial) contents of a .debug_abbrev section.
7734 Returns NULL if the end of the section was encountered.
7735 Returns the address after the last byte read if the end of
7736 an abbreviation set was found. */
7737
7738 static unsigned char *
7739 process_abbrev_section (unsigned char *start, unsigned char *end)
7740 {
7741 if (first_abbrev != NULL)
7742 return NULL;
7743
7744 while (start < end)
7745 {
7746 unsigned int bytes_read;
7747 unsigned long entry;
7748 unsigned long tag;
7749 unsigned long attribute;
7750 int children;
7751
7752 entry = read_leb128 (start, & bytes_read, 0);
7753 start += bytes_read;
7754
7755 /* A single zero is supposed to end the section according
7756 to the standard. If there's more, then signal that to
7757 the caller. */
7758 if (entry == 0)
7759 return start == end ? NULL : start;
7760
7761 tag = read_leb128 (start, & bytes_read, 0);
7762 start += bytes_read;
7763
7764 children = *start++;
7765
7766 add_abbrev (entry, tag, children);
7767
7768 do
7769 {
7770 unsigned long form;
7771
7772 attribute = read_leb128 (start, & bytes_read, 0);
7773 start += bytes_read;
7774
7775 form = read_leb128 (start, & bytes_read, 0);
7776 start += bytes_read;
7777
7778 if (attribute != 0)
7779 add_abbrev_attr (attribute, form);
7780 }
7781 while (attribute != 0);
7782 }
7783
7784 return NULL;
7785 }
7786
7787 static char *
7788 get_TAG_name (unsigned long tag)
7789 {
7790 switch (tag)
7791 {
7792 case DW_TAG_padding: return "DW_TAG_padding";
7793 case DW_TAG_array_type: return "DW_TAG_array_type";
7794 case DW_TAG_class_type: return "DW_TAG_class_type";
7795 case DW_TAG_entry_point: return "DW_TAG_entry_point";
7796 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
7797 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
7798 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
7799 case DW_TAG_label: return "DW_TAG_label";
7800 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
7801 case DW_TAG_member: return "DW_TAG_member";
7802 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
7803 case DW_TAG_reference_type: return "DW_TAG_reference_type";
7804 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
7805 case DW_TAG_string_type: return "DW_TAG_string_type";
7806 case DW_TAG_structure_type: return "DW_TAG_structure_type";
7807 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
7808 case DW_TAG_typedef: return "DW_TAG_typedef";
7809 case DW_TAG_union_type: return "DW_TAG_union_type";
7810 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
7811 case DW_TAG_variant: return "DW_TAG_variant";
7812 case DW_TAG_common_block: return "DW_TAG_common_block";
7813 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
7814 case DW_TAG_inheritance: return "DW_TAG_inheritance";
7815 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
7816 case DW_TAG_module: return "DW_TAG_module";
7817 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
7818 case DW_TAG_set_type: return "DW_TAG_set_type";
7819 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
7820 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
7821 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
7822 case DW_TAG_base_type: return "DW_TAG_base_type";
7823 case DW_TAG_catch_block: return "DW_TAG_catch_block";
7824 case DW_TAG_const_type: return "DW_TAG_const_type";
7825 case DW_TAG_constant: return "DW_TAG_constant";
7826 case DW_TAG_enumerator: return "DW_TAG_enumerator";
7827 case DW_TAG_file_type: return "DW_TAG_file_type";
7828 case DW_TAG_friend: return "DW_TAG_friend";
7829 case DW_TAG_namelist: return "DW_TAG_namelist";
7830 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
7831 case DW_TAG_packed_type: return "DW_TAG_packed_type";
7832 case DW_TAG_subprogram: return "DW_TAG_subprogram";
7833 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
7834 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
7835 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
7836 case DW_TAG_try_block: return "DW_TAG_try_block";
7837 case DW_TAG_variant_part: return "DW_TAG_variant_part";
7838 case DW_TAG_variable: return "DW_TAG_variable";
7839 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
7840 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
7841 case DW_TAG_format_label: return "DW_TAG_format_label";
7842 case DW_TAG_function_template: return "DW_TAG_function_template";
7843 case DW_TAG_class_template: return "DW_TAG_class_template";
7844 /* DWARF 2.1 values. */
7845 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
7846 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
7847 case DW_TAG_interface_type: return "DW_TAG_interface_type";
7848 case DW_TAG_namespace: return "DW_TAG_namespace";
7849 case DW_TAG_imported_module: return "DW_TAG_imported_module";
7850 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
7851 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
7852 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
7853 /* UPC values. */
7854 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
7855 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
7856 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
7857 default:
7858 {
7859 static char buffer[100];
7860
7861 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
7862 return buffer;
7863 }
7864 }
7865 }
7866
7867 static char *
7868 get_FORM_name (unsigned long form)
7869 {
7870 switch (form)
7871 {
7872 case DW_FORM_addr: return "DW_FORM_addr";
7873 case DW_FORM_block2: return "DW_FORM_block2";
7874 case DW_FORM_block4: return "DW_FORM_block4";
7875 case DW_FORM_data2: return "DW_FORM_data2";
7876 case DW_FORM_data4: return "DW_FORM_data4";
7877 case DW_FORM_data8: return "DW_FORM_data8";
7878 case DW_FORM_string: return "DW_FORM_string";
7879 case DW_FORM_block: return "DW_FORM_block";
7880 case DW_FORM_block1: return "DW_FORM_block1";
7881 case DW_FORM_data1: return "DW_FORM_data1";
7882 case DW_FORM_flag: return "DW_FORM_flag";
7883 case DW_FORM_sdata: return "DW_FORM_sdata";
7884 case DW_FORM_strp: return "DW_FORM_strp";
7885 case DW_FORM_udata: return "DW_FORM_udata";
7886 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
7887 case DW_FORM_ref1: return "DW_FORM_ref1";
7888 case DW_FORM_ref2: return "DW_FORM_ref2";
7889 case DW_FORM_ref4: return "DW_FORM_ref4";
7890 case DW_FORM_ref8: return "DW_FORM_ref8";
7891 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
7892 case DW_FORM_indirect: return "DW_FORM_indirect";
7893 default:
7894 {
7895 static char buffer[100];
7896
7897 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
7898 return buffer;
7899 }
7900 }
7901 }
7902
7903 static unsigned char *
7904 display_block (unsigned char *data, unsigned long length)
7905 {
7906 printf (_(" %lu byte block: "), length);
7907
7908 while (length --)
7909 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7910
7911 return data;
7912 }
7913
7914 static int
7915 decode_location_expression (unsigned char * data,
7916 unsigned int pointer_size,
7917 unsigned long length,
7918 unsigned long cu_offset)
7919 {
7920 unsigned op;
7921 unsigned int bytes_read;
7922 unsigned long uvalue;
7923 unsigned char *end = data + length;
7924 int need_frame_base = 0;
7925
7926 while (data < end)
7927 {
7928 op = *data++;
7929
7930 switch (op)
7931 {
7932 case DW_OP_addr:
7933 printf ("DW_OP_addr: %lx",
7934 (unsigned long) byte_get (data, pointer_size));
7935 data += pointer_size;
7936 break;
7937 case DW_OP_deref:
7938 printf ("DW_OP_deref");
7939 break;
7940 case DW_OP_const1u:
7941 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7942 break;
7943 case DW_OP_const1s:
7944 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data++, 1));
7945 break;
7946 case DW_OP_const2u:
7947 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7948 data += 2;
7949 break;
7950 case DW_OP_const2s:
7951 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data, 2));
7952 data += 2;
7953 break;
7954 case DW_OP_const4u:
7955 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7956 data += 4;
7957 break;
7958 case DW_OP_const4s:
7959 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data, 4));
7960 data += 4;
7961 break;
7962 case DW_OP_const8u:
7963 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7964 (unsigned long) byte_get (data + 4, 4));
7965 data += 8;
7966 break;
7967 case DW_OP_const8s:
7968 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7969 (long) byte_get (data + 4, 4));
7970 data += 8;
7971 break;
7972 case DW_OP_constu:
7973 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7974 data += bytes_read;
7975 break;
7976 case DW_OP_consts:
7977 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7978 data += bytes_read;
7979 break;
7980 case DW_OP_dup:
7981 printf ("DW_OP_dup");
7982 break;
7983 case DW_OP_drop:
7984 printf ("DW_OP_drop");
7985 break;
7986 case DW_OP_over:
7987 printf ("DW_OP_over");
7988 break;
7989 case DW_OP_pick:
7990 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7991 break;
7992 case DW_OP_swap:
7993 printf ("DW_OP_swap");
7994 break;
7995 case DW_OP_rot:
7996 printf ("DW_OP_rot");
7997 break;
7998 case DW_OP_xderef:
7999 printf ("DW_OP_xderef");
8000 break;
8001 case DW_OP_abs:
8002 printf ("DW_OP_abs");
8003 break;
8004 case DW_OP_and:
8005 printf ("DW_OP_and");
8006 break;
8007 case DW_OP_div:
8008 printf ("DW_OP_div");
8009 break;
8010 case DW_OP_minus:
8011 printf ("DW_OP_minus");
8012 break;
8013 case DW_OP_mod:
8014 printf ("DW_OP_mod");
8015 break;
8016 case DW_OP_mul:
8017 printf ("DW_OP_mul");
8018 break;
8019 case DW_OP_neg:
8020 printf ("DW_OP_neg");
8021 break;
8022 case DW_OP_not:
8023 printf ("DW_OP_not");
8024 break;
8025 case DW_OP_or:
8026 printf ("DW_OP_or");
8027 break;
8028 case DW_OP_plus:
8029 printf ("DW_OP_plus");
8030 break;
8031 case DW_OP_plus_uconst:
8032 printf ("DW_OP_plus_uconst: %lu",
8033 read_leb128 (data, &bytes_read, 0));
8034 data += bytes_read;
8035 break;
8036 case DW_OP_shl:
8037 printf ("DW_OP_shl");
8038 break;
8039 case DW_OP_shr:
8040 printf ("DW_OP_shr");
8041 break;
8042 case DW_OP_shra:
8043 printf ("DW_OP_shra");
8044 break;
8045 case DW_OP_xor:
8046 printf ("DW_OP_xor");
8047 break;
8048 case DW_OP_bra:
8049 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data, 2));
8050 data += 2;
8051 break;
8052 case DW_OP_eq:
8053 printf ("DW_OP_eq");
8054 break;
8055 case DW_OP_ge:
8056 printf ("DW_OP_ge");
8057 break;
8058 case DW_OP_gt:
8059 printf ("DW_OP_gt");
8060 break;
8061 case DW_OP_le:
8062 printf ("DW_OP_le");
8063 break;
8064 case DW_OP_lt:
8065 printf ("DW_OP_lt");
8066 break;
8067 case DW_OP_ne:
8068 printf ("DW_OP_ne");
8069 break;
8070 case DW_OP_skip:
8071 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data, 2));
8072 data += 2;
8073 break;
8074
8075 case DW_OP_lit0:
8076 case DW_OP_lit1:
8077 case DW_OP_lit2:
8078 case DW_OP_lit3:
8079 case DW_OP_lit4:
8080 case DW_OP_lit5:
8081 case DW_OP_lit6:
8082 case DW_OP_lit7:
8083 case DW_OP_lit8:
8084 case DW_OP_lit9:
8085 case DW_OP_lit10:
8086 case DW_OP_lit11:
8087 case DW_OP_lit12:
8088 case DW_OP_lit13:
8089 case DW_OP_lit14:
8090 case DW_OP_lit15:
8091 case DW_OP_lit16:
8092 case DW_OP_lit17:
8093 case DW_OP_lit18:
8094 case DW_OP_lit19:
8095 case DW_OP_lit20:
8096 case DW_OP_lit21:
8097 case DW_OP_lit22:
8098 case DW_OP_lit23:
8099 case DW_OP_lit24:
8100 case DW_OP_lit25:
8101 case DW_OP_lit26:
8102 case DW_OP_lit27:
8103 case DW_OP_lit28:
8104 case DW_OP_lit29:
8105 case DW_OP_lit30:
8106 case DW_OP_lit31:
8107 printf ("DW_OP_lit%d", op - DW_OP_lit0);
8108 break;
8109
8110 case DW_OP_reg0:
8111 case DW_OP_reg1:
8112 case DW_OP_reg2:
8113 case DW_OP_reg3:
8114 case DW_OP_reg4:
8115 case DW_OP_reg5:
8116 case DW_OP_reg6:
8117 case DW_OP_reg7:
8118 case DW_OP_reg8:
8119 case DW_OP_reg9:
8120 case DW_OP_reg10:
8121 case DW_OP_reg11:
8122 case DW_OP_reg12:
8123 case DW_OP_reg13:
8124 case DW_OP_reg14:
8125 case DW_OP_reg15:
8126 case DW_OP_reg16:
8127 case DW_OP_reg17:
8128 case DW_OP_reg18:
8129 case DW_OP_reg19:
8130 case DW_OP_reg20:
8131 case DW_OP_reg21:
8132 case DW_OP_reg22:
8133 case DW_OP_reg23:
8134 case DW_OP_reg24:
8135 case DW_OP_reg25:
8136 case DW_OP_reg26:
8137 case DW_OP_reg27:
8138 case DW_OP_reg28:
8139 case DW_OP_reg29:
8140 case DW_OP_reg30:
8141 case DW_OP_reg31:
8142 printf ("DW_OP_reg%d", op - DW_OP_reg0);
8143 break;
8144
8145 case DW_OP_breg0:
8146 case DW_OP_breg1:
8147 case DW_OP_breg2:
8148 case DW_OP_breg3:
8149 case DW_OP_breg4:
8150 case DW_OP_breg5:
8151 case DW_OP_breg6:
8152 case DW_OP_breg7:
8153 case DW_OP_breg8:
8154 case DW_OP_breg9:
8155 case DW_OP_breg10:
8156 case DW_OP_breg11:
8157 case DW_OP_breg12:
8158 case DW_OP_breg13:
8159 case DW_OP_breg14:
8160 case DW_OP_breg15:
8161 case DW_OP_breg16:
8162 case DW_OP_breg17:
8163 case DW_OP_breg18:
8164 case DW_OP_breg19:
8165 case DW_OP_breg20:
8166 case DW_OP_breg21:
8167 case DW_OP_breg22:
8168 case DW_OP_breg23:
8169 case DW_OP_breg24:
8170 case DW_OP_breg25:
8171 case DW_OP_breg26:
8172 case DW_OP_breg27:
8173 case DW_OP_breg28:
8174 case DW_OP_breg29:
8175 case DW_OP_breg30:
8176 case DW_OP_breg31:
8177 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
8178 read_leb128 (data, &bytes_read, 1));
8179 data += bytes_read;
8180 break;
8181
8182 case DW_OP_regx:
8183 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
8184 data += bytes_read;
8185 break;
8186 case DW_OP_fbreg:
8187 need_frame_base = 1;
8188 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
8189 data += bytes_read;
8190 break;
8191 case DW_OP_bregx:
8192 uvalue = read_leb128 (data, &bytes_read, 0);
8193 data += bytes_read;
8194 printf ("DW_OP_bregx: %lu %ld", uvalue,
8195 read_leb128 (data, &bytes_read, 1));
8196 data += bytes_read;
8197 break;
8198 case DW_OP_piece:
8199 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
8200 data += bytes_read;
8201 break;
8202 case DW_OP_deref_size:
8203 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
8204 break;
8205 case DW_OP_xderef_size:
8206 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
8207 break;
8208 case DW_OP_nop:
8209 printf ("DW_OP_nop");
8210 break;
8211
8212 /* DWARF 3 extensions. */
8213 case DW_OP_push_object_address:
8214 printf ("DW_OP_push_object_address");
8215 break;
8216 case DW_OP_call2:
8217 /* XXX: Strictly speaking for 64-bit DWARF3 files
8218 this ought to be an 8-byte wide computation. */
8219 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2) + cu_offset);
8220 data += 2;
8221 break;
8222 case DW_OP_call4:
8223 /* XXX: Strictly speaking for 64-bit DWARF3 files
8224 this ought to be an 8-byte wide computation. */
8225 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4) + cu_offset);
8226 data += 4;
8227 break;
8228 case DW_OP_call_ref:
8229 printf ("DW_OP_call_ref");
8230 break;
8231
8232 /* GNU extensions. */
8233 case DW_OP_GNU_push_tls_address:
8234 printf ("DW_OP_GNU_push_tls_address");
8235 break;
8236
8237 default:
8238 if (op >= DW_OP_lo_user
8239 && op <= DW_OP_hi_user)
8240 printf (_("(User defined location op)"));
8241 else
8242 printf (_("(Unknown location op)"));
8243 /* No way to tell where the next op is, so just bail. */
8244 return need_frame_base;
8245 }
8246
8247 /* Separate the ops. */
8248 if (data < end)
8249 printf ("; ");
8250 }
8251
8252 return need_frame_base;
8253 }
8254
8255 /* This structure records the information that
8256 we extract from the.debug_info section. */
8257 typedef struct
8258 {
8259 unsigned int pointer_size;
8260 unsigned long cu_offset;
8261 unsigned long base_address;
8262 /* This is an array of offsets to the location list table. */
8263 unsigned long *loc_offsets;
8264 int *have_frame_base;
8265 unsigned int num_loc_offsets;
8266 unsigned int max_loc_offsets;
8267 unsigned long *range_lists;
8268 unsigned int num_range_lists;
8269 unsigned int max_range_lists;
8270 }
8271 debug_info;
8272
8273 static debug_info * debug_information = NULL;
8274 static unsigned int num_debug_info_entries = 0;
8275 static unsigned int last_pointer_size = 0;
8276 static int warned_about_missing_comp_units = FALSE;
8277
8278 static unsigned char *
8279 read_and_display_attr_value (unsigned long attribute,
8280 unsigned long form,
8281 unsigned char *data,
8282 unsigned long cu_offset,
8283 unsigned long pointer_size,
8284 unsigned long offset_size,
8285 int dwarf_version,
8286 debug_info *debug_info_p,
8287 int do_loc)
8288 {
8289 unsigned long uvalue = 0;
8290 unsigned char *block_start = NULL;
8291 unsigned int bytes_read;
8292
8293 switch (form)
8294 {
8295 default:
8296 break;
8297
8298 case DW_FORM_ref_addr:
8299 if (dwarf_version == 2)
8300 {
8301 uvalue = byte_get (data, pointer_size);
8302 data += pointer_size;
8303 }
8304 else if (dwarf_version == 3)
8305 {
8306 uvalue = byte_get (data, offset_size);
8307 data += offset_size;
8308 }
8309 else
8310 {
8311 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8312 }
8313 break;
8314
8315 case DW_FORM_addr:
8316 uvalue = byte_get (data, pointer_size);
8317 data += pointer_size;
8318 break;
8319
8320 case DW_FORM_strp:
8321 uvalue = byte_get (data, offset_size);
8322 data += offset_size;
8323 break;
8324
8325 case DW_FORM_ref1:
8326 case DW_FORM_flag:
8327 case DW_FORM_data1:
8328 uvalue = byte_get (data++, 1);
8329 break;
8330
8331 case DW_FORM_ref2:
8332 case DW_FORM_data2:
8333 uvalue = byte_get (data, 2);
8334 data += 2;
8335 break;
8336
8337 case DW_FORM_ref4:
8338 case DW_FORM_data4:
8339 uvalue = byte_get (data, 4);
8340 data += 4;
8341 break;
8342
8343 case DW_FORM_sdata:
8344 uvalue = read_leb128 (data, & bytes_read, 1);
8345 data += bytes_read;
8346 break;
8347
8348 case DW_FORM_ref_udata:
8349 case DW_FORM_udata:
8350 uvalue = read_leb128 (data, & bytes_read, 0);
8351 data += bytes_read;
8352 break;
8353
8354 case DW_FORM_indirect:
8355 form = read_leb128 (data, & bytes_read, 0);
8356 data += bytes_read;
8357 if (!do_loc)
8358 printf (" %s", get_FORM_name (form));
8359 return read_and_display_attr_value (attribute, form, data,
8360 cu_offset, pointer_size,
8361 offset_size, dwarf_version,
8362 debug_info_p, do_loc);
8363 }
8364
8365 switch (form)
8366 {
8367 case DW_FORM_ref_addr:
8368 if (!do_loc)
8369 printf (" <#%lx>", uvalue);
8370 break;
8371
8372 case DW_FORM_ref1:
8373 case DW_FORM_ref2:
8374 case DW_FORM_ref4:
8375 case DW_FORM_ref_udata:
8376 if (!do_loc)
8377 printf (" <%lx>", uvalue + cu_offset);
8378 break;
8379
8380 case DW_FORM_data4:
8381 case DW_FORM_addr:
8382 if (!do_loc)
8383 printf (" %#lx", uvalue);
8384 break;
8385
8386 case DW_FORM_flag:
8387 case DW_FORM_data1:
8388 case DW_FORM_data2:
8389 case DW_FORM_sdata:
8390 case DW_FORM_udata:
8391 if (!do_loc)
8392 printf (" %ld", uvalue);
8393 break;
8394
8395 case DW_FORM_ref8:
8396 case DW_FORM_data8:
8397 if (!do_loc)
8398 {
8399 uvalue = byte_get (data, 4);
8400 printf (" %lx", uvalue);
8401 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
8402 }
8403 if ((do_loc || do_debug_loc || do_debug_ranges)
8404 && num_debug_info_entries == 0)
8405 {
8406 if (sizeof (uvalue) == 8)
8407 uvalue = byte_get (data, 8);
8408 else
8409 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8410 }
8411 data += 8;
8412 break;
8413
8414 case DW_FORM_string:
8415 if (!do_loc)
8416 printf (" %s", data);
8417 data += strlen ((char *) data) + 1;
8418 break;
8419
8420 case DW_FORM_block:
8421 uvalue = read_leb128 (data, & bytes_read, 0);
8422 block_start = data + bytes_read;
8423 if (do_loc)
8424 data = block_start + uvalue;
8425 else
8426 data = display_block (block_start, uvalue);
8427 break;
8428
8429 case DW_FORM_block1:
8430 uvalue = byte_get (data, 1);
8431 block_start = data + 1;
8432 if (do_loc)
8433 data = block_start + uvalue;
8434 else
8435 data = display_block (block_start, uvalue);
8436 break;
8437
8438 case DW_FORM_block2:
8439 uvalue = byte_get (data, 2);
8440 block_start = data + 2;
8441 if (do_loc)
8442 data = block_start + uvalue;
8443 else
8444 data = display_block (block_start, uvalue);
8445 break;
8446
8447 case DW_FORM_block4:
8448 uvalue = byte_get (data, 4);
8449 block_start = data + 4;
8450 if (do_loc)
8451 data = block_start + uvalue;
8452 else
8453 data = display_block (block_start, uvalue);
8454 break;
8455
8456 case DW_FORM_strp:
8457 if (!do_loc)
8458 printf (_(" (indirect string, offset: 0x%lx): %s"),
8459 uvalue, fetch_indirect_string (uvalue));
8460 break;
8461
8462 case DW_FORM_indirect:
8463 /* Handled above. */
8464 break;
8465
8466 default:
8467 warn (_("Unrecognized form: %d\n"), form);
8468 break;
8469 }
8470
8471 /* For some attributes we can display further information. */
8472 if ((do_loc || do_debug_loc || do_debug_ranges)
8473 && num_debug_info_entries == 0)
8474 {
8475 switch (attribute)
8476 {
8477 case DW_AT_frame_base:
8478 have_frame_base = 1;
8479 case DW_AT_location:
8480 case DW_AT_data_member_location:
8481 case DW_AT_vtable_elem_location:
8482 case DW_AT_allocated:
8483 case DW_AT_associated:
8484 case DW_AT_data_location:
8485 case DW_AT_stride:
8486 case DW_AT_upper_bound:
8487 case DW_AT_lower_bound:
8488 if (form == DW_FORM_data4 || form == DW_FORM_data8)
8489 {
8490 /* Process location list. */
8491 unsigned int max = debug_info_p->max_loc_offsets;
8492 unsigned int num = debug_info_p->num_loc_offsets;
8493
8494 if (max == 0 || num >= max)
8495 {
8496 max += 1024;
8497 debug_info_p->loc_offsets
8498 = xcrealloc (debug_info_p->loc_offsets,
8499 max, sizeof (*debug_info_p->loc_offsets));
8500 debug_info_p->have_frame_base
8501 = xcrealloc (debug_info_p->have_frame_base,
8502 max, sizeof (*debug_info_p->have_frame_base));
8503 debug_info_p->max_loc_offsets = max;
8504 }
8505 debug_info_p->loc_offsets [num] = uvalue;
8506 debug_info_p->have_frame_base [num] = have_frame_base;
8507 debug_info_p->num_loc_offsets++;
8508 }
8509 break;
8510
8511 case DW_AT_low_pc:
8512 if (need_base_address)
8513 debug_info_p->base_address = uvalue;
8514 break;
8515
8516 case DW_AT_ranges:
8517 if (form == DW_FORM_data4 || form == DW_FORM_data8)
8518 {
8519 /* Process range list. */
8520 unsigned int max = debug_info_p->max_range_lists;
8521 unsigned int num = debug_info_p->num_range_lists;
8522
8523 if (max == 0 || num >= max)
8524 {
8525 max += 1024;
8526 debug_info_p->range_lists
8527 = xcrealloc (debug_info_p->range_lists,
8528 max, sizeof (*debug_info_p->range_lists));
8529 debug_info_p->max_range_lists = max;
8530 }
8531 debug_info_p->range_lists [num] = uvalue;
8532 debug_info_p->num_range_lists++;
8533 }
8534 break;
8535
8536 default:
8537 break;
8538 }
8539 }
8540
8541 if (do_loc)
8542 return data;
8543
8544 printf ("\t");
8545
8546 switch (attribute)
8547 {
8548 case DW_AT_inline:
8549 switch (uvalue)
8550 {
8551 case DW_INL_not_inlined:
8552 printf (_("(not inlined)"));
8553 break;
8554 case DW_INL_inlined:
8555 printf (_("(inlined)"));
8556 break;
8557 case DW_INL_declared_not_inlined:
8558 printf (_("(declared as inline but ignored)"));
8559 break;
8560 case DW_INL_declared_inlined:
8561 printf (_("(declared as inline and inlined)"));
8562 break;
8563 default:
8564 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
8565 break;
8566 }
8567 break;
8568
8569 case DW_AT_language:
8570 switch (uvalue)
8571 {
8572 case DW_LANG_C: printf ("(non-ANSI C)"); break;
8573 case DW_LANG_C89: printf ("(ANSI C)"); break;
8574 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
8575 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
8576 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
8577 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
8578 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
8579 case DW_LANG_Ada83: printf ("(Ada)"); break;
8580 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
8581 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
8582 /* DWARF 2.1 values. */
8583 case DW_LANG_C99: printf ("(ANSI C99)"); break;
8584 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
8585 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
8586 /* MIPS extension. */
8587 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
8588 /* UPC extension. */
8589 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
8590 default:
8591 printf ("(Unknown: %lx)", uvalue);
8592 break;
8593 }
8594 break;
8595
8596 case DW_AT_encoding:
8597 switch (uvalue)
8598 {
8599 case DW_ATE_void: printf ("(void)"); break;
8600 case DW_ATE_address: printf ("(machine address)"); break;
8601 case DW_ATE_boolean: printf ("(boolean)"); break;
8602 case DW_ATE_complex_float: printf ("(complex float)"); break;
8603 case DW_ATE_float: printf ("(float)"); break;
8604 case DW_ATE_signed: printf ("(signed)"); break;
8605 case DW_ATE_signed_char: printf ("(signed char)"); break;
8606 case DW_ATE_unsigned: printf ("(unsigned)"); break;
8607 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
8608 /* DWARF 2.1 value. */
8609 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
8610 /* GNU extension. */
8611 case DW_ATE_GNU_decimal_float: printf ("(decimal float)"); break;
8612 default:
8613 if (uvalue >= DW_ATE_lo_user
8614 && uvalue <= DW_ATE_hi_user)
8615 printf ("(user defined type)");
8616 else
8617 printf ("(unknown type)");
8618 break;
8619 }
8620 break;
8621
8622 case DW_AT_accessibility:
8623 switch (uvalue)
8624 {
8625 case DW_ACCESS_public: printf ("(public)"); break;
8626 case DW_ACCESS_protected: printf ("(protected)"); break;
8627 case DW_ACCESS_private: printf ("(private)"); break;
8628 default:
8629 printf ("(unknown accessibility)");
8630 break;
8631 }
8632 break;
8633
8634 case DW_AT_visibility:
8635 switch (uvalue)
8636 {
8637 case DW_VIS_local: printf ("(local)"); break;
8638 case DW_VIS_exported: printf ("(exported)"); break;
8639 case DW_VIS_qualified: printf ("(qualified)"); break;
8640 default: printf ("(unknown visibility)"); break;
8641 }
8642 break;
8643
8644 case DW_AT_virtuality:
8645 switch (uvalue)
8646 {
8647 case DW_VIRTUALITY_none: printf ("(none)"); break;
8648 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8649 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8650 default: printf ("(unknown virtuality)"); break;
8651 }
8652 break;
8653
8654 case DW_AT_identifier_case:
8655 switch (uvalue)
8656 {
8657 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8658 case DW_ID_up_case: printf ("(up_case)"); break;
8659 case DW_ID_down_case: printf ("(down_case)"); break;
8660 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8661 default: printf ("(unknown case)"); break;
8662 }
8663 break;
8664
8665 case DW_AT_calling_convention:
8666 switch (uvalue)
8667 {
8668 case DW_CC_normal: printf ("(normal)"); break;
8669 case DW_CC_program: printf ("(program)"); break;
8670 case DW_CC_nocall: printf ("(nocall)"); break;
8671 default:
8672 if (uvalue >= DW_CC_lo_user
8673 && uvalue <= DW_CC_hi_user)
8674 printf ("(user defined)");
8675 else
8676 printf ("(unknown convention)");
8677 }
8678 break;
8679
8680 case DW_AT_ordering:
8681 switch (uvalue)
8682 {
8683 case -1: printf ("(undefined)"); break;
8684 case 0: printf ("(row major)"); break;
8685 case 1: printf ("(column major)"); break;
8686 }
8687 break;
8688
8689 case DW_AT_frame_base:
8690 have_frame_base = 1;
8691 case DW_AT_location:
8692 case DW_AT_data_member_location:
8693 case DW_AT_vtable_elem_location:
8694 case DW_AT_allocated:
8695 case DW_AT_associated:
8696 case DW_AT_data_location:
8697 case DW_AT_stride:
8698 case DW_AT_upper_bound:
8699 case DW_AT_lower_bound:
8700 if (block_start)
8701 {
8702 int need_frame_base;
8703
8704 printf ("(");
8705 need_frame_base = decode_location_expression (block_start,
8706 pointer_size,
8707 uvalue,
8708 cu_offset);
8709 printf (")");
8710 if (need_frame_base && !have_frame_base)
8711 printf (_(" [without DW_AT_frame_base]"));
8712 }
8713 else if (form == DW_FORM_data4 || form == DW_FORM_data8)
8714 printf (_("(location list)"));
8715
8716 break;
8717
8718 default:
8719 break;
8720 }
8721
8722 return data;
8723 }
8724
8725 static char *
8726 get_AT_name (unsigned long attribute)
8727 {
8728 switch (attribute)
8729 {
8730 case DW_AT_sibling: return "DW_AT_sibling";
8731 case DW_AT_location: return "DW_AT_location";
8732 case DW_AT_name: return "DW_AT_name";
8733 case DW_AT_ordering: return "DW_AT_ordering";
8734 case DW_AT_subscr_data: return "DW_AT_subscr_data";
8735 case DW_AT_byte_size: return "DW_AT_byte_size";
8736 case DW_AT_bit_offset: return "DW_AT_bit_offset";
8737 case DW_AT_bit_size: return "DW_AT_bit_size";
8738 case DW_AT_element_list: return "DW_AT_element_list";
8739 case DW_AT_stmt_list: return "DW_AT_stmt_list";
8740 case DW_AT_low_pc: return "DW_AT_low_pc";
8741 case DW_AT_high_pc: return "DW_AT_high_pc";
8742 case DW_AT_language: return "DW_AT_language";
8743 case DW_AT_member: return "DW_AT_member";
8744 case DW_AT_discr: return "DW_AT_discr";
8745 case DW_AT_discr_value: return "DW_AT_discr_value";
8746 case DW_AT_visibility: return "DW_AT_visibility";
8747 case DW_AT_import: return "DW_AT_import";
8748 case DW_AT_string_length: return "DW_AT_string_length";
8749 case DW_AT_common_reference: return "DW_AT_common_reference";
8750 case DW_AT_comp_dir: return "DW_AT_comp_dir";
8751 case DW_AT_const_value: return "DW_AT_const_value";
8752 case DW_AT_containing_type: return "DW_AT_containing_type";
8753 case DW_AT_default_value: return "DW_AT_default_value";
8754 case DW_AT_inline: return "DW_AT_inline";
8755 case DW_AT_is_optional: return "DW_AT_is_optional";
8756 case DW_AT_lower_bound: return "DW_AT_lower_bound";
8757 case DW_AT_producer: return "DW_AT_producer";
8758 case DW_AT_prototyped: return "DW_AT_prototyped";
8759 case DW_AT_return_addr: return "DW_AT_return_addr";
8760 case DW_AT_start_scope: return "DW_AT_start_scope";
8761 case DW_AT_stride_size: return "DW_AT_stride_size";
8762 case DW_AT_upper_bound: return "DW_AT_upper_bound";
8763 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
8764 case DW_AT_accessibility: return "DW_AT_accessibility";
8765 case DW_AT_address_class: return "DW_AT_address_class";
8766 case DW_AT_artificial: return "DW_AT_artificial";
8767 case DW_AT_base_types: return "DW_AT_base_types";
8768 case DW_AT_calling_convention: return "DW_AT_calling_convention";
8769 case DW_AT_count: return "DW_AT_count";
8770 case DW_AT_data_member_location: return "DW_AT_data_member_location";
8771 case DW_AT_decl_column: return "DW_AT_decl_column";
8772 case DW_AT_decl_file: return "DW_AT_decl_file";
8773 case DW_AT_decl_line: return "DW_AT_decl_line";
8774 case DW_AT_declaration: return "DW_AT_declaration";
8775 case DW_AT_discr_list: return "DW_AT_discr_list";
8776 case DW_AT_encoding: return "DW_AT_encoding";
8777 case DW_AT_external: return "DW_AT_external";
8778 case DW_AT_frame_base: return "DW_AT_frame_base";
8779 case DW_AT_friend: return "DW_AT_friend";
8780 case DW_AT_identifier_case: return "DW_AT_identifier_case";
8781 case DW_AT_macro_info: return "DW_AT_macro_info";
8782 case DW_AT_namelist_items: return "DW_AT_namelist_items";
8783 case DW_AT_priority: return "DW_AT_priority";
8784 case DW_AT_segment: return "DW_AT_segment";
8785 case DW_AT_specification: return "DW_AT_specification";
8786 case DW_AT_static_link: return "DW_AT_static_link";
8787 case DW_AT_type: return "DW_AT_type";
8788 case DW_AT_use_location: return "DW_AT_use_location";
8789 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
8790 case DW_AT_virtuality: return "DW_AT_virtuality";
8791 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
8792 /* DWARF 2.1 values. */
8793 case DW_AT_allocated: return "DW_AT_allocated";
8794 case DW_AT_associated: return "DW_AT_associated";
8795 case DW_AT_data_location: return "DW_AT_data_location";
8796 case DW_AT_stride: return "DW_AT_stride";
8797 case DW_AT_entry_pc: return "DW_AT_entry_pc";
8798 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
8799 case DW_AT_extension: return "DW_AT_extension";
8800 case DW_AT_ranges: return "DW_AT_ranges";
8801 case DW_AT_trampoline: return "DW_AT_trampoline";
8802 case DW_AT_call_column: return "DW_AT_call_column";
8803 case DW_AT_call_file: return "DW_AT_call_file";
8804 case DW_AT_call_line: return "DW_AT_call_line";
8805 /* SGI/MIPS extensions. */
8806 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
8807 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
8808 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
8809 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
8810 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
8811 case DW_AT_MIPS_software_pipeline_depth:
8812 return "DW_AT_MIPS_software_pipeline_depth";
8813 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
8814 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
8815 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
8816 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
8817 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
8818 /* GNU extensions. */
8819 case DW_AT_sf_names: return "DW_AT_sf_names";
8820 case DW_AT_src_info: return "DW_AT_src_info";
8821 case DW_AT_mac_info: return "DW_AT_mac_info";
8822 case DW_AT_src_coords: return "DW_AT_src_coords";
8823 case DW_AT_body_begin: return "DW_AT_body_begin";
8824 case DW_AT_body_end: return "DW_AT_body_end";
8825 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
8826 /* UPC extension. */
8827 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
8828 default:
8829 {
8830 static char buffer[100];
8831
8832 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
8833 attribute);
8834 return buffer;
8835 }
8836 }
8837 }
8838
8839 static unsigned char *
8840 read_and_display_attr (unsigned long attribute,
8841 unsigned long form,
8842 unsigned char *data,
8843 unsigned long cu_offset,
8844 unsigned long pointer_size,
8845 unsigned long offset_size,
8846 int dwarf_version,
8847 debug_info *debug_info_p,
8848 int do_loc)
8849 {
8850 if (!do_loc)
8851 printf (" %-18s:", get_AT_name (attribute));
8852 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8853 pointer_size, offset_size,
8854 dwarf_version, debug_info_p,
8855 do_loc);
8856 if (!do_loc)
8857 printf ("\n");
8858 return data;
8859 }
8860
8861
8862 /* Process the contents of a .debug_info section. If do_loc is non-zero
8863 then we are scanning for location lists and we do not want to display
8864 anything to the user. */
8865
8866 static int
8867 process_debug_info (Elf_Internal_Shdr *section, unsigned char *start,
8868 FILE *file, int do_loc)
8869 {
8870 unsigned char *end = start + section->sh_size;
8871 unsigned char *section_begin;
8872 unsigned int unit;
8873 unsigned int num_units = 0;
8874
8875 if ((do_loc || do_debug_loc || do_debug_ranges)
8876 && num_debug_info_entries == 0)
8877 {
8878 unsigned long length;
8879
8880 /* First scan the section to get the number of comp units. */
8881 for (section_begin = start, num_units = 0; section_begin < end;
8882 num_units ++)
8883 {
8884 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8885 will be the length. For a 64-bit DWARF section, it'll be
8886 the escape code 0xffffffff followed by an 8 byte length. */
8887 length = byte_get (section_begin, 4);
8888
8889 if (length == 0xffffffff)
8890 {
8891 length = byte_get (section_begin + 4, 8);
8892 section_begin += length + 12;
8893 }
8894 else
8895 section_begin += length + 4;
8896 }
8897
8898 if (num_units == 0)
8899 {
8900 error (_("No comp units in .debug_info section ?"));
8901 return 0;
8902 }
8903
8904 /* Then allocate an array to hold the information. */
8905 debug_information = cmalloc (num_units,
8906 sizeof (* debug_information));
8907 if (debug_information == NULL)
8908 {
8909 error (_("Not enough memory for a debug info array of %u entries"),
8910 num_units);
8911 return 0;
8912 }
8913 }
8914
8915 if (!do_loc)
8916 {
8917 printf (_("The section %s contains:\n\n"),
8918 SECTION_NAME (section));
8919
8920 load_debug_str (file);
8921 load_debug_loc (file);
8922 load_debug_range (file);
8923 }
8924
8925 for (section_begin = start, unit = 0; start < end; unit++)
8926 {
8927 DWARF2_Internal_CompUnit compunit;
8928 unsigned char *hdrptr;
8929 unsigned char *cu_abbrev_offset_ptr;
8930 unsigned char *tags;
8931 int level;
8932 unsigned long cu_offset;
8933 int offset_size;
8934 int initial_length_size;
8935
8936 hdrptr = start;
8937
8938 compunit.cu_length = byte_get (hdrptr, 4);
8939 hdrptr += 4;
8940
8941 if (compunit.cu_length == 0xffffffff)
8942 {
8943 compunit.cu_length = byte_get (hdrptr, 8);
8944 hdrptr += 8;
8945 offset_size = 8;
8946 initial_length_size = 12;
8947 }
8948 else
8949 {
8950 offset_size = 4;
8951 initial_length_size = 4;
8952 }
8953
8954 compunit.cu_version = byte_get (hdrptr, 2);
8955 hdrptr += 2;
8956
8957 cu_offset = start - section_begin;
8958 start += compunit.cu_length + initial_length_size;
8959
8960 if (elf_header.e_type == ET_REL
8961 && !debug_apply_rela_addends (file, section, offset_size,
8962 section_begin, hdrptr, start))
8963 return 0;
8964
8965 cu_abbrev_offset_ptr = hdrptr;
8966 compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
8967 hdrptr += offset_size;
8968
8969 compunit.cu_pointer_size = byte_get (hdrptr, 1);
8970 hdrptr += 1;
8971 if ((do_loc || do_debug_loc || do_debug_ranges)
8972 && num_debug_info_entries == 0)
8973 {
8974 debug_information [unit].cu_offset = cu_offset;
8975 debug_information [unit].pointer_size
8976 = compunit.cu_pointer_size;
8977 debug_information [unit].base_address = 0;
8978 debug_information [unit].loc_offsets = NULL;
8979 debug_information [unit].have_frame_base = NULL;
8980 debug_information [unit].max_loc_offsets = 0;
8981 debug_information [unit].num_loc_offsets = 0;
8982 debug_information [unit].range_lists = NULL;
8983 debug_information [unit].max_range_lists= 0;
8984 debug_information [unit].num_range_lists = 0;
8985 }
8986
8987 tags = hdrptr;
8988
8989 if (!do_loc)
8990 {
8991 printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset);
8992 printf (_(" Length: %ld\n"), compunit.cu_length);
8993 printf (_(" Version: %d\n"), compunit.cu_version);
8994 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8995 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8996 }
8997
8998 if (compunit.cu_version != 2 && compunit.cu_version != 3)
8999 {
9000 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
9001 continue;
9002 }
9003
9004 free_abbrevs ();
9005
9006 /* Read in the abbrevs used by this compilation unit. */
9007 {
9008 Elf_Internal_Shdr *sec;
9009 unsigned char *begin;
9010
9011 /* Locate the .debug_abbrev section and process it. */
9012 sec = find_section (".debug_abbrev");
9013 if (sec == NULL)
9014 {
9015 warn (_("Unable to locate .debug_abbrev section!\n"));
9016 return 0;
9017 }
9018
9019 begin = get_data (NULL, file, sec->sh_offset, 1, sec->sh_size,
9020 _("debug_abbrev section data"));
9021 if (!begin)
9022 return 0;
9023
9024 process_abbrev_section (begin + compunit.cu_abbrev_offset,
9025 begin + sec->sh_size);
9026
9027 free (begin);
9028 }
9029
9030 level = 0;
9031 while (tags < start)
9032 {
9033 unsigned int bytes_read;
9034 unsigned long abbrev_number;
9035 abbrev_entry *entry;
9036 abbrev_attr *attr;
9037
9038 abbrev_number = read_leb128 (tags, & bytes_read, 0);
9039 tags += bytes_read;
9040
9041 /* A null DIE marks the end of a list of children. */
9042 if (abbrev_number == 0)
9043 {
9044 --level;
9045 continue;
9046 }
9047
9048 /* Scan through the abbreviation list until we reach the
9049 correct entry. */
9050 for (entry = first_abbrev;
9051 entry && entry->entry != abbrev_number;
9052 entry = entry->next)
9053 continue;
9054
9055 if (entry == NULL)
9056 {
9057 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
9058 abbrev_number);
9059 return 0;
9060 }
9061
9062 if (!do_loc)
9063 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
9064 level,
9065 (unsigned long) (tags - section_begin
9066 - bytes_read),
9067 abbrev_number,
9068 get_TAG_name (entry->tag));
9069
9070 switch (entry->tag)
9071 {
9072 default:
9073 need_base_address = 0;
9074 break;
9075 case DW_TAG_compile_unit:
9076 need_base_address = 1;
9077 break;
9078 case DW_TAG_entry_point:
9079 case DW_TAG_inlined_subroutine:
9080 case DW_TAG_subprogram:
9081 need_base_address = 0;
9082 /* Assuming that there is no DW_AT_frame_base. */
9083 have_frame_base = 0;
9084 break;
9085 }
9086
9087 for (attr = entry->first_attr; attr; attr = attr->next)
9088 tags = read_and_display_attr (attr->attribute,
9089 attr->form,
9090 tags, cu_offset,
9091 compunit.cu_pointer_size,
9092 offset_size,
9093 compunit.cu_version,
9094 &debug_information [unit],
9095 do_loc);
9096
9097 if (entry->children)
9098 ++level;
9099 }
9100 }
9101
9102 /* Set num_debug_info_entries here so that it can be used to check if
9103 we need to process .debug_loc and .debug_ranges sections. */
9104 if ((do_loc || do_debug_loc || do_debug_ranges)
9105 && num_debug_info_entries == 0)
9106 num_debug_info_entries = num_units;
9107
9108 if (!do_loc)
9109 {
9110 free_debug_range ();
9111 free_debug_str ();
9112 free_debug_loc ();
9113
9114 printf ("\n");
9115 }
9116
9117 return 1;
9118 }
9119
9120 /* Retrieve the pointer size associated with the given compilation unit.
9121 Optionally the offset of this unit into the .debug_info section is
9122 also retutned. If there is no .debug_info section then an error
9123 message is issued and 0 is returned. If the requested comp unit has
9124 not been defined in the .debug_info section then a warning message
9125 is issued and the last know pointer size is returned. This message
9126 is only issued once per section dumped per file dumped. */
9127
9128 static unsigned int
9129 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit,
9130 const char * section_name,
9131 unsigned long * offset_return)
9132 {
9133 unsigned long offset = 0;
9134
9135 if (num_debug_info_entries == 0)
9136 error (_("%s section needs a populated .debug_info section\n"),
9137 section_name);
9138
9139 else if (comp_unit >= num_debug_info_entries)
9140 {
9141 if (!warned_about_missing_comp_units)
9142 {
9143 warn (_("%s section has more comp units than .debug_info section\n"),
9144 section_name);
9145 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
9146 last_pointer_size);
9147 warned_about_missing_comp_units = TRUE;
9148 }
9149 }
9150 else
9151 {
9152 last_pointer_size = debug_information [comp_unit].pointer_size;
9153 offset = debug_information [comp_unit].cu_offset;
9154 }
9155
9156 if (offset_return != NULL)
9157 * offset_return = offset;
9158
9159 return last_pointer_size;
9160 }
9161
9162 /* Locate and scan the .debug_info section in the file and record the pointer
9163 sizes and offsets for the compilation units in it. Usually an executable
9164 will have just one pointer size, but this is not guaranteed, and so we try
9165 not to make any assumptions. Returns zero upon failure, or the number of
9166 compilation units upon success. */
9167
9168 static unsigned int
9169 get_debug_info (FILE * file)
9170 {
9171 Elf_Internal_Shdr * section;
9172 unsigned char * start;
9173 int ret;
9174
9175 /* Reset the last pointer size so that we can issue correct error
9176 messages if we are displaying the contents of more than one section. */
9177 last_pointer_size = 0;
9178 warned_about_missing_comp_units = FALSE;
9179
9180 /* If we already have the information there is nothing else to do. */
9181 if (num_debug_info_entries > 0)
9182 return num_debug_info_entries;
9183
9184 section = find_section (".debug_info");
9185 if (section == NULL)
9186 return 0;
9187
9188 start = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9189 _("extracting information from .debug_info section"));
9190 if (start == NULL)
9191 return 0;
9192
9193 ret = process_debug_info (section, start, file, 1);
9194 free (start);
9195
9196 return ret ? num_debug_info_entries : 0;
9197 }
9198
9199 static int
9200 display_debug_lines (Elf_Internal_Shdr *section,
9201 unsigned char *start, FILE *file)
9202 {
9203 unsigned char *data = start;
9204 unsigned char *end = start + section->sh_size;
9205 unsigned int comp_unit = 0;
9206
9207 printf (_("\nDump of debug contents of section %s:\n\n"),
9208 SECTION_NAME (section));
9209
9210 get_debug_info (file);
9211
9212 while (data < end)
9213 {
9214 DWARF2_Internal_LineInfo info;
9215 unsigned char *standard_opcodes;
9216 unsigned char *end_of_sequence;
9217 unsigned char *hdrptr;
9218 unsigned int pointer_size;
9219 int initial_length_size;
9220 int offset_size;
9221 int i;
9222
9223 hdrptr = data;
9224
9225 /* Check the length of the block. */
9226 info.li_length = byte_get (hdrptr, 4);
9227 hdrptr += 4;
9228
9229 if (info.li_length == 0xffffffff)
9230 {
9231 /* This section is 64-bit DWARF 3. */
9232 info.li_length = byte_get (hdrptr, 8);
9233 hdrptr += 8;
9234 offset_size = 8;
9235 initial_length_size = 12;
9236 }
9237 else
9238 {
9239 offset_size = 4;
9240 initial_length_size = 4;
9241 }
9242
9243 if (info.li_length + initial_length_size > section->sh_size)
9244 {
9245 warn
9246 (_("The line info appears to be corrupt - the section is too small\n"));
9247 return 0;
9248 }
9249
9250 /* Check its version number. */
9251 info.li_version = byte_get (hdrptr, 2);
9252 hdrptr += 2;
9253 if (info.li_version != 2 && info.li_version != 3)
9254 {
9255 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
9256 return 0;
9257 }
9258
9259 info.li_prologue_length = byte_get (hdrptr, offset_size);
9260 hdrptr += offset_size;
9261 info.li_min_insn_length = byte_get (hdrptr, 1);
9262 hdrptr++;
9263 info.li_default_is_stmt = byte_get (hdrptr, 1);
9264 hdrptr++;
9265 info.li_line_base = byte_get (hdrptr, 1);
9266 hdrptr++;
9267 info.li_line_range = byte_get (hdrptr, 1);
9268 hdrptr++;
9269 info.li_opcode_base = byte_get (hdrptr, 1);
9270 hdrptr++;
9271
9272 /* Sign extend the line base field. */
9273 info.li_line_base <<= 24;
9274 info.li_line_base >>= 24;
9275
9276 /* Get the pointer size from the comp unit associated
9277 with this block of line number information. */
9278 pointer_size = get_pointer_size_and_offset_of_comp_unit
9279 (comp_unit, ".debug_line", NULL);
9280 comp_unit ++;
9281
9282 printf (_(" Length: %ld\n"), info.li_length);
9283 printf (_(" DWARF Version: %d\n"), info.li_version);
9284 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
9285 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
9286 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
9287 printf (_(" Line Base: %d\n"), info.li_line_base);
9288 printf (_(" Line Range: %d\n"), info.li_line_range);
9289 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
9290 printf (_(" (Pointer size: %u)%s\n"),
9291 pointer_size,
9292 warned_about_missing_comp_units ? " [assumed]" : "" );
9293
9294 end_of_sequence = data + info.li_length + initial_length_size;
9295
9296 reset_state_machine (info.li_default_is_stmt);
9297
9298 /* Display the contents of the Opcodes table. */
9299 standard_opcodes = hdrptr;
9300
9301 printf (_("\n Opcodes:\n"));
9302
9303 for (i = 1; i < info.li_opcode_base; i++)
9304 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
9305
9306 /* Display the contents of the Directory table. */
9307 data = standard_opcodes + info.li_opcode_base - 1;
9308
9309 if (*data == 0)
9310 printf (_("\n The Directory Table is empty.\n"));
9311 else
9312 {
9313 printf (_("\n The Directory Table:\n"));
9314
9315 while (*data != 0)
9316 {
9317 printf (_(" %s\n"), data);
9318
9319 data += strlen ((char *) data) + 1;
9320 }
9321 }
9322
9323 /* Skip the NUL at the end of the table. */
9324 data++;
9325
9326 /* Display the contents of the File Name table. */
9327 if (*data == 0)
9328 printf (_("\n The File Name Table is empty.\n"));
9329 else
9330 {
9331 printf (_("\n The File Name Table:\n"));
9332 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9333
9334 while (*data != 0)
9335 {
9336 unsigned char *name;
9337 unsigned int bytes_read;
9338
9339 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
9340 name = data;
9341
9342 data += strlen ((char *) data) + 1;
9343
9344 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9345 data += bytes_read;
9346 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9347 data += bytes_read;
9348 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9349 data += bytes_read;
9350 printf (_("%s\n"), name);
9351 }
9352 }
9353
9354 /* Skip the NUL at the end of the table. */
9355 data++;
9356
9357 /* Now display the statements. */
9358 printf (_("\n Line Number Statements:\n"));
9359
9360 while (data < end_of_sequence)
9361 {
9362 unsigned char op_code;
9363 int adv;
9364 unsigned int bytes_read;
9365
9366 op_code = *data++;
9367
9368 if (op_code >= info.li_opcode_base)
9369 {
9370 op_code -= info.li_opcode_base;
9371 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
9372 state_machine_regs.address += adv;
9373 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9374 op_code, adv, state_machine_regs.address);
9375 adv = (op_code % info.li_line_range) + info.li_line_base;
9376 state_machine_regs.line += adv;
9377 printf (_(" and Line by %d to %d\n"),
9378 adv, state_machine_regs.line);
9379 }
9380 else switch (op_code)
9381 {
9382 case DW_LNS_extended_op:
9383 if (pointer_size == 0)
9384 {
9385 warn (_("Extend line ops need a valid pointer size, guessing at 4\n"));
9386 pointer_size = 4;
9387 }
9388
9389 data += process_extended_line_op (data, info.li_default_is_stmt,
9390 pointer_size);
9391 break;
9392
9393 case DW_LNS_copy:
9394 printf (_(" Copy\n"));
9395 break;
9396
9397 case DW_LNS_advance_pc:
9398 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
9399 data += bytes_read;
9400 state_machine_regs.address += adv;
9401 printf (_(" Advance PC by %d to %lx\n"), adv,
9402 state_machine_regs.address);
9403 break;
9404
9405 case DW_LNS_advance_line:
9406 adv = read_leb128 (data, & bytes_read, 1);
9407 data += bytes_read;
9408 state_machine_regs.line += adv;
9409 printf (_(" Advance Line by %d to %d\n"), adv,
9410 state_machine_regs.line);
9411 break;
9412
9413 case DW_LNS_set_file:
9414 adv = read_leb128 (data, & bytes_read, 0);
9415 data += bytes_read;
9416 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9417 adv);
9418 state_machine_regs.file = adv;
9419 break;
9420
9421 case DW_LNS_set_column:
9422 adv = read_leb128 (data, & bytes_read, 0);
9423 data += bytes_read;
9424 printf (_(" Set column to %d\n"), adv);
9425 state_machine_regs.column = adv;
9426 break;
9427
9428 case DW_LNS_negate_stmt:
9429 adv = state_machine_regs.is_stmt;
9430 adv = ! adv;
9431 printf (_(" Set is_stmt to %d\n"), adv);
9432 state_machine_regs.is_stmt = adv;
9433 break;
9434
9435 case DW_LNS_set_basic_block:
9436 printf (_(" Set basic block\n"));
9437 state_machine_regs.basic_block = 1;
9438 break;
9439
9440 case DW_LNS_const_add_pc:
9441 adv = (((255 - info.li_opcode_base) / info.li_line_range)
9442 * info.li_min_insn_length);
9443 state_machine_regs.address += adv;
9444 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
9445 state_machine_regs.address);
9446 break;
9447
9448 case DW_LNS_fixed_advance_pc:
9449 adv = byte_get (data, 2);
9450 data += 2;
9451 state_machine_regs.address += adv;
9452 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9453 adv, state_machine_regs.address);
9454 break;
9455
9456 case DW_LNS_set_prologue_end:
9457 printf (_(" Set prologue_end to true\n"));
9458 break;
9459
9460 case DW_LNS_set_epilogue_begin:
9461 printf (_(" Set epilogue_begin to true\n"));
9462 break;
9463
9464 case DW_LNS_set_isa:
9465 adv = read_leb128 (data, & bytes_read, 0);
9466 data += bytes_read;
9467 printf (_(" Set ISA to %d\n"), adv);
9468 break;
9469
9470 default:
9471 printf (_(" Unknown opcode %d with operands: "), op_code);
9472
9473 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
9474 {
9475 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
9476 i == 1 ? "" : ", ");
9477 data += bytes_read;
9478 }
9479 putchar ('\n');
9480 break;
9481 }
9482 }
9483 putchar ('\n');
9484 }
9485
9486 return 1;
9487 }
9488
9489 static int
9490 display_debug_pubnames (Elf_Internal_Shdr *section,
9491 unsigned char *start,
9492 FILE *file ATTRIBUTE_UNUSED)
9493 {
9494 DWARF2_Internal_PubNames pubnames;
9495 unsigned char *end;
9496
9497 end = start + section->sh_size;
9498
9499 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9500
9501 while (start < end)
9502 {
9503 unsigned char *data;
9504 unsigned long offset;
9505 int offset_size, initial_length_size;
9506
9507 data = start;
9508
9509 pubnames.pn_length = byte_get (data, 4);
9510 data += 4;
9511 if (pubnames.pn_length == 0xffffffff)
9512 {
9513 pubnames.pn_length = byte_get (data, 8);
9514 data += 8;
9515 offset_size = 8;
9516 initial_length_size = 12;
9517 }
9518 else
9519 {
9520 offset_size = 4;
9521 initial_length_size = 4;
9522 }
9523
9524 pubnames.pn_version = byte_get (data, 2);
9525 data += 2;
9526 pubnames.pn_offset = byte_get (data, offset_size);
9527 data += offset_size;
9528 pubnames.pn_size = byte_get (data, offset_size);
9529 data += offset_size;
9530
9531 start += pubnames.pn_length + initial_length_size;
9532
9533 if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
9534 {
9535 static int warned = 0;
9536
9537 if (! warned)
9538 {
9539 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9540 warned = 1;
9541 }
9542
9543 continue;
9544 }
9545
9546 printf (_(" Length: %ld\n"),
9547 pubnames.pn_length);
9548 printf (_(" Version: %d\n"),
9549 pubnames.pn_version);
9550 printf (_(" Offset into .debug_info section: %ld\n"),
9551 pubnames.pn_offset);
9552 printf (_(" Size of area in .debug_info section: %ld\n"),
9553 pubnames.pn_size);
9554
9555 printf (_("\n Offset\tName\n"));
9556
9557 do
9558 {
9559 offset = byte_get (data, offset_size);
9560
9561 if (offset != 0)
9562 {
9563 data += offset_size;
9564 printf (" %-6ld\t\t%s\n", offset, data);
9565 data += strlen ((char *) data) + 1;
9566 }
9567 }
9568 while (offset != 0);
9569 }
9570
9571 printf ("\n");
9572 return 1;
9573 }
9574
9575 static int
9576 display_debug_macinfo (Elf_Internal_Shdr *section,
9577 unsigned char *start,
9578 FILE *file ATTRIBUTE_UNUSED)
9579 {
9580 unsigned char *end = start + section->sh_size;
9581 unsigned char *curr = start;
9582 unsigned int bytes_read;
9583 enum dwarf_macinfo_record_type op;
9584
9585 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9586
9587 while (curr < end)
9588 {
9589 unsigned int lineno;
9590 const char *string;
9591
9592 op = *curr;
9593 curr++;
9594
9595 switch (op)
9596 {
9597 case DW_MACINFO_start_file:
9598 {
9599 unsigned int filenum;
9600
9601 lineno = read_leb128 (curr, & bytes_read, 0);
9602 curr += bytes_read;
9603 filenum = read_leb128 (curr, & bytes_read, 0);
9604 curr += bytes_read;
9605
9606 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9607 lineno, filenum);
9608 }
9609 break;
9610
9611 case DW_MACINFO_end_file:
9612 printf (_(" DW_MACINFO_end_file\n"));
9613 break;
9614
9615 case DW_MACINFO_define:
9616 lineno = read_leb128 (curr, & bytes_read, 0);
9617 curr += bytes_read;
9618 string = (char *) curr;
9619 curr += strlen (string) + 1;
9620 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9621 lineno, string);
9622 break;
9623
9624 case DW_MACINFO_undef:
9625 lineno = read_leb128 (curr, & bytes_read, 0);
9626 curr += bytes_read;
9627 string = (char *) curr;
9628 curr += strlen (string) + 1;
9629 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9630 lineno, string);
9631 break;
9632
9633 case DW_MACINFO_vendor_ext:
9634 {
9635 unsigned int constant;
9636
9637 constant = read_leb128 (curr, & bytes_read, 0);
9638 curr += bytes_read;
9639 string = (char *) curr;
9640 curr += strlen (string) + 1;
9641 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9642 constant, string);
9643 }
9644 break;
9645 }
9646 }
9647
9648 return 1;
9649 }
9650
9651
9652 static int
9653 display_debug_abbrev (Elf_Internal_Shdr *section,
9654 unsigned char *start,
9655 FILE *file ATTRIBUTE_UNUSED)
9656 {
9657 abbrev_entry *entry;
9658 unsigned char *end = start + section->sh_size;
9659
9660 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9661
9662 do
9663 {
9664 start = process_abbrev_section (start, end);
9665
9666 if (first_abbrev == NULL)
9667 continue;
9668
9669 printf (_(" Number TAG\n"));
9670
9671 for (entry = first_abbrev; entry; entry = entry->next)
9672 {
9673 abbrev_attr *attr;
9674
9675 printf (_(" %ld %s [%s]\n"),
9676 entry->entry,
9677 get_TAG_name (entry->tag),
9678 entry->children ? _("has children") : _("no children"));
9679
9680 for (attr = entry->first_attr; attr; attr = attr->next)
9681 printf (_(" %-18s %s\n"),
9682 get_AT_name (attr->attribute),
9683 get_FORM_name (attr->form));
9684 }
9685
9686 free_abbrevs ();
9687 }
9688 while (start);
9689
9690 printf ("\n");
9691
9692 return 1;
9693 }
9694
9695 static int
9696 display_debug_loc (Elf_Internal_Shdr *section,
9697 unsigned char *start, FILE *file)
9698 {
9699 unsigned char *section_end;
9700 unsigned long bytes;
9701 unsigned char *section_begin = start;
9702 unsigned int num_loc_list = 0;
9703 unsigned long last_offset = 0;
9704 unsigned int first = 0;
9705 unsigned int i;
9706 unsigned int j;
9707 int seen_first_offset = 0;
9708 int use_debug_info = 1;
9709 unsigned char *next;
9710
9711 bytes = section->sh_size;
9712 section_end = start + bytes;
9713
9714 if (bytes == 0)
9715 {
9716 printf (_("\nThe .debug_loc section is empty.\n"));
9717 return 0;
9718 }
9719
9720 get_debug_info (file);
9721
9722 /* Check the order of location list in .debug_info section. If
9723 offsets of location lists are in the ascending order, we can
9724 use `debug_information' directly. */
9725 for (i = 0; i < num_debug_info_entries; i++)
9726 {
9727 unsigned int num;
9728
9729 num = debug_information [i].num_loc_offsets;
9730 num_loc_list += num;
9731
9732 /* Check if we can use `debug_information' directly. */
9733 if (use_debug_info && num != 0)
9734 {
9735 if (!seen_first_offset)
9736 {
9737 /* This is the first location list. */
9738 last_offset = debug_information [i].loc_offsets [0];
9739 first = i;
9740 seen_first_offset = 1;
9741 j = 1;
9742 }
9743 else
9744 j = 0;
9745
9746 for (; j < num; j++)
9747 {
9748 if (last_offset >
9749 debug_information [i].loc_offsets [j])
9750 {
9751 use_debug_info = 0;
9752 break;
9753 }
9754 last_offset = debug_information [i].loc_offsets [j];
9755 }
9756 }
9757 }
9758
9759 if (!use_debug_info)
9760 /* FIXME: Should we handle this case? */
9761 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9762
9763 if (!seen_first_offset)
9764 error (_("No location lists in .debug_info section!\n"));
9765
9766 if (debug_information [first].loc_offsets [0] != 0)
9767 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9768 debug_information [first].loc_offsets [0]);
9769
9770 printf (_("Contents of the .debug_loc section:\n\n"));
9771 printf (_(" Offset Begin End Expression\n"));
9772
9773 seen_first_offset = 0;
9774 for (i = first; i < num_debug_info_entries; i++)
9775 {
9776 unsigned long begin;
9777 unsigned long end;
9778 unsigned short length;
9779 unsigned long offset;
9780 unsigned int pointer_size;
9781 unsigned long cu_offset;
9782 unsigned long base_address;
9783 int need_frame_base;
9784 int has_frame_base;
9785
9786 pointer_size = debug_information [i].pointer_size;
9787 cu_offset = debug_information [i].cu_offset;
9788
9789 for (j = 0; j < debug_information [i].num_loc_offsets; j++)
9790 {
9791 has_frame_base = debug_information [i].have_frame_base [j];
9792 offset = debug_information [i].loc_offsets [j];
9793 next = section_begin + offset;
9794 base_address = debug_information [i].base_address;
9795
9796 if (!seen_first_offset)
9797 seen_first_offset = 1;
9798 else
9799 {
9800 if (start < next)
9801 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9802 start - section_begin, next - section_begin);
9803 else if (start > next)
9804 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9805 start - section_begin, next - section_begin);
9806 }
9807 start = next;
9808
9809 if (offset >= bytes)
9810 {
9811 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
9812 offset);
9813 continue;
9814 }
9815
9816 while (1)
9817 {
9818 if (start + 2 * pointer_size > section_end)
9819 {
9820 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9821 offset);
9822 break;
9823 }
9824
9825 begin = byte_get (start, pointer_size);
9826 start += pointer_size;
9827 end = byte_get (start, pointer_size);
9828 start += pointer_size;
9829
9830 if (begin == 0 && end == 0)
9831 {
9832 printf (_(" %8.8lx <End of list>\n"), offset);
9833 break;
9834 }
9835
9836 /* Check base address specifiers. */
9837 if (begin == -1UL && end != -1UL)
9838 {
9839 base_address = end;
9840 printf (_(" %8.8lx %8.8lx %8.8lx (base address)\n"),
9841 offset, begin, end);
9842 continue;
9843 }
9844
9845 if (start + 2 > section_end)
9846 {
9847 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9848 offset);
9849 break;
9850 }
9851
9852 length = byte_get (start, 2);
9853 start += 2;
9854
9855 if (start + length > section_end)
9856 {
9857 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9858 offset);
9859 break;
9860 }
9861
9862 printf (" %8.8lx %8.8lx %8.8lx (",
9863 offset, begin + base_address, end + base_address);
9864 need_frame_base = decode_location_expression (start,
9865 pointer_size,
9866 length,
9867 cu_offset);
9868 putchar (')');
9869
9870 if (need_frame_base && !has_frame_base)
9871 printf (_(" [without DW_AT_frame_base]"));
9872
9873 if (begin == end)
9874 fputs (_(" (start == end)"), stdout);
9875 else if (begin > end)
9876 fputs (_(" (start > end)"), stdout);
9877
9878 putchar ('\n');
9879
9880 start += length;
9881 }
9882 }
9883 }
9884 return 1;
9885 }
9886
9887 static int
9888 display_debug_str (Elf_Internal_Shdr *section,
9889 unsigned char *start,
9890 FILE *file ATTRIBUTE_UNUSED)
9891 {
9892 unsigned long bytes;
9893 bfd_vma addr;
9894
9895 addr = section->sh_addr;
9896 bytes = section->sh_size;
9897
9898 if (bytes == 0)
9899 {
9900 printf (_("\nThe .debug_str section is empty.\n"));
9901 return 0;
9902 }
9903
9904 printf (_("Contents of the .debug_str section:\n\n"));
9905
9906 while (bytes)
9907 {
9908 int j;
9909 int k;
9910 int lbytes;
9911
9912 lbytes = (bytes > 16 ? 16 : bytes);
9913
9914 printf (" 0x%8.8lx ", (unsigned long) addr);
9915
9916 for (j = 0; j < 16; j++)
9917 {
9918 if (j < lbytes)
9919 printf ("%2.2x", start[j]);
9920 else
9921 printf (" ");
9922
9923 if ((j & 3) == 3)
9924 printf (" ");
9925 }
9926
9927 for (j = 0; j < lbytes; j++)
9928 {
9929 k = start[j];
9930 if (k >= ' ' && k < 0x80)
9931 printf ("%c", k);
9932 else
9933 printf (".");
9934 }
9935
9936 putchar ('\n');
9937
9938 start += lbytes;
9939 addr += lbytes;
9940 bytes -= lbytes;
9941 }
9942
9943 putchar ('\n');
9944
9945 return 1;
9946 }
9947
9948
9949 static int
9950 display_debug_info (Elf_Internal_Shdr * section,
9951 unsigned char * start, FILE * file)
9952 {
9953 return process_debug_info (section, start, file, 0);
9954 }
9955
9956
9957 static int
9958 display_debug_aranges (Elf_Internal_Shdr *section,
9959 unsigned char *start,
9960 FILE *file ATTRIBUTE_UNUSED)
9961 {
9962 unsigned char *end = start + section->sh_size;
9963
9964 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
9965
9966 while (start < end)
9967 {
9968 unsigned char *hdrptr;
9969 DWARF2_Internal_ARange arange;
9970 unsigned char *ranges;
9971 unsigned long length;
9972 unsigned long address;
9973 int excess;
9974 int offset_size;
9975 int initial_length_size;
9976
9977 hdrptr = start;
9978
9979 arange.ar_length = byte_get (hdrptr, 4);
9980 hdrptr += 4;
9981
9982 if (arange.ar_length == 0xffffffff)
9983 {
9984 arange.ar_length = byte_get (hdrptr, 8);
9985 hdrptr += 8;
9986 offset_size = 8;
9987 initial_length_size = 12;
9988 }
9989 else
9990 {
9991 offset_size = 4;
9992 initial_length_size = 4;
9993 }
9994
9995 arange.ar_version = byte_get (hdrptr, 2);
9996 hdrptr += 2;
9997
9998 arange.ar_info_offset = byte_get (hdrptr, offset_size);
9999 hdrptr += offset_size;
10000
10001 arange.ar_pointer_size = byte_get (hdrptr, 1);
10002 hdrptr += 1;
10003
10004 arange.ar_segment_size = byte_get (hdrptr, 1);
10005 hdrptr += 1;
10006
10007 if (arange.ar_version != 2 && arange.ar_version != 3)
10008 {
10009 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
10010 break;
10011 }
10012
10013 printf (_(" Length: %ld\n"), arange.ar_length);
10014 printf (_(" Version: %d\n"), arange.ar_version);
10015 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
10016 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
10017 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
10018
10019 printf (_("\n Address Length\n"));
10020
10021 ranges = hdrptr;
10022
10023 /* Must pad to an alignment boundary that is twice the pointer size. */
10024 excess = (hdrptr - start) % (2 * arange.ar_pointer_size);
10025 if (excess)
10026 ranges += (2 * arange.ar_pointer_size) - excess;
10027
10028 for (;;)
10029 {
10030 address = byte_get (ranges, arange.ar_pointer_size);
10031
10032 ranges += arange.ar_pointer_size;
10033
10034 length = byte_get (ranges, arange.ar_pointer_size);
10035
10036 ranges += arange.ar_pointer_size;
10037
10038 /* A pair of zeros marks the end of the list. */
10039 if (address == 0 && length == 0)
10040 break;
10041
10042 printf (" %8.8lx %lu\n", address, length);
10043 }
10044
10045 start += arange.ar_length + initial_length_size;
10046 }
10047
10048 printf ("\n");
10049
10050 return 1;
10051 }
10052
10053 static int
10054 display_debug_ranges (Elf_Internal_Shdr *section,
10055 unsigned char *start,
10056 FILE *file ATTRIBUTE_UNUSED)
10057 {
10058 unsigned char *section_end;
10059 unsigned long bytes;
10060 unsigned char *section_begin = start;
10061 unsigned int num_range_list = 0;
10062 unsigned long last_offset = 0;
10063 unsigned int first = 0;
10064 unsigned int i;
10065 unsigned int j;
10066 int seen_first_offset = 0;
10067 int use_debug_info = 1;
10068 unsigned char *next;
10069
10070 bytes = section->sh_size;
10071 section_end = start + bytes;
10072
10073 if (bytes == 0)
10074 {
10075 printf (_("\nThe .debug_ranges section is empty.\n"));
10076 return 0;
10077 }
10078
10079 get_debug_info (file);
10080
10081 /* Check the order of range list in .debug_info section. If
10082 offsets of range lists are in the ascending order, we can
10083 use `debug_information' directly. */
10084 for (i = 0; i < num_debug_info_entries; i++)
10085 {
10086 unsigned int num;
10087
10088 num = debug_information [i].num_range_lists;
10089 num_range_list += num;
10090
10091 /* Check if we can use `debug_information' directly. */
10092 if (use_debug_info && num != 0)
10093 {
10094 if (!seen_first_offset)
10095 {
10096 /* This is the first range list. */
10097 last_offset = debug_information [i].range_lists [0];
10098 first = i;
10099 seen_first_offset = 1;
10100 j = 1;
10101 }
10102 else
10103 j = 0;
10104
10105 for (; j < num; j++)
10106 {
10107 if (last_offset >
10108 debug_information [i].range_lists [j])
10109 {
10110 use_debug_info = 0;
10111 break;
10112 }
10113 last_offset = debug_information [i].range_lists [j];
10114 }
10115 }
10116 }
10117
10118 if (!use_debug_info)
10119 /* FIXME: Should we handle this case? */
10120 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
10121
10122 if (!seen_first_offset)
10123 error (_("No range lists in .debug_info section!\n"));
10124
10125 if (debug_information [first].range_lists [0] != 0)
10126 warn (_("Range lists in .debug_ranges section start at 0x%lx\n"),
10127 debug_information [first].range_lists [0]);
10128
10129 printf (_("Contents of the .debug_ranges section:\n\n"));
10130 printf (_(" Offset Begin End\n"));
10131
10132 seen_first_offset = 0;
10133 for (i = first; i < num_debug_info_entries; i++)
10134 {
10135 unsigned long begin;
10136 unsigned long end;
10137 unsigned long offset;
10138 unsigned int pointer_size;
10139 unsigned long base_address;
10140
10141 pointer_size = debug_information [i].pointer_size;
10142
10143 for (j = 0; j < debug_information [i].num_range_lists; j++)
10144 {
10145 offset = debug_information [i].range_lists [j];
10146 next = section_begin + offset;
10147 base_address = debug_information [i].base_address;
10148
10149 if (!seen_first_offset)
10150 seen_first_offset = 1;
10151 else
10152 {
10153 if (start < next)
10154 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10155 start - section_begin, next - section_begin);
10156 else if (start > next)
10157 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10158 start - section_begin, next - section_begin);
10159 }
10160 start = next;
10161
10162 while (1)
10163 {
10164 begin = byte_get (start, pointer_size);
10165 start += pointer_size;
10166 end = byte_get (start, pointer_size);
10167 start += pointer_size;
10168
10169 if (begin == 0 && end == 0)
10170 {
10171 printf (_(" %8.8lx <End of list>\n"), offset);
10172 break;
10173 }
10174
10175 /* Check base address specifiers. */
10176 if (begin == -1UL && end != -1UL)
10177 {
10178 base_address = end;
10179 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
10180 offset, begin, end);
10181 continue;
10182 }
10183
10184 printf (" %8.8lx %8.8lx %8.8lx",
10185 offset, begin + base_address, end + base_address);
10186
10187 if (begin == end)
10188 fputs (_(" (start == end)"), stdout);
10189 else if (begin > end)
10190 fputs (_(" (start > end)"), stdout);
10191
10192 putchar ('\n');
10193 }
10194 }
10195 }
10196 putchar ('\n');
10197 return 1;
10198 }
10199
10200 typedef struct Frame_Chunk
10201 {
10202 struct Frame_Chunk *next;
10203 unsigned char *chunk_start;
10204 int ncols;
10205 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
10206 short int *col_type;
10207 int *col_offset;
10208 char *augmentation;
10209 unsigned int code_factor;
10210 int data_factor;
10211 unsigned long pc_begin;
10212 unsigned long pc_range;
10213 int cfa_reg;
10214 int cfa_offset;
10215 int ra;
10216 unsigned char fde_encoding;
10217 unsigned char cfa_exp;
10218 }
10219 Frame_Chunk;
10220
10221 /* A marker for a col_type that means this column was never referenced
10222 in the frame info. */
10223 #define DW_CFA_unreferenced (-1)
10224
10225 static void
10226 frame_need_space (Frame_Chunk *fc, int reg)
10227 {
10228 int prev = fc->ncols;
10229
10230 if (reg < fc->ncols)
10231 return;
10232
10233 fc->ncols = reg + 1;
10234 fc->col_type = xcrealloc (fc->col_type, fc->ncols, sizeof (short int));
10235 fc->col_offset = xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
10236
10237 while (prev < fc->ncols)
10238 {
10239 fc->col_type[prev] = DW_CFA_unreferenced;
10240 fc->col_offset[prev] = 0;
10241 prev++;
10242 }
10243 }
10244
10245 static void
10246 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
10247 {
10248 int r;
10249 char tmp[100];
10250
10251 if (*max_regs < fc->ncols)
10252 *max_regs = fc->ncols;
10253
10254 if (*need_col_headers)
10255 {
10256 *need_col_headers = 0;
10257
10258 printf (" LOC CFA ");
10259
10260 for (r = 0; r < *max_regs; r++)
10261 if (fc->col_type[r] != DW_CFA_unreferenced)
10262 {
10263 if (r == fc->ra)
10264 printf ("ra ");
10265 else
10266 printf ("r%-4d", r);
10267 }
10268
10269 printf ("\n");
10270 }
10271
10272 printf ("%08lx ", fc->pc_begin);
10273 if (fc->cfa_exp)
10274 strcpy (tmp, "exp");
10275 else
10276 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
10277 printf ("%-8s ", tmp);
10278
10279 for (r = 0; r < fc->ncols; r++)
10280 {
10281 if (fc->col_type[r] != DW_CFA_unreferenced)
10282 {
10283 switch (fc->col_type[r])
10284 {
10285 case DW_CFA_undefined:
10286 strcpy (tmp, "u");
10287 break;
10288 case DW_CFA_same_value:
10289 strcpy (tmp, "s");
10290 break;
10291 case DW_CFA_offset:
10292 sprintf (tmp, "c%+d", fc->col_offset[r]);
10293 break;
10294 case DW_CFA_register:
10295 sprintf (tmp, "r%d", fc->col_offset[r]);
10296 break;
10297 case DW_CFA_expression:
10298 strcpy (tmp, "exp");
10299 break;
10300 default:
10301 strcpy (tmp, "n/a");
10302 break;
10303 }
10304 printf ("%-5s", tmp);
10305 }
10306 }
10307 printf ("\n");
10308 }
10309
10310 static int
10311 size_of_encoded_value (int encoding)
10312 {
10313 switch (encoding & 0x7)
10314 {
10315 default: /* ??? */
10316 case 0: return eh_addr_size;
10317 case 2: return 2;
10318 case 3: return 4;
10319 case 4: return 8;
10320 }
10321 }
10322
10323 static bfd_vma
10324 get_encoded_value (unsigned char *data, int encoding)
10325 {
10326 int size = size_of_encoded_value (encoding);
10327 if (encoding & DW_EH_PE_signed)
10328 return byte_get_signed (data, size);
10329 else
10330 return byte_get (data, size);
10331 }
10332
10333 #define GET(N) byte_get (start, N); start += N
10334 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
10335 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
10336
10337 static int
10338 display_debug_frames (Elf_Internal_Shdr *section,
10339 unsigned char *start,
10340 FILE *file ATTRIBUTE_UNUSED)
10341 {
10342 unsigned char *end = start + section->sh_size;
10343 unsigned char *section_start = start;
10344 Frame_Chunk *chunks = 0;
10345 Frame_Chunk *remembered_state = 0;
10346 Frame_Chunk *rs;
10347 int is_eh = streq (SECTION_NAME (section), ".eh_frame");
10348 unsigned int length_return;
10349 int max_regs = 0;
10350
10351 printf (_("The section %s contains:\n"), SECTION_NAME (section));
10352
10353 while (start < end)
10354 {
10355 unsigned char *saved_start;
10356 unsigned char *block_end;
10357 unsigned long length;
10358 unsigned long cie_id;
10359 Frame_Chunk *fc;
10360 Frame_Chunk *cie;
10361 int need_col_headers = 1;
10362 unsigned char *augmentation_data = NULL;
10363 unsigned long augmentation_data_len = 0;
10364 int encoded_ptr_size = eh_addr_size;
10365 int offset_size;
10366 int initial_length_size;
10367
10368 saved_start = start;
10369 length = byte_get (start, 4); start += 4;
10370
10371 if (length == 0)
10372 {
10373 printf ("\n%08lx ZERO terminator\n\n",
10374 (unsigned long)(saved_start - section_start));
10375 return 1;
10376 }
10377
10378 if (length == 0xffffffff)
10379 {
10380 length = byte_get (start, 8);
10381 start += 8;
10382 offset_size = 8;
10383 initial_length_size = 12;
10384 }
10385 else
10386 {
10387 offset_size = 4;
10388 initial_length_size = 4;
10389 }
10390
10391 block_end = saved_start + length + initial_length_size;
10392 cie_id = byte_get (start, offset_size); start += offset_size;
10393
10394 if (elf_header.e_type == ET_REL
10395 && !debug_apply_rela_addends (file, section, offset_size,
10396 section_start, start, block_end))
10397 return 0;
10398
10399 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
10400 {
10401 int version;
10402
10403 fc = xmalloc (sizeof (Frame_Chunk));
10404 memset (fc, 0, sizeof (Frame_Chunk));
10405
10406 fc->next = chunks;
10407 chunks = fc;
10408 fc->chunk_start = saved_start;
10409 fc->ncols = 0;
10410 fc->col_type = xmalloc (sizeof (short int));
10411 fc->col_offset = xmalloc (sizeof (int));
10412 frame_need_space (fc, max_regs-1);
10413
10414 version = *start++;
10415
10416 fc->augmentation = (char *) start;
10417 start = (unsigned char *) strchr ((char *) start, '\0') + 1;
10418
10419 if (fc->augmentation[0] == 'z')
10420 {
10421 fc->code_factor = LEB ();
10422 fc->data_factor = SLEB ();
10423 if (version == 1)
10424 {
10425 fc->ra = GET (1);
10426 }
10427 else
10428 {
10429 fc->ra = LEB ();
10430 }
10431 augmentation_data_len = LEB ();
10432 augmentation_data = start;
10433 start += augmentation_data_len;
10434 }
10435 else if (streq (fc->augmentation, "eh"))
10436 {
10437 start += eh_addr_size;
10438 fc->code_factor = LEB ();
10439 fc->data_factor = SLEB ();
10440 if (version == 1)
10441 {
10442 fc->ra = GET (1);
10443 }
10444 else
10445 {
10446 fc->ra = LEB ();
10447 }
10448 }
10449 else
10450 {
10451 fc->code_factor = LEB ();
10452 fc->data_factor = SLEB ();
10453 if (version == 1)
10454 {
10455 fc->ra = GET (1);
10456 }
10457 else
10458 {
10459 fc->ra = LEB ();
10460 }
10461 }
10462 cie = fc;
10463
10464 if (do_debug_frames_interp)
10465 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10466 (unsigned long)(saved_start - section_start), length, cie_id,
10467 fc->augmentation, fc->code_factor, fc->data_factor,
10468 fc->ra);
10469 else
10470 {
10471 printf ("\n%08lx %08lx %08lx CIE\n",
10472 (unsigned long)(saved_start - section_start), length, cie_id);
10473 printf (" Version: %d\n", version);
10474 printf (" Augmentation: \"%s\"\n", fc->augmentation);
10475 printf (" Code alignment factor: %u\n", fc->code_factor);
10476 printf (" Data alignment factor: %d\n", fc->data_factor);
10477 printf (" Return address column: %d\n", fc->ra);
10478
10479 if (augmentation_data_len)
10480 {
10481 unsigned long i;
10482 printf (" Augmentation data: ");
10483 for (i = 0; i < augmentation_data_len; ++i)
10484 printf (" %02x", augmentation_data[i]);
10485 putchar ('\n');
10486 }
10487 putchar ('\n');
10488 }
10489
10490 if (augmentation_data_len)
10491 {
10492 unsigned char *p, *q;
10493 p = (unsigned char *) fc->augmentation + 1;
10494 q = augmentation_data;
10495
10496 while (1)
10497 {
10498 if (*p == 'L')
10499 q++;
10500 else if (*p == 'P')
10501 q += 1 + size_of_encoded_value (*q);
10502 else if (*p == 'R')
10503 fc->fde_encoding = *q++;
10504 else
10505 break;
10506 p++;
10507 }
10508
10509 if (fc->fde_encoding)
10510 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
10511 }
10512
10513 frame_need_space (fc, fc->ra);
10514 }
10515 else
10516 {
10517 unsigned char *look_for;
10518 static Frame_Chunk fde_fc;
10519
10520 fc = & fde_fc;
10521 memset (fc, 0, sizeof (Frame_Chunk));
10522
10523 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
10524
10525 for (cie = chunks; cie ; cie = cie->next)
10526 if (cie->chunk_start == look_for)
10527 break;
10528
10529 if (!cie)
10530 {
10531 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
10532 cie_id, saved_start);
10533 start = block_end;
10534 fc->ncols = 0;
10535 fc->col_type = xmalloc (sizeof (short int));
10536 fc->col_offset = xmalloc (sizeof (int));
10537 frame_need_space (fc, max_regs - 1);
10538 cie = fc;
10539 fc->augmentation = "";
10540 fc->fde_encoding = 0;
10541 }
10542 else
10543 {
10544 fc->ncols = cie->ncols;
10545 fc->col_type = xcmalloc (fc->ncols, sizeof (short int));
10546 fc->col_offset = xcmalloc (fc->ncols, sizeof (int));
10547 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
10548 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
10549 fc->augmentation = cie->augmentation;
10550 fc->code_factor = cie->code_factor;
10551 fc->data_factor = cie->data_factor;
10552 fc->cfa_reg = cie->cfa_reg;
10553 fc->cfa_offset = cie->cfa_offset;
10554 fc->ra = cie->ra;
10555 frame_need_space (fc, max_regs-1);
10556 fc->fde_encoding = cie->fde_encoding;
10557 }
10558
10559 if (fc->fde_encoding)
10560 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
10561
10562 fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
10563 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
10564 /* Don't adjust for ET_REL since there's invariably a pcrel
10565 reloc here, which we haven't applied. */
10566 && elf_header.e_type != ET_REL)
10567 fc->pc_begin += section->sh_addr + (start - section_start);
10568 start += encoded_ptr_size;
10569 fc->pc_range = byte_get (start, encoded_ptr_size);
10570 start += encoded_ptr_size;
10571
10572 if (cie->augmentation[0] == 'z')
10573 {
10574 augmentation_data_len = LEB ();
10575 augmentation_data = start;
10576 start += augmentation_data_len;
10577 }
10578
10579 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10580 (unsigned long)(saved_start - section_start), length, cie_id,
10581 (unsigned long)(cie->chunk_start - section_start),
10582 fc->pc_begin, fc->pc_begin + fc->pc_range);
10583 if (! do_debug_frames_interp && augmentation_data_len)
10584 {
10585 unsigned long i;
10586
10587 printf (" Augmentation data: ");
10588 for (i = 0; i < augmentation_data_len; ++i)
10589 printf (" %02x", augmentation_data[i]);
10590 putchar ('\n');
10591 putchar ('\n');
10592 }
10593 }
10594
10595 /* At this point, fc is the current chunk, cie (if any) is set, and
10596 we're about to interpret instructions for the chunk. */
10597 /* ??? At present we need to do this always, since this sizes the
10598 fc->col_type and fc->col_offset arrays, which we write into always.
10599 We should probably split the interpreted and non-interpreted bits
10600 into two different routines, since there's so much that doesn't
10601 really overlap between them. */
10602 if (1 || do_debug_frames_interp)
10603 {
10604 /* Start by making a pass over the chunk, allocating storage
10605 and taking note of what registers are used. */
10606 unsigned char *tmp = start;
10607
10608 while (start < block_end)
10609 {
10610 unsigned op, opa;
10611 unsigned long reg, tmp;
10612
10613 op = *start++;
10614 opa = op & 0x3f;
10615 if (op & 0xc0)
10616 op &= 0xc0;
10617
10618 /* Warning: if you add any more cases to this switch, be
10619 sure to add them to the corresponding switch below. */
10620 switch (op)
10621 {
10622 case DW_CFA_advance_loc:
10623 break;
10624 case DW_CFA_offset:
10625 LEB ();
10626 frame_need_space (fc, opa);
10627 fc->col_type[opa] = DW_CFA_undefined;
10628 break;
10629 case DW_CFA_restore:
10630 frame_need_space (fc, opa);
10631 fc->col_type[opa] = DW_CFA_undefined;
10632 break;
10633 case DW_CFA_set_loc:
10634 start += encoded_ptr_size;
10635 break;
10636 case DW_CFA_advance_loc1:
10637 start += 1;
10638 break;
10639 case DW_CFA_advance_loc2:
10640 start += 2;
10641 break;
10642 case DW_CFA_advance_loc4:
10643 start += 4;
10644 break;
10645 case DW_CFA_offset_extended:
10646 reg = LEB (); LEB ();
10647 frame_need_space (fc, reg);
10648 fc->col_type[reg] = DW_CFA_undefined;
10649 break;
10650 case DW_CFA_restore_extended:
10651 reg = LEB ();
10652 frame_need_space (fc, reg);
10653 fc->col_type[reg] = DW_CFA_undefined;
10654 break;
10655 case DW_CFA_undefined:
10656 reg = LEB ();
10657 frame_need_space (fc, reg);
10658 fc->col_type[reg] = DW_CFA_undefined;
10659 break;
10660 case DW_CFA_same_value:
10661 reg = LEB ();
10662 frame_need_space (fc, reg);
10663 fc->col_type[reg] = DW_CFA_undefined;
10664 break;
10665 case DW_CFA_register:
10666 reg = LEB (); LEB ();
10667 frame_need_space (fc, reg);
10668 fc->col_type[reg] = DW_CFA_undefined;
10669 break;
10670 case DW_CFA_def_cfa:
10671 LEB (); LEB ();
10672 break;
10673 case DW_CFA_def_cfa_register:
10674 LEB ();
10675 break;
10676 case DW_CFA_def_cfa_offset:
10677 LEB ();
10678 break;
10679 case DW_CFA_def_cfa_expression:
10680 tmp = LEB ();
10681 start += tmp;
10682 break;
10683 case DW_CFA_expression:
10684 reg = LEB ();
10685 tmp = LEB ();
10686 start += tmp;
10687 frame_need_space (fc, reg);
10688 fc->col_type[reg] = DW_CFA_undefined;
10689 break;
10690 case DW_CFA_offset_extended_sf:
10691 reg = LEB (); SLEB ();
10692 frame_need_space (fc, reg);
10693 fc->col_type[reg] = DW_CFA_undefined;
10694 break;
10695 case DW_CFA_def_cfa_sf:
10696 LEB (); SLEB ();
10697 break;
10698 case DW_CFA_def_cfa_offset_sf:
10699 SLEB ();
10700 break;
10701 case DW_CFA_MIPS_advance_loc8:
10702 start += 8;
10703 break;
10704 case DW_CFA_GNU_args_size:
10705 LEB ();
10706 break;
10707 case DW_CFA_GNU_negative_offset_extended:
10708 reg = LEB (); LEB ();
10709 frame_need_space (fc, reg);
10710 fc->col_type[reg] = DW_CFA_undefined;
10711
10712 default:
10713 break;
10714 }
10715 }
10716 start = tmp;
10717 }
10718
10719 /* Now we know what registers are used, make a second pass over
10720 the chunk, this time actually printing out the info. */
10721
10722 while (start < block_end)
10723 {
10724 unsigned op, opa;
10725 unsigned long ul, reg, roffs;
10726 long l, ofs;
10727 bfd_vma vma;
10728
10729 op = *start++;
10730 opa = op & 0x3f;
10731 if (op & 0xc0)
10732 op &= 0xc0;
10733
10734 /* Warning: if you add any more cases to this switch, be
10735 sure to add them to the corresponding switch above. */
10736 switch (op)
10737 {
10738 case DW_CFA_advance_loc:
10739 if (do_debug_frames_interp)
10740 frame_display_row (fc, &need_col_headers, &max_regs);
10741 else
10742 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10743 opa * fc->code_factor,
10744 fc->pc_begin + opa * fc->code_factor);
10745 fc->pc_begin += opa * fc->code_factor;
10746 break;
10747
10748 case DW_CFA_offset:
10749 roffs = LEB ();
10750 if (! do_debug_frames_interp)
10751 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10752 opa, roffs * fc->data_factor);
10753 fc->col_type[opa] = DW_CFA_offset;
10754 fc->col_offset[opa] = roffs * fc->data_factor;
10755 break;
10756
10757 case DW_CFA_restore:
10758 if (! do_debug_frames_interp)
10759 printf (" DW_CFA_restore: r%d\n", opa);
10760 fc->col_type[opa] = cie->col_type[opa];
10761 fc->col_offset[opa] = cie->col_offset[opa];
10762 break;
10763
10764 case DW_CFA_set_loc:
10765 vma = get_encoded_value (start, fc->fde_encoding);
10766 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
10767 && elf_header.e_type != ET_REL)
10768 vma += section->sh_addr + (start - section_start);
10769 start += encoded_ptr_size;
10770 if (do_debug_frames_interp)
10771 frame_display_row (fc, &need_col_headers, &max_regs);
10772 else
10773 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
10774 fc->pc_begin = vma;
10775 break;
10776
10777 case DW_CFA_advance_loc1:
10778 ofs = byte_get (start, 1); start += 1;
10779 if (do_debug_frames_interp)
10780 frame_display_row (fc, &need_col_headers, &max_regs);
10781 else
10782 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10783 ofs * fc->code_factor,
10784 fc->pc_begin + ofs * fc->code_factor);
10785 fc->pc_begin += ofs * fc->code_factor;
10786 break;
10787
10788 case DW_CFA_advance_loc2:
10789 ofs = byte_get (start, 2); start += 2;
10790 if (do_debug_frames_interp)
10791 frame_display_row (fc, &need_col_headers, &max_regs);
10792 else
10793 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10794 ofs * fc->code_factor,
10795 fc->pc_begin + ofs * fc->code_factor);
10796 fc->pc_begin += ofs * fc->code_factor;
10797 break;
10798
10799 case DW_CFA_advance_loc4:
10800 ofs = byte_get (start, 4); start += 4;
10801 if (do_debug_frames_interp)
10802 frame_display_row (fc, &need_col_headers, &max_regs);
10803 else
10804 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10805 ofs * fc->code_factor,
10806 fc->pc_begin + ofs * fc->code_factor);
10807 fc->pc_begin += ofs * fc->code_factor;
10808 break;
10809
10810 case DW_CFA_offset_extended:
10811 reg = LEB ();
10812 roffs = LEB ();
10813 if (! do_debug_frames_interp)
10814 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10815 reg, roffs * fc->data_factor);
10816 fc->col_type[reg] = DW_CFA_offset;
10817 fc->col_offset[reg] = roffs * fc->data_factor;
10818 break;
10819
10820 case DW_CFA_restore_extended:
10821 reg = LEB ();
10822 if (! do_debug_frames_interp)
10823 printf (" DW_CFA_restore_extended: r%ld\n", reg);
10824 fc->col_type[reg] = cie->col_type[reg];
10825 fc->col_offset[reg] = cie->col_offset[reg];
10826 break;
10827
10828 case DW_CFA_undefined:
10829 reg = LEB ();
10830 if (! do_debug_frames_interp)
10831 printf (" DW_CFA_undefined: r%ld\n", reg);
10832 fc->col_type[reg] = DW_CFA_undefined;
10833 fc->col_offset[reg] = 0;
10834 break;
10835
10836 case DW_CFA_same_value:
10837 reg = LEB ();
10838 if (! do_debug_frames_interp)
10839 printf (" DW_CFA_same_value: r%ld\n", reg);
10840 fc->col_type[reg] = DW_CFA_same_value;
10841 fc->col_offset[reg] = 0;
10842 break;
10843
10844 case DW_CFA_register:
10845 reg = LEB ();
10846 roffs = LEB ();
10847 if (! do_debug_frames_interp)
10848 printf (" DW_CFA_register: r%ld in r%ld\n", reg, roffs);
10849 fc->col_type[reg] = DW_CFA_register;
10850 fc->col_offset[reg] = roffs;
10851 break;
10852
10853 case DW_CFA_remember_state:
10854 if (! do_debug_frames_interp)
10855 printf (" DW_CFA_remember_state\n");
10856 rs = xmalloc (sizeof (Frame_Chunk));
10857 rs->ncols = fc->ncols;
10858 rs->col_type = xcmalloc (rs->ncols, sizeof (short int));
10859 rs->col_offset = xcmalloc (rs->ncols, sizeof (int));
10860 memcpy (rs->col_type, fc->col_type, rs->ncols);
10861 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
10862 rs->next = remembered_state;
10863 remembered_state = rs;
10864 break;
10865
10866 case DW_CFA_restore_state:
10867 if (! do_debug_frames_interp)
10868 printf (" DW_CFA_restore_state\n");
10869 rs = remembered_state;
10870 if (rs)
10871 {
10872 remembered_state = rs->next;
10873 frame_need_space (fc, rs->ncols-1);
10874 memcpy (fc->col_type, rs->col_type, rs->ncols);
10875 memcpy (fc->col_offset, rs->col_offset,
10876 rs->ncols * sizeof (int));
10877 free (rs->col_type);
10878 free (rs->col_offset);
10879 free (rs);
10880 }
10881 else if (do_debug_frames_interp)
10882 printf ("Mismatched DW_CFA_restore_state\n");
10883 break;
10884
10885 case DW_CFA_def_cfa:
10886 fc->cfa_reg = LEB ();
10887 fc->cfa_offset = LEB ();
10888 fc->cfa_exp = 0;
10889 if (! do_debug_frames_interp)
10890 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10891 fc->cfa_reg, fc->cfa_offset);
10892 break;
10893
10894 case DW_CFA_def_cfa_register:
10895 fc->cfa_reg = LEB ();
10896 fc->cfa_exp = 0;
10897 if (! do_debug_frames_interp)
10898 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
10899 break;
10900
10901 case DW_CFA_def_cfa_offset:
10902 fc->cfa_offset = LEB ();
10903 if (! do_debug_frames_interp)
10904 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
10905 break;
10906
10907 case DW_CFA_nop:
10908 if (! do_debug_frames_interp)
10909 printf (" DW_CFA_nop\n");
10910 break;
10911
10912 case DW_CFA_def_cfa_expression:
10913 ul = LEB ();
10914 if (! do_debug_frames_interp)
10915 {
10916 printf (" DW_CFA_def_cfa_expression (");
10917 decode_location_expression (start, eh_addr_size, ul, 0);
10918 printf (")\n");
10919 }
10920 fc->cfa_exp = 1;
10921 start += ul;
10922 break;
10923
10924 case DW_CFA_expression:
10925 reg = LEB ();
10926 ul = LEB ();
10927 if (! do_debug_frames_interp)
10928 {
10929 printf (" DW_CFA_expression: r%ld (", reg);
10930 decode_location_expression (start, eh_addr_size, ul, 0);
10931 printf (")\n");
10932 }
10933 fc->col_type[reg] = DW_CFA_expression;
10934 start += ul;
10935 break;
10936
10937 case DW_CFA_offset_extended_sf:
10938 reg = LEB ();
10939 l = SLEB ();
10940 frame_need_space (fc, reg);
10941 if (! do_debug_frames_interp)
10942 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10943 reg, l * fc->data_factor);
10944 fc->col_type[reg] = DW_CFA_offset;
10945 fc->col_offset[reg] = l * fc->data_factor;
10946 break;
10947
10948 case DW_CFA_def_cfa_sf:
10949 fc->cfa_reg = LEB ();
10950 fc->cfa_offset = SLEB ();
10951 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
10952 fc->cfa_exp = 0;
10953 if (! do_debug_frames_interp)
10954 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10955 fc->cfa_reg, fc->cfa_offset);
10956 break;
10957
10958 case DW_CFA_def_cfa_offset_sf:
10959 fc->cfa_offset = SLEB ();
10960 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
10961 if (! do_debug_frames_interp)
10962 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
10963 break;
10964
10965 case DW_CFA_MIPS_advance_loc8:
10966 ofs = byte_get (start, 8); start += 8;
10967 if (do_debug_frames_interp)
10968 frame_display_row (fc, &need_col_headers, &max_regs);
10969 else
10970 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10971 ofs * fc->code_factor,
10972 fc->pc_begin + ofs * fc->code_factor);
10973 fc->pc_begin += ofs * fc->code_factor;
10974 break;
10975
10976 case DW_CFA_GNU_window_save:
10977 if (! do_debug_frames_interp)
10978 printf (" DW_CFA_GNU_window_save\n");
10979 break;
10980
10981 case DW_CFA_GNU_args_size:
10982 ul = LEB ();
10983 if (! do_debug_frames_interp)
10984 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
10985 break;
10986
10987 case DW_CFA_GNU_negative_offset_extended:
10988 reg = LEB ();
10989 l = - LEB ();
10990 frame_need_space (fc, reg);
10991 if (! do_debug_frames_interp)
10992 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10993 reg, l * fc->data_factor);
10994 fc->col_type[reg] = DW_CFA_offset;
10995 fc->col_offset[reg] = l * fc->data_factor;
10996 break;
10997
10998 default:
10999 warn (_("unsupported or unknown DW_CFA_%d\n"), op);
11000 start = block_end;
11001 }
11002 }
11003
11004 if (do_debug_frames_interp)
11005 frame_display_row (fc, &need_col_headers, &max_regs);
11006
11007 start = block_end;
11008 }
11009
11010 printf ("\n");
11011
11012 return 1;
11013 }
11014
11015 #undef GET
11016 #undef LEB
11017 #undef SLEB
11018
11019 static int
11020 display_debug_not_supported (Elf_Internal_Shdr *section,
11021 unsigned char *start ATTRIBUTE_UNUSED,
11022 FILE *file ATTRIBUTE_UNUSED)
11023 {
11024 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
11025 SECTION_NAME (section));
11026
11027 return 1;
11028 }
11029
11030 /* A structure containing the name of a debug section
11031 and a pointer to a function that can decode it. */
11032 static struct
11033 {
11034 const char *const name;
11035 int (*display) (Elf_Internal_Shdr *, unsigned char *, FILE *);
11036 }
11037 debug_displays[] =
11038 {
11039 { ".debug_abbrev", display_debug_abbrev },
11040 { ".debug_aranges", display_debug_aranges },
11041 { ".debug_frame", display_debug_frames },
11042 { ".debug_info", display_debug_info },
11043 { ".debug_line", display_debug_lines },
11044 { ".debug_pubnames", display_debug_pubnames },
11045 { ".eh_frame", display_debug_frames },
11046 { ".debug_macinfo", display_debug_macinfo },
11047 { ".debug_str", display_debug_str },
11048 { ".debug_loc", display_debug_loc },
11049 { ".debug_pubtypes", display_debug_pubnames },
11050 { ".debug_ranges", display_debug_ranges },
11051 { ".debug_static_func", display_debug_not_supported },
11052 { ".debug_static_vars", display_debug_not_supported },
11053 { ".debug_types", display_debug_not_supported },
11054 { ".debug_weaknames", display_debug_not_supported }
11055 };
11056
11057 static int
11058 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
11059 {
11060 char *name = SECTION_NAME (section);
11061 bfd_size_type length;
11062 int result = 1;
11063 int i;
11064
11065 length = section->sh_size;
11066 if (length == 0)
11067 {
11068 printf (_("\nSection '%s' has no debugging data.\n"), name);
11069 return 0;
11070 }
11071
11072 if (strneq (name, ".gnu.linkonce.wi.", 17))
11073 name = ".debug_info";
11074
11075 /* See if we know how to display the contents of this section. */
11076 for (i = NUM_ELEM (debug_displays); i--;)
11077 if (streq (debug_displays[i].name, name))
11078 {
11079 unsigned char *start;
11080
11081 start = get_data (NULL, file, section->sh_offset, 1, length,
11082 _("debug section data"));
11083 if (start == NULL)
11084 {
11085 result = 0;
11086 break;
11087 }
11088
11089 result &= debug_displays[i].display (section, start, file);
11090 free (start);
11091
11092 /* If we loaded in the abbrev section
11093 at some point, we must release it here. */
11094 free_abbrevs ();
11095
11096 break;
11097 }
11098
11099 if (i == -1)
11100 {
11101 printf (_("Unrecognized debug section: %s\n"), name);
11102 result = 0;
11103 }
11104
11105 return result;
11106 }
11107
11108 static void
11109 process_section_contents (FILE *file)
11110 {
11111 Elf_Internal_Shdr *section;
11112 unsigned int i;
11113
11114 if (! do_dump)
11115 return;
11116
11117 for (i = 0, section = section_headers;
11118 i < elf_header.e_shnum && i < num_dump_sects;
11119 i++, section++)
11120 {
11121 #ifdef SUPPORT_DISASSEMBLY
11122 if (dump_sects[i] & DISASS_DUMP)
11123 disassemble_section (section, file);
11124 #endif
11125 if (dump_sects[i] & HEX_DUMP)
11126 dump_section (section, file);
11127
11128 if (dump_sects[i] & DEBUG_DUMP)
11129 display_debug_section (section, file);
11130 }
11131
11132 /* Check to see if the user requested a
11133 dump of a section that does not exist. */
11134 while (i++ < num_dump_sects)
11135 if (dump_sects[i])
11136 warn (_("Section %d was not dumped because it does not exist!\n"), i);
11137 }
11138
11139 static void
11140 process_mips_fpe_exception (int mask)
11141 {
11142 if (mask)
11143 {
11144 int first = 1;
11145 if (mask & OEX_FPU_INEX)
11146 fputs ("INEX", stdout), first = 0;
11147 if (mask & OEX_FPU_UFLO)
11148 printf ("%sUFLO", first ? "" : "|"), first = 0;
11149 if (mask & OEX_FPU_OFLO)
11150 printf ("%sOFLO", first ? "" : "|"), first = 0;
11151 if (mask & OEX_FPU_DIV0)
11152 printf ("%sDIV0", first ? "" : "|"), first = 0;
11153 if (mask & OEX_FPU_INVAL)
11154 printf ("%sINVAL", first ? "" : "|");
11155 }
11156 else
11157 fputs ("0", stdout);
11158 }
11159
11160 static int
11161 process_mips_specific (FILE *file)
11162 {
11163 Elf_Internal_Dyn *entry;
11164 size_t liblist_offset = 0;
11165 size_t liblistno = 0;
11166 size_t conflictsno = 0;
11167 size_t options_offset = 0;
11168 size_t conflicts_offset = 0;
11169
11170 /* We have a lot of special sections. Thanks SGI! */
11171 if (dynamic_section == NULL)
11172 /* No information available. */
11173 return 0;
11174
11175 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11176 switch (entry->d_tag)
11177 {
11178 case DT_MIPS_LIBLIST:
11179 liblist_offset
11180 = offset_from_vma (file, entry->d_un.d_val,
11181 liblistno * sizeof (Elf32_External_Lib));
11182 break;
11183 case DT_MIPS_LIBLISTNO:
11184 liblistno = entry->d_un.d_val;
11185 break;
11186 case DT_MIPS_OPTIONS:
11187 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11188 break;
11189 case DT_MIPS_CONFLICT:
11190 conflicts_offset
11191 = offset_from_vma (file, entry->d_un.d_val,
11192 conflictsno * sizeof (Elf32_External_Conflict));
11193 break;
11194 case DT_MIPS_CONFLICTNO:
11195 conflictsno = entry->d_un.d_val;
11196 break;
11197 default:
11198 break;
11199 }
11200
11201 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11202 {
11203 Elf32_External_Lib *elib;
11204 size_t cnt;
11205
11206 elib = get_data (NULL, file, liblist_offset,
11207 liblistno, sizeof (Elf32_External_Lib),
11208 _("liblist"));
11209 if (elib)
11210 {
11211 printf ("\nSection '.liblist' contains %lu entries:\n",
11212 (unsigned long) liblistno);
11213 fputs (" Library Time Stamp Checksum Version Flags\n",
11214 stdout);
11215
11216 for (cnt = 0; cnt < liblistno; ++cnt)
11217 {
11218 Elf32_Lib liblist;
11219 time_t time;
11220 char timebuf[20];
11221 struct tm *tmp;
11222
11223 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11224 time = BYTE_GET (elib[cnt].l_time_stamp);
11225 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11226 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11227 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11228
11229 tmp = gmtime (&time);
11230 snprintf (timebuf, sizeof (timebuf),
11231 "%04u-%02u-%02uT%02u:%02u:%02u",
11232 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11233 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11234
11235 printf ("%3lu: ", (unsigned long) cnt);
11236 if (VALID_DYNAMIC_NAME (liblist.l_name))
11237 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11238 else
11239 printf ("<corrupt: %9ld>", liblist.l_name);
11240 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11241 liblist.l_version);
11242
11243 if (liblist.l_flags == 0)
11244 puts (" NONE");
11245 else
11246 {
11247 static const struct
11248 {
11249 const char *name;
11250 int bit;
11251 }
11252 l_flags_vals[] =
11253 {
11254 { " EXACT_MATCH", LL_EXACT_MATCH },
11255 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11256 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11257 { " EXPORTS", LL_EXPORTS },
11258 { " DELAY_LOAD", LL_DELAY_LOAD },
11259 { " DELTA", LL_DELTA }
11260 };
11261 int flags = liblist.l_flags;
11262 size_t fcnt;
11263
11264 for (fcnt = 0;
11265 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
11266 ++fcnt)
11267 if ((flags & l_flags_vals[fcnt].bit) != 0)
11268 {
11269 fputs (l_flags_vals[fcnt].name, stdout);
11270 flags ^= l_flags_vals[fcnt].bit;
11271 }
11272 if (flags != 0)
11273 printf (" %#x", (unsigned int) flags);
11274
11275 puts ("");
11276 }
11277 }
11278
11279 free (elib);
11280 }
11281 }
11282
11283 if (options_offset != 0)
11284 {
11285 Elf_External_Options *eopt;
11286 Elf_Internal_Shdr *sect = section_headers;
11287 Elf_Internal_Options *iopt;
11288 Elf_Internal_Options *option;
11289 size_t offset;
11290 int cnt;
11291
11292 /* Find the section header so that we get the size. */
11293 while (sect->sh_type != SHT_MIPS_OPTIONS)
11294 ++sect;
11295
11296 eopt = get_data (NULL, file, options_offset, 1, sect->sh_size,
11297 _("options"));
11298 if (eopt)
11299 {
11300 iopt = cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (*iopt));
11301 if (iopt == NULL)
11302 {
11303 error (_("Out of memory"));
11304 return 0;
11305 }
11306
11307 offset = cnt = 0;
11308 option = iopt;
11309
11310 while (offset < sect->sh_size)
11311 {
11312 Elf_External_Options *eoption;
11313
11314 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11315
11316 option->kind = BYTE_GET (eoption->kind);
11317 option->size = BYTE_GET (eoption->size);
11318 option->section = BYTE_GET (eoption->section);
11319 option->info = BYTE_GET (eoption->info);
11320
11321 offset += option->size;
11322
11323 ++option;
11324 ++cnt;
11325 }
11326
11327 printf (_("\nSection '%s' contains %d entries:\n"),
11328 SECTION_NAME (sect), cnt);
11329
11330 option = iopt;
11331
11332 while (cnt-- > 0)
11333 {
11334 size_t len;
11335
11336 switch (option->kind)
11337 {
11338 case ODK_NULL:
11339 /* This shouldn't happen. */
11340 printf (" NULL %d %lx", option->section, option->info);
11341 break;
11342 case ODK_REGINFO:
11343 printf (" REGINFO ");
11344 if (elf_header.e_machine == EM_MIPS)
11345 {
11346 /* 32bit form. */
11347 Elf32_External_RegInfo *ereg;
11348 Elf32_RegInfo reginfo;
11349
11350 ereg = (Elf32_External_RegInfo *) (option + 1);
11351 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11352 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11353 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11354 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11355 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11356 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11357
11358 printf ("GPR %08lx GP 0x%lx\n",
11359 reginfo.ri_gprmask,
11360 (unsigned long) reginfo.ri_gp_value);
11361 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11362 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11363 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11364 }
11365 else
11366 {
11367 /* 64 bit form. */
11368 Elf64_External_RegInfo *ereg;
11369 Elf64_Internal_RegInfo reginfo;
11370
11371 ereg = (Elf64_External_RegInfo *) (option + 1);
11372 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11373 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11374 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11375 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11376 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11377 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11378
11379 printf ("GPR %08lx GP 0x",
11380 reginfo.ri_gprmask);
11381 printf_vma (reginfo.ri_gp_value);
11382 printf ("\n");
11383
11384 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11385 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11386 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11387 }
11388 ++option;
11389 continue;
11390 case ODK_EXCEPTIONS:
11391 fputs (" EXCEPTIONS fpe_min(", stdout);
11392 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11393 fputs (") fpe_max(", stdout);
11394 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11395 fputs (")", stdout);
11396
11397 if (option->info & OEX_PAGE0)
11398 fputs (" PAGE0", stdout);
11399 if (option->info & OEX_SMM)
11400 fputs (" SMM", stdout);
11401 if (option->info & OEX_FPDBUG)
11402 fputs (" FPDBUG", stdout);
11403 if (option->info & OEX_DISMISS)
11404 fputs (" DISMISS", stdout);
11405 break;
11406 case ODK_PAD:
11407 fputs (" PAD ", stdout);
11408 if (option->info & OPAD_PREFIX)
11409 fputs (" PREFIX", stdout);
11410 if (option->info & OPAD_POSTFIX)
11411 fputs (" POSTFIX", stdout);
11412 if (option->info & OPAD_SYMBOL)
11413 fputs (" SYMBOL", stdout);
11414 break;
11415 case ODK_HWPATCH:
11416 fputs (" HWPATCH ", stdout);
11417 if (option->info & OHW_R4KEOP)
11418 fputs (" R4KEOP", stdout);
11419 if (option->info & OHW_R8KPFETCH)
11420 fputs (" R8KPFETCH", stdout);
11421 if (option->info & OHW_R5KEOP)
11422 fputs (" R5KEOP", stdout);
11423 if (option->info & OHW_R5KCVTL)
11424 fputs (" R5KCVTL", stdout);
11425 break;
11426 case ODK_FILL:
11427 fputs (" FILL ", stdout);
11428 /* XXX Print content of info word? */
11429 break;
11430 case ODK_TAGS:
11431 fputs (" TAGS ", stdout);
11432 /* XXX Print content of info word? */
11433 break;
11434 case ODK_HWAND:
11435 fputs (" HWAND ", stdout);
11436 if (option->info & OHWA0_R4KEOP_CHECKED)
11437 fputs (" R4KEOP_CHECKED", stdout);
11438 if (option->info & OHWA0_R4KEOP_CLEAN)
11439 fputs (" R4KEOP_CLEAN", stdout);
11440 break;
11441 case ODK_HWOR:
11442 fputs (" HWOR ", stdout);
11443 if (option->info & OHWA0_R4KEOP_CHECKED)
11444 fputs (" R4KEOP_CHECKED", stdout);
11445 if (option->info & OHWA0_R4KEOP_CLEAN)
11446 fputs (" R4KEOP_CLEAN", stdout);
11447 break;
11448 case ODK_GP_GROUP:
11449 printf (" GP_GROUP %#06lx self-contained %#06lx",
11450 option->info & OGP_GROUP,
11451 (option->info & OGP_SELF) >> 16);
11452 break;
11453 case ODK_IDENT:
11454 printf (" IDENT %#06lx self-contained %#06lx",
11455 option->info & OGP_GROUP,
11456 (option->info & OGP_SELF) >> 16);
11457 break;
11458 default:
11459 /* This shouldn't happen. */
11460 printf (" %3d ??? %d %lx",
11461 option->kind, option->section, option->info);
11462 break;
11463 }
11464
11465 len = sizeof (*eopt);
11466 while (len < option->size)
11467 if (((char *) option)[len] >= ' '
11468 && ((char *) option)[len] < 0x7f)
11469 printf ("%c", ((char *) option)[len++]);
11470 else
11471 printf ("\\%03o", ((char *) option)[len++]);
11472
11473 fputs ("\n", stdout);
11474 ++option;
11475 }
11476
11477 free (eopt);
11478 }
11479 }
11480
11481 if (conflicts_offset != 0 && conflictsno != 0)
11482 {
11483 Elf32_Conflict *iconf;
11484 size_t cnt;
11485
11486 if (dynamic_symbols == NULL)
11487 {
11488 error (_("conflict list found without a dynamic symbol table"));
11489 return 0;
11490 }
11491
11492 iconf = cmalloc (conflictsno, sizeof (*iconf));
11493 if (iconf == NULL)
11494 {
11495 error (_("Out of memory"));
11496 return 0;
11497 }
11498
11499 if (is_32bit_elf)
11500 {
11501 Elf32_External_Conflict *econf32;
11502
11503 econf32 = get_data (NULL, file, conflicts_offset,
11504 conflictsno, sizeof (*econf32), _("conflict"));
11505 if (!econf32)
11506 return 0;
11507
11508 for (cnt = 0; cnt < conflictsno; ++cnt)
11509 iconf[cnt] = BYTE_GET (econf32[cnt]);
11510
11511 free (econf32);
11512 }
11513 else
11514 {
11515 Elf64_External_Conflict *econf64;
11516
11517 econf64 = get_data (NULL, file, conflicts_offset,
11518 conflictsno, sizeof (*econf64), _("conflict"));
11519 if (!econf64)
11520 return 0;
11521
11522 for (cnt = 0; cnt < conflictsno; ++cnt)
11523 iconf[cnt] = BYTE_GET (econf64[cnt]);
11524
11525 free (econf64);
11526 }
11527
11528 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11529 (unsigned long) conflictsno);
11530 puts (_(" Num: Index Value Name"));
11531
11532 for (cnt = 0; cnt < conflictsno; ++cnt)
11533 {
11534 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
11535
11536 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
11537 print_vma (psym->st_value, FULL_HEX);
11538 putchar (' ');
11539 if (VALID_DYNAMIC_NAME (psym->st_name))
11540 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11541 else
11542 printf ("<corrupt: %14ld>", psym->st_name);
11543 putchar ('\n');
11544 }
11545
11546 free (iconf);
11547 }
11548
11549 return 1;
11550 }
11551
11552 static int
11553 process_gnu_liblist (FILE *file)
11554 {
11555 Elf_Internal_Shdr *section, *string_sec;
11556 Elf32_External_Lib *elib;
11557 char *strtab;
11558 size_t strtab_size;
11559 size_t cnt;
11560 unsigned i;
11561
11562 if (! do_arch)
11563 return 0;
11564
11565 for (i = 0, section = section_headers;
11566 i < elf_header.e_shnum;
11567 i++, section++)
11568 {
11569 switch (section->sh_type)
11570 {
11571 case SHT_GNU_LIBLIST:
11572 if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum)
11573 break;
11574
11575 elib = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
11576 _("liblist"));
11577
11578 if (elib == NULL)
11579 break;
11580 string_sec = SECTION_HEADER (section->sh_link);
11581
11582 strtab = get_data (NULL, file, string_sec->sh_offset, 1,
11583 string_sec->sh_size, _("liblist string table"));
11584 strtab_size = string_sec->sh_size;
11585
11586 if (strtab == NULL
11587 || section->sh_entsize != sizeof (Elf32_External_Lib))
11588 {
11589 free (elib);
11590 break;
11591 }
11592
11593 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11594 SECTION_NAME (section),
11595 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
11596
11597 puts (" Library Time Stamp Checksum Version Flags");
11598
11599 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
11600 ++cnt)
11601 {
11602 Elf32_Lib liblist;
11603 time_t time;
11604 char timebuf[20];
11605 struct tm *tmp;
11606
11607 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11608 time = BYTE_GET (elib[cnt].l_time_stamp);
11609 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11610 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11611 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11612
11613 tmp = gmtime (&time);
11614 snprintf (timebuf, sizeof (timebuf),
11615 "%04u-%02u-%02uT%02u:%02u:%02u",
11616 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11617 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11618
11619 printf ("%3lu: ", (unsigned long) cnt);
11620 if (do_wide)
11621 printf ("%-20s", liblist.l_name < strtab_size
11622 ? strtab + liblist.l_name : "<corrupt>");
11623 else
11624 printf ("%-20.20s", liblist.l_name < strtab_size
11625 ? strtab + liblist.l_name : "<corrupt>");
11626 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
11627 liblist.l_version, liblist.l_flags);
11628 }
11629
11630 free (elib);
11631 }
11632 }
11633
11634 return 1;
11635 }
11636
11637 static const char *
11638 get_note_type (unsigned e_type)
11639 {
11640 static char buff[64];
11641
11642 if (elf_header.e_type == ET_CORE)
11643 switch (e_type)
11644 {
11645 case NT_AUXV:
11646 return _("NT_AUXV (auxiliary vector)");
11647 case NT_PRSTATUS:
11648 return _("NT_PRSTATUS (prstatus structure)");
11649 case NT_FPREGSET:
11650 return _("NT_FPREGSET (floating point registers)");
11651 case NT_PRPSINFO:
11652 return _("NT_PRPSINFO (prpsinfo structure)");
11653 case NT_TASKSTRUCT:
11654 return _("NT_TASKSTRUCT (task structure)");
11655 case NT_PRXFPREG:
11656 return _("NT_PRXFPREG (user_xfpregs structure)");
11657 case NT_PSTATUS:
11658 return _("NT_PSTATUS (pstatus structure)");
11659 case NT_FPREGS:
11660 return _("NT_FPREGS (floating point registers)");
11661 case NT_PSINFO:
11662 return _("NT_PSINFO (psinfo structure)");
11663 case NT_LWPSTATUS:
11664 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11665 case NT_LWPSINFO:
11666 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11667 case NT_WIN32PSTATUS:
11668 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11669 default:
11670 break;
11671 }
11672 else
11673 switch (e_type)
11674 {
11675 case NT_VERSION:
11676 return _("NT_VERSION (version)");
11677 case NT_ARCH:
11678 return _("NT_ARCH (architecture)");
11679 default:
11680 break;
11681 }
11682
11683 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11684 return buff;
11685 }
11686
11687 static const char *
11688 get_netbsd_elfcore_note_type (unsigned e_type)
11689 {
11690 static char buff[64];
11691
11692 if (e_type == NT_NETBSDCORE_PROCINFO)
11693 {
11694 /* NetBSD core "procinfo" structure. */
11695 return _("NetBSD procinfo structure");
11696 }
11697
11698 /* As of Jan 2002 there are no other machine-independent notes
11699 defined for NetBSD core files. If the note type is less
11700 than the start of the machine-dependent note types, we don't
11701 understand it. */
11702
11703 if (e_type < NT_NETBSDCORE_FIRSTMACH)
11704 {
11705 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11706 return buff;
11707 }
11708
11709 switch (elf_header.e_machine)
11710 {
11711 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11712 and PT_GETFPREGS == mach+2. */
11713
11714 case EM_OLD_ALPHA:
11715 case EM_ALPHA:
11716 case EM_SPARC:
11717 case EM_SPARC32PLUS:
11718 case EM_SPARCV9:
11719 switch (e_type)
11720 {
11721 case NT_NETBSDCORE_FIRSTMACH+0:
11722 return _("PT_GETREGS (reg structure)");
11723 case NT_NETBSDCORE_FIRSTMACH+2:
11724 return _("PT_GETFPREGS (fpreg structure)");
11725 default:
11726 break;
11727 }
11728 break;
11729
11730 /* On all other arch's, PT_GETREGS == mach+1 and
11731 PT_GETFPREGS == mach+3. */
11732 default:
11733 switch (e_type)
11734 {
11735 case NT_NETBSDCORE_FIRSTMACH+1:
11736 return _("PT_GETREGS (reg structure)");
11737 case NT_NETBSDCORE_FIRSTMACH+3:
11738 return _("PT_GETFPREGS (fpreg structure)");
11739 default:
11740 break;
11741 }
11742 }
11743
11744 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
11745 e_type - NT_NETBSDCORE_FIRSTMACH);
11746 return buff;
11747 }
11748
11749 /* Note that by the ELF standard, the name field is already null byte
11750 terminated, and namesz includes the terminating null byte.
11751 I.E. the value of namesz for the name "FSF" is 4.
11752
11753 If the value of namesz is zero, there is no name present. */
11754 static int
11755 process_note (Elf_Internal_Note *pnote)
11756 {
11757 const char *nt;
11758
11759 if (pnote->namesz == 0)
11760 /* If there is no note name, then use the default set of
11761 note type strings. */
11762 nt = get_note_type (pnote->type);
11763
11764 else if (strneq (pnote->namedata, "NetBSD-CORE", 11))
11765 /* NetBSD-specific core file notes. */
11766 nt = get_netbsd_elfcore_note_type (pnote->type);
11767
11768 else
11769 /* Don't recognize this note name; just use the default set of
11770 note type strings. */
11771 nt = get_note_type (pnote->type);
11772
11773 printf (" %s\t\t0x%08lx\t%s\n",
11774 pnote->namesz ? pnote->namedata : "(NONE)",
11775 pnote->descsz, nt);
11776 return 1;
11777 }
11778
11779
11780 static int
11781 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
11782 {
11783 Elf_External_Note *pnotes;
11784 Elf_External_Note *external;
11785 int res = 1;
11786
11787 if (length <= 0)
11788 return 0;
11789
11790 pnotes = get_data (NULL, file, offset, 1, length, _("notes"));
11791 if (!pnotes)
11792 return 0;
11793
11794 external = pnotes;
11795
11796 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11797 (unsigned long) offset, (unsigned long) length);
11798 printf (_(" Owner\t\tData size\tDescription\n"));
11799
11800 while (external < (Elf_External_Note *)((char *) pnotes + length))
11801 {
11802 Elf_External_Note *next;
11803 Elf_Internal_Note inote;
11804 char *temp = NULL;
11805
11806 inote.type = BYTE_GET (external->type);
11807 inote.namesz = BYTE_GET (external->namesz);
11808 inote.namedata = external->name;
11809 inote.descsz = BYTE_GET (external->descsz);
11810 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
11811 inote.descpos = offset + (inote.descdata - (char *) pnotes);
11812
11813 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
11814
11815 if (((char *) next) > (((char *) pnotes) + length))
11816 {
11817 warn (_("corrupt note found at offset %x into core notes\n"),
11818 ((char *) external) - ((char *) pnotes));
11819 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
11820 inote.type, inote.namesz, inote.descsz);
11821 break;
11822 }
11823
11824 external = next;
11825
11826 /* Verify that name is null terminated. It appears that at least
11827 one version of Linux (RedHat 6.0) generates corefiles that don't
11828 comply with the ELF spec by failing to include the null byte in
11829 namesz. */
11830 if (inote.namedata[inote.namesz] != '\0')
11831 {
11832 temp = malloc (inote.namesz + 1);
11833
11834 if (temp == NULL)
11835 {
11836 error (_("Out of memory\n"));
11837 res = 0;
11838 break;
11839 }
11840
11841 strncpy (temp, inote.namedata, inote.namesz);
11842 temp[inote.namesz] = 0;
11843
11844 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11845 inote.namedata = temp;
11846 }
11847
11848 res &= process_note (& inote);
11849
11850 if (temp != NULL)
11851 {
11852 free (temp);
11853 temp = NULL;
11854 }
11855 }
11856
11857 free (pnotes);
11858
11859 return res;
11860 }
11861
11862 static int
11863 process_corefile_note_segments (FILE *file)
11864 {
11865 Elf_Internal_Phdr *segment;
11866 unsigned int i;
11867 int res = 1;
11868
11869 if (! get_program_headers (file))
11870 return 0;
11871
11872 for (i = 0, segment = program_headers;
11873 i < elf_header.e_phnum;
11874 i++, segment++)
11875 {
11876 if (segment->p_type == PT_NOTE)
11877 res &= process_corefile_note_segment (file,
11878 (bfd_vma) segment->p_offset,
11879 (bfd_vma) segment->p_filesz);
11880 }
11881
11882 return res;
11883 }
11884
11885 static int
11886 process_note_sections (FILE *file)
11887 {
11888 Elf_Internal_Shdr *section;
11889 unsigned long i;
11890 int res = 1;
11891
11892 for (i = 0, section = section_headers;
11893 i < elf_header.e_shnum;
11894 i++, section++)
11895 if (section->sh_type == SHT_NOTE)
11896 res &= process_corefile_note_segment (file,
11897 (bfd_vma) section->sh_offset,
11898 (bfd_vma) section->sh_size);
11899
11900 return res;
11901 }
11902
11903 static int
11904 process_notes (FILE *file)
11905 {
11906 /* If we have not been asked to display the notes then do nothing. */
11907 if (! do_notes)
11908 return 1;
11909
11910 if (elf_header.e_type != ET_CORE)
11911 return process_note_sections (file);
11912
11913 /* No program headers means no NOTE segment. */
11914 if (elf_header.e_phnum > 0)
11915 return process_corefile_note_segments (file);
11916
11917 printf (_("No note segments present in the core file.\n"));
11918 return 1;
11919 }
11920
11921 static int
11922 process_arch_specific (FILE *file)
11923 {
11924 if (! do_arch)
11925 return 1;
11926
11927 switch (elf_header.e_machine)
11928 {
11929 case EM_MIPS:
11930 case EM_MIPS_RS3_LE:
11931 return process_mips_specific (file);
11932 break;
11933 default:
11934 break;
11935 }
11936 return 1;
11937 }
11938
11939 static int
11940 get_file_header (FILE *file)
11941 {
11942 /* Read in the identity array. */
11943 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
11944 return 0;
11945
11946 /* Determine how to read the rest of the header. */
11947 switch (elf_header.e_ident[EI_DATA])
11948 {
11949 default: /* fall through */
11950 case ELFDATANONE: /* fall through */
11951 case ELFDATA2LSB:
11952 byte_get = byte_get_little_endian;
11953 byte_put = byte_put_little_endian;
11954 break;
11955 case ELFDATA2MSB:
11956 byte_get = byte_get_big_endian;
11957 byte_put = byte_put_big_endian;
11958 break;
11959 }
11960
11961 /* For now we only support 32 bit and 64 bit ELF files. */
11962 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
11963
11964 /* Read in the rest of the header. */
11965 if (is_32bit_elf)
11966 {
11967 Elf32_External_Ehdr ehdr32;
11968
11969 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
11970 return 0;
11971
11972 elf_header.e_type = BYTE_GET (ehdr32.e_type);
11973 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
11974 elf_header.e_version = BYTE_GET (ehdr32.e_version);
11975 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
11976 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
11977 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
11978 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
11979 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
11980 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
11981 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
11982 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
11983 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
11984 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
11985 }
11986 else
11987 {
11988 Elf64_External_Ehdr ehdr64;
11989
11990 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11991 we will not be able to cope with the 64bit data found in
11992 64 ELF files. Detect this now and abort before we start
11993 overwriting things. */
11994 if (sizeof (bfd_vma) < 8)
11995 {
11996 error (_("This instance of readelf has been built without support for a\n\
11997 64 bit data type and so it cannot read 64 bit ELF files.\n"));
11998 return 0;
11999 }
12000
12001 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
12002 return 0;
12003
12004 elf_header.e_type = BYTE_GET (ehdr64.e_type);
12005 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
12006 elf_header.e_version = BYTE_GET (ehdr64.e_version);
12007 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
12008 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
12009 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
12010 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
12011 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
12012 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
12013 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
12014 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
12015 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
12016 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
12017 }
12018
12019 if (elf_header.e_shoff)
12020 {
12021 /* There may be some extensions in the first section header. Don't
12022 bomb if we can't read it. */
12023 if (is_32bit_elf)
12024 get_32bit_section_headers (file, 1);
12025 else
12026 get_64bit_section_headers (file, 1);
12027 }
12028
12029 return 1;
12030 }
12031
12032 /* Process one ELF object file according to the command line options.
12033 This file may actually be stored in an archive. The file is
12034 positioned at the start of the ELF object. */
12035
12036 static int
12037 process_object (char *file_name, FILE *file)
12038 {
12039 unsigned int i;
12040
12041 if (! get_file_header (file))
12042 {
12043 error (_("%s: Failed to read file header\n"), file_name);
12044 return 1;
12045 }
12046
12047 /* Initialise per file variables. */
12048 for (i = NUM_ELEM (version_info); i--;)
12049 version_info[i] = 0;
12050
12051 for (i = NUM_ELEM (dynamic_info); i--;)
12052 dynamic_info[i] = 0;
12053
12054 /* Process the file. */
12055 if (show_name)
12056 printf (_("\nFile: %s\n"), file_name);
12057
12058 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12059 Note we do this even if cmdline_dump_sects is empty because we
12060 must make sure that the dump_sets array is zeroed out before each
12061 object file is processed. */
12062 if (num_dump_sects > num_cmdline_dump_sects)
12063 memset (dump_sects, 0, num_dump_sects);
12064
12065 if (num_cmdline_dump_sects > 0)
12066 {
12067 if (num_dump_sects == 0)
12068 /* A sneaky way of allocating the dump_sects array. */
12069 request_dump (num_cmdline_dump_sects, 0);
12070
12071 assert (num_dump_sects >= num_cmdline_dump_sects);
12072 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
12073 }
12074
12075 if (! process_file_header ())
12076 return 1;
12077
12078 if (! process_section_headers (file))
12079 {
12080 /* Without loaded section headers we cannot process lots of
12081 things. */
12082 do_unwind = do_version = do_dump = do_arch = 0;
12083
12084 if (! do_using_dynamic)
12085 do_syms = do_reloc = 0;
12086 }
12087
12088 if (! process_section_groups (file))
12089 {
12090 /* Without loaded section groups we cannot process unwind. */
12091 do_unwind = 0;
12092 }
12093
12094 if (process_program_headers (file))
12095 process_dynamic_section (file);
12096
12097 process_relocs (file);
12098
12099 process_unwind (file);
12100
12101 process_symbol_table (file);
12102
12103 process_syminfo (file);
12104
12105 process_version_sections (file);
12106
12107 process_section_contents (file);
12108
12109 process_notes (file);
12110
12111 process_gnu_liblist (file);
12112
12113 process_arch_specific (file);
12114
12115 if (program_headers)
12116 {
12117 free (program_headers);
12118 program_headers = NULL;
12119 }
12120
12121 if (section_headers)
12122 {
12123 free (section_headers);
12124 section_headers = NULL;
12125 }
12126
12127 if (string_table)
12128 {
12129 free (string_table);
12130 string_table = NULL;
12131 string_table_length = 0;
12132 }
12133
12134 if (dynamic_strings)
12135 {
12136 free (dynamic_strings);
12137 dynamic_strings = NULL;
12138 dynamic_strings_length = 0;
12139 }
12140
12141 if (dynamic_symbols)
12142 {
12143 free (dynamic_symbols);
12144 dynamic_symbols = NULL;
12145 num_dynamic_syms = 0;
12146 }
12147
12148 if (dynamic_syminfo)
12149 {
12150 free (dynamic_syminfo);
12151 dynamic_syminfo = NULL;
12152 }
12153
12154 if (section_headers_groups)
12155 {
12156 free (section_headers_groups);
12157 section_headers_groups = NULL;
12158 }
12159
12160 if (section_groups)
12161 {
12162 struct group_list *g, *next;
12163
12164 for (i = 0; i < group_count; i++)
12165 {
12166 for (g = section_groups [i].root; g != NULL; g = next)
12167 {
12168 next = g->next;
12169 free (g);
12170 }
12171 }
12172
12173 free (section_groups);
12174 section_groups = NULL;
12175 }
12176
12177 if (debug_information)
12178 {
12179 for (i = 0; i < num_debug_info_entries; i++)
12180 {
12181 if (!debug_information [i].max_loc_offsets)
12182 {
12183 free (debug_information [i].loc_offsets);
12184 free (debug_information [i].have_frame_base);
12185 }
12186 if (!debug_information [i].max_range_lists)
12187 free (debug_information [i].range_lists);
12188 }
12189 free (debug_information);
12190 debug_information = NULL;
12191 num_debug_info_entries = 0;
12192 }
12193
12194 return 0;
12195 }
12196
12197 /* Process an ELF archive. The file is positioned just after the
12198 ARMAG string. */
12199
12200 static int
12201 process_archive (char *file_name, FILE *file)
12202 {
12203 struct ar_hdr arhdr;
12204 size_t got;
12205 unsigned long size;
12206 char *longnames = NULL;
12207 unsigned long longnames_size = 0;
12208 size_t file_name_size;
12209 int ret;
12210
12211 show_name = 1;
12212
12213 got = fread (&arhdr, 1, sizeof arhdr, file);
12214 if (got != sizeof arhdr)
12215 {
12216 if (got == 0)
12217 return 0;
12218
12219 error (_("%s: failed to read archive header\n"), file_name);
12220 return 1;
12221 }
12222
12223 if (memcmp (arhdr.ar_name, "/ ", 16) == 0)
12224 {
12225 /* This is the archive symbol table. Skip it.
12226 FIXME: We should have an option to dump it. */
12227 size = strtoul (arhdr.ar_size, NULL, 10);
12228 if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
12229 {
12230 error (_("%s: failed to skip archive symbol table\n"), file_name);
12231 return 1;
12232 }
12233
12234 got = fread (&arhdr, 1, sizeof arhdr, file);
12235 if (got != sizeof arhdr)
12236 {
12237 if (got == 0)
12238 return 0;
12239
12240 error (_("%s: failed to read archive header\n"), file_name);
12241 return 1;
12242 }
12243 }
12244
12245 if (memcmp (arhdr.ar_name, "// ", 16) == 0)
12246 {
12247 /* This is the archive string table holding long member
12248 names. */
12249
12250 longnames_size = strtoul (arhdr.ar_size, NULL, 10);
12251
12252 longnames = malloc (longnames_size);
12253 if (longnames == NULL)
12254 {
12255 error (_("Out of memory\n"));
12256 return 1;
12257 }
12258
12259 if (fread (longnames, longnames_size, 1, file) != 1)
12260 {
12261 free (longnames);
12262 error (_("%s: failed to read string table\n"), file_name);
12263 return 1;
12264 }
12265
12266 if ((longnames_size & 1) != 0)
12267 getc (file);
12268
12269 got = fread (&arhdr, 1, sizeof arhdr, file);
12270 if (got != sizeof arhdr)
12271 {
12272 free (longnames);
12273
12274 if (got == 0)
12275 return 0;
12276
12277 error (_("%s: failed to read archive header\n"), file_name);
12278 return 1;
12279 }
12280 }
12281
12282 file_name_size = strlen (file_name);
12283 ret = 0;
12284
12285 while (1)
12286 {
12287 char *name;
12288 char *nameend;
12289 char *namealc;
12290
12291 if (arhdr.ar_name[0] == '/')
12292 {
12293 unsigned long off;
12294
12295 off = strtoul (arhdr.ar_name + 1, NULL, 10);
12296 if (off >= longnames_size)
12297 {
12298 error (_("%s: invalid archive string table offset %lu\n"), off);
12299 ret = 1;
12300 break;
12301 }
12302
12303 name = longnames + off;
12304 nameend = memchr (name, '/', longnames_size - off);
12305 }
12306 else
12307 {
12308 name = arhdr.ar_name;
12309 nameend = memchr (name, '/', 16);
12310 }
12311
12312 if (nameend == NULL)
12313 {
12314 error (_("%s: bad archive file name\n"));
12315 ret = 1;
12316 break;
12317 }
12318
12319 namealc = malloc (file_name_size + (nameend - name) + 3);
12320 if (namealc == NULL)
12321 {
12322 error (_("Out of memory\n"));
12323 ret = 1;
12324 break;
12325 }
12326
12327 memcpy (namealc, file_name, file_name_size);
12328 namealc[file_name_size] = '(';
12329 memcpy (namealc + file_name_size + 1, name, nameend - name);
12330 namealc[file_name_size + 1 + (nameend - name)] = ')';
12331 namealc[file_name_size + 2 + (nameend - name)] = '\0';
12332
12333 archive_file_offset = ftell (file);
12334 archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
12335
12336 ret |= process_object (namealc, file);
12337
12338 free (namealc);
12339
12340 if (fseek (file,
12341 (archive_file_offset
12342 + archive_file_size
12343 + (archive_file_size & 1)),
12344 SEEK_SET) != 0)
12345 {
12346 error (_("%s: failed to seek to next archive header\n"), file_name);
12347 ret = 1;
12348 break;
12349 }
12350
12351 got = fread (&arhdr, 1, sizeof arhdr, file);
12352 if (got != sizeof arhdr)
12353 {
12354 if (got == 0)
12355 break;
12356
12357 error (_("%s: failed to read archive header\n"), file_name);
12358 ret = 1;
12359 break;
12360 }
12361 }
12362
12363 if (longnames != 0)
12364 free (longnames);
12365
12366 return ret;
12367 }
12368
12369 static int
12370 process_file (char *file_name)
12371 {
12372 FILE *file;
12373 struct stat statbuf;
12374 char armag[SARMAG];
12375 int ret;
12376
12377 if (stat (file_name, &statbuf) < 0)
12378 {
12379 if (errno == ENOENT)
12380 error (_("'%s': No such file\n"), file_name);
12381 else
12382 error (_("Could not locate '%s'. System error message: %s\n"),
12383 file_name, strerror (errno));
12384 return 1;
12385 }
12386
12387 if (! S_ISREG (statbuf.st_mode))
12388 {
12389 error (_("'%s' is not an ordinary file\n"), file_name);
12390 return 1;
12391 }
12392
12393 file = fopen (file_name, "rb");
12394 if (file == NULL)
12395 {
12396 error (_("Input file '%s' is not readable.\n"), file_name);
12397 return 1;
12398 }
12399
12400 if (fread (armag, SARMAG, 1, file) != 1)
12401 {
12402 error (_("%s: Failed to read file header\n"), file_name);
12403 fclose (file);
12404 return 1;
12405 }
12406
12407 if (memcmp (armag, ARMAG, SARMAG) == 0)
12408 ret = process_archive (file_name, file);
12409 else
12410 {
12411 rewind (file);
12412 archive_file_size = archive_file_offset = 0;
12413 ret = process_object (file_name, file);
12414 }
12415
12416 fclose (file);
12417
12418 return ret;
12419 }
12420
12421 #ifdef SUPPORT_DISASSEMBLY
12422 /* Needed by the i386 disassembler. For extra credit, someone could
12423 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12424 symbols. */
12425
12426 void
12427 print_address (unsigned int addr, FILE *outfile)
12428 {
12429 fprintf (outfile,"0x%8.8x", addr);
12430 }
12431
12432 /* Needed by the i386 disassembler. */
12433 void
12434 db_task_printsym (unsigned int addr)
12435 {
12436 print_address (addr, stderr);
12437 }
12438 #endif
12439
12440 int
12441 main (int argc, char **argv)
12442 {
12443 int err;
12444
12445 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12446 setlocale (LC_MESSAGES, "");
12447 #endif
12448 #if defined (HAVE_SETLOCALE)
12449 setlocale (LC_CTYPE, "");
12450 #endif
12451 bindtextdomain (PACKAGE, LOCALEDIR);
12452 textdomain (PACKAGE);
12453
12454 parse_args (argc, argv);
12455
12456 if (num_dump_sects > 0)
12457 {
12458 /* Make a copy of the dump_sects array. */
12459 cmdline_dump_sects = malloc (num_dump_sects);
12460 if (cmdline_dump_sects == NULL)
12461 error (_("Out of memory allocating dump request table."));
12462 else
12463 {
12464 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
12465 num_cmdline_dump_sects = num_dump_sects;
12466 }
12467 }
12468
12469 if (optind < (argc - 1))
12470 show_name = 1;
12471
12472 err = 0;
12473 while (optind < argc)
12474 err |= process_file (argv[optind++]);
12475
12476 if (dump_sects != NULL)
12477 free (dump_sects);
12478 if (cmdline_dump_sects != NULL)
12479 free (cmdline_dump_sects);
12480
12481 return err;
12482 }