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