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