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