* readelf.c (get_machine_dlags): Add support for RX's PID mode.
[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 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2432 strcat (buf, ", micromips");
2433
2434 switch ((e_flags & EF_MIPS_ARCH))
2435 {
2436 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2437 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2438 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2439 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2440 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2441 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2442 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2443 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2444 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2445 default: strcat (buf, _(", unknown ISA")); break;
2446 }
2447
2448 if (e_flags & EF_SH_PIC)
2449 strcat (buf, ", pic");
2450
2451 if (e_flags & EF_SH_FDPIC)
2452 strcat (buf, ", fdpic");
2453 break;
2454
2455 case EM_SH:
2456 switch ((e_flags & EF_SH_MACH_MASK))
2457 {
2458 case EF_SH1: strcat (buf, ", sh1"); break;
2459 case EF_SH2: strcat (buf, ", sh2"); break;
2460 case EF_SH3: strcat (buf, ", sh3"); break;
2461 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2462 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2463 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2464 case EF_SH3E: strcat (buf, ", sh3e"); break;
2465 case EF_SH4: strcat (buf, ", sh4"); break;
2466 case EF_SH5: strcat (buf, ", sh5"); break;
2467 case EF_SH2E: strcat (buf, ", sh2e"); break;
2468 case EF_SH4A: strcat (buf, ", sh4a"); break;
2469 case EF_SH2A: strcat (buf, ", sh2a"); break;
2470 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2471 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2472 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2473 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2474 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2475 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2476 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2477 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2478 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2479 default: strcat (buf, _(", unknown ISA")); break;
2480 }
2481
2482 break;
2483
2484 case EM_SPARCV9:
2485 if (e_flags & EF_SPARC_32PLUS)
2486 strcat (buf, ", v8+");
2487
2488 if (e_flags & EF_SPARC_SUN_US1)
2489 strcat (buf, ", ultrasparcI");
2490
2491 if (e_flags & EF_SPARC_SUN_US3)
2492 strcat (buf, ", ultrasparcIII");
2493
2494 if (e_flags & EF_SPARC_HAL_R1)
2495 strcat (buf, ", halr1");
2496
2497 if (e_flags & EF_SPARC_LEDATA)
2498 strcat (buf, ", ledata");
2499
2500 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2501 strcat (buf, ", tso");
2502
2503 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2504 strcat (buf, ", pso");
2505
2506 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2507 strcat (buf, ", rmo");
2508 break;
2509
2510 case EM_PARISC:
2511 switch (e_flags & EF_PARISC_ARCH)
2512 {
2513 case EFA_PARISC_1_0:
2514 strcpy (buf, ", PA-RISC 1.0");
2515 break;
2516 case EFA_PARISC_1_1:
2517 strcpy (buf, ", PA-RISC 1.1");
2518 break;
2519 case EFA_PARISC_2_0:
2520 strcpy (buf, ", PA-RISC 2.0");
2521 break;
2522 default:
2523 break;
2524 }
2525 if (e_flags & EF_PARISC_TRAPNIL)
2526 strcat (buf, ", trapnil");
2527 if (e_flags & EF_PARISC_EXT)
2528 strcat (buf, ", ext");
2529 if (e_flags & EF_PARISC_LSB)
2530 strcat (buf, ", lsb");
2531 if (e_flags & EF_PARISC_WIDE)
2532 strcat (buf, ", wide");
2533 if (e_flags & EF_PARISC_NO_KABP)
2534 strcat (buf, ", no kabp");
2535 if (e_flags & EF_PARISC_LAZYSWAP)
2536 strcat (buf, ", lazyswap");
2537 break;
2538
2539 case EM_PJ:
2540 case EM_PJ_OLD:
2541 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2542 strcat (buf, ", new calling convention");
2543
2544 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2545 strcat (buf, ", gnu calling convention");
2546 break;
2547
2548 case EM_IA_64:
2549 if ((e_flags & EF_IA_64_ABI64))
2550 strcat (buf, ", 64-bit");
2551 else
2552 strcat (buf, ", 32-bit");
2553 if ((e_flags & EF_IA_64_REDUCEDFP))
2554 strcat (buf, ", reduced fp model");
2555 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2556 strcat (buf, ", no function descriptors, constant gp");
2557 else if ((e_flags & EF_IA_64_CONS_GP))
2558 strcat (buf, ", constant gp");
2559 if ((e_flags & EF_IA_64_ABSOLUTE))
2560 strcat (buf, ", absolute");
2561 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2562 {
2563 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2564 strcat (buf, ", vms_linkages");
2565 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2566 {
2567 case EF_IA_64_VMS_COMCOD_SUCCESS:
2568 break;
2569 case EF_IA_64_VMS_COMCOD_WARNING:
2570 strcat (buf, ", warning");
2571 break;
2572 case EF_IA_64_VMS_COMCOD_ERROR:
2573 strcat (buf, ", error");
2574 break;
2575 case EF_IA_64_VMS_COMCOD_ABORT:
2576 strcat (buf, ", abort");
2577 break;
2578 default:
2579 abort ();
2580 }
2581 }
2582 break;
2583
2584 case EM_VAX:
2585 if ((e_flags & EF_VAX_NONPIC))
2586 strcat (buf, ", non-PIC");
2587 if ((e_flags & EF_VAX_DFLOAT))
2588 strcat (buf, ", D-Float");
2589 if ((e_flags & EF_VAX_GFLOAT))
2590 strcat (buf, ", G-Float");
2591 break;
2592
2593 case EM_RX:
2594 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2595 strcat (buf, ", 64-bit doubles");
2596 if (e_flags & E_FLAG_RX_DSP)
2597 strcat (buf, ", dsp");
2598 if (e_flags & E_FLAG_RX_PID)
2599 strcat (buf, ", pid");
2600 break;
2601
2602 case EM_S390:
2603 if (e_flags & EF_S390_HIGH_GPRS)
2604 strcat (buf, ", highgprs");
2605 break;
2606
2607 case EM_TI_C6000:
2608 if ((e_flags & EF_C6000_REL))
2609 strcat (buf, ", relocatable module");
2610 break;
2611 }
2612 }
2613
2614 return buf;
2615 }
2616
2617 static const char *
2618 get_osabi_name (unsigned int osabi)
2619 {
2620 static char buff[32];
2621
2622 switch (osabi)
2623 {
2624 case ELFOSABI_NONE: return "UNIX - System V";
2625 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2626 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2627 case ELFOSABI_GNU: return "UNIX - GNU";
2628 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2629 case ELFOSABI_AIX: return "UNIX - AIX";
2630 case ELFOSABI_IRIX: return "UNIX - IRIX";
2631 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2632 case ELFOSABI_TRU64: return "UNIX - TRU64";
2633 case ELFOSABI_MODESTO: return "Novell - Modesto";
2634 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2635 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2636 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2637 case ELFOSABI_AROS: return "AROS";
2638 case ELFOSABI_FENIXOS: return "FenixOS";
2639 default:
2640 if (osabi >= 64)
2641 switch (elf_header.e_machine)
2642 {
2643 case EM_ARM:
2644 switch (osabi)
2645 {
2646 case ELFOSABI_ARM: return "ARM";
2647 default:
2648 break;
2649 }
2650 break;
2651
2652 case EM_MSP430:
2653 case EM_MSP430_OLD:
2654 switch (osabi)
2655 {
2656 case ELFOSABI_STANDALONE: return _("Standalone App");
2657 default:
2658 break;
2659 }
2660 break;
2661
2662 case EM_TI_C6000:
2663 switch (osabi)
2664 {
2665 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2666 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2667 default:
2668 break;
2669 }
2670 break;
2671
2672 default:
2673 break;
2674 }
2675 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2676 return buff;
2677 }
2678 }
2679
2680 static const char *
2681 get_arm_segment_type (unsigned long type)
2682 {
2683 switch (type)
2684 {
2685 case PT_ARM_EXIDX:
2686 return "EXIDX";
2687 default:
2688 break;
2689 }
2690
2691 return NULL;
2692 }
2693
2694 static const char *
2695 get_mips_segment_type (unsigned long type)
2696 {
2697 switch (type)
2698 {
2699 case PT_MIPS_REGINFO:
2700 return "REGINFO";
2701 case PT_MIPS_RTPROC:
2702 return "RTPROC";
2703 case PT_MIPS_OPTIONS:
2704 return "OPTIONS";
2705 default:
2706 break;
2707 }
2708
2709 return NULL;
2710 }
2711
2712 static const char *
2713 get_parisc_segment_type (unsigned long type)
2714 {
2715 switch (type)
2716 {
2717 case PT_HP_TLS: return "HP_TLS";
2718 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2719 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2720 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2721 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2722 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2723 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2724 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2725 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2726 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2727 case PT_HP_PARALLEL: return "HP_PARALLEL";
2728 case PT_HP_FASTBIND: return "HP_FASTBIND";
2729 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2730 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2731 case PT_HP_STACK: return "HP_STACK";
2732 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2733 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2734 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2735 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2736 default:
2737 break;
2738 }
2739
2740 return NULL;
2741 }
2742
2743 static const char *
2744 get_ia64_segment_type (unsigned long type)
2745 {
2746 switch (type)
2747 {
2748 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2749 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2750 case PT_HP_TLS: return "HP_TLS";
2751 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2752 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2753 case PT_IA_64_HP_STACK: return "HP_STACK";
2754 default:
2755 break;
2756 }
2757
2758 return NULL;
2759 }
2760
2761 static const char *
2762 get_tic6x_segment_type (unsigned long type)
2763 {
2764 switch (type)
2765 {
2766 case PT_C6000_PHATTR: return "C6000_PHATTR";
2767 default:
2768 break;
2769 }
2770
2771 return NULL;
2772 }
2773
2774 static const char *
2775 get_segment_type (unsigned long p_type)
2776 {
2777 static char buff[32];
2778
2779 switch (p_type)
2780 {
2781 case PT_NULL: return "NULL";
2782 case PT_LOAD: return "LOAD";
2783 case PT_DYNAMIC: return "DYNAMIC";
2784 case PT_INTERP: return "INTERP";
2785 case PT_NOTE: return "NOTE";
2786 case PT_SHLIB: return "SHLIB";
2787 case PT_PHDR: return "PHDR";
2788 case PT_TLS: return "TLS";
2789
2790 case PT_GNU_EH_FRAME:
2791 return "GNU_EH_FRAME";
2792 case PT_GNU_STACK: return "GNU_STACK";
2793 case PT_GNU_RELRO: return "GNU_RELRO";
2794
2795 default:
2796 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2797 {
2798 const char * result;
2799
2800 switch (elf_header.e_machine)
2801 {
2802 case EM_ARM:
2803 result = get_arm_segment_type (p_type);
2804 break;
2805 case EM_MIPS:
2806 case EM_MIPS_RS3_LE:
2807 result = get_mips_segment_type (p_type);
2808 break;
2809 case EM_PARISC:
2810 result = get_parisc_segment_type (p_type);
2811 break;
2812 case EM_IA_64:
2813 result = get_ia64_segment_type (p_type);
2814 break;
2815 case EM_TI_C6000:
2816 result = get_tic6x_segment_type (p_type);
2817 break;
2818 default:
2819 result = NULL;
2820 break;
2821 }
2822
2823 if (result != NULL)
2824 return result;
2825
2826 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2827 }
2828 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2829 {
2830 const char * result;
2831
2832 switch (elf_header.e_machine)
2833 {
2834 case EM_PARISC:
2835 result = get_parisc_segment_type (p_type);
2836 break;
2837 case EM_IA_64:
2838 result = get_ia64_segment_type (p_type);
2839 break;
2840 default:
2841 result = NULL;
2842 break;
2843 }
2844
2845 if (result != NULL)
2846 return result;
2847
2848 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2849 }
2850 else
2851 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2852
2853 return buff;
2854 }
2855 }
2856
2857 static const char *
2858 get_mips_section_type_name (unsigned int sh_type)
2859 {
2860 switch (sh_type)
2861 {
2862 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2863 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2864 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2865 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2866 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2867 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2868 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2869 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2870 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2871 case SHT_MIPS_RELD: return "MIPS_RELD";
2872 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2873 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2874 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2875 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2876 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2877 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2878 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2879 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2880 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2881 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2882 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2883 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2884 case SHT_MIPS_LINE: return "MIPS_LINE";
2885 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2886 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2887 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2888 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2889 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2890 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2891 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2892 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2893 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2894 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2895 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2896 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2897 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2898 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2899 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2900 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2901 default:
2902 break;
2903 }
2904 return NULL;
2905 }
2906
2907 static const char *
2908 get_parisc_section_type_name (unsigned int sh_type)
2909 {
2910 switch (sh_type)
2911 {
2912 case SHT_PARISC_EXT: return "PARISC_EXT";
2913 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2914 case SHT_PARISC_DOC: return "PARISC_DOC";
2915 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2916 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2917 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2918 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2919 default:
2920 break;
2921 }
2922 return NULL;
2923 }
2924
2925 static const char *
2926 get_ia64_section_type_name (unsigned int sh_type)
2927 {
2928 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2929 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2930 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2931
2932 switch (sh_type)
2933 {
2934 case SHT_IA_64_EXT: return "IA_64_EXT";
2935 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2936 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2937 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2938 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2939 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2940 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
2941 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
2942 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
2943 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
2944 default:
2945 break;
2946 }
2947 return NULL;
2948 }
2949
2950 static const char *
2951 get_x86_64_section_type_name (unsigned int sh_type)
2952 {
2953 switch (sh_type)
2954 {
2955 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2956 default:
2957 break;
2958 }
2959 return NULL;
2960 }
2961
2962 static const char *
2963 get_arm_section_type_name (unsigned int sh_type)
2964 {
2965 switch (sh_type)
2966 {
2967 case SHT_ARM_EXIDX: return "ARM_EXIDX";
2968 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
2969 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
2970 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
2971 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
2972 default:
2973 break;
2974 }
2975 return NULL;
2976 }
2977
2978 static const char *
2979 get_tic6x_section_type_name (unsigned int sh_type)
2980 {
2981 switch (sh_type)
2982 {
2983 case SHT_C6000_UNWIND:
2984 return "C6000_UNWIND";
2985 case SHT_C6000_PREEMPTMAP:
2986 return "C6000_PREEMPTMAP";
2987 case SHT_C6000_ATTRIBUTES:
2988 return "C6000_ATTRIBUTES";
2989 case SHT_TI_ICODE:
2990 return "TI_ICODE";
2991 case SHT_TI_XREF:
2992 return "TI_XREF";
2993 case SHT_TI_HANDLER:
2994 return "TI_HANDLER";
2995 case SHT_TI_INITINFO:
2996 return "TI_INITINFO";
2997 case SHT_TI_PHATTRS:
2998 return "TI_PHATTRS";
2999 default:
3000 break;
3001 }
3002 return NULL;
3003 }
3004
3005 static const char *
3006 get_section_type_name (unsigned int sh_type)
3007 {
3008 static char buff[32];
3009
3010 switch (sh_type)
3011 {
3012 case SHT_NULL: return "NULL";
3013 case SHT_PROGBITS: return "PROGBITS";
3014 case SHT_SYMTAB: return "SYMTAB";
3015 case SHT_STRTAB: return "STRTAB";
3016 case SHT_RELA: return "RELA";
3017 case SHT_HASH: return "HASH";
3018 case SHT_DYNAMIC: return "DYNAMIC";
3019 case SHT_NOTE: return "NOTE";
3020 case SHT_NOBITS: return "NOBITS";
3021 case SHT_REL: return "REL";
3022 case SHT_SHLIB: return "SHLIB";
3023 case SHT_DYNSYM: return "DYNSYM";
3024 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3025 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3026 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3027 case SHT_GNU_HASH: return "GNU_HASH";
3028 case SHT_GROUP: return "GROUP";
3029 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3030 case SHT_GNU_verdef: return "VERDEF";
3031 case SHT_GNU_verneed: return "VERNEED";
3032 case SHT_GNU_versym: return "VERSYM";
3033 case 0x6ffffff0: return "VERSYM";
3034 case 0x6ffffffc: return "VERDEF";
3035 case 0x7ffffffd: return "AUXILIARY";
3036 case 0x7fffffff: return "FILTER";
3037 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3038
3039 default:
3040 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3041 {
3042 const char * result;
3043
3044 switch (elf_header.e_machine)
3045 {
3046 case EM_MIPS:
3047 case EM_MIPS_RS3_LE:
3048 result = get_mips_section_type_name (sh_type);
3049 break;
3050 case EM_PARISC:
3051 result = get_parisc_section_type_name (sh_type);
3052 break;
3053 case EM_IA_64:
3054 result = get_ia64_section_type_name (sh_type);
3055 break;
3056 case EM_X86_64:
3057 case EM_L1OM:
3058 case EM_K1OM:
3059 result = get_x86_64_section_type_name (sh_type);
3060 break;
3061 case EM_ARM:
3062 result = get_arm_section_type_name (sh_type);
3063 break;
3064 case EM_TI_C6000:
3065 result = get_tic6x_section_type_name (sh_type);
3066 break;
3067 default:
3068 result = NULL;
3069 break;
3070 }
3071
3072 if (result != NULL)
3073 return result;
3074
3075 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3076 }
3077 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3078 {
3079 const char * result;
3080
3081 switch (elf_header.e_machine)
3082 {
3083 case EM_IA_64:
3084 result = get_ia64_section_type_name (sh_type);
3085 break;
3086 default:
3087 result = NULL;
3088 break;
3089 }
3090
3091 if (result != NULL)
3092 return result;
3093
3094 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3095 }
3096 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3097 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3098 else
3099 /* This message is probably going to be displayed in a 15
3100 character wide field, so put the hex value first. */
3101 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3102
3103 return buff;
3104 }
3105 }
3106
3107 #define OPTION_DEBUG_DUMP 512
3108 #define OPTION_DYN_SYMS 513
3109 #define OPTION_DWARF_DEPTH 514
3110 #define OPTION_DWARF_START 515
3111
3112 static struct option options[] =
3113 {
3114 {"all", no_argument, 0, 'a'},
3115 {"file-header", no_argument, 0, 'h'},
3116 {"program-headers", no_argument, 0, 'l'},
3117 {"headers", no_argument, 0, 'e'},
3118 {"histogram", no_argument, 0, 'I'},
3119 {"segments", no_argument, 0, 'l'},
3120 {"sections", no_argument, 0, 'S'},
3121 {"section-headers", no_argument, 0, 'S'},
3122 {"section-groups", no_argument, 0, 'g'},
3123 {"section-details", no_argument, 0, 't'},
3124 {"full-section-name",no_argument, 0, 'N'},
3125 {"symbols", no_argument, 0, 's'},
3126 {"syms", no_argument, 0, 's'},
3127 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3128 {"relocs", no_argument, 0, 'r'},
3129 {"notes", no_argument, 0, 'n'},
3130 {"dynamic", no_argument, 0, 'd'},
3131 {"arch-specific", no_argument, 0, 'A'},
3132 {"version-info", no_argument, 0, 'V'},
3133 {"use-dynamic", no_argument, 0, 'D'},
3134 {"unwind", no_argument, 0, 'u'},
3135 {"archive-index", no_argument, 0, 'c'},
3136 {"hex-dump", required_argument, 0, 'x'},
3137 {"relocated-dump", required_argument, 0, 'R'},
3138 {"string-dump", required_argument, 0, 'p'},
3139 #ifdef SUPPORT_DISASSEMBLY
3140 {"instruction-dump", required_argument, 0, 'i'},
3141 #endif
3142 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3143
3144 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3145 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3146
3147 {"version", no_argument, 0, 'v'},
3148 {"wide", no_argument, 0, 'W'},
3149 {"help", no_argument, 0, 'H'},
3150 {0, no_argument, 0, 0}
3151 };
3152
3153 static void
3154 usage (FILE * stream)
3155 {
3156 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3157 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3158 fprintf (stream, _(" Options are:\n\
3159 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3160 -h --file-header Display the ELF file header\n\
3161 -l --program-headers Display the program headers\n\
3162 --segments An alias for --program-headers\n\
3163 -S --section-headers Display the sections' header\n\
3164 --sections An alias for --section-headers\n\
3165 -g --section-groups Display the section groups\n\
3166 -t --section-details Display the section details\n\
3167 -e --headers Equivalent to: -h -l -S\n\
3168 -s --syms Display the symbol table\n\
3169 --symbols An alias for --syms\n\
3170 --dyn-syms Display the dynamic symbol table\n\
3171 -n --notes Display the core notes (if present)\n\
3172 -r --relocs Display the relocations (if present)\n\
3173 -u --unwind Display the unwind info (if present)\n\
3174 -d --dynamic Display the dynamic section (if present)\n\
3175 -V --version-info Display the version sections (if present)\n\
3176 -A --arch-specific Display architecture specific information (if any).\n\
3177 -c --archive-index Display the symbol/file index in an archive\n\
3178 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3179 -x --hex-dump=<number|name>\n\
3180 Dump the contents of section <number|name> as bytes\n\
3181 -p --string-dump=<number|name>\n\
3182 Dump the contents of section <number|name> as strings\n\
3183 -R --relocated-dump=<number|name>\n\
3184 Dump the contents of section <number|name> as relocated bytes\n\
3185 -w[lLiaprmfFsoRt] or\n\
3186 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3187 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3188 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges]\n\
3189 Display the contents of DWARF2 debug sections\n"));
3190 fprintf (stream, _("\
3191 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3192 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3193 or deeper\n"));
3194 #ifdef SUPPORT_DISASSEMBLY
3195 fprintf (stream, _("\
3196 -i --instruction-dump=<number|name>\n\
3197 Disassemble the contents of section <number|name>\n"));
3198 #endif
3199 fprintf (stream, _("\
3200 -I --histogram Display histogram of bucket list lengths\n\
3201 -W --wide Allow output width to exceed 80 characters\n\
3202 @<file> Read options from <file>\n\
3203 -H --help Display this information\n\
3204 -v --version Display the version number of readelf\n"));
3205
3206 if (REPORT_BUGS_TO[0] && stream == stdout)
3207 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3208
3209 exit (stream == stdout ? 0 : 1);
3210 }
3211
3212 /* Record the fact that the user wants the contents of section number
3213 SECTION to be displayed using the method(s) encoded as flags bits
3214 in TYPE. Note, TYPE can be zero if we are creating the array for
3215 the first time. */
3216
3217 static void
3218 request_dump_bynumber (unsigned int section, dump_type type)
3219 {
3220 if (section >= num_dump_sects)
3221 {
3222 dump_type * new_dump_sects;
3223
3224 new_dump_sects = (dump_type *) calloc (section + 1,
3225 sizeof (* dump_sects));
3226
3227 if (new_dump_sects == NULL)
3228 error (_("Out of memory allocating dump request table.\n"));
3229 else
3230 {
3231 /* Copy current flag settings. */
3232 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3233
3234 free (dump_sects);
3235
3236 dump_sects = new_dump_sects;
3237 num_dump_sects = section + 1;
3238 }
3239 }
3240
3241 if (dump_sects)
3242 dump_sects[section] |= type;
3243
3244 return;
3245 }
3246
3247 /* Request a dump by section name. */
3248
3249 static void
3250 request_dump_byname (const char * section, dump_type type)
3251 {
3252 struct dump_list_entry * new_request;
3253
3254 new_request = (struct dump_list_entry *)
3255 malloc (sizeof (struct dump_list_entry));
3256 if (!new_request)
3257 error (_("Out of memory allocating dump request table.\n"));
3258
3259 new_request->name = strdup (section);
3260 if (!new_request->name)
3261 error (_("Out of memory allocating dump request table.\n"));
3262
3263 new_request->type = type;
3264
3265 new_request->next = dump_sects_byname;
3266 dump_sects_byname = new_request;
3267 }
3268
3269 static inline void
3270 request_dump (dump_type type)
3271 {
3272 int section;
3273 char * cp;
3274
3275 do_dump++;
3276 section = strtoul (optarg, & cp, 0);
3277
3278 if (! *cp && section >= 0)
3279 request_dump_bynumber (section, type);
3280 else
3281 request_dump_byname (optarg, type);
3282 }
3283
3284
3285 static void
3286 parse_args (int argc, char ** argv)
3287 {
3288 int c;
3289
3290 if (argc < 2)
3291 usage (stderr);
3292
3293 while ((c = getopt_long
3294 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3295 {
3296 switch (c)
3297 {
3298 case 0:
3299 /* Long options. */
3300 break;
3301 case 'H':
3302 usage (stdout);
3303 break;
3304
3305 case 'a':
3306 do_syms++;
3307 do_reloc++;
3308 do_unwind++;
3309 do_dynamic++;
3310 do_header++;
3311 do_sections++;
3312 do_section_groups++;
3313 do_segments++;
3314 do_version++;
3315 do_histogram++;
3316 do_arch++;
3317 do_notes++;
3318 break;
3319 case 'g':
3320 do_section_groups++;
3321 break;
3322 case 't':
3323 case 'N':
3324 do_sections++;
3325 do_section_details++;
3326 break;
3327 case 'e':
3328 do_header++;
3329 do_sections++;
3330 do_segments++;
3331 break;
3332 case 'A':
3333 do_arch++;
3334 break;
3335 case 'D':
3336 do_using_dynamic++;
3337 break;
3338 case 'r':
3339 do_reloc++;
3340 break;
3341 case 'u':
3342 do_unwind++;
3343 break;
3344 case 'h':
3345 do_header++;
3346 break;
3347 case 'l':
3348 do_segments++;
3349 break;
3350 case 's':
3351 do_syms++;
3352 break;
3353 case 'S':
3354 do_sections++;
3355 break;
3356 case 'd':
3357 do_dynamic++;
3358 break;
3359 case 'I':
3360 do_histogram++;
3361 break;
3362 case 'n':
3363 do_notes++;
3364 break;
3365 case 'c':
3366 do_archive_index++;
3367 break;
3368 case 'x':
3369 request_dump (HEX_DUMP);
3370 break;
3371 case 'p':
3372 request_dump (STRING_DUMP);
3373 break;
3374 case 'R':
3375 request_dump (RELOC_DUMP);
3376 break;
3377 case 'w':
3378 do_dump++;
3379 if (optarg == 0)
3380 {
3381 do_debugging = 1;
3382 dwarf_select_sections_all ();
3383 }
3384 else
3385 {
3386 do_debugging = 0;
3387 dwarf_select_sections_by_letters (optarg);
3388 }
3389 break;
3390 case OPTION_DEBUG_DUMP:
3391 do_dump++;
3392 if (optarg == 0)
3393 do_debugging = 1;
3394 else
3395 {
3396 do_debugging = 0;
3397 dwarf_select_sections_by_names (optarg);
3398 }
3399 break;
3400 case OPTION_DWARF_DEPTH:
3401 {
3402 char *cp;
3403
3404 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3405 }
3406 break;
3407 case OPTION_DWARF_START:
3408 {
3409 char *cp;
3410
3411 dwarf_start_die = strtoul (optarg, & cp, 0);
3412 }
3413 break;
3414 case OPTION_DYN_SYMS:
3415 do_dyn_syms++;
3416 break;
3417 #ifdef SUPPORT_DISASSEMBLY
3418 case 'i':
3419 request_dump (DISASS_DUMP);
3420 break;
3421 #endif
3422 case 'v':
3423 print_version (program_name);
3424 break;
3425 case 'V':
3426 do_version++;
3427 break;
3428 case 'W':
3429 do_wide++;
3430 break;
3431 default:
3432 /* xgettext:c-format */
3433 error (_("Invalid option '-%c'\n"), c);
3434 /* Drop through. */
3435 case '?':
3436 usage (stderr);
3437 }
3438 }
3439
3440 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3441 && !do_segments && !do_header && !do_dump && !do_version
3442 && !do_histogram && !do_debugging && !do_arch && !do_notes
3443 && !do_section_groups && !do_archive_index
3444 && !do_dyn_syms)
3445 usage (stderr);
3446 else if (argc < 3)
3447 {
3448 warn (_("Nothing to do.\n"));
3449 usage (stderr);
3450 }
3451 }
3452
3453 static const char *
3454 get_elf_class (unsigned int elf_class)
3455 {
3456 static char buff[32];
3457
3458 switch (elf_class)
3459 {
3460 case ELFCLASSNONE: return _("none");
3461 case ELFCLASS32: return "ELF32";
3462 case ELFCLASS64: return "ELF64";
3463 default:
3464 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3465 return buff;
3466 }
3467 }
3468
3469 static const char *
3470 get_data_encoding (unsigned int encoding)
3471 {
3472 static char buff[32];
3473
3474 switch (encoding)
3475 {
3476 case ELFDATANONE: return _("none");
3477 case ELFDATA2LSB: return _("2's complement, little endian");
3478 case ELFDATA2MSB: return _("2's complement, big endian");
3479 default:
3480 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3481 return buff;
3482 }
3483 }
3484
3485 /* Decode the data held in 'elf_header'. */
3486
3487 static int
3488 process_file_header (void)
3489 {
3490 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3491 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3492 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3493 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3494 {
3495 error
3496 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3497 return 0;
3498 }
3499
3500 init_dwarf_regnames (elf_header.e_machine);
3501
3502 if (do_header)
3503 {
3504 int i;
3505
3506 printf (_("ELF Header:\n"));
3507 printf (_(" Magic: "));
3508 for (i = 0; i < EI_NIDENT; i++)
3509 printf ("%2.2x ", elf_header.e_ident[i]);
3510 printf ("\n");
3511 printf (_(" Class: %s\n"),
3512 get_elf_class (elf_header.e_ident[EI_CLASS]));
3513 printf (_(" Data: %s\n"),
3514 get_data_encoding (elf_header.e_ident[EI_DATA]));
3515 printf (_(" Version: %d %s\n"),
3516 elf_header.e_ident[EI_VERSION],
3517 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3518 ? "(current)"
3519 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3520 ? _("<unknown: %lx>")
3521 : "")));
3522 printf (_(" OS/ABI: %s\n"),
3523 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3524 printf (_(" ABI Version: %d\n"),
3525 elf_header.e_ident[EI_ABIVERSION]);
3526 printf (_(" Type: %s\n"),
3527 get_file_type (elf_header.e_type));
3528 printf (_(" Machine: %s\n"),
3529 get_machine_name (elf_header.e_machine));
3530 printf (_(" Version: 0x%lx\n"),
3531 (unsigned long) elf_header.e_version);
3532
3533 printf (_(" Entry point address: "));
3534 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3535 printf (_("\n Start of program headers: "));
3536 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3537 printf (_(" (bytes into file)\n Start of section headers: "));
3538 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3539 printf (_(" (bytes into file)\n"));
3540
3541 printf (_(" Flags: 0x%lx%s\n"),
3542 (unsigned long) elf_header.e_flags,
3543 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3544 printf (_(" Size of this header: %ld (bytes)\n"),
3545 (long) elf_header.e_ehsize);
3546 printf (_(" Size of program headers: %ld (bytes)\n"),
3547 (long) elf_header.e_phentsize);
3548 printf (_(" Number of program headers: %ld"),
3549 (long) elf_header.e_phnum);
3550 if (section_headers != NULL
3551 && elf_header.e_phnum == PN_XNUM
3552 && section_headers[0].sh_info != 0)
3553 printf (" (%ld)", (long) section_headers[0].sh_info);
3554 putc ('\n', stdout);
3555 printf (_(" Size of section headers: %ld (bytes)\n"),
3556 (long) elf_header.e_shentsize);
3557 printf (_(" Number of section headers: %ld"),
3558 (long) elf_header.e_shnum);
3559 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3560 printf (" (%ld)", (long) section_headers[0].sh_size);
3561 putc ('\n', stdout);
3562 printf (_(" Section header string table index: %ld"),
3563 (long) elf_header.e_shstrndx);
3564 if (section_headers != NULL
3565 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3566 printf (" (%u)", section_headers[0].sh_link);
3567 else if (elf_header.e_shstrndx != SHN_UNDEF
3568 && elf_header.e_shstrndx >= elf_header.e_shnum)
3569 printf (_(" <corrupt: out of range>"));
3570 putc ('\n', stdout);
3571 }
3572
3573 if (section_headers != NULL)
3574 {
3575 if (elf_header.e_phnum == PN_XNUM
3576 && section_headers[0].sh_info != 0)
3577 elf_header.e_phnum = section_headers[0].sh_info;
3578 if (elf_header.e_shnum == SHN_UNDEF)
3579 elf_header.e_shnum = section_headers[0].sh_size;
3580 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3581 elf_header.e_shstrndx = section_headers[0].sh_link;
3582 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3583 elf_header.e_shstrndx = SHN_UNDEF;
3584 free (section_headers);
3585 section_headers = NULL;
3586 }
3587
3588 return 1;
3589 }
3590
3591
3592 static int
3593 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3594 {
3595 Elf32_External_Phdr * phdrs;
3596 Elf32_External_Phdr * external;
3597 Elf_Internal_Phdr * internal;
3598 unsigned int i;
3599
3600 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3601 elf_header.e_phentsize,
3602 elf_header.e_phnum,
3603 _("program headers"));
3604 if (!phdrs)
3605 return 0;
3606
3607 for (i = 0, internal = pheaders, external = phdrs;
3608 i < elf_header.e_phnum;
3609 i++, internal++, external++)
3610 {
3611 internal->p_type = BYTE_GET (external->p_type);
3612 internal->p_offset = BYTE_GET (external->p_offset);
3613 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3614 internal->p_paddr = BYTE_GET (external->p_paddr);
3615 internal->p_filesz = BYTE_GET (external->p_filesz);
3616 internal->p_memsz = BYTE_GET (external->p_memsz);
3617 internal->p_flags = BYTE_GET (external->p_flags);
3618 internal->p_align = BYTE_GET (external->p_align);
3619 }
3620
3621 free (phdrs);
3622
3623 return 1;
3624 }
3625
3626 static int
3627 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3628 {
3629 Elf64_External_Phdr * phdrs;
3630 Elf64_External_Phdr * external;
3631 Elf_Internal_Phdr * internal;
3632 unsigned int i;
3633
3634 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3635 elf_header.e_phentsize,
3636 elf_header.e_phnum,
3637 _("program headers"));
3638 if (!phdrs)
3639 return 0;
3640
3641 for (i = 0, internal = pheaders, external = phdrs;
3642 i < elf_header.e_phnum;
3643 i++, internal++, external++)
3644 {
3645 internal->p_type = BYTE_GET (external->p_type);
3646 internal->p_flags = BYTE_GET (external->p_flags);
3647 internal->p_offset = BYTE_GET (external->p_offset);
3648 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3649 internal->p_paddr = BYTE_GET (external->p_paddr);
3650 internal->p_filesz = BYTE_GET (external->p_filesz);
3651 internal->p_memsz = BYTE_GET (external->p_memsz);
3652 internal->p_align = BYTE_GET (external->p_align);
3653 }
3654
3655 free (phdrs);
3656
3657 return 1;
3658 }
3659
3660 /* Returns 1 if the program headers were read into `program_headers'. */
3661
3662 static int
3663 get_program_headers (FILE * file)
3664 {
3665 Elf_Internal_Phdr * phdrs;
3666
3667 /* Check cache of prior read. */
3668 if (program_headers != NULL)
3669 return 1;
3670
3671 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3672 sizeof (Elf_Internal_Phdr));
3673
3674 if (phdrs == NULL)
3675 {
3676 error (_("Out of memory\n"));
3677 return 0;
3678 }
3679
3680 if (is_32bit_elf
3681 ? get_32bit_program_headers (file, phdrs)
3682 : get_64bit_program_headers (file, phdrs))
3683 {
3684 program_headers = phdrs;
3685 return 1;
3686 }
3687
3688 free (phdrs);
3689 return 0;
3690 }
3691
3692 /* Returns 1 if the program headers were loaded. */
3693
3694 static int
3695 process_program_headers (FILE * file)
3696 {
3697 Elf_Internal_Phdr * segment;
3698 unsigned int i;
3699
3700 if (elf_header.e_phnum == 0)
3701 {
3702 /* PR binutils/12467. */
3703 if (elf_header.e_phoff != 0)
3704 warn (_("possibly corrupt ELF header - it has a non-zero program"
3705 " header offset, but no program headers"));
3706 else if (do_segments)
3707 printf (_("\nThere are no program headers in this file.\n"));
3708 return 0;
3709 }
3710
3711 if (do_segments && !do_header)
3712 {
3713 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3714 printf (_("Entry point "));
3715 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3716 printf (_("\nThere are %d program headers, starting at offset "),
3717 elf_header.e_phnum);
3718 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3719 printf ("\n");
3720 }
3721
3722 if (! get_program_headers (file))
3723 return 0;
3724
3725 if (do_segments)
3726 {
3727 if (elf_header.e_phnum > 1)
3728 printf (_("\nProgram Headers:\n"));
3729 else
3730 printf (_("\nProgram Headers:\n"));
3731
3732 if (is_32bit_elf)
3733 printf
3734 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3735 else if (do_wide)
3736 printf
3737 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3738 else
3739 {
3740 printf
3741 (_(" Type Offset VirtAddr PhysAddr\n"));
3742 printf
3743 (_(" FileSiz MemSiz Flags Align\n"));
3744 }
3745 }
3746
3747 dynamic_addr = 0;
3748 dynamic_size = 0;
3749
3750 for (i = 0, segment = program_headers;
3751 i < elf_header.e_phnum;
3752 i++, segment++)
3753 {
3754 if (do_segments)
3755 {
3756 printf (" %-14.14s ", get_segment_type (segment->p_type));
3757
3758 if (is_32bit_elf)
3759 {
3760 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3761 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3762 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3763 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3764 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3765 printf ("%c%c%c ",
3766 (segment->p_flags & PF_R ? 'R' : ' '),
3767 (segment->p_flags & PF_W ? 'W' : ' '),
3768 (segment->p_flags & PF_X ? 'E' : ' '));
3769 printf ("%#lx", (unsigned long) segment->p_align);
3770 }
3771 else if (do_wide)
3772 {
3773 if ((unsigned long) segment->p_offset == segment->p_offset)
3774 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3775 else
3776 {
3777 print_vma (segment->p_offset, FULL_HEX);
3778 putchar (' ');
3779 }
3780
3781 print_vma (segment->p_vaddr, FULL_HEX);
3782 putchar (' ');
3783 print_vma (segment->p_paddr, FULL_HEX);
3784 putchar (' ');
3785
3786 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3787 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3788 else
3789 {
3790 print_vma (segment->p_filesz, FULL_HEX);
3791 putchar (' ');
3792 }
3793
3794 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3795 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3796 else
3797 {
3798 print_vma (segment->p_offset, FULL_HEX);
3799 }
3800
3801 printf (" %c%c%c ",
3802 (segment->p_flags & PF_R ? 'R' : ' '),
3803 (segment->p_flags & PF_W ? 'W' : ' '),
3804 (segment->p_flags & PF_X ? 'E' : ' '));
3805
3806 if ((unsigned long) segment->p_align == segment->p_align)
3807 printf ("%#lx", (unsigned long) segment->p_align);
3808 else
3809 {
3810 print_vma (segment->p_align, PREFIX_HEX);
3811 }
3812 }
3813 else
3814 {
3815 print_vma (segment->p_offset, FULL_HEX);
3816 putchar (' ');
3817 print_vma (segment->p_vaddr, FULL_HEX);
3818 putchar (' ');
3819 print_vma (segment->p_paddr, FULL_HEX);
3820 printf ("\n ");
3821 print_vma (segment->p_filesz, FULL_HEX);
3822 putchar (' ');
3823 print_vma (segment->p_memsz, FULL_HEX);
3824 printf (" %c%c%c ",
3825 (segment->p_flags & PF_R ? 'R' : ' '),
3826 (segment->p_flags & PF_W ? 'W' : ' '),
3827 (segment->p_flags & PF_X ? 'E' : ' '));
3828 print_vma (segment->p_align, HEX);
3829 }
3830 }
3831
3832 switch (segment->p_type)
3833 {
3834 case PT_DYNAMIC:
3835 if (dynamic_addr)
3836 error (_("more than one dynamic segment\n"));
3837
3838 /* By default, assume that the .dynamic section is the first
3839 section in the DYNAMIC segment. */
3840 dynamic_addr = segment->p_offset;
3841 dynamic_size = segment->p_filesz;
3842
3843 /* Try to locate the .dynamic section. If there is
3844 a section header table, we can easily locate it. */
3845 if (section_headers != NULL)
3846 {
3847 Elf_Internal_Shdr * sec;
3848
3849 sec = find_section (".dynamic");
3850 if (sec == NULL || sec->sh_size == 0)
3851 {
3852 /* A corresponding .dynamic section is expected, but on
3853 IA-64/OpenVMS it is OK for it to be missing. */
3854 if (!is_ia64_vms ())
3855 error (_("no .dynamic section in the dynamic segment\n"));
3856 break;
3857 }
3858
3859 if (sec->sh_type == SHT_NOBITS)
3860 {
3861 dynamic_size = 0;
3862 break;
3863 }
3864
3865 dynamic_addr = sec->sh_offset;
3866 dynamic_size = sec->sh_size;
3867
3868 if (dynamic_addr < segment->p_offset
3869 || dynamic_addr > segment->p_offset + segment->p_filesz)
3870 warn (_("the .dynamic section is not contained"
3871 " within the dynamic segment\n"));
3872 else if (dynamic_addr > segment->p_offset)
3873 warn (_("the .dynamic section is not the first section"
3874 " in the dynamic segment.\n"));
3875 }
3876 break;
3877
3878 case PT_INTERP:
3879 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3880 SEEK_SET))
3881 error (_("Unable to find program interpreter name\n"));
3882 else
3883 {
3884 char fmt [32];
3885 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3886
3887 if (ret >= (int) sizeof (fmt) || ret < 0)
3888 error (_("Internal error: failed to create format string to display program interpreter\n"));
3889
3890 program_interpreter[0] = 0;
3891 if (fscanf (file, fmt, program_interpreter) <= 0)
3892 error (_("Unable to read program interpreter name\n"));
3893
3894 if (do_segments)
3895 printf (_("\n [Requesting program interpreter: %s]"),
3896 program_interpreter);
3897 }
3898 break;
3899 }
3900
3901 if (do_segments)
3902 putc ('\n', stdout);
3903 }
3904
3905 if (do_segments && section_headers != NULL && string_table != NULL)
3906 {
3907 printf (_("\n Section to Segment mapping:\n"));
3908 printf (_(" Segment Sections...\n"));
3909
3910 for (i = 0; i < elf_header.e_phnum; i++)
3911 {
3912 unsigned int j;
3913 Elf_Internal_Shdr * section;
3914
3915 segment = program_headers + i;
3916 section = section_headers + 1;
3917
3918 printf (" %2.2d ", i);
3919
3920 for (j = 1; j < elf_header.e_shnum; j++, section++)
3921 {
3922 if (!ELF_TBSS_SPECIAL (section, segment)
3923 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
3924 printf ("%s ", SECTION_NAME (section));
3925 }
3926
3927 putc ('\n',stdout);
3928 }
3929 }
3930
3931 return 1;
3932 }
3933
3934
3935 /* Find the file offset corresponding to VMA by using the program headers. */
3936
3937 static long
3938 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
3939 {
3940 Elf_Internal_Phdr * seg;
3941
3942 if (! get_program_headers (file))
3943 {
3944 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3945 return (long) vma;
3946 }
3947
3948 for (seg = program_headers;
3949 seg < program_headers + elf_header.e_phnum;
3950 ++seg)
3951 {
3952 if (seg->p_type != PT_LOAD)
3953 continue;
3954
3955 if (vma >= (seg->p_vaddr & -seg->p_align)
3956 && vma + size <= seg->p_vaddr + seg->p_filesz)
3957 return vma - seg->p_vaddr + seg->p_offset;
3958 }
3959
3960 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3961 (unsigned long) vma);
3962 return (long) vma;
3963 }
3964
3965
3966 static int
3967 get_32bit_section_headers (FILE * file, unsigned int num)
3968 {
3969 Elf32_External_Shdr * shdrs;
3970 Elf_Internal_Shdr * internal;
3971 unsigned int i;
3972
3973 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3974 elf_header.e_shentsize, num,
3975 _("section headers"));
3976 if (!shdrs)
3977 return 0;
3978
3979 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3980 sizeof (Elf_Internal_Shdr));
3981
3982 if (section_headers == NULL)
3983 {
3984 error (_("Out of memory\n"));
3985 return 0;
3986 }
3987
3988 for (i = 0, internal = section_headers;
3989 i < num;
3990 i++, internal++)
3991 {
3992 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3993 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3994 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3995 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3996 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3997 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3998 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3999 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4000 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4001 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4002 }
4003
4004 free (shdrs);
4005
4006 return 1;
4007 }
4008
4009 static int
4010 get_64bit_section_headers (FILE * file, unsigned int num)
4011 {
4012 Elf64_External_Shdr * shdrs;
4013 Elf_Internal_Shdr * internal;
4014 unsigned int i;
4015
4016 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4017 elf_header.e_shentsize, num,
4018 _("section headers"));
4019 if (!shdrs)
4020 return 0;
4021
4022 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4023 sizeof (Elf_Internal_Shdr));
4024
4025 if (section_headers == NULL)
4026 {
4027 error (_("Out of memory\n"));
4028 return 0;
4029 }
4030
4031 for (i = 0, internal = section_headers;
4032 i < num;
4033 i++, internal++)
4034 {
4035 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4036 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4037 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4038 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4039 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4040 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4041 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4042 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4043 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4044 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4045 }
4046
4047 free (shdrs);
4048
4049 return 1;
4050 }
4051
4052 static Elf_Internal_Sym *
4053 get_32bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4054 {
4055 unsigned long number;
4056 Elf32_External_Sym * esyms = NULL;
4057 Elf_External_Sym_Shndx * shndx;
4058 Elf_Internal_Sym * isyms = NULL;
4059 Elf_Internal_Sym * psym;
4060 unsigned int j;
4061
4062 /* Run some sanity checks first. */
4063 if (section->sh_entsize == 0)
4064 {
4065 error (_("sh_entsize is zero\n"));
4066 return NULL;
4067 }
4068
4069 number = section->sh_size / section->sh_entsize;
4070
4071 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4072 {
4073 error (_("Invalid sh_entsize\n"));
4074 return NULL;
4075 }
4076
4077 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4078 section->sh_size, _("symbols"));
4079 if (esyms == NULL)
4080 return NULL;
4081
4082 shndx = NULL;
4083 if (symtab_shndx_hdr != NULL
4084 && (symtab_shndx_hdr->sh_link
4085 == (unsigned long) (section - section_headers)))
4086 {
4087 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4088 symtab_shndx_hdr->sh_offset,
4089 1, symtab_shndx_hdr->sh_size,
4090 _("symtab shndx"));
4091 if (shndx == NULL)
4092 goto exit_point;
4093 }
4094
4095 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4096
4097 if (isyms == NULL)
4098 {
4099 error (_("Out of memory\n"));
4100 goto exit_point;
4101 }
4102
4103 for (j = 0, psym = isyms; j < number; j++, psym++)
4104 {
4105 psym->st_name = BYTE_GET (esyms[j].st_name);
4106 psym->st_value = BYTE_GET (esyms[j].st_value);
4107 psym->st_size = BYTE_GET (esyms[j].st_size);
4108 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4109 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4110 psym->st_shndx
4111 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4112 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4113 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4114 psym->st_info = BYTE_GET (esyms[j].st_info);
4115 psym->st_other = BYTE_GET (esyms[j].st_other);
4116 }
4117
4118 exit_point:
4119 if (shndx)
4120 free (shndx);
4121 if (esyms)
4122 free (esyms);
4123
4124 return isyms;
4125 }
4126
4127 static Elf_Internal_Sym *
4128 get_64bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4129 {
4130 unsigned long number;
4131 Elf64_External_Sym * esyms;
4132 Elf_External_Sym_Shndx * shndx;
4133 Elf_Internal_Sym * isyms;
4134 Elf_Internal_Sym * psym;
4135 unsigned int j;
4136
4137 /* Run some sanity checks first. */
4138 if (section->sh_entsize == 0)
4139 {
4140 error (_("sh_entsize is zero\n"));
4141 return NULL;
4142 }
4143
4144 number = section->sh_size / section->sh_entsize;
4145
4146 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4147 {
4148 error (_("Invalid sh_entsize\n"));
4149 return NULL;
4150 }
4151
4152 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4153 section->sh_size, _("symbols"));
4154 if (!esyms)
4155 return NULL;
4156
4157 shndx = NULL;
4158 if (symtab_shndx_hdr != NULL
4159 && (symtab_shndx_hdr->sh_link
4160 == (unsigned long) (section - section_headers)))
4161 {
4162 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4163 symtab_shndx_hdr->sh_offset,
4164 1, symtab_shndx_hdr->sh_size,
4165 _("symtab shndx"));
4166 if (!shndx)
4167 {
4168 free (esyms);
4169 return NULL;
4170 }
4171 }
4172
4173 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4174
4175 if (isyms == NULL)
4176 {
4177 error (_("Out of memory\n"));
4178 if (shndx)
4179 free (shndx);
4180 free (esyms);
4181 return NULL;
4182 }
4183
4184 for (j = 0, psym = isyms;
4185 j < number;
4186 j++, psym++)
4187 {
4188 psym->st_name = BYTE_GET (esyms[j].st_name);
4189 psym->st_info = BYTE_GET (esyms[j].st_info);
4190 psym->st_other = BYTE_GET (esyms[j].st_other);
4191 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4192 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4193 psym->st_shndx
4194 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4195 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4196 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4197 psym->st_value = BYTE_GET (esyms[j].st_value);
4198 psym->st_size = BYTE_GET (esyms[j].st_size);
4199 }
4200
4201 if (shndx)
4202 free (shndx);
4203 free (esyms);
4204
4205 return isyms;
4206 }
4207
4208 static const char *
4209 get_elf_section_flags (bfd_vma sh_flags)
4210 {
4211 static char buff[1024];
4212 char * p = buff;
4213 int field_size = is_32bit_elf ? 8 : 16;
4214 int sindex;
4215 int size = sizeof (buff) - (field_size + 4 + 1);
4216 bfd_vma os_flags = 0;
4217 bfd_vma proc_flags = 0;
4218 bfd_vma unknown_flags = 0;
4219 static const struct
4220 {
4221 const char * str;
4222 int len;
4223 }
4224 flags [] =
4225 {
4226 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4227 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4228 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4229 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4230 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4231 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4232 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4233 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4234 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4235 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4236 /* IA-64 specific. */
4237 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4238 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4239 /* IA-64 OpenVMS specific. */
4240 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4241 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4242 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4243 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4244 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4245 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4246 /* Generic. */
4247 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4248 /* SPARC specific. */
4249 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4250 };
4251
4252 if (do_section_details)
4253 {
4254 sprintf (buff, "[%*.*lx]: ",
4255 field_size, field_size, (unsigned long) sh_flags);
4256 p += field_size + 4;
4257 }
4258
4259 while (sh_flags)
4260 {
4261 bfd_vma flag;
4262
4263 flag = sh_flags & - sh_flags;
4264 sh_flags &= ~ flag;
4265
4266 if (do_section_details)
4267 {
4268 switch (flag)
4269 {
4270 case SHF_WRITE: sindex = 0; break;
4271 case SHF_ALLOC: sindex = 1; break;
4272 case SHF_EXECINSTR: sindex = 2; break;
4273 case SHF_MERGE: sindex = 3; break;
4274 case SHF_STRINGS: sindex = 4; break;
4275 case SHF_INFO_LINK: sindex = 5; break;
4276 case SHF_LINK_ORDER: sindex = 6; break;
4277 case SHF_OS_NONCONFORMING: sindex = 7; break;
4278 case SHF_GROUP: sindex = 8; break;
4279 case SHF_TLS: sindex = 9; break;
4280 case SHF_EXCLUDE: sindex = 18; break;
4281
4282 default:
4283 sindex = -1;
4284 switch (elf_header.e_machine)
4285 {
4286 case EM_IA_64:
4287 if (flag == SHF_IA_64_SHORT)
4288 sindex = 10;
4289 else if (flag == SHF_IA_64_NORECOV)
4290 sindex = 11;
4291 #ifdef BFD64
4292 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4293 switch (flag)
4294 {
4295 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4296 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4297 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4298 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4299 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4300 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4301 default: break;
4302 }
4303 #endif
4304 break;
4305
4306 case EM_386:
4307 case EM_486:
4308 case EM_X86_64:
4309 case EM_L1OM:
4310 case EM_K1OM:
4311 case EM_OLD_SPARCV9:
4312 case EM_SPARC32PLUS:
4313 case EM_SPARCV9:
4314 case EM_SPARC:
4315 if (flag == SHF_ORDERED)
4316 sindex = 19;
4317 break;
4318 default:
4319 break;
4320 }
4321 }
4322
4323 if (sindex != -1)
4324 {
4325 if (p != buff + field_size + 4)
4326 {
4327 if (size < (10 + 2))
4328 abort ();
4329 size -= 2;
4330 *p++ = ',';
4331 *p++ = ' ';
4332 }
4333
4334 size -= flags [sindex].len;
4335 p = stpcpy (p, flags [sindex].str);
4336 }
4337 else if (flag & SHF_MASKOS)
4338 os_flags |= flag;
4339 else if (flag & SHF_MASKPROC)
4340 proc_flags |= flag;
4341 else
4342 unknown_flags |= flag;
4343 }
4344 else
4345 {
4346 switch (flag)
4347 {
4348 case SHF_WRITE: *p = 'W'; break;
4349 case SHF_ALLOC: *p = 'A'; break;
4350 case SHF_EXECINSTR: *p = 'X'; break;
4351 case SHF_MERGE: *p = 'M'; break;
4352 case SHF_STRINGS: *p = 'S'; break;
4353 case SHF_INFO_LINK: *p = 'I'; break;
4354 case SHF_LINK_ORDER: *p = 'L'; break;
4355 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4356 case SHF_GROUP: *p = 'G'; break;
4357 case SHF_TLS: *p = 'T'; break;
4358 case SHF_EXCLUDE: *p = 'E'; break;
4359
4360 default:
4361 if ((elf_header.e_machine == EM_X86_64
4362 || elf_header.e_machine == EM_L1OM
4363 || elf_header.e_machine == EM_K1OM)
4364 && flag == SHF_X86_64_LARGE)
4365 *p = 'l';
4366 else if (flag & SHF_MASKOS)
4367 {
4368 *p = 'o';
4369 sh_flags &= ~ SHF_MASKOS;
4370 }
4371 else if (flag & SHF_MASKPROC)
4372 {
4373 *p = 'p';
4374 sh_flags &= ~ SHF_MASKPROC;
4375 }
4376 else
4377 *p = 'x';
4378 break;
4379 }
4380 p++;
4381 }
4382 }
4383
4384 if (do_section_details)
4385 {
4386 if (os_flags)
4387 {
4388 size -= 5 + field_size;
4389 if (p != buff + field_size + 4)
4390 {
4391 if (size < (2 + 1))
4392 abort ();
4393 size -= 2;
4394 *p++ = ',';
4395 *p++ = ' ';
4396 }
4397 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4398 (unsigned long) os_flags);
4399 p += 5 + field_size;
4400 }
4401 if (proc_flags)
4402 {
4403 size -= 7 + field_size;
4404 if (p != buff + field_size + 4)
4405 {
4406 if (size < (2 + 1))
4407 abort ();
4408 size -= 2;
4409 *p++ = ',';
4410 *p++ = ' ';
4411 }
4412 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4413 (unsigned long) proc_flags);
4414 p += 7 + field_size;
4415 }
4416 if (unknown_flags)
4417 {
4418 size -= 10 + field_size;
4419 if (p != buff + field_size + 4)
4420 {
4421 if (size < (2 + 1))
4422 abort ();
4423 size -= 2;
4424 *p++ = ',';
4425 *p++ = ' ';
4426 }
4427 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4428 (unsigned long) unknown_flags);
4429 p += 10 + field_size;
4430 }
4431 }
4432
4433 *p = '\0';
4434 return buff;
4435 }
4436
4437 static int
4438 process_section_headers (FILE * file)
4439 {
4440 Elf_Internal_Shdr * section;
4441 unsigned int i;
4442
4443 section_headers = NULL;
4444
4445 if (elf_header.e_shnum == 0)
4446 {
4447 /* PR binutils/12467. */
4448 if (elf_header.e_shoff != 0)
4449 warn (_("possibly corrupt ELF file header - it has a non-zero"
4450 " section header offset, but no section headers\n"));
4451 else if (do_sections)
4452 printf (_("\nThere are no sections in this file.\n"));
4453
4454 return 1;
4455 }
4456
4457 if (do_sections && !do_header)
4458 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4459 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4460
4461 if (is_32bit_elf)
4462 {
4463 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4464 return 0;
4465 }
4466 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4467 return 0;
4468
4469 /* Read in the string table, so that we have names to display. */
4470 if (elf_header.e_shstrndx != SHN_UNDEF
4471 && elf_header.e_shstrndx < elf_header.e_shnum)
4472 {
4473 section = section_headers + elf_header.e_shstrndx;
4474
4475 if (section->sh_size != 0)
4476 {
4477 string_table = (char *) get_data (NULL, file, section->sh_offset,
4478 1, section->sh_size,
4479 _("string table"));
4480
4481 string_table_length = string_table != NULL ? section->sh_size : 0;
4482 }
4483 }
4484
4485 /* Scan the sections for the dynamic symbol table
4486 and dynamic string table and debug sections. */
4487 dynamic_symbols = NULL;
4488 dynamic_strings = NULL;
4489 dynamic_syminfo = NULL;
4490 symtab_shndx_hdr = NULL;
4491
4492 eh_addr_size = is_32bit_elf ? 4 : 8;
4493 switch (elf_header.e_machine)
4494 {
4495 case EM_MIPS:
4496 case EM_MIPS_RS3_LE:
4497 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4498 FDE addresses. However, the ABI also has a semi-official ILP32
4499 variant for which the normal FDE address size rules apply.
4500
4501 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4502 section, where XX is the size of longs in bits. Unfortunately,
4503 earlier compilers provided no way of distinguishing ILP32 objects
4504 from LP64 objects, so if there's any doubt, we should assume that
4505 the official LP64 form is being used. */
4506 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4507 && find_section (".gcc_compiled_long32") == NULL)
4508 eh_addr_size = 8;
4509 break;
4510
4511 case EM_H8_300:
4512 case EM_H8_300H:
4513 switch (elf_header.e_flags & EF_H8_MACH)
4514 {
4515 case E_H8_MACH_H8300:
4516 case E_H8_MACH_H8300HN:
4517 case E_H8_MACH_H8300SN:
4518 case E_H8_MACH_H8300SXN:
4519 eh_addr_size = 2;
4520 break;
4521 case E_H8_MACH_H8300H:
4522 case E_H8_MACH_H8300S:
4523 case E_H8_MACH_H8300SX:
4524 eh_addr_size = 4;
4525 break;
4526 }
4527 break;
4528
4529 case EM_M32C_OLD:
4530 case EM_M32C:
4531 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4532 {
4533 case EF_M32C_CPU_M16C:
4534 eh_addr_size = 2;
4535 break;
4536 }
4537 break;
4538 }
4539
4540 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4541 do \
4542 { \
4543 size_t expected_entsize \
4544 = is_32bit_elf ? size32 : size64; \
4545 if (section->sh_entsize != expected_entsize) \
4546 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4547 i, (unsigned long int) section->sh_entsize, \
4548 (unsigned long int) expected_entsize); \
4549 section->sh_entsize = expected_entsize; \
4550 } \
4551 while (0)
4552 #define CHECK_ENTSIZE(section, i, type) \
4553 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4554 sizeof (Elf64_External_##type))
4555
4556 for (i = 0, section = section_headers;
4557 i < elf_header.e_shnum;
4558 i++, section++)
4559 {
4560 char * name = SECTION_NAME (section);
4561
4562 if (section->sh_type == SHT_DYNSYM)
4563 {
4564 if (dynamic_symbols != NULL)
4565 {
4566 error (_("File contains multiple dynamic symbol tables\n"));
4567 continue;
4568 }
4569
4570 CHECK_ENTSIZE (section, i, Sym);
4571 num_dynamic_syms = section->sh_size / section->sh_entsize;
4572 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4573 }
4574 else if (section->sh_type == SHT_STRTAB
4575 && streq (name, ".dynstr"))
4576 {
4577 if (dynamic_strings != NULL)
4578 {
4579 error (_("File contains multiple dynamic string tables\n"));
4580 continue;
4581 }
4582
4583 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4584 1, section->sh_size,
4585 _("dynamic strings"));
4586 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4587 }
4588 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4589 {
4590 if (symtab_shndx_hdr != NULL)
4591 {
4592 error (_("File contains multiple symtab shndx tables\n"));
4593 continue;
4594 }
4595 symtab_shndx_hdr = section;
4596 }
4597 else if (section->sh_type == SHT_SYMTAB)
4598 CHECK_ENTSIZE (section, i, Sym);
4599 else if (section->sh_type == SHT_GROUP)
4600 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4601 else if (section->sh_type == SHT_REL)
4602 CHECK_ENTSIZE (section, i, Rel);
4603 else if (section->sh_type == SHT_RELA)
4604 CHECK_ENTSIZE (section, i, Rela);
4605 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4606 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4607 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4608 || do_debug_str || do_debug_loc || do_debug_ranges)
4609 && (const_strneq (name, ".debug_")
4610 || const_strneq (name, ".zdebug_")))
4611 {
4612 if (name[1] == 'z')
4613 name += sizeof (".zdebug_") - 1;
4614 else
4615 name += sizeof (".debug_") - 1;
4616
4617 if (do_debugging
4618 || (do_debug_info && streq (name, "info"))
4619 || (do_debug_info && streq (name, "types"))
4620 || (do_debug_abbrevs && streq (name, "abbrev"))
4621 || (do_debug_lines && streq (name, "line"))
4622 || (do_debug_pubnames && streq (name, "pubnames"))
4623 || (do_debug_pubtypes && streq (name, "pubtypes"))
4624 || (do_debug_aranges && streq (name, "aranges"))
4625 || (do_debug_ranges && streq (name, "ranges"))
4626 || (do_debug_frames && streq (name, "frame"))
4627 || (do_debug_macinfo && streq (name, "macinfo"))
4628 || (do_debug_macinfo && streq (name, "macro"))
4629 || (do_debug_str && streq (name, "str"))
4630 || (do_debug_loc && streq (name, "loc"))
4631 )
4632 request_dump_bynumber (i, DEBUG_DUMP);
4633 }
4634 /* Linkonce section to be combined with .debug_info at link time. */
4635 else if ((do_debugging || do_debug_info)
4636 && const_strneq (name, ".gnu.linkonce.wi."))
4637 request_dump_bynumber (i, DEBUG_DUMP);
4638 else if (do_debug_frames && streq (name, ".eh_frame"))
4639 request_dump_bynumber (i, DEBUG_DUMP);
4640 else if (do_gdb_index && streq (name, ".gdb_index"))
4641 request_dump_bynumber (i, DEBUG_DUMP);
4642 /* Trace sections for Itanium VMS. */
4643 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4644 || do_trace_aranges)
4645 && const_strneq (name, ".trace_"))
4646 {
4647 name += sizeof (".trace_") - 1;
4648
4649 if (do_debugging
4650 || (do_trace_info && streq (name, "info"))
4651 || (do_trace_abbrevs && streq (name, "abbrev"))
4652 || (do_trace_aranges && streq (name, "aranges"))
4653 )
4654 request_dump_bynumber (i, DEBUG_DUMP);
4655 }
4656
4657 }
4658
4659 if (! do_sections)
4660 return 1;
4661
4662 if (elf_header.e_shnum > 1)
4663 printf (_("\nSection Headers:\n"));
4664 else
4665 printf (_("\nSection Header:\n"));
4666
4667 if (is_32bit_elf)
4668 {
4669 if (do_section_details)
4670 {
4671 printf (_(" [Nr] Name\n"));
4672 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4673 }
4674 else
4675 printf
4676 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4677 }
4678 else if (do_wide)
4679 {
4680 if (do_section_details)
4681 {
4682 printf (_(" [Nr] Name\n"));
4683 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4684 }
4685 else
4686 printf
4687 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4688 }
4689 else
4690 {
4691 if (do_section_details)
4692 {
4693 printf (_(" [Nr] Name\n"));
4694 printf (_(" Type Address Offset Link\n"));
4695 printf (_(" Size EntSize Info Align\n"));
4696 }
4697 else
4698 {
4699 printf (_(" [Nr] Name Type Address Offset\n"));
4700 printf (_(" Size EntSize Flags Link Info Align\n"));
4701 }
4702 }
4703
4704 if (do_section_details)
4705 printf (_(" Flags\n"));
4706
4707 for (i = 0, section = section_headers;
4708 i < elf_header.e_shnum;
4709 i++, section++)
4710 {
4711 if (do_section_details)
4712 {
4713 printf (" [%2u] %s\n",
4714 i,
4715 SECTION_NAME (section));
4716 if (is_32bit_elf || do_wide)
4717 printf (" %-15.15s ",
4718 get_section_type_name (section->sh_type));
4719 }
4720 else
4721 printf ((do_wide ? " [%2u] %-17s %-15s "
4722 : " [%2u] %-17.17s %-15.15s "),
4723 i,
4724 SECTION_NAME (section),
4725 get_section_type_name (section->sh_type));
4726
4727 if (is_32bit_elf)
4728 {
4729 const char * link_too_big = NULL;
4730
4731 print_vma (section->sh_addr, LONG_HEX);
4732
4733 printf ( " %6.6lx %6.6lx %2.2lx",
4734 (unsigned long) section->sh_offset,
4735 (unsigned long) section->sh_size,
4736 (unsigned long) section->sh_entsize);
4737
4738 if (do_section_details)
4739 fputs (" ", stdout);
4740 else
4741 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4742
4743 if (section->sh_link >= elf_header.e_shnum)
4744 {
4745 link_too_big = "";
4746 /* The sh_link value is out of range. Normally this indicates
4747 an error but it can have special values in Solaris binaries. */
4748 switch (elf_header.e_machine)
4749 {
4750 case EM_386:
4751 case EM_486:
4752 case EM_X86_64:
4753 case EM_L1OM:
4754 case EM_K1OM:
4755 case EM_OLD_SPARCV9:
4756 case EM_SPARC32PLUS:
4757 case EM_SPARCV9:
4758 case EM_SPARC:
4759 if (section->sh_link == (SHN_BEFORE & 0xffff))
4760 link_too_big = "BEFORE";
4761 else if (section->sh_link == (SHN_AFTER & 0xffff))
4762 link_too_big = "AFTER";
4763 break;
4764 default:
4765 break;
4766 }
4767 }
4768
4769 if (do_section_details)
4770 {
4771 if (link_too_big != NULL && * link_too_big)
4772 printf ("<%s> ", link_too_big);
4773 else
4774 printf ("%2u ", section->sh_link);
4775 printf ("%3u %2lu\n", section->sh_info,
4776 (unsigned long) section->sh_addralign);
4777 }
4778 else
4779 printf ("%2u %3u %2lu\n",
4780 section->sh_link,
4781 section->sh_info,
4782 (unsigned long) section->sh_addralign);
4783
4784 if (link_too_big && ! * link_too_big)
4785 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4786 i, section->sh_link);
4787 }
4788 else if (do_wide)
4789 {
4790 print_vma (section->sh_addr, LONG_HEX);
4791
4792 if ((long) section->sh_offset == section->sh_offset)
4793 printf (" %6.6lx", (unsigned long) section->sh_offset);
4794 else
4795 {
4796 putchar (' ');
4797 print_vma (section->sh_offset, LONG_HEX);
4798 }
4799
4800 if ((unsigned long) section->sh_size == section->sh_size)
4801 printf (" %6.6lx", (unsigned long) section->sh_size);
4802 else
4803 {
4804 putchar (' ');
4805 print_vma (section->sh_size, LONG_HEX);
4806 }
4807
4808 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4809 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4810 else
4811 {
4812 putchar (' ');
4813 print_vma (section->sh_entsize, LONG_HEX);
4814 }
4815
4816 if (do_section_details)
4817 fputs (" ", stdout);
4818 else
4819 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4820
4821 printf ("%2u %3u ", section->sh_link, section->sh_info);
4822
4823 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4824 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4825 else
4826 {
4827 print_vma (section->sh_addralign, DEC);
4828 putchar ('\n');
4829 }
4830 }
4831 else if (do_section_details)
4832 {
4833 printf (" %-15.15s ",
4834 get_section_type_name (section->sh_type));
4835 print_vma (section->sh_addr, LONG_HEX);
4836 if ((long) section->sh_offset == section->sh_offset)
4837 printf (" %16.16lx", (unsigned long) section->sh_offset);
4838 else
4839 {
4840 printf (" ");
4841 print_vma (section->sh_offset, LONG_HEX);
4842 }
4843 printf (" %u\n ", section->sh_link);
4844 print_vma (section->sh_size, LONG_HEX);
4845 putchar (' ');
4846 print_vma (section->sh_entsize, LONG_HEX);
4847
4848 printf (" %-16u %lu\n",
4849 section->sh_info,
4850 (unsigned long) section->sh_addralign);
4851 }
4852 else
4853 {
4854 putchar (' ');
4855 print_vma (section->sh_addr, LONG_HEX);
4856 if ((long) section->sh_offset == section->sh_offset)
4857 printf (" %8.8lx", (unsigned long) section->sh_offset);
4858 else
4859 {
4860 printf (" ");
4861 print_vma (section->sh_offset, LONG_HEX);
4862 }
4863 printf ("\n ");
4864 print_vma (section->sh_size, LONG_HEX);
4865 printf (" ");
4866 print_vma (section->sh_entsize, LONG_HEX);
4867
4868 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4869
4870 printf (" %2u %3u %lu\n",
4871 section->sh_link,
4872 section->sh_info,
4873 (unsigned long) section->sh_addralign);
4874 }
4875
4876 if (do_section_details)
4877 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4878 }
4879
4880 if (!do_section_details)
4881 {
4882 if (elf_header.e_machine == EM_X86_64
4883 || elf_header.e_machine == EM_L1OM
4884 || elf_header.e_machine == EM_K1OM)
4885 printf (_("Key to Flags:\n\
4886 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4887 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4888 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4889 else
4890 printf (_("Key to Flags:\n\
4891 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4892 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4893 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4894 }
4895
4896 return 1;
4897 }
4898
4899 static const char *
4900 get_group_flags (unsigned int flags)
4901 {
4902 static char buff[32];
4903 switch (flags)
4904 {
4905 case 0:
4906 return "";
4907
4908 case GRP_COMDAT:
4909 return "COMDAT ";
4910
4911 default:
4912 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
4913 break;
4914 }
4915 return buff;
4916 }
4917
4918 static int
4919 process_section_groups (FILE * file)
4920 {
4921 Elf_Internal_Shdr * section;
4922 unsigned int i;
4923 struct group * group;
4924 Elf_Internal_Shdr * symtab_sec;
4925 Elf_Internal_Shdr * strtab_sec;
4926 Elf_Internal_Sym * symtab;
4927 char * strtab;
4928 size_t strtab_size;
4929
4930 /* Don't process section groups unless needed. */
4931 if (!do_unwind && !do_section_groups)
4932 return 1;
4933
4934 if (elf_header.e_shnum == 0)
4935 {
4936 if (do_section_groups)
4937 printf (_("\nThere are no sections to group in this file.\n"));
4938
4939 return 1;
4940 }
4941
4942 if (section_headers == NULL)
4943 {
4944 error (_("Section headers are not available!\n"));
4945 abort ();
4946 }
4947
4948 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
4949 sizeof (struct group *));
4950
4951 if (section_headers_groups == NULL)
4952 {
4953 error (_("Out of memory\n"));
4954 return 0;
4955 }
4956
4957 /* Scan the sections for the group section. */
4958 group_count = 0;
4959 for (i = 0, section = section_headers;
4960 i < elf_header.e_shnum;
4961 i++, section++)
4962 if (section->sh_type == SHT_GROUP)
4963 group_count++;
4964
4965 if (group_count == 0)
4966 {
4967 if (do_section_groups)
4968 printf (_("\nThere are no section groups in this file.\n"));
4969
4970 return 1;
4971 }
4972
4973 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
4974
4975 if (section_groups == NULL)
4976 {
4977 error (_("Out of memory\n"));
4978 return 0;
4979 }
4980
4981 symtab_sec = NULL;
4982 strtab_sec = NULL;
4983 symtab = NULL;
4984 strtab = NULL;
4985 strtab_size = 0;
4986 for (i = 0, section = section_headers, group = section_groups;
4987 i < elf_header.e_shnum;
4988 i++, section++)
4989 {
4990 if (section->sh_type == SHT_GROUP)
4991 {
4992 char * name = SECTION_NAME (section);
4993 char * group_name;
4994 unsigned char * start;
4995 unsigned char * indices;
4996 unsigned int entry, j, size;
4997 Elf_Internal_Shdr * sec;
4998 Elf_Internal_Sym * sym;
4999
5000 /* Get the symbol table. */
5001 if (section->sh_link >= elf_header.e_shnum
5002 || ((sec = section_headers + section->sh_link)->sh_type
5003 != SHT_SYMTAB))
5004 {
5005 error (_("Bad sh_link in group section `%s'\n"), name);
5006 continue;
5007 }
5008
5009 if (symtab_sec != sec)
5010 {
5011 symtab_sec = sec;
5012 if (symtab)
5013 free (symtab);
5014 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
5015 }
5016
5017 if (symtab == NULL)
5018 {
5019 error (_("Corrupt header in group section `%s'\n"), name);
5020 continue;
5021 }
5022
5023 sym = symtab + section->sh_info;
5024
5025 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5026 {
5027 if (sym->st_shndx == 0
5028 || sym->st_shndx >= elf_header.e_shnum)
5029 {
5030 error (_("Bad sh_info in group section `%s'\n"), name);
5031 continue;
5032 }
5033
5034 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5035 strtab_sec = NULL;
5036 if (strtab)
5037 free (strtab);
5038 strtab = NULL;
5039 strtab_size = 0;
5040 }
5041 else
5042 {
5043 /* Get the string table. */
5044 if (symtab_sec->sh_link >= elf_header.e_shnum)
5045 {
5046 strtab_sec = NULL;
5047 if (strtab)
5048 free (strtab);
5049 strtab = NULL;
5050 strtab_size = 0;
5051 }
5052 else if (strtab_sec
5053 != (sec = section_headers + symtab_sec->sh_link))
5054 {
5055 strtab_sec = sec;
5056 if (strtab)
5057 free (strtab);
5058 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5059 1, strtab_sec->sh_size,
5060 _("string table"));
5061 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5062 }
5063 group_name = sym->st_name < strtab_size
5064 ? strtab + sym->st_name : _("<corrupt>");
5065 }
5066
5067 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5068 1, section->sh_size,
5069 _("section data"));
5070 if (start == NULL)
5071 continue;
5072
5073 indices = start;
5074 size = (section->sh_size / section->sh_entsize) - 1;
5075 entry = byte_get (indices, 4);
5076 indices += 4;
5077
5078 if (do_section_groups)
5079 {
5080 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5081 get_group_flags (entry), i, name, group_name, size);
5082
5083 printf (_(" [Index] Name\n"));
5084 }
5085
5086 group->group_index = i;
5087
5088 for (j = 0; j < size; j++)
5089 {
5090 struct group_list * g;
5091
5092 entry = byte_get (indices, 4);
5093 indices += 4;
5094
5095 if (entry >= elf_header.e_shnum)
5096 {
5097 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5098 entry, i, elf_header.e_shnum - 1);
5099 continue;
5100 }
5101
5102 if (section_headers_groups [entry] != NULL)
5103 {
5104 if (entry)
5105 {
5106 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5107 entry, i,
5108 section_headers_groups [entry]->group_index);
5109 continue;
5110 }
5111 else
5112 {
5113 /* Intel C/C++ compiler may put section 0 in a
5114 section group. We just warn it the first time
5115 and ignore it afterwards. */
5116 static int warned = 0;
5117 if (!warned)
5118 {
5119 error (_("section 0 in group section [%5u]\n"),
5120 section_headers_groups [entry]->group_index);
5121 warned++;
5122 }
5123 }
5124 }
5125
5126 section_headers_groups [entry] = group;
5127
5128 if (do_section_groups)
5129 {
5130 sec = section_headers + entry;
5131 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5132 }
5133
5134 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5135 g->section_index = entry;
5136 g->next = group->root;
5137 group->root = g;
5138 }
5139
5140 if (start)
5141 free (start);
5142
5143 group++;
5144 }
5145 }
5146
5147 if (symtab)
5148 free (symtab);
5149 if (strtab)
5150 free (strtab);
5151 return 1;
5152 }
5153
5154 /* Data used to display dynamic fixups. */
5155
5156 struct ia64_vms_dynfixup
5157 {
5158 bfd_vma needed_ident; /* Library ident number. */
5159 bfd_vma needed; /* Index in the dstrtab of the library name. */
5160 bfd_vma fixup_needed; /* Index of the library. */
5161 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5162 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5163 };
5164
5165 /* Data used to display dynamic relocations. */
5166
5167 struct ia64_vms_dynimgrela
5168 {
5169 bfd_vma img_rela_cnt; /* Number of relocations. */
5170 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5171 };
5172
5173 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5174 library). */
5175
5176 static void
5177 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5178 const char *strtab, unsigned int strtab_sz)
5179 {
5180 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5181 long i;
5182 const char *lib_name;
5183
5184 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5185 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5186 _("dynamic section image fixups"));
5187 if (!imfs)
5188 return;
5189
5190 if (fixup->needed < strtab_sz)
5191 lib_name = strtab + fixup->needed;
5192 else
5193 {
5194 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5195 (unsigned long) fixup->needed);
5196 lib_name = "???";
5197 }
5198 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5199 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5200 printf
5201 (_("Seg Offset Type SymVec DataType\n"));
5202
5203 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5204 {
5205 unsigned int type;
5206 const char *rtype;
5207
5208 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5209 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5210 type = BYTE_GET (imfs [i].type);
5211 rtype = elf_ia64_reloc_type (type);
5212 if (rtype == NULL)
5213 printf (" 0x%08x ", type);
5214 else
5215 printf (" %-32s ", rtype);
5216 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5217 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5218 }
5219
5220 free (imfs);
5221 }
5222
5223 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5224
5225 static void
5226 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5227 {
5228 Elf64_External_VMS_IMAGE_RELA *imrs;
5229 long i;
5230
5231 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5232 1, imgrela->img_rela_cnt * sizeof (*imrs),
5233 _("dynamic section image relas"));
5234 if (!imrs)
5235 return;
5236
5237 printf (_("\nImage relocs\n"));
5238 printf
5239 (_("Seg Offset Type Addend Seg Sym Off\n"));
5240
5241 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5242 {
5243 unsigned int type;
5244 const char *rtype;
5245
5246 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5247 printf ("%08" BFD_VMA_FMT "x ",
5248 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5249 type = BYTE_GET (imrs [i].type);
5250 rtype = elf_ia64_reloc_type (type);
5251 if (rtype == NULL)
5252 printf ("0x%08x ", type);
5253 else
5254 printf ("%-31s ", rtype);
5255 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5256 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5257 printf ("%08" BFD_VMA_FMT "x\n",
5258 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5259 }
5260
5261 free (imrs);
5262 }
5263
5264 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5265
5266 static int
5267 process_ia64_vms_dynamic_relocs (FILE *file)
5268 {
5269 struct ia64_vms_dynfixup fixup;
5270 struct ia64_vms_dynimgrela imgrela;
5271 Elf_Internal_Dyn *entry;
5272 int res = 0;
5273 bfd_vma strtab_off = 0;
5274 bfd_vma strtab_sz = 0;
5275 char *strtab = NULL;
5276
5277 memset (&fixup, 0, sizeof (fixup));
5278 memset (&imgrela, 0, sizeof (imgrela));
5279
5280 /* Note: the order of the entries is specified by the OpenVMS specs. */
5281 for (entry = dynamic_section;
5282 entry < dynamic_section + dynamic_nent;
5283 entry++)
5284 {
5285 switch (entry->d_tag)
5286 {
5287 case DT_IA_64_VMS_STRTAB_OFFSET:
5288 strtab_off = entry->d_un.d_val;
5289 break;
5290 case DT_STRSZ:
5291 strtab_sz = entry->d_un.d_val;
5292 if (strtab == NULL)
5293 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5294 1, strtab_sz, _("dynamic string section"));
5295 break;
5296
5297 case DT_IA_64_VMS_NEEDED_IDENT:
5298 fixup.needed_ident = entry->d_un.d_val;
5299 break;
5300 case DT_NEEDED:
5301 fixup.needed = entry->d_un.d_val;
5302 break;
5303 case DT_IA_64_VMS_FIXUP_NEEDED:
5304 fixup.fixup_needed = entry->d_un.d_val;
5305 break;
5306 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5307 fixup.fixup_rela_cnt = entry->d_un.d_val;
5308 break;
5309 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5310 fixup.fixup_rela_off = entry->d_un.d_val;
5311 res++;
5312 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5313 break;
5314
5315 case DT_IA_64_VMS_IMG_RELA_CNT:
5316 imgrela.img_rela_cnt = entry->d_un.d_val;
5317 break;
5318 case DT_IA_64_VMS_IMG_RELA_OFF:
5319 imgrela.img_rela_off = entry->d_un.d_val;
5320 res++;
5321 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5322 break;
5323
5324 default:
5325 break;
5326 }
5327 }
5328
5329 if (strtab != NULL)
5330 free (strtab);
5331
5332 return res;
5333 }
5334
5335 static struct
5336 {
5337 const char * name;
5338 int reloc;
5339 int size;
5340 int rela;
5341 } dynamic_relocations [] =
5342 {
5343 { "REL", DT_REL, DT_RELSZ, FALSE },
5344 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5345 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5346 };
5347
5348 /* Process the reloc section. */
5349
5350 static int
5351 process_relocs (FILE * file)
5352 {
5353 unsigned long rel_size;
5354 unsigned long rel_offset;
5355
5356
5357 if (!do_reloc)
5358 return 1;
5359
5360 if (do_using_dynamic)
5361 {
5362 int is_rela;
5363 const char * name;
5364 int has_dynamic_reloc;
5365 unsigned int i;
5366
5367 has_dynamic_reloc = 0;
5368
5369 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5370 {
5371 is_rela = dynamic_relocations [i].rela;
5372 name = dynamic_relocations [i].name;
5373 rel_size = dynamic_info [dynamic_relocations [i].size];
5374 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5375
5376 has_dynamic_reloc |= rel_size;
5377
5378 if (is_rela == UNKNOWN)
5379 {
5380 if (dynamic_relocations [i].reloc == DT_JMPREL)
5381 switch (dynamic_info[DT_PLTREL])
5382 {
5383 case DT_REL:
5384 is_rela = FALSE;
5385 break;
5386 case DT_RELA:
5387 is_rela = TRUE;
5388 break;
5389 }
5390 }
5391
5392 if (rel_size)
5393 {
5394 printf
5395 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5396 name, rel_offset, rel_size);
5397
5398 dump_relocations (file,
5399 offset_from_vma (file, rel_offset, rel_size),
5400 rel_size,
5401 dynamic_symbols, num_dynamic_syms,
5402 dynamic_strings, dynamic_strings_length, is_rela);
5403 }
5404 }
5405
5406 if (is_ia64_vms ())
5407 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5408
5409 if (! has_dynamic_reloc)
5410 printf (_("\nThere are no dynamic relocations in this file.\n"));
5411 }
5412 else
5413 {
5414 Elf_Internal_Shdr * section;
5415 unsigned long i;
5416 int found = 0;
5417
5418 for (i = 0, section = section_headers;
5419 i < elf_header.e_shnum;
5420 i++, section++)
5421 {
5422 if ( section->sh_type != SHT_RELA
5423 && section->sh_type != SHT_REL)
5424 continue;
5425
5426 rel_offset = section->sh_offset;
5427 rel_size = section->sh_size;
5428
5429 if (rel_size)
5430 {
5431 Elf_Internal_Shdr * strsec;
5432 int is_rela;
5433
5434 printf (_("\nRelocation section "));
5435
5436 if (string_table == NULL)
5437 printf ("%d", section->sh_name);
5438 else
5439 printf (_("'%s'"), SECTION_NAME (section));
5440
5441 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5442 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5443
5444 is_rela = section->sh_type == SHT_RELA;
5445
5446 if (section->sh_link != 0
5447 && section->sh_link < elf_header.e_shnum)
5448 {
5449 Elf_Internal_Shdr * symsec;
5450 Elf_Internal_Sym * symtab;
5451 unsigned long nsyms;
5452 unsigned long strtablen = 0;
5453 char * strtab = NULL;
5454
5455 symsec = section_headers + section->sh_link;
5456 if (symsec->sh_type != SHT_SYMTAB
5457 && symsec->sh_type != SHT_DYNSYM)
5458 continue;
5459
5460 nsyms = symsec->sh_size / symsec->sh_entsize;
5461 symtab = GET_ELF_SYMBOLS (file, symsec);
5462
5463 if (symtab == NULL)
5464 continue;
5465
5466 if (symsec->sh_link != 0
5467 && symsec->sh_link < elf_header.e_shnum)
5468 {
5469 strsec = section_headers + symsec->sh_link;
5470
5471 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5472 1, strsec->sh_size,
5473 _("string table"));
5474 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5475 }
5476
5477 dump_relocations (file, rel_offset, rel_size,
5478 symtab, nsyms, strtab, strtablen, is_rela);
5479 if (strtab)
5480 free (strtab);
5481 free (symtab);
5482 }
5483 else
5484 dump_relocations (file, rel_offset, rel_size,
5485 NULL, 0, NULL, 0, is_rela);
5486
5487 found = 1;
5488 }
5489 }
5490
5491 if (! found)
5492 printf (_("\nThere are no relocations in this file.\n"));
5493 }
5494
5495 return 1;
5496 }
5497
5498 /* Process the unwind section. */
5499
5500 #include "unwind-ia64.h"
5501
5502 /* An absolute address consists of a section and an offset. If the
5503 section is NULL, the offset itself is the address, otherwise, the
5504 address equals to LOAD_ADDRESS(section) + offset. */
5505
5506 struct absaddr
5507 {
5508 unsigned short section;
5509 bfd_vma offset;
5510 };
5511
5512 #define ABSADDR(a) \
5513 ((a).section \
5514 ? section_headers [(a).section].sh_addr + (a).offset \
5515 : (a).offset)
5516
5517 struct ia64_unw_table_entry
5518 {
5519 struct absaddr start;
5520 struct absaddr end;
5521 struct absaddr info;
5522 };
5523
5524 struct ia64_unw_aux_info
5525 {
5526
5527 struct ia64_unw_table_entry *table; /* Unwind table. */
5528 unsigned long table_len; /* Length of unwind table. */
5529 unsigned char * info; /* Unwind info. */
5530 unsigned long info_size; /* Size of unwind info. */
5531 bfd_vma info_addr; /* starting address of unwind info. */
5532 bfd_vma seg_base; /* Starting address of segment. */
5533 Elf_Internal_Sym * symtab; /* The symbol table. */
5534 unsigned long nsyms; /* Number of symbols. */
5535 char * strtab; /* The string table. */
5536 unsigned long strtab_size; /* Size of string table. */
5537 };
5538
5539 static void
5540 find_symbol_for_address (Elf_Internal_Sym * symtab,
5541 unsigned long nsyms,
5542 const char * strtab,
5543 unsigned long strtab_size,
5544 struct absaddr addr,
5545 const char ** symname,
5546 bfd_vma * offset)
5547 {
5548 bfd_vma dist = 0x100000;
5549 Elf_Internal_Sym * sym;
5550 Elf_Internal_Sym * best = NULL;
5551 unsigned long i;
5552
5553 REMOVE_ARCH_BITS (addr.offset);
5554
5555 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5556 {
5557 bfd_vma value = sym->st_value;
5558
5559 REMOVE_ARCH_BITS (value);
5560
5561 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5562 && sym->st_name != 0
5563 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5564 && addr.offset >= value
5565 && addr.offset - value < dist)
5566 {
5567 best = sym;
5568 dist = addr.offset - value;
5569 if (!dist)
5570 break;
5571 }
5572 }
5573 if (best)
5574 {
5575 *symname = (best->st_name >= strtab_size
5576 ? _("<corrupt>") : strtab + best->st_name);
5577 *offset = dist;
5578 return;
5579 }
5580 *symname = NULL;
5581 *offset = addr.offset;
5582 }
5583
5584 static void
5585 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5586 {
5587 struct ia64_unw_table_entry * tp;
5588 int in_body;
5589
5590 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5591 {
5592 bfd_vma stamp;
5593 bfd_vma offset;
5594 const unsigned char * dp;
5595 const unsigned char * head;
5596 const char * procname;
5597
5598 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5599 aux->strtab_size, tp->start, &procname, &offset);
5600
5601 fputs ("\n<", stdout);
5602
5603 if (procname)
5604 {
5605 fputs (procname, stdout);
5606
5607 if (offset)
5608 printf ("+%lx", (unsigned long) offset);
5609 }
5610
5611 fputs (">: [", stdout);
5612 print_vma (tp->start.offset, PREFIX_HEX);
5613 fputc ('-', stdout);
5614 print_vma (tp->end.offset, PREFIX_HEX);
5615 printf ("], info at +0x%lx\n",
5616 (unsigned long) (tp->info.offset - aux->seg_base));
5617
5618 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5619 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5620
5621 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5622 (unsigned) UNW_VER (stamp),
5623 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5624 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5625 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5626 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5627
5628 if (UNW_VER (stamp) != 1)
5629 {
5630 printf (_("\tUnknown version.\n"));
5631 continue;
5632 }
5633
5634 in_body = 0;
5635 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5636 dp = unw_decode (dp, in_body, & in_body);
5637 }
5638 }
5639
5640 static int
5641 slurp_ia64_unwind_table (FILE * file,
5642 struct ia64_unw_aux_info * aux,
5643 Elf_Internal_Shdr * sec)
5644 {
5645 unsigned long size, nrelas, i;
5646 Elf_Internal_Phdr * seg;
5647 struct ia64_unw_table_entry * tep;
5648 Elf_Internal_Shdr * relsec;
5649 Elf_Internal_Rela * rela;
5650 Elf_Internal_Rela * rp;
5651 unsigned char * table;
5652 unsigned char * tp;
5653 Elf_Internal_Sym * sym;
5654 const char * relname;
5655
5656 /* First, find the starting address of the segment that includes
5657 this section: */
5658
5659 if (elf_header.e_phnum)
5660 {
5661 if (! get_program_headers (file))
5662 return 0;
5663
5664 for (seg = program_headers;
5665 seg < program_headers + elf_header.e_phnum;
5666 ++seg)
5667 {
5668 if (seg->p_type != PT_LOAD)
5669 continue;
5670
5671 if (sec->sh_addr >= seg->p_vaddr
5672 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5673 {
5674 aux->seg_base = seg->p_vaddr;
5675 break;
5676 }
5677 }
5678 }
5679
5680 /* Second, build the unwind table from the contents of the unwind section: */
5681 size = sec->sh_size;
5682 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5683 _("unwind table"));
5684 if (!table)
5685 return 0;
5686
5687 aux->table = (struct ia64_unw_table_entry *)
5688 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5689 tep = aux->table;
5690 for (tp = table; tp < table + size; ++tep)
5691 {
5692 tep->start.section = SHN_UNDEF;
5693 tep->end.section = SHN_UNDEF;
5694 tep->info.section = SHN_UNDEF;
5695 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5696 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5697 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5698 tep->start.offset += aux->seg_base;
5699 tep->end.offset += aux->seg_base;
5700 tep->info.offset += aux->seg_base;
5701 }
5702 free (table);
5703
5704 /* Third, apply any relocations to the unwind table: */
5705 for (relsec = section_headers;
5706 relsec < section_headers + elf_header.e_shnum;
5707 ++relsec)
5708 {
5709 if (relsec->sh_type != SHT_RELA
5710 || relsec->sh_info >= elf_header.e_shnum
5711 || section_headers + relsec->sh_info != sec)
5712 continue;
5713
5714 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5715 & rela, & nrelas))
5716 return 0;
5717
5718 for (rp = rela; rp < rela + nrelas; ++rp)
5719 {
5720 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5721 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5722
5723 if (! const_strneq (relname, "R_IA64_SEGREL"))
5724 {
5725 warn (_("Skipping unexpected relocation type %s\n"), relname);
5726 continue;
5727 }
5728
5729 i = rp->r_offset / (3 * eh_addr_size);
5730
5731 switch (rp->r_offset/eh_addr_size % 3)
5732 {
5733 case 0:
5734 aux->table[i].start.section = sym->st_shndx;
5735 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5736 break;
5737 case 1:
5738 aux->table[i].end.section = sym->st_shndx;
5739 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5740 break;
5741 case 2:
5742 aux->table[i].info.section = sym->st_shndx;
5743 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5744 break;
5745 default:
5746 break;
5747 }
5748 }
5749
5750 free (rela);
5751 }
5752
5753 aux->table_len = size / (3 * eh_addr_size);
5754 return 1;
5755 }
5756
5757 static int
5758 ia64_process_unwind (FILE * file)
5759 {
5760 Elf_Internal_Shdr * sec;
5761 Elf_Internal_Shdr * unwsec = NULL;
5762 Elf_Internal_Shdr * strsec;
5763 unsigned long i, unwcount = 0, unwstart = 0;
5764 struct ia64_unw_aux_info aux;
5765
5766 memset (& aux, 0, sizeof (aux));
5767
5768 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5769 {
5770 if (sec->sh_type == SHT_SYMTAB
5771 && sec->sh_link < elf_header.e_shnum)
5772 {
5773 aux.nsyms = sec->sh_size / sec->sh_entsize;
5774 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5775
5776 strsec = section_headers + sec->sh_link;
5777 assert (aux.strtab == NULL);
5778 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5779 1, strsec->sh_size,
5780 _("string table"));
5781 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5782 }
5783 else if (sec->sh_type == SHT_IA_64_UNWIND)
5784 unwcount++;
5785 }
5786
5787 if (!unwcount)
5788 printf (_("\nThere are no unwind sections in this file.\n"));
5789
5790 while (unwcount-- > 0)
5791 {
5792 char * suffix;
5793 size_t len, len2;
5794
5795 for (i = unwstart, sec = section_headers + unwstart;
5796 i < elf_header.e_shnum; ++i, ++sec)
5797 if (sec->sh_type == SHT_IA_64_UNWIND)
5798 {
5799 unwsec = sec;
5800 break;
5801 }
5802
5803 unwstart = i + 1;
5804 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5805
5806 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5807 {
5808 /* We need to find which section group it is in. */
5809 struct group_list * g = section_headers_groups [i]->root;
5810
5811 for (; g != NULL; g = g->next)
5812 {
5813 sec = section_headers + g->section_index;
5814
5815 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5816 break;
5817 }
5818
5819 if (g == NULL)
5820 i = elf_header.e_shnum;
5821 }
5822 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5823 {
5824 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5825 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5826 suffix = SECTION_NAME (unwsec) + len;
5827 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5828 ++i, ++sec)
5829 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5830 && streq (SECTION_NAME (sec) + len2, suffix))
5831 break;
5832 }
5833 else
5834 {
5835 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5836 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5837 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5838 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5839 suffix = "";
5840 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5841 suffix = SECTION_NAME (unwsec) + len;
5842 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5843 ++i, ++sec)
5844 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5845 && streq (SECTION_NAME (sec) + len2, suffix))
5846 break;
5847 }
5848
5849 if (i == elf_header.e_shnum)
5850 {
5851 printf (_("\nCould not find unwind info section for "));
5852
5853 if (string_table == NULL)
5854 printf ("%d", unwsec->sh_name);
5855 else
5856 printf (_("'%s'"), SECTION_NAME (unwsec));
5857 }
5858 else
5859 {
5860 aux.info_addr = sec->sh_addr;
5861 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5862 sec->sh_size,
5863 _("unwind info"));
5864 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
5865
5866 printf (_("\nUnwind section "));
5867
5868 if (string_table == NULL)
5869 printf ("%d", unwsec->sh_name);
5870 else
5871 printf (_("'%s'"), SECTION_NAME (unwsec));
5872
5873 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5874 (unsigned long) unwsec->sh_offset,
5875 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5876
5877 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5878
5879 if (aux.table_len > 0)
5880 dump_ia64_unwind (& aux);
5881
5882 if (aux.table)
5883 free ((char *) aux.table);
5884 if (aux.info)
5885 free ((char *) aux.info);
5886 aux.table = NULL;
5887 aux.info = NULL;
5888 }
5889 }
5890
5891 if (aux.symtab)
5892 free (aux.symtab);
5893 if (aux.strtab)
5894 free ((char *) aux.strtab);
5895
5896 return 1;
5897 }
5898
5899 struct hppa_unw_table_entry
5900 {
5901 struct absaddr start;
5902 struct absaddr end;
5903 unsigned int Cannot_unwind:1; /* 0 */
5904 unsigned int Millicode:1; /* 1 */
5905 unsigned int Millicode_save_sr0:1; /* 2 */
5906 unsigned int Region_description:2; /* 3..4 */
5907 unsigned int reserved1:1; /* 5 */
5908 unsigned int Entry_SR:1; /* 6 */
5909 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5910 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5911 unsigned int Args_stored:1; /* 16 */
5912 unsigned int Variable_Frame:1; /* 17 */
5913 unsigned int Separate_Package_Body:1; /* 18 */
5914 unsigned int Frame_Extension_Millicode:1; /* 19 */
5915 unsigned int Stack_Overflow_Check:1; /* 20 */
5916 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5917 unsigned int Ada_Region:1; /* 22 */
5918 unsigned int cxx_info:1; /* 23 */
5919 unsigned int cxx_try_catch:1; /* 24 */
5920 unsigned int sched_entry_seq:1; /* 25 */
5921 unsigned int reserved2:1; /* 26 */
5922 unsigned int Save_SP:1; /* 27 */
5923 unsigned int Save_RP:1; /* 28 */
5924 unsigned int Save_MRP_in_frame:1; /* 29 */
5925 unsigned int extn_ptr_defined:1; /* 30 */
5926 unsigned int Cleanup_defined:1; /* 31 */
5927
5928 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5929 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5930 unsigned int Large_frame:1; /* 2 */
5931 unsigned int Pseudo_SP_Set:1; /* 3 */
5932 unsigned int reserved4:1; /* 4 */
5933 unsigned int Total_frame_size:27; /* 5..31 */
5934 };
5935
5936 struct hppa_unw_aux_info
5937 {
5938 struct hppa_unw_table_entry *table; /* Unwind table. */
5939 unsigned long table_len; /* Length of unwind table. */
5940 bfd_vma seg_base; /* Starting address of segment. */
5941 Elf_Internal_Sym * symtab; /* The symbol table. */
5942 unsigned long nsyms; /* Number of symbols. */
5943 char * strtab; /* The string table. */
5944 unsigned long strtab_size; /* Size of string table. */
5945 };
5946
5947 static void
5948 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
5949 {
5950 struct hppa_unw_table_entry * tp;
5951
5952 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5953 {
5954 bfd_vma offset;
5955 const char * procname;
5956
5957 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5958 aux->strtab_size, tp->start, &procname,
5959 &offset);
5960
5961 fputs ("\n<", stdout);
5962
5963 if (procname)
5964 {
5965 fputs (procname, stdout);
5966
5967 if (offset)
5968 printf ("+%lx", (unsigned long) offset);
5969 }
5970
5971 fputs (">: [", stdout);
5972 print_vma (tp->start.offset, PREFIX_HEX);
5973 fputc ('-', stdout);
5974 print_vma (tp->end.offset, PREFIX_HEX);
5975 printf ("]\n\t");
5976
5977 #define PF(_m) if (tp->_m) printf (#_m " ");
5978 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5979 PF(Cannot_unwind);
5980 PF(Millicode);
5981 PF(Millicode_save_sr0);
5982 /* PV(Region_description); */
5983 PF(Entry_SR);
5984 PV(Entry_FR);
5985 PV(Entry_GR);
5986 PF(Args_stored);
5987 PF(Variable_Frame);
5988 PF(Separate_Package_Body);
5989 PF(Frame_Extension_Millicode);
5990 PF(Stack_Overflow_Check);
5991 PF(Two_Instruction_SP_Increment);
5992 PF(Ada_Region);
5993 PF(cxx_info);
5994 PF(cxx_try_catch);
5995 PF(sched_entry_seq);
5996 PF(Save_SP);
5997 PF(Save_RP);
5998 PF(Save_MRP_in_frame);
5999 PF(extn_ptr_defined);
6000 PF(Cleanup_defined);
6001 PF(MPE_XL_interrupt_marker);
6002 PF(HP_UX_interrupt_marker);
6003 PF(Large_frame);
6004 PF(Pseudo_SP_Set);
6005 PV(Total_frame_size);
6006 #undef PF
6007 #undef PV
6008 }
6009
6010 printf ("\n");
6011 }
6012
6013 static int
6014 slurp_hppa_unwind_table (FILE * file,
6015 struct hppa_unw_aux_info * aux,
6016 Elf_Internal_Shdr * sec)
6017 {
6018 unsigned long size, unw_ent_size, nentries, nrelas, i;
6019 Elf_Internal_Phdr * seg;
6020 struct hppa_unw_table_entry * tep;
6021 Elf_Internal_Shdr * relsec;
6022 Elf_Internal_Rela * rela;
6023 Elf_Internal_Rela * rp;
6024 unsigned char * table;
6025 unsigned char * tp;
6026 Elf_Internal_Sym * sym;
6027 const char * relname;
6028
6029 /* First, find the starting address of the segment that includes
6030 this section. */
6031
6032 if (elf_header.e_phnum)
6033 {
6034 if (! get_program_headers (file))
6035 return 0;
6036
6037 for (seg = program_headers;
6038 seg < program_headers + elf_header.e_phnum;
6039 ++seg)
6040 {
6041 if (seg->p_type != PT_LOAD)
6042 continue;
6043
6044 if (sec->sh_addr >= seg->p_vaddr
6045 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6046 {
6047 aux->seg_base = seg->p_vaddr;
6048 break;
6049 }
6050 }
6051 }
6052
6053 /* Second, build the unwind table from the contents of the unwind
6054 section. */
6055 size = sec->sh_size;
6056 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6057 _("unwind table"));
6058 if (!table)
6059 return 0;
6060
6061 unw_ent_size = 16;
6062 nentries = size / unw_ent_size;
6063 size = unw_ent_size * nentries;
6064
6065 tep = aux->table = (struct hppa_unw_table_entry *)
6066 xcmalloc (nentries, sizeof (aux->table[0]));
6067
6068 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6069 {
6070 unsigned int tmp1, tmp2;
6071
6072 tep->start.section = SHN_UNDEF;
6073 tep->end.section = SHN_UNDEF;
6074
6075 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6076 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6077 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6078 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6079
6080 tep->start.offset += aux->seg_base;
6081 tep->end.offset += aux->seg_base;
6082
6083 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6084 tep->Millicode = (tmp1 >> 30) & 0x1;
6085 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6086 tep->Region_description = (tmp1 >> 27) & 0x3;
6087 tep->reserved1 = (tmp1 >> 26) & 0x1;
6088 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6089 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6090 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6091 tep->Args_stored = (tmp1 >> 15) & 0x1;
6092 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6093 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6094 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6095 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6096 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6097 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6098 tep->cxx_info = (tmp1 >> 8) & 0x1;
6099 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6100 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6101 tep->reserved2 = (tmp1 >> 5) & 0x1;
6102 tep->Save_SP = (tmp1 >> 4) & 0x1;
6103 tep->Save_RP = (tmp1 >> 3) & 0x1;
6104 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6105 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6106 tep->Cleanup_defined = tmp1 & 0x1;
6107
6108 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6109 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6110 tep->Large_frame = (tmp2 >> 29) & 0x1;
6111 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6112 tep->reserved4 = (tmp2 >> 27) & 0x1;
6113 tep->Total_frame_size = tmp2 & 0x7ffffff;
6114 }
6115 free (table);
6116
6117 /* Third, apply any relocations to the unwind table. */
6118 for (relsec = section_headers;
6119 relsec < section_headers + elf_header.e_shnum;
6120 ++relsec)
6121 {
6122 if (relsec->sh_type != SHT_RELA
6123 || relsec->sh_info >= elf_header.e_shnum
6124 || section_headers + relsec->sh_info != sec)
6125 continue;
6126
6127 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6128 & rela, & nrelas))
6129 return 0;
6130
6131 for (rp = rela; rp < rela + nrelas; ++rp)
6132 {
6133 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6134 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6135
6136 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6137 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6138 {
6139 warn (_("Skipping unexpected relocation type %s\n"), relname);
6140 continue;
6141 }
6142
6143 i = rp->r_offset / unw_ent_size;
6144
6145 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6146 {
6147 case 0:
6148 aux->table[i].start.section = sym->st_shndx;
6149 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6150 break;
6151 case 1:
6152 aux->table[i].end.section = sym->st_shndx;
6153 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6154 break;
6155 default:
6156 break;
6157 }
6158 }
6159
6160 free (rela);
6161 }
6162
6163 aux->table_len = nentries;
6164
6165 return 1;
6166 }
6167
6168 static int
6169 hppa_process_unwind (FILE * file)
6170 {
6171 struct hppa_unw_aux_info aux;
6172 Elf_Internal_Shdr * unwsec = NULL;
6173 Elf_Internal_Shdr * strsec;
6174 Elf_Internal_Shdr * sec;
6175 unsigned long i;
6176
6177 memset (& aux, 0, sizeof (aux));
6178
6179 if (string_table == NULL)
6180 return 1;
6181
6182 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6183 {
6184 if (sec->sh_type == SHT_SYMTAB
6185 && sec->sh_link < elf_header.e_shnum)
6186 {
6187 aux.nsyms = sec->sh_size / sec->sh_entsize;
6188 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6189
6190 strsec = section_headers + sec->sh_link;
6191 assert (aux.strtab == NULL);
6192 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6193 1, strsec->sh_size,
6194 _("string table"));
6195 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6196 }
6197 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6198 unwsec = sec;
6199 }
6200
6201 if (!unwsec)
6202 printf (_("\nThere are no unwind sections in this file.\n"));
6203
6204 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6205 {
6206 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6207 {
6208 printf (_("\nUnwind section "));
6209 printf (_("'%s'"), SECTION_NAME (sec));
6210
6211 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6212 (unsigned long) sec->sh_offset,
6213 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6214
6215 slurp_hppa_unwind_table (file, &aux, sec);
6216 if (aux.table_len > 0)
6217 dump_hppa_unwind (&aux);
6218
6219 if (aux.table)
6220 free ((char *) aux.table);
6221 aux.table = NULL;
6222 }
6223 }
6224
6225 if (aux.symtab)
6226 free (aux.symtab);
6227 if (aux.strtab)
6228 free ((char *) aux.strtab);
6229
6230 return 1;
6231 }
6232
6233 struct arm_section
6234 {
6235 unsigned char *data;
6236
6237 Elf_Internal_Shdr *sec;
6238 Elf_Internal_Rela *rela;
6239 unsigned long nrelas;
6240 unsigned int rel_type;
6241
6242 Elf_Internal_Rela *next_rela;
6243 };
6244
6245 struct arm_unw_aux_info
6246 {
6247 FILE *file;
6248
6249 Elf_Internal_Sym *symtab; /* The symbol table. */
6250 unsigned long nsyms; /* Number of symbols. */
6251 char *strtab; /* The string table. */
6252 unsigned long strtab_size; /* Size of string table. */
6253 };
6254
6255 static const char *
6256 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6257 bfd_vma fn, struct absaddr addr)
6258 {
6259 const char *procname;
6260 bfd_vma sym_offset;
6261
6262 if (addr.section == SHN_UNDEF)
6263 addr.offset = fn;
6264
6265 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6266 aux->strtab_size, addr, &procname,
6267 &sym_offset);
6268
6269 print_vma (fn, PREFIX_HEX);
6270
6271 if (procname)
6272 {
6273 fputs (" <", stdout);
6274 fputs (procname, stdout);
6275
6276 if (sym_offset)
6277 printf ("+0x%lx", (unsigned long) sym_offset);
6278 fputc ('>', stdout);
6279 }
6280
6281 return procname;
6282 }
6283
6284 static void
6285 arm_free_section (struct arm_section *arm_sec)
6286 {
6287 if (arm_sec->data != NULL)
6288 free (arm_sec->data);
6289
6290 if (arm_sec->rela != NULL)
6291 free (arm_sec->rela);
6292 }
6293
6294 static int
6295 arm_section_get_word (struct arm_unw_aux_info *aux,
6296 struct arm_section *arm_sec,
6297 Elf_Internal_Shdr *sec, bfd_vma word_offset,
6298 unsigned int *wordp, struct absaddr *addr)
6299 {
6300 Elf_Internal_Rela *rp;
6301 Elf_Internal_Sym *sym;
6302 const char * relname;
6303 unsigned int word;
6304 bfd_boolean wrapped;
6305
6306 addr->section = SHN_UNDEF;
6307 addr->offset = 0;
6308
6309 if (sec != arm_sec->sec)
6310 {
6311 Elf_Internal_Shdr *relsec;
6312
6313 arm_free_section (arm_sec);
6314
6315 arm_sec->sec = sec;
6316 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6317 sec->sh_size, _("unwind data"));
6318 arm_sec->rela = NULL;
6319 arm_sec->nrelas = 0;
6320
6321 for (relsec = section_headers;
6322 relsec < section_headers + elf_header.e_shnum;
6323 ++relsec)
6324 {
6325 if (relsec->sh_info >= elf_header.e_shnum
6326 || section_headers + relsec->sh_info != sec)
6327 continue;
6328
6329 if (relsec->sh_type == SHT_REL)
6330 {
6331 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6332 relsec->sh_size,
6333 & arm_sec->rela, & arm_sec->nrelas))
6334 return 0;
6335 break;
6336 }
6337 else if (relsec->sh_type == SHT_RELA)
6338 {
6339 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6340 relsec->sh_size,
6341 & arm_sec->rela, & arm_sec->nrelas))
6342 return 0;
6343 break;
6344 }
6345 }
6346
6347 arm_sec->next_rela = arm_sec->rela;
6348 }
6349
6350 if (arm_sec->data == NULL)
6351 return 0;
6352
6353 word = byte_get (arm_sec->data + word_offset, 4);
6354
6355 wrapped = FALSE;
6356 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6357 {
6358 bfd_vma prelval, offset;
6359
6360 if (rp->r_offset > word_offset && !wrapped)
6361 {
6362 rp = arm_sec->rela;
6363 wrapped = TRUE;
6364 }
6365 if (rp->r_offset > word_offset)
6366 break;
6367
6368 if (rp->r_offset & 3)
6369 {
6370 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6371 (unsigned long) rp->r_offset);
6372 continue;
6373 }
6374
6375 if (rp->r_offset < word_offset)
6376 continue;
6377
6378 switch (elf_header.e_machine)
6379 {
6380 case EM_ARM:
6381 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6382 break;
6383
6384 case EM_TI_C6000:
6385 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6386 break;
6387
6388 default:
6389 abort();
6390 }
6391
6392 if (streq (relname, "R_ARM_NONE")
6393 || streq (relname, "R_C6000_NONE"))
6394 continue;
6395
6396 if (!(streq (relname, "R_ARM_PREL31")
6397 || streq (relname, "R_C6000_PREL31")))
6398 {
6399 warn (_("Skipping unexpected relocation type %s\n"), relname);
6400 continue;
6401 }
6402
6403 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6404
6405 if (arm_sec->rel_type == SHT_REL)
6406 {
6407 offset = word & 0x7fffffff;
6408 if (offset & 0x40000000)
6409 offset |= ~ (bfd_vma) 0x7fffffff;
6410 }
6411 else
6412 offset = rp->r_addend;
6413
6414 offset += sym->st_value;
6415 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6416
6417 if (streq (relname, "R_C6000_PREL31"))
6418 prelval >>= 1;
6419
6420 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6421 addr->section = sym->st_shndx;
6422 addr->offset = offset;
6423 break;
6424 }
6425
6426 *wordp = word;
6427 arm_sec->next_rela = rp;
6428
6429 return 1;
6430 }
6431
6432 static const char *tic6x_unwind_regnames[16] = {
6433 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6434 "A14", "A13", "A12", "A11", "A10",
6435 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"};
6436
6437 static void
6438 decode_tic6x_unwind_regmask (unsigned int mask)
6439 {
6440 int i;
6441
6442 for (i = 12; mask; mask >>= 1, i--)
6443 {
6444 if (mask & 1)
6445 {
6446 fputs (tic6x_unwind_regnames[i], stdout);
6447 if (mask > 1)
6448 fputs (", ", stdout);
6449 }
6450 }
6451 }
6452
6453 #define ADVANCE \
6454 if (remaining == 0 && more_words) \
6455 { \
6456 data_offset += 4; \
6457 if (!arm_section_get_word (aux, data_arm_sec, data_sec, \
6458 data_offset, &word, &addr)) \
6459 return; \
6460 remaining = 4; \
6461 more_words--; \
6462 } \
6463
6464 #define GET_OP(OP) \
6465 ADVANCE; \
6466 if (remaining) \
6467 { \
6468 remaining--; \
6469 (OP) = word >> 24; \
6470 word <<= 8; \
6471 } \
6472 else \
6473 { \
6474 printf (_("[Truncated opcode]\n")); \
6475 return; \
6476 } \
6477 printf ("0x%02x ", OP)
6478
6479 static void
6480 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6481 unsigned int word, unsigned int remaining,
6482 unsigned int more_words,
6483 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6484 struct arm_section *data_arm_sec)
6485 {
6486 struct absaddr addr;
6487
6488 /* Decode the unwinding instructions. */
6489 while (1)
6490 {
6491 unsigned int op, op2;
6492
6493 ADVANCE;
6494 if (remaining == 0)
6495 break;
6496 remaining--;
6497 op = word >> 24;
6498 word <<= 8;
6499
6500 printf (" 0x%02x ", op);
6501
6502 if ((op & 0xc0) == 0x00)
6503 {
6504 int offset = ((op & 0x3f) << 2) + 4;
6505
6506 printf (" vsp = vsp + %d", offset);
6507 }
6508 else if ((op & 0xc0) == 0x40)
6509 {
6510 int offset = ((op & 0x3f) << 2) + 4;
6511
6512 printf (" vsp = vsp - %d", offset);
6513 }
6514 else if ((op & 0xf0) == 0x80)
6515 {
6516 GET_OP (op2);
6517 if (op == 0x80 && op2 == 0)
6518 printf (_("Refuse to unwind"));
6519 else
6520 {
6521 unsigned int mask = ((op & 0x0f) << 8) | op2;
6522 int first = 1;
6523 int i;
6524
6525 printf ("pop {");
6526 for (i = 0; i < 12; i++)
6527 if (mask & (1 << i))
6528 {
6529 if (first)
6530 first = 0;
6531 else
6532 printf (", ");
6533 printf ("r%d", 4 + i);
6534 }
6535 printf ("}");
6536 }
6537 }
6538 else if ((op & 0xf0) == 0x90)
6539 {
6540 if (op == 0x9d || op == 0x9f)
6541 printf (_(" [Reserved]"));
6542 else
6543 printf (" vsp = r%d", op & 0x0f);
6544 }
6545 else if ((op & 0xf0) == 0xa0)
6546 {
6547 int end = 4 + (op & 0x07);
6548 int first = 1;
6549 int i;
6550
6551 printf (" pop {");
6552 for (i = 4; i <= end; i++)
6553 {
6554 if (first)
6555 first = 0;
6556 else
6557 printf (", ");
6558 printf ("r%d", i);
6559 }
6560 if (op & 0x08)
6561 {
6562 if (first)
6563 printf (", ");
6564 printf ("r14");
6565 }
6566 printf ("}");
6567 }
6568 else if (op == 0xb0)
6569 printf (_(" finish"));
6570 else if (op == 0xb1)
6571 {
6572 GET_OP (op2);
6573 if (op2 == 0 || (op2 & 0xf0) != 0)
6574 printf (_("[Spare]"));
6575 else
6576 {
6577 unsigned int mask = op2 & 0x0f;
6578 int first = 1;
6579 int i;
6580
6581 printf ("pop {");
6582 for (i = 0; i < 12; i++)
6583 if (mask & (1 << i))
6584 {
6585 if (first)
6586 first = 0;
6587 else
6588 printf (", ");
6589 printf ("r%d", i);
6590 }
6591 printf ("}");
6592 }
6593 }
6594 else if (op == 0xb2)
6595 {
6596 unsigned char buf[9];
6597 unsigned int i, len;
6598 unsigned long offset;
6599
6600 for (i = 0; i < sizeof (buf); i++)
6601 {
6602 GET_OP (buf[i]);
6603 if ((buf[i] & 0x80) == 0)
6604 break;
6605 }
6606 assert (i < sizeof (buf));
6607 offset = read_uleb128 (buf, &len);
6608 assert (len == i + 1);
6609 offset = offset * 4 + 0x204;
6610 printf ("vsp = vsp + %ld", offset);
6611 }
6612 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6613 {
6614 unsigned int first, last;
6615
6616 GET_OP (op2);
6617 first = op2 >> 4;
6618 last = op2 & 0x0f;
6619 if (op == 0xc8)
6620 first = first + 16;
6621 printf ("pop {D%d", first);
6622 if (last)
6623 printf ("-D%d", first + last);
6624 printf ("}");
6625 }
6626 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6627 {
6628 unsigned int count = op & 0x07;
6629
6630 printf ("pop {D8");
6631 if (count)
6632 printf ("-D%d", 8 + count);
6633 printf ("}");
6634 }
6635 else if (op >= 0xc0 && op <= 0xc5)
6636 {
6637 unsigned int count = op & 0x07;
6638
6639 printf (" pop {wR10");
6640 if (count)
6641 printf ("-wR%d", 10 + count);
6642 printf ("}");
6643 }
6644 else if (op == 0xc6)
6645 {
6646 unsigned int first, last;
6647
6648 GET_OP (op2);
6649 first = op2 >> 4;
6650 last = op2 & 0x0f;
6651 printf ("pop {wR%d", first);
6652 if (last)
6653 printf ("-wR%d", first + last);
6654 printf ("}");
6655 }
6656 else if (op == 0xc7)
6657 {
6658 GET_OP (op2);
6659 if (op2 == 0 || (op2 & 0xf0) != 0)
6660 printf (_("[Spare]"));
6661 else
6662 {
6663 unsigned int mask = op2 & 0x0f;
6664 int first = 1;
6665 int i;
6666
6667 printf ("pop {");
6668 for (i = 0; i < 4; i++)
6669 if (mask & (1 << i))
6670 {
6671 if (first)
6672 first = 0;
6673 else
6674 printf (", ");
6675 printf ("wCGR%d", i);
6676 }
6677 printf ("}");
6678 }
6679 }
6680 else
6681 printf (_(" [unsupported opcode]"));
6682 printf ("\n");
6683 }
6684 }
6685
6686 static void
6687 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
6688 unsigned int word, unsigned int remaining,
6689 unsigned int more_words,
6690 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6691 struct arm_section *data_arm_sec)
6692 {
6693 struct absaddr addr;
6694
6695 /* Decode the unwinding instructions. */
6696 while (1)
6697 {
6698 unsigned int op, op2;
6699
6700 ADVANCE;
6701 if (remaining == 0)
6702 break;
6703 remaining--;
6704 op = word >> 24;
6705 word <<= 8;
6706
6707 printf (_(" 0x%02x "), op);
6708
6709 if ((op & 0xc0) == 0x00)
6710 {
6711 int offset = ((op & 0x3f) << 3) + 8;
6712 printf (_(" sp = sp + %d"), offset);
6713 }
6714 else if ((op & 0xc0) == 0x80)
6715 {
6716 GET_OP (op2);
6717 if (op == 0x80 && op2 == 0)
6718 printf (_("Refuse to unwind"));
6719 else
6720 {
6721 unsigned int mask = ((op & 0x1f) << 8) | op2;
6722 if (op & 0x20)
6723 printf ("pop compact {");
6724 else
6725 printf ("pop {");
6726
6727 decode_tic6x_unwind_regmask (mask);
6728 printf("}");
6729 }
6730 }
6731 else if ((op & 0xf0) == 0xc0)
6732 {
6733 unsigned int reg;
6734 unsigned int nregs;
6735 unsigned int i;
6736 const char *name;
6737 struct {
6738 unsigned int offset;
6739 unsigned int reg;
6740 } regpos[16];
6741
6742 /* Scan entire instruction first so that GET_OP output is not
6743 interleaved with disassembly. */
6744 nregs = 0;
6745 for (i = 0; nregs < (op & 0xf); i++)
6746 {
6747 GET_OP (op2);
6748 reg = op2 >> 4;
6749 if (reg != 0xf)
6750 {
6751 regpos[nregs].offset = i * 2;
6752 regpos[nregs].reg = reg;
6753 nregs++;
6754 }
6755
6756 reg = op2 & 0xf;
6757 if (reg != 0xf)
6758 {
6759 regpos[nregs].offset = i * 2 + 1;
6760 regpos[nregs].reg = reg;
6761 nregs++;
6762 }
6763 }
6764
6765 printf (_("pop frame {"));
6766 reg = nregs - 1;
6767 for (i = i * 2; i > 0; i--)
6768 {
6769 if (regpos[reg].offset == i - 1)
6770 {
6771 name = tic6x_unwind_regnames[regpos[reg].reg];
6772 if (reg > 0)
6773 reg--;
6774 }
6775 else
6776 name = _("[pad]");
6777
6778 fputs (name, stdout);
6779 if (i > 1)
6780 printf (", ");
6781 }
6782
6783 printf ("}");
6784 }
6785 else if (op == 0xd0)
6786 printf (" MOV FP, SP");
6787 else if (op == 0xd1)
6788 printf (" __c6xabi_pop_rts");
6789 else if (op == 0xd2)
6790 {
6791 unsigned char buf[9];
6792 unsigned int i, len;
6793 unsigned long offset;
6794 for (i = 0; i < sizeof (buf); i++)
6795 {
6796 GET_OP (buf[i]);
6797 if ((buf[i] & 0x80) == 0)
6798 break;
6799 }
6800 assert (i < sizeof (buf));
6801 offset = read_uleb128 (buf, &len);
6802 assert (len == i + 1);
6803 offset = offset * 8 + 0x408;
6804 printf (_("sp = sp + %ld"), offset);
6805 }
6806 else if ((op & 0xf0) == 0xe0)
6807 {
6808 if ((op & 0x0f) == 7)
6809 printf (" RETURN");
6810 else
6811 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
6812 }
6813 else
6814 {
6815 printf (_(" [unsupported opcode]"));
6816 }
6817 putchar ('\n');
6818 }
6819 }
6820
6821 static bfd_vma
6822 expand_prel31 (bfd_vma word, bfd_vma where)
6823 {
6824 bfd_vma offset;
6825
6826 offset = word & 0x7fffffff;
6827 if (offset & 0x40000000)
6828 offset |= ~ (bfd_vma) 0x7fffffff;
6829
6830 if (elf_header.e_machine == EM_TI_C6000)
6831 offset <<= 1;
6832
6833 return offset + where;
6834 }
6835
6836 static void
6837 decode_arm_unwind (struct arm_unw_aux_info *aux,
6838 unsigned int word, unsigned int remaining,
6839 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6840 struct arm_section *data_arm_sec)
6841 {
6842 int per_index;
6843 unsigned int more_words = 0;
6844 struct absaddr addr;
6845
6846 if (remaining == 0)
6847 {
6848 /* Fetch the first word. */
6849 if (!arm_section_get_word (aux, data_arm_sec, data_sec, data_offset,
6850 &word, &addr))
6851 return;
6852 remaining = 4;
6853 }
6854
6855 if ((word & 0x80000000) == 0)
6856 {
6857 /* Expand prel31 for personality routine. */
6858 bfd_vma fn;
6859 const char *procname;
6860
6861 fn = expand_prel31 (word, data_sec->sh_addr + data_offset);
6862 printf (_(" Personality routine: "));
6863 procname = arm_print_vma_and_name (aux, fn, addr);
6864 fputc ('\n', stdout);
6865
6866 /* The GCC personality routines use the standard compact
6867 encoding, starting with one byte giving the number of
6868 words. */
6869 if (procname != NULL
6870 && (const_strneq (procname, "__gcc_personality_v0")
6871 || const_strneq (procname, "__gxx_personality_v0")
6872 || const_strneq (procname, "__gcj_personality_v0")
6873 || const_strneq (procname, "__gnu_objc_personality_v0")))
6874 {
6875 remaining = 0;
6876 more_words = 1;
6877 ADVANCE;
6878 if (!remaining)
6879 {
6880 printf (_(" [Truncated data]\n"));
6881 return;
6882 }
6883 more_words = word >> 24;
6884 word <<= 8;
6885 remaining--;
6886 per_index = -1;
6887 }
6888 else
6889 return;
6890 }
6891 else
6892 {
6893
6894 per_index = (word >> 24) & 0x7f;
6895 printf (_(" Compact model %d\n"), per_index);
6896 if (per_index == 0)
6897 {
6898 more_words = 0;
6899 word <<= 8;
6900 remaining--;
6901 }
6902 else if (per_index < 3)
6903 {
6904 more_words = (word >> 16) & 0xff;
6905 word <<= 16;
6906 remaining -= 2;
6907 }
6908 }
6909
6910 switch (elf_header.e_machine)
6911 {
6912 case EM_ARM:
6913 if (per_index < 3)
6914 {
6915 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
6916 data_offset, data_sec, data_arm_sec);
6917 }
6918 else
6919 printf (" [reserved]\n");
6920 break;
6921
6922 case EM_TI_C6000:
6923 if (per_index < 3)
6924 {
6925 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
6926 data_offset, data_sec, data_arm_sec);
6927 }
6928 else if (per_index < 5)
6929 {
6930 if (((word >> 17) & 0x7f) == 0x7f)
6931 printf (_(" Restore stack from frame pointer\n"));
6932 else
6933 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
6934 printf (_(" Registers restored: "));
6935 if (per_index == 4)
6936 printf (" (compact) ");
6937 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
6938 putchar ('\n');
6939 printf (_(" Return register: %s\n"),
6940 tic6x_unwind_regnames[word & 0xf]);
6941 }
6942 else
6943 printf (" [reserved]\n");
6944 break;
6945
6946 default:
6947 abort ();
6948 }
6949
6950 /* Decode the descriptors. Not implemented. */
6951 }
6952
6953 static void
6954 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
6955 {
6956 struct arm_section exidx_arm_sec, extab_arm_sec;
6957 unsigned int i, exidx_len;
6958
6959 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
6960 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
6961 exidx_len = exidx_sec->sh_size / 8;
6962
6963 for (i = 0; i < exidx_len; i++)
6964 {
6965 unsigned int exidx_fn, exidx_entry;
6966 struct absaddr fn_addr, entry_addr;
6967 bfd_vma fn;
6968
6969 fputc ('\n', stdout);
6970
6971 if (!arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6972 8 * i, &exidx_fn, &fn_addr)
6973 || !arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6974 8 * i + 4, &exidx_entry, &entry_addr))
6975 {
6976 arm_free_section (&exidx_arm_sec);
6977 arm_free_section (&extab_arm_sec);
6978 return;
6979 }
6980
6981 fn = expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
6982
6983 arm_print_vma_and_name (aux, fn, entry_addr);
6984 fputs (": ", stdout);
6985
6986 if (exidx_entry == 1)
6987 {
6988 print_vma (exidx_entry, PREFIX_HEX);
6989 fputs (" [cantunwind]\n", stdout);
6990 }
6991 else if (exidx_entry & 0x80000000)
6992 {
6993 print_vma (exidx_entry, PREFIX_HEX);
6994 fputc ('\n', stdout);
6995 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
6996 }
6997 else
6998 {
6999 bfd_vma table, table_offset = 0;
7000 Elf_Internal_Shdr *table_sec;
7001
7002 fputs ("@", stdout);
7003 table = expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7004 print_vma (table, PREFIX_HEX);
7005 printf ("\n");
7006
7007 /* Locate the matching .ARM.extab. */
7008 if (entry_addr.section != SHN_UNDEF
7009 && entry_addr.section < elf_header.e_shnum)
7010 {
7011 table_sec = section_headers + entry_addr.section;
7012 table_offset = entry_addr.offset;
7013 }
7014 else
7015 {
7016 table_sec = find_section_by_address (table);
7017 if (table_sec != NULL)
7018 table_offset = table - table_sec->sh_addr;
7019 }
7020 if (table_sec == NULL)
7021 {
7022 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7023 (unsigned long) table);
7024 continue;
7025 }
7026 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7027 &extab_arm_sec);
7028 }
7029 }
7030
7031 printf ("\n");
7032
7033 arm_free_section (&exidx_arm_sec);
7034 arm_free_section (&extab_arm_sec);
7035 }
7036
7037 /* Used for both ARM and C6X unwinding tables. */
7038 static int
7039 arm_process_unwind (FILE *file)
7040 {
7041 struct arm_unw_aux_info aux;
7042 Elf_Internal_Shdr *unwsec = NULL;
7043 Elf_Internal_Shdr *strsec;
7044 Elf_Internal_Shdr *sec;
7045 unsigned long i;
7046 unsigned int sec_type;
7047
7048 memset (& aux, 0, sizeof (aux));
7049 aux.file = file;
7050
7051 switch (elf_header.e_machine)
7052 {
7053 case EM_ARM:
7054 sec_type = SHT_ARM_EXIDX;
7055 break;
7056
7057 case EM_TI_C6000:
7058 sec_type = SHT_C6000_UNWIND;
7059 break;
7060
7061 default:
7062 abort();
7063 }
7064
7065 if (string_table == NULL)
7066 return 1;
7067
7068 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7069 {
7070 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7071 {
7072 aux.nsyms = sec->sh_size / sec->sh_entsize;
7073 aux.symtab = GET_ELF_SYMBOLS (file, sec);
7074
7075 strsec = section_headers + sec->sh_link;
7076 assert (aux.strtab == NULL);
7077 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7078 1, strsec->sh_size, _("string table"));
7079 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7080 }
7081 else if (sec->sh_type == sec_type)
7082 unwsec = sec;
7083 }
7084
7085 if (!unwsec)
7086 printf (_("\nThere are no unwind sections in this file.\n"));
7087
7088 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7089 {
7090 if (sec->sh_type == sec_type)
7091 {
7092 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7093 SECTION_NAME (sec),
7094 (unsigned long) sec->sh_offset,
7095 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7096
7097 dump_arm_unwind (&aux, sec);
7098 }
7099 }
7100
7101 if (aux.symtab)
7102 free (aux.symtab);
7103 if (aux.strtab)
7104 free ((char *) aux.strtab);
7105
7106 return 1;
7107 }
7108
7109 static int
7110 process_unwind (FILE * file)
7111 {
7112 struct unwind_handler
7113 {
7114 int machtype;
7115 int (* handler)(FILE *);
7116 } handlers[] =
7117 {
7118 { EM_ARM, arm_process_unwind },
7119 { EM_IA_64, ia64_process_unwind },
7120 { EM_PARISC, hppa_process_unwind },
7121 { EM_TI_C6000, arm_process_unwind },
7122 { 0, 0 }
7123 };
7124 int i;
7125
7126 if (!do_unwind)
7127 return 1;
7128
7129 for (i = 0; handlers[i].handler != NULL; i++)
7130 if (elf_header.e_machine == handlers[i].machtype)
7131 return handlers[i].handler (file);
7132
7133 printf (_("\nThere are no unwind sections in this file.\n"));
7134 return 1;
7135 }
7136
7137 static void
7138 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7139 {
7140 switch (entry->d_tag)
7141 {
7142 case DT_MIPS_FLAGS:
7143 if (entry->d_un.d_val == 0)
7144 printf (_("NONE\n"));
7145 else
7146 {
7147 static const char * opts[] =
7148 {
7149 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7150 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7151 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7152 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7153 "RLD_ORDER_SAFE"
7154 };
7155 unsigned int cnt;
7156 int first = 1;
7157
7158 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7159 if (entry->d_un.d_val & (1 << cnt))
7160 {
7161 printf ("%s%s", first ? "" : " ", opts[cnt]);
7162 first = 0;
7163 }
7164 puts ("");
7165 }
7166 break;
7167
7168 case DT_MIPS_IVERSION:
7169 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7170 printf (_("Interface Version: %s\n"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7171 else
7172 printf (_("<corrupt: %ld>\n"), (long) entry->d_un.d_ptr);
7173 break;
7174
7175 case DT_MIPS_TIME_STAMP:
7176 {
7177 char timebuf[20];
7178 struct tm * tmp;
7179
7180 time_t atime = entry->d_un.d_val;
7181 tmp = gmtime (&atime);
7182 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7183 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7184 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7185 printf (_("Time Stamp: %s\n"), timebuf);
7186 }
7187 break;
7188
7189 case DT_MIPS_RLD_VERSION:
7190 case DT_MIPS_LOCAL_GOTNO:
7191 case DT_MIPS_CONFLICTNO:
7192 case DT_MIPS_LIBLISTNO:
7193 case DT_MIPS_SYMTABNO:
7194 case DT_MIPS_UNREFEXTNO:
7195 case DT_MIPS_HIPAGENO:
7196 case DT_MIPS_DELTA_CLASS_NO:
7197 case DT_MIPS_DELTA_INSTANCE_NO:
7198 case DT_MIPS_DELTA_RELOC_NO:
7199 case DT_MIPS_DELTA_SYM_NO:
7200 case DT_MIPS_DELTA_CLASSSYM_NO:
7201 case DT_MIPS_COMPACT_SIZE:
7202 printf ("%ld\n", (long) entry->d_un.d_ptr);
7203 break;
7204
7205 default:
7206 printf ("%#lx\n", (unsigned long) entry->d_un.d_ptr);
7207 }
7208 }
7209
7210 static void
7211 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7212 {
7213 switch (entry->d_tag)
7214 {
7215 case DT_HP_DLD_FLAGS:
7216 {
7217 static struct
7218 {
7219 long int bit;
7220 const char * str;
7221 }
7222 flags[] =
7223 {
7224 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7225 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7226 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7227 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7228 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7229 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7230 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7231 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7232 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7233 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7234 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7235 { DT_HP_GST, "HP_GST" },
7236 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7237 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7238 { DT_HP_NODELETE, "HP_NODELETE" },
7239 { DT_HP_GROUP, "HP_GROUP" },
7240 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7241 };
7242 int first = 1;
7243 size_t cnt;
7244 bfd_vma val = entry->d_un.d_val;
7245
7246 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7247 if (val & flags[cnt].bit)
7248 {
7249 if (! first)
7250 putchar (' ');
7251 fputs (flags[cnt].str, stdout);
7252 first = 0;
7253 val ^= flags[cnt].bit;
7254 }
7255
7256 if (val != 0 || first)
7257 {
7258 if (! first)
7259 putchar (' ');
7260 print_vma (val, HEX);
7261 }
7262 }
7263 break;
7264
7265 default:
7266 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7267 break;
7268 }
7269 putchar ('\n');
7270 }
7271
7272 #ifdef BFD64
7273
7274 /* VMS vs Unix time offset and factor. */
7275
7276 #define VMS_EPOCH_OFFSET 35067168000000000LL
7277 #define VMS_GRANULARITY_FACTOR 10000000
7278
7279 /* Display a VMS time in a human readable format. */
7280
7281 static void
7282 print_vms_time (bfd_int64_t vmstime)
7283 {
7284 struct tm *tm;
7285 time_t unxtime;
7286
7287 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7288 tm = gmtime (&unxtime);
7289 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7290 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7291 tm->tm_hour, tm->tm_min, tm->tm_sec);
7292 }
7293 #endif /* BFD64 */
7294
7295 static void
7296 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7297 {
7298 switch (entry->d_tag)
7299 {
7300 case DT_IA_64_PLT_RESERVE:
7301 /* First 3 slots reserved. */
7302 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7303 printf (" -- ");
7304 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7305 break;
7306
7307 case DT_IA_64_VMS_LINKTIME:
7308 #ifdef BFD64
7309 print_vms_time (entry->d_un.d_val);
7310 #endif
7311 break;
7312
7313 case DT_IA_64_VMS_LNKFLAGS:
7314 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7315 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7316 printf (" CALL_DEBUG");
7317 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7318 printf (" NOP0BUFS");
7319 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7320 printf (" P0IMAGE");
7321 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7322 printf (" MKTHREADS");
7323 if (entry->d_un.d_val & VMS_LF_UPCALLS)
7324 printf (" UPCALLS");
7325 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7326 printf (" IMGSTA");
7327 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7328 printf (" INITIALIZE");
7329 if (entry->d_un.d_val & VMS_LF_MAIN)
7330 printf (" MAIN");
7331 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7332 printf (" EXE_INIT");
7333 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7334 printf (" TBK_IN_IMG");
7335 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7336 printf (" DBG_IN_IMG");
7337 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7338 printf (" TBK_IN_DSF");
7339 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7340 printf (" DBG_IN_DSF");
7341 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7342 printf (" SIGNATURES");
7343 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7344 printf (" REL_SEG_OFF");
7345 break;
7346
7347 default:
7348 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7349 break;
7350 }
7351 putchar ('\n');
7352 }
7353
7354 static int
7355 get_32bit_dynamic_section (FILE * file)
7356 {
7357 Elf32_External_Dyn * edyn;
7358 Elf32_External_Dyn * ext;
7359 Elf_Internal_Dyn * entry;
7360
7361 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7362 dynamic_size, _("dynamic section"));
7363 if (!edyn)
7364 return 0;
7365
7366 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7367 might not have the luxury of section headers. Look for the DT_NULL
7368 terminator to determine the number of entries. */
7369 for (ext = edyn, dynamic_nent = 0;
7370 (char *) ext < (char *) edyn + dynamic_size;
7371 ext++)
7372 {
7373 dynamic_nent++;
7374 if (BYTE_GET (ext->d_tag) == DT_NULL)
7375 break;
7376 }
7377
7378 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7379 sizeof (* entry));
7380 if (dynamic_section == NULL)
7381 {
7382 error (_("Out of memory\n"));
7383 free (edyn);
7384 return 0;
7385 }
7386
7387 for (ext = edyn, entry = dynamic_section;
7388 entry < dynamic_section + dynamic_nent;
7389 ext++, entry++)
7390 {
7391 entry->d_tag = BYTE_GET (ext->d_tag);
7392 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7393 }
7394
7395 free (edyn);
7396
7397 return 1;
7398 }
7399
7400 static int
7401 get_64bit_dynamic_section (FILE * file)
7402 {
7403 Elf64_External_Dyn * edyn;
7404 Elf64_External_Dyn * ext;
7405 Elf_Internal_Dyn * entry;
7406
7407 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7408 dynamic_size, _("dynamic section"));
7409 if (!edyn)
7410 return 0;
7411
7412 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7413 might not have the luxury of section headers. Look for the DT_NULL
7414 terminator to determine the number of entries. */
7415 for (ext = edyn, dynamic_nent = 0;
7416 (char *) ext < (char *) edyn + dynamic_size;
7417 ext++)
7418 {
7419 dynamic_nent++;
7420 if (BYTE_GET (ext->d_tag) == DT_NULL)
7421 break;
7422 }
7423
7424 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7425 sizeof (* entry));
7426 if (dynamic_section == NULL)
7427 {
7428 error (_("Out of memory\n"));
7429 free (edyn);
7430 return 0;
7431 }
7432
7433 for (ext = edyn, entry = dynamic_section;
7434 entry < dynamic_section + dynamic_nent;
7435 ext++, entry++)
7436 {
7437 entry->d_tag = BYTE_GET (ext->d_tag);
7438 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7439 }
7440
7441 free (edyn);
7442
7443 return 1;
7444 }
7445
7446 static void
7447 print_dynamic_flags (bfd_vma flags)
7448 {
7449 int first = 1;
7450
7451 while (flags)
7452 {
7453 bfd_vma flag;
7454
7455 flag = flags & - flags;
7456 flags &= ~ flag;
7457
7458 if (first)
7459 first = 0;
7460 else
7461 putc (' ', stdout);
7462
7463 switch (flag)
7464 {
7465 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7466 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7467 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7468 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7469 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7470 default: fputs (_("unknown"), stdout); break;
7471 }
7472 }
7473 puts ("");
7474 }
7475
7476 /* Parse and display the contents of the dynamic section. */
7477
7478 static int
7479 process_dynamic_section (FILE * file)
7480 {
7481 Elf_Internal_Dyn * entry;
7482
7483 if (dynamic_size == 0)
7484 {
7485 if (do_dynamic)
7486 printf (_("\nThere is no dynamic section in this file.\n"));
7487
7488 return 1;
7489 }
7490
7491 if (is_32bit_elf)
7492 {
7493 if (! get_32bit_dynamic_section (file))
7494 return 0;
7495 }
7496 else if (! get_64bit_dynamic_section (file))
7497 return 0;
7498
7499 /* Find the appropriate symbol table. */
7500 if (dynamic_symbols == NULL)
7501 {
7502 for (entry = dynamic_section;
7503 entry < dynamic_section + dynamic_nent;
7504 ++entry)
7505 {
7506 Elf_Internal_Shdr section;
7507
7508 if (entry->d_tag != DT_SYMTAB)
7509 continue;
7510
7511 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7512
7513 /* Since we do not know how big the symbol table is,
7514 we default to reading in the entire file (!) and
7515 processing that. This is overkill, I know, but it
7516 should work. */
7517 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7518
7519 if (archive_file_offset != 0)
7520 section.sh_size = archive_file_size - section.sh_offset;
7521 else
7522 {
7523 if (fseek (file, 0, SEEK_END))
7524 error (_("Unable to seek to end of file!\n"));
7525
7526 section.sh_size = ftell (file) - section.sh_offset;
7527 }
7528
7529 if (is_32bit_elf)
7530 section.sh_entsize = sizeof (Elf32_External_Sym);
7531 else
7532 section.sh_entsize = sizeof (Elf64_External_Sym);
7533
7534 num_dynamic_syms = section.sh_size / section.sh_entsize;
7535 if (num_dynamic_syms < 1)
7536 {
7537 error (_("Unable to determine the number of symbols to load\n"));
7538 continue;
7539 }
7540
7541 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
7542 }
7543 }
7544
7545 /* Similarly find a string table. */
7546 if (dynamic_strings == NULL)
7547 {
7548 for (entry = dynamic_section;
7549 entry < dynamic_section + dynamic_nent;
7550 ++entry)
7551 {
7552 unsigned long offset;
7553 long str_tab_len;
7554
7555 if (entry->d_tag != DT_STRTAB)
7556 continue;
7557
7558 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7559
7560 /* Since we do not know how big the string table is,
7561 we default to reading in the entire file (!) and
7562 processing that. This is overkill, I know, but it
7563 should work. */
7564
7565 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7566
7567 if (archive_file_offset != 0)
7568 str_tab_len = archive_file_size - offset;
7569 else
7570 {
7571 if (fseek (file, 0, SEEK_END))
7572 error (_("Unable to seek to end of file\n"));
7573 str_tab_len = ftell (file) - offset;
7574 }
7575
7576 if (str_tab_len < 1)
7577 {
7578 error
7579 (_("Unable to determine the length of the dynamic string table\n"));
7580 continue;
7581 }
7582
7583 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7584 str_tab_len,
7585 _("dynamic string table"));
7586 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7587 break;
7588 }
7589 }
7590
7591 /* And find the syminfo section if available. */
7592 if (dynamic_syminfo == NULL)
7593 {
7594 unsigned long syminsz = 0;
7595
7596 for (entry = dynamic_section;
7597 entry < dynamic_section + dynamic_nent;
7598 ++entry)
7599 {
7600 if (entry->d_tag == DT_SYMINENT)
7601 {
7602 /* Note: these braces are necessary to avoid a syntax
7603 error from the SunOS4 C compiler. */
7604 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7605 }
7606 else if (entry->d_tag == DT_SYMINSZ)
7607 syminsz = entry->d_un.d_val;
7608 else if (entry->d_tag == DT_SYMINFO)
7609 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7610 syminsz);
7611 }
7612
7613 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7614 {
7615 Elf_External_Syminfo * extsyminfo;
7616 Elf_External_Syminfo * extsym;
7617 Elf_Internal_Syminfo * syminfo;
7618
7619 /* There is a syminfo section. Read the data. */
7620 extsyminfo = (Elf_External_Syminfo *)
7621 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7622 _("symbol information"));
7623 if (!extsyminfo)
7624 return 0;
7625
7626 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7627 if (dynamic_syminfo == NULL)
7628 {
7629 error (_("Out of memory\n"));
7630 return 0;
7631 }
7632
7633 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7634 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7635 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7636 ++syminfo, ++extsym)
7637 {
7638 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7639 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7640 }
7641
7642 free (extsyminfo);
7643 }
7644 }
7645
7646 if (do_dynamic && dynamic_addr)
7647 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7648 dynamic_addr, dynamic_nent);
7649 if (do_dynamic)
7650 printf (_(" Tag Type Name/Value\n"));
7651
7652 for (entry = dynamic_section;
7653 entry < dynamic_section + dynamic_nent;
7654 entry++)
7655 {
7656 if (do_dynamic)
7657 {
7658 const char * dtype;
7659
7660 putchar (' ');
7661 print_vma (entry->d_tag, FULL_HEX);
7662 dtype = get_dynamic_type (entry->d_tag);
7663 printf (" (%s)%*s", dtype,
7664 ((is_32bit_elf ? 27 : 19)
7665 - (int) strlen (dtype)),
7666 " ");
7667 }
7668
7669 switch (entry->d_tag)
7670 {
7671 case DT_FLAGS:
7672 if (do_dynamic)
7673 print_dynamic_flags (entry->d_un.d_val);
7674 break;
7675
7676 case DT_AUXILIARY:
7677 case DT_FILTER:
7678 case DT_CONFIG:
7679 case DT_DEPAUDIT:
7680 case DT_AUDIT:
7681 if (do_dynamic)
7682 {
7683 switch (entry->d_tag)
7684 {
7685 case DT_AUXILIARY:
7686 printf (_("Auxiliary library"));
7687 break;
7688
7689 case DT_FILTER:
7690 printf (_("Filter library"));
7691 break;
7692
7693 case DT_CONFIG:
7694 printf (_("Configuration file"));
7695 break;
7696
7697 case DT_DEPAUDIT:
7698 printf (_("Dependency audit library"));
7699 break;
7700
7701 case DT_AUDIT:
7702 printf (_("Audit library"));
7703 break;
7704 }
7705
7706 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7707 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7708 else
7709 {
7710 printf (": ");
7711 print_vma (entry->d_un.d_val, PREFIX_HEX);
7712 putchar ('\n');
7713 }
7714 }
7715 break;
7716
7717 case DT_FEATURE:
7718 if (do_dynamic)
7719 {
7720 printf (_("Flags:"));
7721
7722 if (entry->d_un.d_val == 0)
7723 printf (_(" None\n"));
7724 else
7725 {
7726 unsigned long int val = entry->d_un.d_val;
7727
7728 if (val & DTF_1_PARINIT)
7729 {
7730 printf (" PARINIT");
7731 val ^= DTF_1_PARINIT;
7732 }
7733 if (val & DTF_1_CONFEXP)
7734 {
7735 printf (" CONFEXP");
7736 val ^= DTF_1_CONFEXP;
7737 }
7738 if (val != 0)
7739 printf (" %lx", val);
7740 puts ("");
7741 }
7742 }
7743 break;
7744
7745 case DT_POSFLAG_1:
7746 if (do_dynamic)
7747 {
7748 printf (_("Flags:"));
7749
7750 if (entry->d_un.d_val == 0)
7751 printf (_(" None\n"));
7752 else
7753 {
7754 unsigned long int val = entry->d_un.d_val;
7755
7756 if (val & DF_P1_LAZYLOAD)
7757 {
7758 printf (" LAZYLOAD");
7759 val ^= DF_P1_LAZYLOAD;
7760 }
7761 if (val & DF_P1_GROUPPERM)
7762 {
7763 printf (" GROUPPERM");
7764 val ^= DF_P1_GROUPPERM;
7765 }
7766 if (val != 0)
7767 printf (" %lx", val);
7768 puts ("");
7769 }
7770 }
7771 break;
7772
7773 case DT_FLAGS_1:
7774 if (do_dynamic)
7775 {
7776 printf (_("Flags:"));
7777 if (entry->d_un.d_val == 0)
7778 printf (_(" None\n"));
7779 else
7780 {
7781 unsigned long int val = entry->d_un.d_val;
7782
7783 if (val & DF_1_NOW)
7784 {
7785 printf (" NOW");
7786 val ^= DF_1_NOW;
7787 }
7788 if (val & DF_1_GLOBAL)
7789 {
7790 printf (" GLOBAL");
7791 val ^= DF_1_GLOBAL;
7792 }
7793 if (val & DF_1_GROUP)
7794 {
7795 printf (" GROUP");
7796 val ^= DF_1_GROUP;
7797 }
7798 if (val & DF_1_NODELETE)
7799 {
7800 printf (" NODELETE");
7801 val ^= DF_1_NODELETE;
7802 }
7803 if (val & DF_1_LOADFLTR)
7804 {
7805 printf (" LOADFLTR");
7806 val ^= DF_1_LOADFLTR;
7807 }
7808 if (val & DF_1_INITFIRST)
7809 {
7810 printf (" INITFIRST");
7811 val ^= DF_1_INITFIRST;
7812 }
7813 if (val & DF_1_NOOPEN)
7814 {
7815 printf (" NOOPEN");
7816 val ^= DF_1_NOOPEN;
7817 }
7818 if (val & DF_1_ORIGIN)
7819 {
7820 printf (" ORIGIN");
7821 val ^= DF_1_ORIGIN;
7822 }
7823 if (val & DF_1_DIRECT)
7824 {
7825 printf (" DIRECT");
7826 val ^= DF_1_DIRECT;
7827 }
7828 if (val & DF_1_TRANS)
7829 {
7830 printf (" TRANS");
7831 val ^= DF_1_TRANS;
7832 }
7833 if (val & DF_1_INTERPOSE)
7834 {
7835 printf (" INTERPOSE");
7836 val ^= DF_1_INTERPOSE;
7837 }
7838 if (val & DF_1_NODEFLIB)
7839 {
7840 printf (" NODEFLIB");
7841 val ^= DF_1_NODEFLIB;
7842 }
7843 if (val & DF_1_NODUMP)
7844 {
7845 printf (" NODUMP");
7846 val ^= DF_1_NODUMP;
7847 }
7848 if (val & DF_1_CONLFAT)
7849 {
7850 printf (" CONLFAT");
7851 val ^= DF_1_CONLFAT;
7852 }
7853 if (val != 0)
7854 printf (" %lx", val);
7855 puts ("");
7856 }
7857 }
7858 break;
7859
7860 case DT_PLTREL:
7861 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7862 if (do_dynamic)
7863 puts (get_dynamic_type (entry->d_un.d_val));
7864 break;
7865
7866 case DT_NULL :
7867 case DT_NEEDED :
7868 case DT_PLTGOT :
7869 case DT_HASH :
7870 case DT_STRTAB :
7871 case DT_SYMTAB :
7872 case DT_RELA :
7873 case DT_INIT :
7874 case DT_FINI :
7875 case DT_SONAME :
7876 case DT_RPATH :
7877 case DT_SYMBOLIC:
7878 case DT_REL :
7879 case DT_DEBUG :
7880 case DT_TEXTREL :
7881 case DT_JMPREL :
7882 case DT_RUNPATH :
7883 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7884
7885 if (do_dynamic)
7886 {
7887 char * name;
7888
7889 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7890 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7891 else
7892 name = NULL;
7893
7894 if (name)
7895 {
7896 switch (entry->d_tag)
7897 {
7898 case DT_NEEDED:
7899 printf (_("Shared library: [%s]"), name);
7900
7901 if (streq (name, program_interpreter))
7902 printf (_(" program interpreter"));
7903 break;
7904
7905 case DT_SONAME:
7906 printf (_("Library soname: [%s]"), name);
7907 break;
7908
7909 case DT_RPATH:
7910 printf (_("Library rpath: [%s]"), name);
7911 break;
7912
7913 case DT_RUNPATH:
7914 printf (_("Library runpath: [%s]"), name);
7915 break;
7916
7917 default:
7918 print_vma (entry->d_un.d_val, PREFIX_HEX);
7919 break;
7920 }
7921 }
7922 else
7923 print_vma (entry->d_un.d_val, PREFIX_HEX);
7924
7925 putchar ('\n');
7926 }
7927 break;
7928
7929 case DT_PLTRELSZ:
7930 case DT_RELASZ :
7931 case DT_STRSZ :
7932 case DT_RELSZ :
7933 case DT_RELAENT :
7934 case DT_SYMENT :
7935 case DT_RELENT :
7936 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7937 case DT_PLTPADSZ:
7938 case DT_MOVEENT :
7939 case DT_MOVESZ :
7940 case DT_INIT_ARRAYSZ:
7941 case DT_FINI_ARRAYSZ:
7942 case DT_GNU_CONFLICTSZ:
7943 case DT_GNU_LIBLISTSZ:
7944 if (do_dynamic)
7945 {
7946 print_vma (entry->d_un.d_val, UNSIGNED);
7947 printf (_(" (bytes)\n"));
7948 }
7949 break;
7950
7951 case DT_VERDEFNUM:
7952 case DT_VERNEEDNUM:
7953 case DT_RELACOUNT:
7954 case DT_RELCOUNT:
7955 if (do_dynamic)
7956 {
7957 print_vma (entry->d_un.d_val, UNSIGNED);
7958 putchar ('\n');
7959 }
7960 break;
7961
7962 case DT_SYMINSZ:
7963 case DT_SYMINENT:
7964 case DT_SYMINFO:
7965 case DT_USED:
7966 case DT_INIT_ARRAY:
7967 case DT_FINI_ARRAY:
7968 if (do_dynamic)
7969 {
7970 if (entry->d_tag == DT_USED
7971 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
7972 {
7973 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7974
7975 if (*name)
7976 {
7977 printf (_("Not needed object: [%s]\n"), name);
7978 break;
7979 }
7980 }
7981
7982 print_vma (entry->d_un.d_val, PREFIX_HEX);
7983 putchar ('\n');
7984 }
7985 break;
7986
7987 case DT_BIND_NOW:
7988 /* The value of this entry is ignored. */
7989 if (do_dynamic)
7990 putchar ('\n');
7991 break;
7992
7993 case DT_GNU_PRELINKED:
7994 if (do_dynamic)
7995 {
7996 struct tm * tmp;
7997 time_t atime = entry->d_un.d_val;
7998
7999 tmp = gmtime (&atime);
8000 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8001 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8002 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8003
8004 }
8005 break;
8006
8007 case DT_GNU_HASH:
8008 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8009 if (do_dynamic)
8010 {
8011 print_vma (entry->d_un.d_val, PREFIX_HEX);
8012 putchar ('\n');
8013 }
8014 break;
8015
8016 default:
8017 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8018 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8019 entry->d_un.d_val;
8020
8021 if (do_dynamic)
8022 {
8023 switch (elf_header.e_machine)
8024 {
8025 case EM_MIPS:
8026 case EM_MIPS_RS3_LE:
8027 dynamic_section_mips_val (entry);
8028 break;
8029 case EM_PARISC:
8030 dynamic_section_parisc_val (entry);
8031 break;
8032 case EM_IA_64:
8033 dynamic_section_ia64_val (entry);
8034 break;
8035 default:
8036 print_vma (entry->d_un.d_val, PREFIX_HEX);
8037 putchar ('\n');
8038 }
8039 }
8040 break;
8041 }
8042 }
8043
8044 return 1;
8045 }
8046
8047 static char *
8048 get_ver_flags (unsigned int flags)
8049 {
8050 static char buff[32];
8051
8052 buff[0] = 0;
8053
8054 if (flags == 0)
8055 return _("none");
8056
8057 if (flags & VER_FLG_BASE)
8058 strcat (buff, "BASE ");
8059
8060 if (flags & VER_FLG_WEAK)
8061 {
8062 if (flags & VER_FLG_BASE)
8063 strcat (buff, "| ");
8064
8065 strcat (buff, "WEAK ");
8066 }
8067
8068 if (flags & VER_FLG_INFO)
8069 {
8070 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8071 strcat (buff, "| ");
8072
8073 strcat (buff, "INFO ");
8074 }
8075
8076 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8077 strcat (buff, _("| <unknown>"));
8078
8079 return buff;
8080 }
8081
8082 /* Display the contents of the version sections. */
8083
8084 static int
8085 process_version_sections (FILE * file)
8086 {
8087 Elf_Internal_Shdr * section;
8088 unsigned i;
8089 int found = 0;
8090
8091 if (! do_version)
8092 return 1;
8093
8094 for (i = 0, section = section_headers;
8095 i < elf_header.e_shnum;
8096 i++, section++)
8097 {
8098 switch (section->sh_type)
8099 {
8100 case SHT_GNU_verdef:
8101 {
8102 Elf_External_Verdef * edefs;
8103 unsigned int idx;
8104 unsigned int cnt;
8105 char * endbuf;
8106
8107 found = 1;
8108
8109 printf
8110 (_("\nVersion definition section '%s' contains %u entries:\n"),
8111 SECTION_NAME (section), section->sh_info);
8112
8113 printf (_(" Addr: 0x"));
8114 printf_vma (section->sh_addr);
8115 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8116 (unsigned long) section->sh_offset, section->sh_link,
8117 section->sh_link < elf_header.e_shnum
8118 ? SECTION_NAME (section_headers + section->sh_link)
8119 : _("<corrupt>"));
8120
8121 edefs = (Elf_External_Verdef *)
8122 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8123 _("version definition section"));
8124 if (!edefs)
8125 break;
8126 endbuf = (char *) edefs + section->sh_size;
8127
8128 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8129 {
8130 char * vstart;
8131 Elf_External_Verdef * edef;
8132 Elf_Internal_Verdef ent;
8133 Elf_External_Verdaux * eaux;
8134 Elf_Internal_Verdaux aux;
8135 int j;
8136 int isum;
8137
8138 /* Check for negative or very large indicies. */
8139 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
8140 break;
8141
8142 vstart = ((char *) edefs) + idx;
8143 if (vstart + sizeof (*edef) > endbuf)
8144 break;
8145
8146 edef = (Elf_External_Verdef *) vstart;
8147
8148 ent.vd_version = BYTE_GET (edef->vd_version);
8149 ent.vd_flags = BYTE_GET (edef->vd_flags);
8150 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
8151 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
8152 ent.vd_hash = BYTE_GET (edef->vd_hash);
8153 ent.vd_aux = BYTE_GET (edef->vd_aux);
8154 ent.vd_next = BYTE_GET (edef->vd_next);
8155
8156 printf (_(" %#06x: Rev: %d Flags: %s"),
8157 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8158
8159 printf (_(" Index: %d Cnt: %d "),
8160 ent.vd_ndx, ent.vd_cnt);
8161
8162 /* Check for overflow. */
8163 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
8164 || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
8165 break;
8166
8167 vstart += ent.vd_aux;
8168
8169 eaux = (Elf_External_Verdaux *) vstart;
8170
8171 aux.vda_name = BYTE_GET (eaux->vda_name);
8172 aux.vda_next = BYTE_GET (eaux->vda_next);
8173
8174 if (VALID_DYNAMIC_NAME (aux.vda_name))
8175 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8176 else
8177 printf (_("Name index: %ld\n"), aux.vda_name);
8178
8179 isum = idx + ent.vd_aux;
8180
8181 for (j = 1; j < ent.vd_cnt; j++)
8182 {
8183 /* Check for overflow. */
8184 if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
8185 || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
8186 break;
8187
8188 isum += aux.vda_next;
8189 vstart += aux.vda_next;
8190
8191 eaux = (Elf_External_Verdaux *) vstart;
8192 if (vstart + sizeof (*eaux) > endbuf)
8193 break;
8194
8195 aux.vda_name = BYTE_GET (eaux->vda_name);
8196 aux.vda_next = BYTE_GET (eaux->vda_next);
8197
8198 if (VALID_DYNAMIC_NAME (aux.vda_name))
8199 printf (_(" %#06x: Parent %d: %s\n"),
8200 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8201 else
8202 printf (_(" %#06x: Parent %d, name index: %ld\n"),
8203 isum, j, aux.vda_name);
8204 }
8205
8206 if (j < ent.vd_cnt)
8207 printf (_(" Version def aux past end of section\n"));
8208
8209 idx += ent.vd_next;
8210 }
8211
8212 if (cnt < section->sh_info)
8213 printf (_(" Version definition past end of section\n"));
8214
8215 free (edefs);
8216 }
8217 break;
8218
8219 case SHT_GNU_verneed:
8220 {
8221 Elf_External_Verneed * eneed;
8222 unsigned int idx;
8223 unsigned int cnt;
8224 char * endbuf;
8225
8226 found = 1;
8227
8228 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8229 SECTION_NAME (section), section->sh_info);
8230
8231 printf (_(" Addr: 0x"));
8232 printf_vma (section->sh_addr);
8233 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8234 (unsigned long) section->sh_offset, section->sh_link,
8235 section->sh_link < elf_header.e_shnum
8236 ? SECTION_NAME (section_headers + section->sh_link)
8237 : _("<corrupt>"));
8238
8239 eneed = (Elf_External_Verneed *) get_data (NULL, file,
8240 section->sh_offset, 1,
8241 section->sh_size,
8242 _("version need section"));
8243 if (!eneed)
8244 break;
8245 endbuf = (char *) eneed + section->sh_size;
8246
8247 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8248 {
8249 Elf_External_Verneed * entry;
8250 Elf_Internal_Verneed ent;
8251 int j;
8252 int isum;
8253 char * vstart;
8254
8255 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
8256 break;
8257
8258 vstart = ((char *) eneed) + idx;
8259 if (vstart + sizeof (*entry) > endbuf)
8260 break;
8261
8262 entry = (Elf_External_Verneed *) vstart;
8263
8264 ent.vn_version = BYTE_GET (entry->vn_version);
8265 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
8266 ent.vn_file = BYTE_GET (entry->vn_file);
8267 ent.vn_aux = BYTE_GET (entry->vn_aux);
8268 ent.vn_next = BYTE_GET (entry->vn_next);
8269
8270 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
8271
8272 if (VALID_DYNAMIC_NAME (ent.vn_file))
8273 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8274 else
8275 printf (_(" File: %lx"), ent.vn_file);
8276
8277 printf (_(" Cnt: %d\n"), ent.vn_cnt);
8278
8279 /* Check for overflow. */
8280 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
8281 || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
8282 break;
8283
8284 vstart += ent.vn_aux;
8285
8286 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8287 {
8288 Elf_External_Vernaux * eaux;
8289 Elf_Internal_Vernaux aux;
8290
8291 if (vstart + sizeof (*eaux) > endbuf)
8292 break;
8293 eaux = (Elf_External_Vernaux *) vstart;
8294
8295 aux.vna_hash = BYTE_GET (eaux->vna_hash);
8296 aux.vna_flags = BYTE_GET (eaux->vna_flags);
8297 aux.vna_other = BYTE_GET (eaux->vna_other);
8298 aux.vna_name = BYTE_GET (eaux->vna_name);
8299 aux.vna_next = BYTE_GET (eaux->vna_next);
8300
8301 if (VALID_DYNAMIC_NAME (aux.vna_name))
8302 printf (_(" %#06x: Name: %s"),
8303 isum, GET_DYNAMIC_NAME (aux.vna_name));
8304 else
8305 printf (_(" %#06x: Name index: %lx"),
8306 isum, aux.vna_name);
8307
8308 printf (_(" Flags: %s Version: %d\n"),
8309 get_ver_flags (aux.vna_flags), aux.vna_other);
8310
8311 /* Check for overflow. */
8312 if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
8313 || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
8314 break;
8315
8316 isum += aux.vna_next;
8317 vstart += aux.vna_next;
8318 }
8319 if (j < ent.vn_cnt)
8320 printf (_(" Version need aux past end of section\n"));
8321
8322 idx += ent.vn_next;
8323 }
8324 if (cnt < section->sh_info)
8325 printf (_(" Version need past end of section\n"));
8326
8327 free (eneed);
8328 }
8329 break;
8330
8331 case SHT_GNU_versym:
8332 {
8333 Elf_Internal_Shdr * link_section;
8334 int total;
8335 int cnt;
8336 unsigned char * edata;
8337 unsigned short * data;
8338 char * strtab;
8339 Elf_Internal_Sym * symbols;
8340 Elf_Internal_Shdr * string_sec;
8341 long off;
8342
8343 if (section->sh_link >= elf_header.e_shnum)
8344 break;
8345
8346 link_section = section_headers + section->sh_link;
8347 total = section->sh_size / sizeof (Elf_External_Versym);
8348
8349 if (link_section->sh_link >= elf_header.e_shnum)
8350 break;
8351
8352 found = 1;
8353
8354 symbols = GET_ELF_SYMBOLS (file, link_section);
8355 if (symbols == NULL)
8356 break;
8357
8358 string_sec = section_headers + link_section->sh_link;
8359
8360 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8361 string_sec->sh_size,
8362 _("version string table"));
8363 if (!strtab)
8364 {
8365 free (symbols);
8366 break;
8367 }
8368
8369 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8370 SECTION_NAME (section), total);
8371
8372 printf (_(" Addr: "));
8373 printf_vma (section->sh_addr);
8374 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8375 (unsigned long) section->sh_offset, section->sh_link,
8376 SECTION_NAME (link_section));
8377
8378 off = offset_from_vma (file,
8379 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8380 total * sizeof (short));
8381 edata = (unsigned char *) get_data (NULL, file, off, total,
8382 sizeof (short),
8383 _("version symbol data"));
8384 if (!edata)
8385 {
8386 free (strtab);
8387 free (symbols);
8388 break;
8389 }
8390
8391 data = (short unsigned int *) cmalloc (total, sizeof (short));
8392
8393 for (cnt = total; cnt --;)
8394 data[cnt] = byte_get (edata + cnt * sizeof (short),
8395 sizeof (short));
8396
8397 free (edata);
8398
8399 for (cnt = 0; cnt < total; cnt += 4)
8400 {
8401 int j, nn;
8402 int check_def, check_need;
8403 char * name;
8404
8405 printf (" %03x:", cnt);
8406
8407 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8408 switch (data[cnt + j])
8409 {
8410 case 0:
8411 fputs (_(" 0 (*local*) "), stdout);
8412 break;
8413
8414 case 1:
8415 fputs (_(" 1 (*global*) "), stdout);
8416 break;
8417
8418 default:
8419 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8420 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8421
8422 /* If this index value is greater than the size of the symbols
8423 array, break to avoid an out-of-bounds read, */
8424 if ((unsigned long)(cnt + j) >=
8425 ((unsigned long)link_section->sh_size /
8426 (unsigned long)link_section->sh_entsize))
8427 {
8428 warn (_("invalid index into symbol array\n"));
8429 break;
8430 }
8431
8432 check_def = 1;
8433 check_need = 1;
8434 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8435 || section_headers[symbols[cnt + j].st_shndx].sh_type
8436 != SHT_NOBITS)
8437 {
8438 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8439 check_def = 0;
8440 else
8441 check_need = 0;
8442 }
8443
8444 if (check_need
8445 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8446 {
8447 Elf_Internal_Verneed ivn;
8448 unsigned long offset;
8449
8450 offset = offset_from_vma
8451 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8452 sizeof (Elf_External_Verneed));
8453
8454 do
8455 {
8456 Elf_Internal_Vernaux ivna;
8457 Elf_External_Verneed evn;
8458 Elf_External_Vernaux evna;
8459 unsigned long a_off;
8460
8461 if (get_data (&evn, file, offset, sizeof (evn), 1,
8462 _("version need")) == NULL)
8463 break;
8464
8465 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8466 ivn.vn_next = BYTE_GET (evn.vn_next);
8467
8468 a_off = offset + ivn.vn_aux;
8469
8470 do
8471 {
8472 if (get_data (&evna, file, a_off, sizeof (evna),
8473 1, _("version need aux (2)")) == NULL)
8474 {
8475 ivna.vna_next = 0;
8476 ivna.vna_other = 0;
8477 }
8478 else
8479 {
8480 ivna.vna_next = BYTE_GET (evna.vna_next);
8481 ivna.vna_other = BYTE_GET (evna.vna_other);
8482 }
8483
8484 a_off += ivna.vna_next;
8485 }
8486 while (ivna.vna_other != data[cnt + j]
8487 && ivna.vna_next != 0);
8488
8489 if (ivna.vna_other == data[cnt + j])
8490 {
8491 ivna.vna_name = BYTE_GET (evna.vna_name);
8492
8493 if (ivna.vna_name >= string_sec->sh_size)
8494 name = _("*invalid*");
8495 else
8496 name = strtab + ivna.vna_name;
8497 nn += printf ("(%s%-*s",
8498 name,
8499 12 - (int) strlen (name),
8500 ")");
8501 check_def = 0;
8502 break;
8503 }
8504
8505 offset += ivn.vn_next;
8506 }
8507 while (ivn.vn_next);
8508 }
8509
8510 if (check_def && data[cnt + j] != 0x8001
8511 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8512 {
8513 Elf_Internal_Verdef ivd;
8514 Elf_External_Verdef evd;
8515 unsigned long offset;
8516
8517 offset = offset_from_vma
8518 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8519 sizeof evd);
8520
8521 do
8522 {
8523 if (get_data (&evd, file, offset, sizeof (evd), 1,
8524 _("version def")) == NULL)
8525 {
8526 ivd.vd_next = 0;
8527 ivd.vd_ndx = 0;
8528 }
8529 else
8530 {
8531 ivd.vd_next = BYTE_GET (evd.vd_next);
8532 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8533 }
8534
8535 offset += ivd.vd_next;
8536 }
8537 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8538 && ivd.vd_next != 0);
8539
8540 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8541 {
8542 Elf_External_Verdaux evda;
8543 Elf_Internal_Verdaux ivda;
8544
8545 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8546
8547 if (get_data (&evda, file,
8548 offset - ivd.vd_next + ivd.vd_aux,
8549 sizeof (evda), 1,
8550 _("version def aux")) == NULL)
8551 break;
8552
8553 ivda.vda_name = BYTE_GET (evda.vda_name);
8554
8555 if (ivda.vda_name >= string_sec->sh_size)
8556 name = _("*invalid*");
8557 else
8558 name = strtab + ivda.vda_name;
8559 nn += printf ("(%s%-*s",
8560 name,
8561 12 - (int) strlen (name),
8562 ")");
8563 }
8564 }
8565
8566 if (nn < 18)
8567 printf ("%*c", 18 - nn, ' ');
8568 }
8569
8570 putchar ('\n');
8571 }
8572
8573 free (data);
8574 free (strtab);
8575 free (symbols);
8576 }
8577 break;
8578
8579 default:
8580 break;
8581 }
8582 }
8583
8584 if (! found)
8585 printf (_("\nNo version information found in this file.\n"));
8586
8587 return 1;
8588 }
8589
8590 static const char *
8591 get_symbol_binding (unsigned int binding)
8592 {
8593 static char buff[32];
8594
8595 switch (binding)
8596 {
8597 case STB_LOCAL: return "LOCAL";
8598 case STB_GLOBAL: return "GLOBAL";
8599 case STB_WEAK: return "WEAK";
8600 default:
8601 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8602 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8603 binding);
8604 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8605 {
8606 if (binding == STB_GNU_UNIQUE
8607 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8608 /* GNU is still using the default value 0. */
8609 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8610 return "UNIQUE";
8611 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8612 }
8613 else
8614 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8615 return buff;
8616 }
8617 }
8618
8619 static const char *
8620 get_symbol_type (unsigned int type)
8621 {
8622 static char buff[32];
8623
8624 switch (type)
8625 {
8626 case STT_NOTYPE: return "NOTYPE";
8627 case STT_OBJECT: return "OBJECT";
8628 case STT_FUNC: return "FUNC";
8629 case STT_SECTION: return "SECTION";
8630 case STT_FILE: return "FILE";
8631 case STT_COMMON: return "COMMON";
8632 case STT_TLS: return "TLS";
8633 case STT_RELC: return "RELC";
8634 case STT_SRELC: return "SRELC";
8635 default:
8636 if (type >= STT_LOPROC && type <= STT_HIPROC)
8637 {
8638 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8639 return "THUMB_FUNC";
8640
8641 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8642 return "REGISTER";
8643
8644 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8645 return "PARISC_MILLI";
8646
8647 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8648 }
8649 else if (type >= STT_LOOS && type <= STT_HIOS)
8650 {
8651 if (elf_header.e_machine == EM_PARISC)
8652 {
8653 if (type == STT_HP_OPAQUE)
8654 return "HP_OPAQUE";
8655 if (type == STT_HP_STUB)
8656 return "HP_STUB";
8657 }
8658
8659 if (type == STT_GNU_IFUNC
8660 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8661 /* GNU is still using the default value 0. */
8662 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8663 return "IFUNC";
8664
8665 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8666 }
8667 else
8668 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8669 return buff;
8670 }
8671 }
8672
8673 static const char *
8674 get_symbol_visibility (unsigned int visibility)
8675 {
8676 switch (visibility)
8677 {
8678 case STV_DEFAULT: return "DEFAULT";
8679 case STV_INTERNAL: return "INTERNAL";
8680 case STV_HIDDEN: return "HIDDEN";
8681 case STV_PROTECTED: return "PROTECTED";
8682 default: abort ();
8683 }
8684 }
8685
8686 static const char *
8687 get_mips_symbol_other (unsigned int other)
8688 {
8689 switch (other)
8690 {
8691 case STO_OPTIONAL:
8692 return "OPTIONAL";
8693 case STO_MIPS_PLT:
8694 return "MIPS PLT";
8695 case STO_MIPS_PIC:
8696 return "MIPS PIC";
8697 case STO_MICROMIPS:
8698 return "MICROMIPS";
8699 case STO_MICROMIPS | STO_MIPS_PIC:
8700 return "MICROMIPS, MIPS PIC";
8701 case STO_MIPS16:
8702 return "MIPS16";
8703 default:
8704 return NULL;
8705 }
8706 }
8707
8708 static const char *
8709 get_ia64_symbol_other (unsigned int other)
8710 {
8711 if (is_ia64_vms ())
8712 {
8713 static char res[32];
8714
8715 res[0] = 0;
8716
8717 /* Function types is for images and .STB files only. */
8718 switch (elf_header.e_type)
8719 {
8720 case ET_DYN:
8721 case ET_EXEC:
8722 switch (VMS_ST_FUNC_TYPE (other))
8723 {
8724 case VMS_SFT_CODE_ADDR:
8725 strcat (res, " CA");
8726 break;
8727 case VMS_SFT_SYMV_IDX:
8728 strcat (res, " VEC");
8729 break;
8730 case VMS_SFT_FD:
8731 strcat (res, " FD");
8732 break;
8733 case VMS_SFT_RESERVE:
8734 strcat (res, " RSV");
8735 break;
8736 default:
8737 abort ();
8738 }
8739 break;
8740 default:
8741 break;
8742 }
8743 switch (VMS_ST_LINKAGE (other))
8744 {
8745 case VMS_STL_IGNORE:
8746 strcat (res, " IGN");
8747 break;
8748 case VMS_STL_RESERVE:
8749 strcat (res, " RSV");
8750 break;
8751 case VMS_STL_STD:
8752 strcat (res, " STD");
8753 break;
8754 case VMS_STL_LNK:
8755 strcat (res, " LNK");
8756 break;
8757 default:
8758 abort ();
8759 }
8760
8761 if (res[0] != 0)
8762 return res + 1;
8763 else
8764 return res;
8765 }
8766 return NULL;
8767 }
8768
8769 static const char *
8770 get_symbol_other (unsigned int other)
8771 {
8772 const char * result = NULL;
8773 static char buff [32];
8774
8775 if (other == 0)
8776 return "";
8777
8778 switch (elf_header.e_machine)
8779 {
8780 case EM_MIPS:
8781 result = get_mips_symbol_other (other);
8782 break;
8783 case EM_IA_64:
8784 result = get_ia64_symbol_other (other);
8785 break;
8786 default:
8787 break;
8788 }
8789
8790 if (result)
8791 return result;
8792
8793 snprintf (buff, sizeof buff, _("<other>: %x"), other);
8794 return buff;
8795 }
8796
8797 static const char *
8798 get_symbol_index_type (unsigned int type)
8799 {
8800 static char buff[32];
8801
8802 switch (type)
8803 {
8804 case SHN_UNDEF: return "UND";
8805 case SHN_ABS: return "ABS";
8806 case SHN_COMMON: return "COM";
8807 default:
8808 if (type == SHN_IA_64_ANSI_COMMON
8809 && elf_header.e_machine == EM_IA_64
8810 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8811 return "ANSI_COM";
8812 else if ((elf_header.e_machine == EM_X86_64
8813 || elf_header.e_machine == EM_L1OM
8814 || elf_header.e_machine == EM_K1OM)
8815 && type == SHN_X86_64_LCOMMON)
8816 return "LARGE_COM";
8817 else if ((type == SHN_MIPS_SCOMMON
8818 && elf_header.e_machine == EM_MIPS)
8819 || (type == SHN_TIC6X_SCOMMON
8820 && elf_header.e_machine == EM_TI_C6000))
8821 return "SCOM";
8822 else if (type == SHN_MIPS_SUNDEFINED
8823 && elf_header.e_machine == EM_MIPS)
8824 return "SUND";
8825 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8826 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8827 else if (type >= SHN_LOOS && type <= SHN_HIOS)
8828 sprintf (buff, "OS [0x%04x]", type & 0xffff);
8829 else if (type >= SHN_LORESERVE)
8830 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
8831 else
8832 sprintf (buff, "%3d", type);
8833 break;
8834 }
8835
8836 return buff;
8837 }
8838
8839 static bfd_vma *
8840 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
8841 {
8842 unsigned char * e_data;
8843 bfd_vma * i_data;
8844
8845 e_data = (unsigned char *) cmalloc (number, ent_size);
8846
8847 if (e_data == NULL)
8848 {
8849 error (_("Out of memory\n"));
8850 return NULL;
8851 }
8852
8853 if (fread (e_data, ent_size, number, file) != number)
8854 {
8855 error (_("Unable to read in dynamic data\n"));
8856 return NULL;
8857 }
8858
8859 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
8860
8861 if (i_data == NULL)
8862 {
8863 error (_("Out of memory\n"));
8864 free (e_data);
8865 return NULL;
8866 }
8867
8868 while (number--)
8869 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
8870
8871 free (e_data);
8872
8873 return i_data;
8874 }
8875
8876 static void
8877 print_dynamic_symbol (bfd_vma si, unsigned long hn)
8878 {
8879 Elf_Internal_Sym * psym;
8880 int n;
8881
8882 psym = dynamic_symbols + si;
8883
8884 n = print_vma (si, DEC_5);
8885 if (n < 5)
8886 fputs (" " + n, stdout);
8887 printf (" %3lu: ", hn);
8888 print_vma (psym->st_value, LONG_HEX);
8889 putchar (' ');
8890 print_vma (psym->st_size, DEC_5);
8891
8892 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8893 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8894 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8895 /* Check to see if any other bits in the st_other field are set.
8896 Note - displaying this information disrupts the layout of the
8897 table being generated, but for the moment this case is very
8898 rare. */
8899 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8900 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8901 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
8902 if (VALID_DYNAMIC_NAME (psym->st_name))
8903 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8904 else
8905 printf (_(" <corrupt: %14ld>"), psym->st_name);
8906 putchar ('\n');
8907 }
8908
8909 /* Dump the symbol table. */
8910 static int
8911 process_symbol_table (FILE * file)
8912 {
8913 Elf_Internal_Shdr * section;
8914 bfd_vma nbuckets = 0;
8915 bfd_vma nchains = 0;
8916 bfd_vma * buckets = NULL;
8917 bfd_vma * chains = NULL;
8918 bfd_vma ngnubuckets = 0;
8919 bfd_vma * gnubuckets = NULL;
8920 bfd_vma * gnuchains = NULL;
8921 bfd_vma gnusymidx = 0;
8922
8923 if (!do_syms && !do_dyn_syms && !do_histogram)
8924 return 1;
8925
8926 if (dynamic_info[DT_HASH]
8927 && (do_histogram
8928 || (do_using_dynamic
8929 && !do_dyn_syms
8930 && dynamic_strings != NULL)))
8931 {
8932 unsigned char nb[8];
8933 unsigned char nc[8];
8934 int hash_ent_size = 4;
8935
8936 if ((elf_header.e_machine == EM_ALPHA
8937 || elf_header.e_machine == EM_S390
8938 || elf_header.e_machine == EM_S390_OLD)
8939 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
8940 hash_ent_size = 8;
8941
8942 if (fseek (file,
8943 (archive_file_offset
8944 + offset_from_vma (file, dynamic_info[DT_HASH],
8945 sizeof nb + sizeof nc)),
8946 SEEK_SET))
8947 {
8948 error (_("Unable to seek to start of dynamic information\n"));
8949 goto no_hash;
8950 }
8951
8952 if (fread (nb, hash_ent_size, 1, file) != 1)
8953 {
8954 error (_("Failed to read in number of buckets\n"));
8955 goto no_hash;
8956 }
8957
8958 if (fread (nc, hash_ent_size, 1, file) != 1)
8959 {
8960 error (_("Failed to read in number of chains\n"));
8961 goto no_hash;
8962 }
8963
8964 nbuckets = byte_get (nb, hash_ent_size);
8965 nchains = byte_get (nc, hash_ent_size);
8966
8967 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
8968 chains = get_dynamic_data (file, nchains, hash_ent_size);
8969
8970 no_hash:
8971 if (buckets == NULL || chains == NULL)
8972 {
8973 if (do_using_dynamic)
8974 return 0;
8975 free (buckets);
8976 free (chains);
8977 buckets = NULL;
8978 chains = NULL;
8979 nbuckets = 0;
8980 nchains = 0;
8981 }
8982 }
8983
8984 if (dynamic_info_DT_GNU_HASH
8985 && (do_histogram
8986 || (do_using_dynamic
8987 && !do_dyn_syms
8988 && dynamic_strings != NULL)))
8989 {
8990 unsigned char nb[16];
8991 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
8992 bfd_vma buckets_vma;
8993
8994 if (fseek (file,
8995 (archive_file_offset
8996 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
8997 sizeof nb)),
8998 SEEK_SET))
8999 {
9000 error (_("Unable to seek to start of dynamic information\n"));
9001 goto no_gnu_hash;
9002 }
9003
9004 if (fread (nb, 16, 1, file) != 1)
9005 {
9006 error (_("Failed to read in number of buckets\n"));
9007 goto no_gnu_hash;
9008 }
9009
9010 ngnubuckets = byte_get (nb, 4);
9011 gnusymidx = byte_get (nb + 4, 4);
9012 bitmaskwords = byte_get (nb + 8, 4);
9013 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9014 if (is_32bit_elf)
9015 buckets_vma += bitmaskwords * 4;
9016 else
9017 buckets_vma += bitmaskwords * 8;
9018
9019 if (fseek (file,
9020 (archive_file_offset
9021 + offset_from_vma (file, buckets_vma, 4)),
9022 SEEK_SET))
9023 {
9024 error (_("Unable to seek to start of dynamic information\n"));
9025 goto no_gnu_hash;
9026 }
9027
9028 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9029
9030 if (gnubuckets == NULL)
9031 goto no_gnu_hash;
9032
9033 for (i = 0; i < ngnubuckets; i++)
9034 if (gnubuckets[i] != 0)
9035 {
9036 if (gnubuckets[i] < gnusymidx)
9037 return 0;
9038
9039 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9040 maxchain = gnubuckets[i];
9041 }
9042
9043 if (maxchain == 0xffffffff)
9044 goto no_gnu_hash;
9045
9046 maxchain -= gnusymidx;
9047
9048 if (fseek (file,
9049 (archive_file_offset
9050 + offset_from_vma (file, buckets_vma
9051 + 4 * (ngnubuckets + maxchain), 4)),
9052 SEEK_SET))
9053 {
9054 error (_("Unable to seek to start of dynamic information\n"));
9055 goto no_gnu_hash;
9056 }
9057
9058 do
9059 {
9060 if (fread (nb, 4, 1, file) != 1)
9061 {
9062 error (_("Failed to determine last chain length\n"));
9063 goto no_gnu_hash;
9064 }
9065
9066 if (maxchain + 1 == 0)
9067 goto no_gnu_hash;
9068
9069 ++maxchain;
9070 }
9071 while ((byte_get (nb, 4) & 1) == 0);
9072
9073 if (fseek (file,
9074 (archive_file_offset
9075 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9076 SEEK_SET))
9077 {
9078 error (_("Unable to seek to start of dynamic information\n"));
9079 goto no_gnu_hash;
9080 }
9081
9082 gnuchains = get_dynamic_data (file, maxchain, 4);
9083
9084 no_gnu_hash:
9085 if (gnuchains == NULL)
9086 {
9087 free (gnubuckets);
9088 gnubuckets = NULL;
9089 ngnubuckets = 0;
9090 if (do_using_dynamic)
9091 return 0;
9092 }
9093 }
9094
9095 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9096 && do_syms
9097 && do_using_dynamic
9098 && dynamic_strings != NULL)
9099 {
9100 unsigned long hn;
9101
9102 if (dynamic_info[DT_HASH])
9103 {
9104 bfd_vma si;
9105
9106 printf (_("\nSymbol table 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 < nbuckets; hn++)
9113 {
9114 if (! buckets[hn])
9115 continue;
9116
9117 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9118 print_dynamic_symbol (si, hn);
9119 }
9120 }
9121
9122 if (dynamic_info_DT_GNU_HASH)
9123 {
9124 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9125 if (is_32bit_elf)
9126 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9127 else
9128 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9129
9130 for (hn = 0; hn < ngnubuckets; ++hn)
9131 if (gnubuckets[hn] != 0)
9132 {
9133 bfd_vma si = gnubuckets[hn];
9134 bfd_vma off = si - gnusymidx;
9135
9136 do
9137 {
9138 print_dynamic_symbol (si, hn);
9139 si++;
9140 }
9141 while ((gnuchains[off++] & 1) == 0);
9142 }
9143 }
9144 }
9145 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9146 {
9147 unsigned int i;
9148
9149 for (i = 0, section = section_headers;
9150 i < elf_header.e_shnum;
9151 i++, section++)
9152 {
9153 unsigned int si;
9154 char * strtab = NULL;
9155 unsigned long int strtab_size = 0;
9156 Elf_Internal_Sym * symtab;
9157 Elf_Internal_Sym * psym;
9158
9159 if ((section->sh_type != SHT_SYMTAB
9160 && section->sh_type != SHT_DYNSYM)
9161 || (!do_syms
9162 && section->sh_type == SHT_SYMTAB))
9163 continue;
9164
9165 if (section->sh_entsize == 0)
9166 {
9167 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9168 SECTION_NAME (section));
9169 continue;
9170 }
9171
9172 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9173 SECTION_NAME (section),
9174 (unsigned long) (section->sh_size / section->sh_entsize));
9175
9176 if (is_32bit_elf)
9177 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9178 else
9179 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9180
9181 symtab = GET_ELF_SYMBOLS (file, section);
9182 if (symtab == NULL)
9183 continue;
9184
9185 if (section->sh_link == elf_header.e_shstrndx)
9186 {
9187 strtab = string_table;
9188 strtab_size = string_table_length;
9189 }
9190 else if (section->sh_link < elf_header.e_shnum)
9191 {
9192 Elf_Internal_Shdr * string_sec;
9193
9194 string_sec = section_headers + section->sh_link;
9195
9196 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9197 1, string_sec->sh_size,
9198 _("string table"));
9199 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9200 }
9201
9202 for (si = 0, psym = symtab;
9203 si < section->sh_size / section->sh_entsize;
9204 si++, psym++)
9205 {
9206 printf ("%6d: ", si);
9207 print_vma (psym->st_value, LONG_HEX);
9208 putchar (' ');
9209 print_vma (psym->st_size, DEC_5);
9210 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9211 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9212 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9213 /* Check to see if any other bits in the st_other field are set.
9214 Note - displaying this information disrupts the layout of the
9215 table being generated, but for the moment this case is very rare. */
9216 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9217 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9218 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9219 print_symbol (25, psym->st_name < strtab_size
9220 ? strtab + psym->st_name : _("<corrupt>"));
9221
9222 if (section->sh_type == SHT_DYNSYM
9223 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9224 {
9225 unsigned char data[2];
9226 unsigned short vers_data;
9227 unsigned long offset;
9228 int is_nobits;
9229 int check_def;
9230
9231 offset = offset_from_vma
9232 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9233 sizeof data + si * sizeof (vers_data));
9234
9235 if (get_data (&data, file, offset + si * sizeof (vers_data),
9236 sizeof (data), 1, _("version data")) == NULL)
9237 break;
9238
9239 vers_data = byte_get (data, 2);
9240
9241 is_nobits = (psym->st_shndx < elf_header.e_shnum
9242 && section_headers[psym->st_shndx].sh_type
9243 == SHT_NOBITS);
9244
9245 check_def = (psym->st_shndx != SHN_UNDEF);
9246
9247 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9248 {
9249 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9250 && (is_nobits || ! check_def))
9251 {
9252 Elf_External_Verneed evn;
9253 Elf_Internal_Verneed ivn;
9254 Elf_Internal_Vernaux ivna;
9255
9256 /* We must test both. */
9257 offset = offset_from_vma
9258 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9259 sizeof evn);
9260
9261 do
9262 {
9263 unsigned long vna_off;
9264
9265 if (get_data (&evn, file, offset, sizeof (evn), 1,
9266 _("version need")) == NULL)
9267 {
9268 ivna.vna_next = 0;
9269 ivna.vna_other = 0;
9270 ivna.vna_name = 0;
9271 break;
9272 }
9273
9274 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9275 ivn.vn_next = BYTE_GET (evn.vn_next);
9276
9277 vna_off = offset + ivn.vn_aux;
9278
9279 do
9280 {
9281 Elf_External_Vernaux evna;
9282
9283 if (get_data (&evna, file, vna_off,
9284 sizeof (evna), 1,
9285 _("version need aux (3)")) == NULL)
9286 {
9287 ivna.vna_next = 0;
9288 ivna.vna_other = 0;
9289 ivna.vna_name = 0;
9290 }
9291 else
9292 {
9293 ivna.vna_other = BYTE_GET (evna.vna_other);
9294 ivna.vna_next = BYTE_GET (evna.vna_next);
9295 ivna.vna_name = BYTE_GET (evna.vna_name);
9296 }
9297
9298 vna_off += ivna.vna_next;
9299 }
9300 while (ivna.vna_other != vers_data
9301 && ivna.vna_next != 0);
9302
9303 if (ivna.vna_other == vers_data)
9304 break;
9305
9306 offset += ivn.vn_next;
9307 }
9308 while (ivn.vn_next != 0);
9309
9310 if (ivna.vna_other == vers_data)
9311 {
9312 printf ("@%s (%d)",
9313 ivna.vna_name < strtab_size
9314 ? strtab + ivna.vna_name : _("<corrupt>"),
9315 ivna.vna_other);
9316 check_def = 0;
9317 }
9318 else if (! is_nobits)
9319 error (_("bad dynamic symbol\n"));
9320 else
9321 check_def = 1;
9322 }
9323
9324 if (check_def)
9325 {
9326 if (vers_data != 0x8001
9327 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9328 {
9329 Elf_Internal_Verdef ivd;
9330 Elf_Internal_Verdaux ivda;
9331 Elf_External_Verdaux evda;
9332 unsigned long off;
9333
9334 off = offset_from_vma
9335 (file,
9336 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9337 sizeof (Elf_External_Verdef));
9338
9339 do
9340 {
9341 Elf_External_Verdef evd;
9342
9343 if (get_data (&evd, file, off, sizeof (evd),
9344 1, _("version def")) == NULL)
9345 {
9346 ivd.vd_ndx = 0;
9347 ivd.vd_aux = 0;
9348 ivd.vd_next = 0;
9349 }
9350 else
9351 {
9352 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9353 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9354 ivd.vd_next = BYTE_GET (evd.vd_next);
9355 }
9356
9357 off += ivd.vd_next;
9358 }
9359 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9360 && ivd.vd_next != 0);
9361
9362 off -= ivd.vd_next;
9363 off += ivd.vd_aux;
9364
9365 if (get_data (&evda, file, off, sizeof (evda),
9366 1, _("version def aux")) == NULL)
9367 break;
9368
9369 ivda.vda_name = BYTE_GET (evda.vda_name);
9370
9371 if (psym->st_name != ivda.vda_name)
9372 printf ((vers_data & VERSYM_HIDDEN)
9373 ? "@%s" : "@@%s",
9374 ivda.vda_name < strtab_size
9375 ? strtab + ivda.vda_name : _("<corrupt>"));
9376 }
9377 }
9378 }
9379 }
9380
9381 putchar ('\n');
9382 }
9383
9384 free (symtab);
9385 if (strtab != string_table)
9386 free (strtab);
9387 }
9388 }
9389 else if (do_syms)
9390 printf
9391 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9392
9393 if (do_histogram && buckets != NULL)
9394 {
9395 unsigned long * lengths;
9396 unsigned long * counts;
9397 unsigned long hn;
9398 bfd_vma si;
9399 unsigned long maxlength = 0;
9400 unsigned long nzero_counts = 0;
9401 unsigned long nsyms = 0;
9402
9403 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9404 (unsigned long) nbuckets);
9405 printf (_(" Length Number %% of total Coverage\n"));
9406
9407 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9408 if (lengths == NULL)
9409 {
9410 error (_("Out of memory\n"));
9411 return 0;
9412 }
9413 for (hn = 0; hn < nbuckets; ++hn)
9414 {
9415 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9416 {
9417 ++nsyms;
9418 if (maxlength < ++lengths[hn])
9419 ++maxlength;
9420 }
9421 }
9422
9423 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9424 if (counts == NULL)
9425 {
9426 error (_("Out of memory\n"));
9427 return 0;
9428 }
9429
9430 for (hn = 0; hn < nbuckets; ++hn)
9431 ++counts[lengths[hn]];
9432
9433 if (nbuckets > 0)
9434 {
9435 unsigned long i;
9436 printf (" 0 %-10lu (%5.1f%%)\n",
9437 counts[0], (counts[0] * 100.0) / nbuckets);
9438 for (i = 1; i <= maxlength; ++i)
9439 {
9440 nzero_counts += counts[i] * i;
9441 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9442 i, counts[i], (counts[i] * 100.0) / nbuckets,
9443 (nzero_counts * 100.0) / nsyms);
9444 }
9445 }
9446
9447 free (counts);
9448 free (lengths);
9449 }
9450
9451 if (buckets != NULL)
9452 {
9453 free (buckets);
9454 free (chains);
9455 }
9456
9457 if (do_histogram && gnubuckets != NULL)
9458 {
9459 unsigned long * lengths;
9460 unsigned long * counts;
9461 unsigned long hn;
9462 unsigned long maxlength = 0;
9463 unsigned long nzero_counts = 0;
9464 unsigned long nsyms = 0;
9465
9466 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9467 if (lengths == NULL)
9468 {
9469 error (_("Out of memory\n"));
9470 return 0;
9471 }
9472
9473 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9474 (unsigned long) ngnubuckets);
9475 printf (_(" Length Number %% of total Coverage\n"));
9476
9477 for (hn = 0; hn < ngnubuckets; ++hn)
9478 if (gnubuckets[hn] != 0)
9479 {
9480 bfd_vma off, length = 1;
9481
9482 for (off = gnubuckets[hn] - gnusymidx;
9483 (gnuchains[off] & 1) == 0; ++off)
9484 ++length;
9485 lengths[hn] = length;
9486 if (length > maxlength)
9487 maxlength = length;
9488 nsyms += length;
9489 }
9490
9491 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9492 if (counts == NULL)
9493 {
9494 error (_("Out of memory\n"));
9495 return 0;
9496 }
9497
9498 for (hn = 0; hn < ngnubuckets; ++hn)
9499 ++counts[lengths[hn]];
9500
9501 if (ngnubuckets > 0)
9502 {
9503 unsigned long j;
9504 printf (" 0 %-10lu (%5.1f%%)\n",
9505 counts[0], (counts[0] * 100.0) / ngnubuckets);
9506 for (j = 1; j <= maxlength; ++j)
9507 {
9508 nzero_counts += counts[j] * j;
9509 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9510 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9511 (nzero_counts * 100.0) / nsyms);
9512 }
9513 }
9514
9515 free (counts);
9516 free (lengths);
9517 free (gnubuckets);
9518 free (gnuchains);
9519 }
9520
9521 return 1;
9522 }
9523
9524 static int
9525 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9526 {
9527 unsigned int i;
9528
9529 if (dynamic_syminfo == NULL
9530 || !do_dynamic)
9531 /* No syminfo, this is ok. */
9532 return 1;
9533
9534 /* There better should be a dynamic symbol section. */
9535 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9536 return 0;
9537
9538 if (dynamic_addr)
9539 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9540 dynamic_syminfo_offset, dynamic_syminfo_nent);
9541
9542 printf (_(" Num: Name BoundTo Flags\n"));
9543 for (i = 0; i < dynamic_syminfo_nent; ++i)
9544 {
9545 unsigned short int flags = dynamic_syminfo[i].si_flags;
9546
9547 printf ("%4d: ", i);
9548 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9549 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9550 else
9551 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9552 putchar (' ');
9553
9554 switch (dynamic_syminfo[i].si_boundto)
9555 {
9556 case SYMINFO_BT_SELF:
9557 fputs ("SELF ", stdout);
9558 break;
9559 case SYMINFO_BT_PARENT:
9560 fputs ("PARENT ", stdout);
9561 break;
9562 default:
9563 if (dynamic_syminfo[i].si_boundto > 0
9564 && dynamic_syminfo[i].si_boundto < dynamic_nent
9565 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9566 {
9567 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9568 putchar (' ' );
9569 }
9570 else
9571 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9572 break;
9573 }
9574
9575 if (flags & SYMINFO_FLG_DIRECT)
9576 printf (" DIRECT");
9577 if (flags & SYMINFO_FLG_PASSTHRU)
9578 printf (" PASSTHRU");
9579 if (flags & SYMINFO_FLG_COPY)
9580 printf (" COPY");
9581 if (flags & SYMINFO_FLG_LAZYLOAD)
9582 printf (" LAZYLOAD");
9583
9584 puts ("");
9585 }
9586
9587 return 1;
9588 }
9589
9590 /* Check to see if the given reloc needs to be handled in a target specific
9591 manner. If so then process the reloc and return TRUE otherwise return
9592 FALSE. */
9593
9594 static bfd_boolean
9595 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9596 unsigned char * start,
9597 Elf_Internal_Sym * symtab)
9598 {
9599 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9600
9601 switch (elf_header.e_machine)
9602 {
9603 case EM_MN10300:
9604 case EM_CYGNUS_MN10300:
9605 {
9606 static Elf_Internal_Sym * saved_sym = NULL;
9607
9608 switch (reloc_type)
9609 {
9610 case 34: /* R_MN10300_ALIGN */
9611 return TRUE;
9612 case 33: /* R_MN10300_SYM_DIFF */
9613 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9614 return TRUE;
9615 case 1: /* R_MN10300_32 */
9616 case 2: /* R_MN10300_16 */
9617 if (saved_sym != NULL)
9618 {
9619 bfd_vma value;
9620
9621 value = reloc->r_addend
9622 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9623 - saved_sym->st_value);
9624
9625 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9626
9627 saved_sym = NULL;
9628 return TRUE;
9629 }
9630 break;
9631 default:
9632 if (saved_sym != NULL)
9633 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9634 break;
9635 }
9636 break;
9637 }
9638 }
9639
9640 return FALSE;
9641 }
9642
9643 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9644 DWARF debug sections. This is a target specific test. Note - we do not
9645 go through the whole including-target-headers-multiple-times route, (as
9646 we have already done with <elf/h8.h>) because this would become very
9647 messy and even then this function would have to contain target specific
9648 information (the names of the relocs instead of their numeric values).
9649 FIXME: This is not the correct way to solve this problem. The proper way
9650 is to have target specific reloc sizing and typing functions created by
9651 the reloc-macros.h header, in the same way that it already creates the
9652 reloc naming functions. */
9653
9654 static bfd_boolean
9655 is_32bit_abs_reloc (unsigned int reloc_type)
9656 {
9657 switch (elf_header.e_machine)
9658 {
9659 case EM_386:
9660 case EM_486:
9661 return reloc_type == 1; /* R_386_32. */
9662 case EM_68K:
9663 return reloc_type == 1; /* R_68K_32. */
9664 case EM_860:
9665 return reloc_type == 1; /* R_860_32. */
9666 case EM_960:
9667 return reloc_type == 2; /* R_960_32. */
9668 case EM_ALPHA:
9669 return reloc_type == 1; /* R_ALPHA_REFLONG. */
9670 case EM_ARC:
9671 return reloc_type == 1; /* R_ARC_32. */
9672 case EM_ARM:
9673 return reloc_type == 2; /* R_ARM_ABS32 */
9674 case EM_AVR_OLD:
9675 case EM_AVR:
9676 return reloc_type == 1;
9677 case EM_BLACKFIN:
9678 return reloc_type == 0x12; /* R_byte4_data. */
9679 case EM_CRIS:
9680 return reloc_type == 3; /* R_CRIS_32. */
9681 case EM_CR16:
9682 case EM_CR16_OLD:
9683 return reloc_type == 3; /* R_CR16_NUM32. */
9684 case EM_CRX:
9685 return reloc_type == 15; /* R_CRX_NUM32. */
9686 case EM_CYGNUS_FRV:
9687 return reloc_type == 1;
9688 case EM_CYGNUS_D10V:
9689 case EM_D10V:
9690 return reloc_type == 6; /* R_D10V_32. */
9691 case EM_CYGNUS_D30V:
9692 case EM_D30V:
9693 return reloc_type == 12; /* R_D30V_32_NORMAL. */
9694 case EM_DLX:
9695 return reloc_type == 3; /* R_DLX_RELOC_32. */
9696 case EM_CYGNUS_FR30:
9697 case EM_FR30:
9698 return reloc_type == 3; /* R_FR30_32. */
9699 case EM_H8S:
9700 case EM_H8_300:
9701 case EM_H8_300H:
9702 return reloc_type == 1; /* R_H8_DIR32. */
9703 case EM_IA_64:
9704 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
9705 case EM_IP2K_OLD:
9706 case EM_IP2K:
9707 return reloc_type == 2; /* R_IP2K_32. */
9708 case EM_IQ2000:
9709 return reloc_type == 2; /* R_IQ2000_32. */
9710 case EM_LATTICEMICO32:
9711 return reloc_type == 3; /* R_LM32_32. */
9712 case EM_M32C_OLD:
9713 case EM_M32C:
9714 return reloc_type == 3; /* R_M32C_32. */
9715 case EM_M32R:
9716 return reloc_type == 34; /* R_M32R_32_RELA. */
9717 case EM_MCORE:
9718 return reloc_type == 1; /* R_MCORE_ADDR32. */
9719 case EM_CYGNUS_MEP:
9720 return reloc_type == 4; /* R_MEP_32. */
9721 case EM_MICROBLAZE:
9722 return reloc_type == 1; /* R_MICROBLAZE_32. */
9723 case EM_MIPS:
9724 return reloc_type == 2; /* R_MIPS_32. */
9725 case EM_MMIX:
9726 return reloc_type == 4; /* R_MMIX_32. */
9727 case EM_CYGNUS_MN10200:
9728 case EM_MN10200:
9729 return reloc_type == 1; /* R_MN10200_32. */
9730 case EM_CYGNUS_MN10300:
9731 case EM_MN10300:
9732 return reloc_type == 1; /* R_MN10300_32. */
9733 case EM_MOXIE:
9734 return reloc_type == 1; /* R_MOXIE_32. */
9735 case EM_MSP430_OLD:
9736 case EM_MSP430:
9737 return reloc_type == 1; /* R_MSP43_32. */
9738 case EM_MT:
9739 return reloc_type == 2; /* R_MT_32. */
9740 case EM_ALTERA_NIOS2:
9741 case EM_NIOS32:
9742 return reloc_type == 1; /* R_NIOS_32. */
9743 case EM_OPENRISC:
9744 case EM_OR32:
9745 return reloc_type == 1; /* R_OR32_32. */
9746 case EM_PARISC:
9747 return (reloc_type == 1 /* R_PARISC_DIR32. */
9748 || reloc_type == 41); /* R_PARISC_SECREL32. */
9749 case EM_PJ:
9750 case EM_PJ_OLD:
9751 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
9752 case EM_PPC64:
9753 return reloc_type == 1; /* R_PPC64_ADDR32. */
9754 case EM_PPC:
9755 return reloc_type == 1; /* R_PPC_ADDR32. */
9756 case EM_RX:
9757 return reloc_type == 1; /* R_RX_DIR32. */
9758 case EM_S370:
9759 return reloc_type == 1; /* R_I370_ADDR31. */
9760 case EM_S390_OLD:
9761 case EM_S390:
9762 return reloc_type == 4; /* R_S390_32. */
9763 case EM_SCORE:
9764 return reloc_type == 8; /* R_SCORE_ABS32. */
9765 case EM_SH:
9766 return reloc_type == 1; /* R_SH_DIR32. */
9767 case EM_SPARC32PLUS:
9768 case EM_SPARCV9:
9769 case EM_SPARC:
9770 return reloc_type == 3 /* R_SPARC_32. */
9771 || reloc_type == 23; /* R_SPARC_UA32. */
9772 case EM_SPU:
9773 return reloc_type == 6; /* R_SPU_ADDR32 */
9774 case EM_TI_C6000:
9775 return reloc_type == 1; /* R_C6000_ABS32. */
9776 case EM_TILEGX:
9777 return reloc_type == 2; /* R_TILEGX_32. */
9778 case EM_TILEPRO:
9779 return reloc_type == 1; /* R_TILEPRO_32. */
9780 case EM_CYGNUS_V850:
9781 case EM_V850:
9782 return reloc_type == 6; /* R_V850_ABS32. */
9783 case EM_VAX:
9784 return reloc_type == 1; /* R_VAX_32. */
9785 case EM_X86_64:
9786 case EM_L1OM:
9787 case EM_K1OM:
9788 return reloc_type == 10; /* R_X86_64_32. */
9789 case EM_XC16X:
9790 case EM_C166:
9791 return reloc_type == 3; /* R_XC16C_ABS_32. */
9792 case EM_XSTORMY16:
9793 return reloc_type == 1; /* R_XSTROMY16_32. */
9794 case EM_XTENSA_OLD:
9795 case EM_XTENSA:
9796 return reloc_type == 1; /* R_XTENSA_32. */
9797 default:
9798 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9799 elf_header.e_machine);
9800 abort ();
9801 }
9802 }
9803
9804 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9805 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
9806
9807 static bfd_boolean
9808 is_32bit_pcrel_reloc (unsigned int reloc_type)
9809 {
9810 switch (elf_header.e_machine)
9811 {
9812 case EM_386:
9813 case EM_486:
9814 return reloc_type == 2; /* R_386_PC32. */
9815 case EM_68K:
9816 return reloc_type == 4; /* R_68K_PC32. */
9817 case EM_ALPHA:
9818 return reloc_type == 10; /* R_ALPHA_SREL32. */
9819 case EM_ARM:
9820 return reloc_type == 3; /* R_ARM_REL32 */
9821 case EM_MICROBLAZE:
9822 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
9823 case EM_PARISC:
9824 return reloc_type == 9; /* R_PARISC_PCREL32. */
9825 case EM_PPC:
9826 return reloc_type == 26; /* R_PPC_REL32. */
9827 case EM_PPC64:
9828 return reloc_type == 26; /* R_PPC64_REL32. */
9829 case EM_S390_OLD:
9830 case EM_S390:
9831 return reloc_type == 5; /* R_390_PC32. */
9832 case EM_SH:
9833 return reloc_type == 2; /* R_SH_REL32. */
9834 case EM_SPARC32PLUS:
9835 case EM_SPARCV9:
9836 case EM_SPARC:
9837 return reloc_type == 6; /* R_SPARC_DISP32. */
9838 case EM_SPU:
9839 return reloc_type == 13; /* R_SPU_REL32. */
9840 case EM_TILEGX:
9841 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
9842 case EM_TILEPRO:
9843 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
9844 case EM_X86_64:
9845 case EM_L1OM:
9846 case EM_K1OM:
9847 return reloc_type == 2; /* R_X86_64_PC32. */
9848 case EM_XTENSA_OLD:
9849 case EM_XTENSA:
9850 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
9851 default:
9852 /* Do not abort or issue an error message here. Not all targets use
9853 pc-relative 32-bit relocs in their DWARF debug information and we
9854 have already tested for target coverage in is_32bit_abs_reloc. A
9855 more helpful warning message will be generated by apply_relocations
9856 anyway, so just return. */
9857 return FALSE;
9858 }
9859 }
9860
9861 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9862 a 64-bit absolute RELA relocation used in DWARF debug sections. */
9863
9864 static bfd_boolean
9865 is_64bit_abs_reloc (unsigned int reloc_type)
9866 {
9867 switch (elf_header.e_machine)
9868 {
9869 case EM_ALPHA:
9870 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
9871 case EM_IA_64:
9872 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
9873 case EM_PARISC:
9874 return reloc_type == 80; /* R_PARISC_DIR64. */
9875 case EM_PPC64:
9876 return reloc_type == 38; /* R_PPC64_ADDR64. */
9877 case EM_SPARC32PLUS:
9878 case EM_SPARCV9:
9879 case EM_SPARC:
9880 return reloc_type == 54; /* R_SPARC_UA64. */
9881 case EM_X86_64:
9882 case EM_L1OM:
9883 case EM_K1OM:
9884 return reloc_type == 1; /* R_X86_64_64. */
9885 case EM_S390_OLD:
9886 case EM_S390:
9887 return reloc_type == 22; /* R_S390_64. */
9888 case EM_TILEGX:
9889 return reloc_type == 1; /* R_TILEGX_64. */
9890 case EM_MIPS:
9891 return reloc_type == 18; /* R_MIPS_64. */
9892 default:
9893 return FALSE;
9894 }
9895 }
9896
9897 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
9898 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
9899
9900 static bfd_boolean
9901 is_64bit_pcrel_reloc (unsigned int reloc_type)
9902 {
9903 switch (elf_header.e_machine)
9904 {
9905 case EM_ALPHA:
9906 return reloc_type == 11; /* R_ALPHA_SREL64. */
9907 case EM_IA_64:
9908 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
9909 case EM_PARISC:
9910 return reloc_type == 72; /* R_PARISC_PCREL64. */
9911 case EM_PPC64:
9912 return reloc_type == 44; /* R_PPC64_REL64. */
9913 case EM_SPARC32PLUS:
9914 case EM_SPARCV9:
9915 case EM_SPARC:
9916 return reloc_type == 46; /* R_SPARC_DISP64. */
9917 case EM_X86_64:
9918 case EM_L1OM:
9919 case EM_K1OM:
9920 return reloc_type == 24; /* R_X86_64_PC64. */
9921 case EM_S390_OLD:
9922 case EM_S390:
9923 return reloc_type == 23; /* R_S390_PC64. */
9924 case EM_TILEGX:
9925 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
9926 default:
9927 return FALSE;
9928 }
9929 }
9930
9931 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9932 a 24-bit absolute RELA relocation used in DWARF debug sections. */
9933
9934 static bfd_boolean
9935 is_24bit_abs_reloc (unsigned int reloc_type)
9936 {
9937 switch (elf_header.e_machine)
9938 {
9939 case EM_CYGNUS_MN10200:
9940 case EM_MN10200:
9941 return reloc_type == 4; /* R_MN10200_24. */
9942 default:
9943 return FALSE;
9944 }
9945 }
9946
9947 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9948 a 16-bit absolute RELA relocation used in DWARF debug sections. */
9949
9950 static bfd_boolean
9951 is_16bit_abs_reloc (unsigned int reloc_type)
9952 {
9953 switch (elf_header.e_machine)
9954 {
9955 case EM_AVR_OLD:
9956 case EM_AVR:
9957 return reloc_type == 4; /* R_AVR_16. */
9958 case EM_CYGNUS_D10V:
9959 case EM_D10V:
9960 return reloc_type == 3; /* R_D10V_16. */
9961 case EM_H8S:
9962 case EM_H8_300:
9963 case EM_H8_300H:
9964 return reloc_type == R_H8_DIR16;
9965 case EM_IP2K_OLD:
9966 case EM_IP2K:
9967 return reloc_type == 1; /* R_IP2K_16. */
9968 case EM_M32C_OLD:
9969 case EM_M32C:
9970 return reloc_type == 1; /* R_M32C_16 */
9971 case EM_MSP430_OLD:
9972 case EM_MSP430:
9973 return reloc_type == 5; /* R_MSP430_16_BYTE. */
9974 case EM_ALTERA_NIOS2:
9975 case EM_NIOS32:
9976 return reloc_type == 9; /* R_NIOS_16. */
9977 case EM_TI_C6000:
9978 return reloc_type == 2; /* R_C6000_ABS16. */
9979 case EM_XC16X:
9980 case EM_C166:
9981 return reloc_type == 2; /* R_XC16C_ABS_16. */
9982 default:
9983 return FALSE;
9984 }
9985 }
9986
9987 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
9988 relocation entries (possibly formerly used for SHT_GROUP sections). */
9989
9990 static bfd_boolean
9991 is_none_reloc (unsigned int reloc_type)
9992 {
9993 switch (elf_header.e_machine)
9994 {
9995 case EM_68K: /* R_68K_NONE. */
9996 case EM_386: /* R_386_NONE. */
9997 case EM_SPARC32PLUS:
9998 case EM_SPARCV9:
9999 case EM_SPARC: /* R_SPARC_NONE. */
10000 case EM_MIPS: /* R_MIPS_NONE. */
10001 case EM_PARISC: /* R_PARISC_NONE. */
10002 case EM_ALPHA: /* R_ALPHA_NONE. */
10003 case EM_PPC: /* R_PPC_NONE. */
10004 case EM_PPC64: /* R_PPC64_NONE. */
10005 case EM_ARM: /* R_ARM_NONE. */
10006 case EM_IA_64: /* R_IA64_NONE. */
10007 case EM_SH: /* R_SH_NONE. */
10008 case EM_S390_OLD:
10009 case EM_S390: /* R_390_NONE. */
10010 case EM_CRIS: /* R_CRIS_NONE. */
10011 case EM_X86_64: /* R_X86_64_NONE. */
10012 case EM_L1OM: /* R_X86_64_NONE. */
10013 case EM_K1OM: /* R_X86_64_NONE. */
10014 case EM_MN10300: /* R_MN10300_NONE. */
10015 case EM_MOXIE: /* R_MOXIE_NONE. */
10016 case EM_M32R: /* R_M32R_NONE. */
10017 case EM_TI_C6000:/* R_C6000_NONE. */
10018 case EM_TILEGX: /* R_TILEGX_NONE. */
10019 case EM_TILEPRO: /* R_TILEPRO_NONE. */
10020 case EM_XC16X:
10021 case EM_C166: /* R_XC16X_NONE. */
10022 return reloc_type == 0;
10023 case EM_XTENSA_OLD:
10024 case EM_XTENSA:
10025 return (reloc_type == 0 /* R_XTENSA_NONE. */
10026 || reloc_type == 17 /* R_XTENSA_DIFF8. */
10027 || reloc_type == 18 /* R_XTENSA_DIFF16. */
10028 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
10029 }
10030 return FALSE;
10031 }
10032
10033 /* Apply relocations to a section.
10034 Note: So far support has been added only for those relocations
10035 which can be found in debug sections.
10036 FIXME: Add support for more relocations ? */
10037
10038 static void
10039 apply_relocations (void * file,
10040 Elf_Internal_Shdr * section,
10041 unsigned char * start)
10042 {
10043 Elf_Internal_Shdr * relsec;
10044 unsigned char * end = start + section->sh_size;
10045
10046 if (elf_header.e_type != ET_REL)
10047 return;
10048
10049 /* Find the reloc section associated with the section. */
10050 for (relsec = section_headers;
10051 relsec < section_headers + elf_header.e_shnum;
10052 ++relsec)
10053 {
10054 bfd_boolean is_rela;
10055 unsigned long num_relocs;
10056 Elf_Internal_Rela * relocs;
10057 Elf_Internal_Rela * rp;
10058 Elf_Internal_Shdr * symsec;
10059 Elf_Internal_Sym * symtab;
10060 Elf_Internal_Sym * sym;
10061
10062 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10063 || relsec->sh_info >= elf_header.e_shnum
10064 || section_headers + relsec->sh_info != section
10065 || relsec->sh_size == 0
10066 || relsec->sh_link >= elf_header.e_shnum)
10067 continue;
10068
10069 is_rela = relsec->sh_type == SHT_RELA;
10070
10071 if (is_rela)
10072 {
10073 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10074 relsec->sh_size, & relocs, & num_relocs))
10075 return;
10076 }
10077 else
10078 {
10079 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10080 relsec->sh_size, & relocs, & num_relocs))
10081 return;
10082 }
10083
10084 /* SH uses RELA but uses in place value instead of the addend field. */
10085 if (elf_header.e_machine == EM_SH)
10086 is_rela = FALSE;
10087
10088 symsec = section_headers + relsec->sh_link;
10089 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec);
10090
10091 for (rp = relocs; rp < relocs + num_relocs; ++rp)
10092 {
10093 bfd_vma addend;
10094 unsigned int reloc_type;
10095 unsigned int reloc_size;
10096 unsigned char * rloc;
10097
10098 reloc_type = get_reloc_type (rp->r_info);
10099
10100 if (target_specific_reloc_handling (rp, start, symtab))
10101 continue;
10102 else if (is_none_reloc (reloc_type))
10103 continue;
10104 else if (is_32bit_abs_reloc (reloc_type)
10105 || is_32bit_pcrel_reloc (reloc_type))
10106 reloc_size = 4;
10107 else if (is_64bit_abs_reloc (reloc_type)
10108 || is_64bit_pcrel_reloc (reloc_type))
10109 reloc_size = 8;
10110 else if (is_24bit_abs_reloc (reloc_type))
10111 reloc_size = 3;
10112 else if (is_16bit_abs_reloc (reloc_type))
10113 reloc_size = 2;
10114 else
10115 {
10116 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10117 reloc_type, SECTION_NAME (section));
10118 continue;
10119 }
10120
10121 rloc = start + rp->r_offset;
10122 if ((rloc + reloc_size) > end)
10123 {
10124 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10125 (unsigned long) rp->r_offset,
10126 SECTION_NAME (section));
10127 continue;
10128 }
10129
10130 sym = symtab + get_reloc_symindex (rp->r_info);
10131
10132 /* If the reloc has a symbol associated with it,
10133 make sure that it is of an appropriate type.
10134
10135 Relocations against symbols without type can happen.
10136 Gcc -feliminate-dwarf2-dups may generate symbols
10137 without type for debug info.
10138
10139 Icc generates relocations against function symbols
10140 instead of local labels.
10141
10142 Relocations against object symbols can happen, eg when
10143 referencing a global array. For an example of this see
10144 the _clz.o binary in libgcc.a. */
10145 if (sym != symtab
10146 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10147 {
10148 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10149 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10150 (long int)(rp - relocs),
10151 SECTION_NAME (relsec));
10152 continue;
10153 }
10154
10155 addend = 0;
10156 if (is_rela)
10157 addend += rp->r_addend;
10158 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10159 partial_inplace. */
10160 if (!is_rela
10161 || (elf_header.e_machine == EM_XTENSA
10162 && reloc_type == 1)
10163 || ((elf_header.e_machine == EM_PJ
10164 || elf_header.e_machine == EM_PJ_OLD)
10165 && reloc_type == 1)
10166 || ((elf_header.e_machine == EM_D30V
10167 || elf_header.e_machine == EM_CYGNUS_D30V)
10168 && reloc_type == 12))
10169 addend += byte_get (rloc, reloc_size);
10170
10171 if (is_32bit_pcrel_reloc (reloc_type)
10172 || is_64bit_pcrel_reloc (reloc_type))
10173 {
10174 /* On HPPA, all pc-relative relocations are biased by 8. */
10175 if (elf_header.e_machine == EM_PARISC)
10176 addend -= 8;
10177 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10178 reloc_size);
10179 }
10180 else
10181 byte_put (rloc, addend + sym->st_value, reloc_size);
10182 }
10183
10184 free (symtab);
10185 free (relocs);
10186 break;
10187 }
10188 }
10189
10190 #ifdef SUPPORT_DISASSEMBLY
10191 static int
10192 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10193 {
10194 printf (_("\nAssembly dump of section %s\n"),
10195 SECTION_NAME (section));
10196
10197 /* XXX -- to be done --- XXX */
10198
10199 return 1;
10200 }
10201 #endif
10202
10203 /* Reads in the contents of SECTION from FILE, returning a pointer
10204 to a malloc'ed buffer or NULL if something went wrong. */
10205
10206 static char *
10207 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10208 {
10209 bfd_size_type num_bytes;
10210
10211 num_bytes = section->sh_size;
10212
10213 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10214 {
10215 printf (_("\nSection '%s' has no data to dump.\n"),
10216 SECTION_NAME (section));
10217 return NULL;
10218 }
10219
10220 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10221 _("section contents"));
10222 }
10223
10224
10225 static void
10226 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10227 {
10228 Elf_Internal_Shdr * relsec;
10229 bfd_size_type num_bytes;
10230 char * data;
10231 char * end;
10232 char * start;
10233 char * name = SECTION_NAME (section);
10234 bfd_boolean some_strings_shown;
10235
10236 start = get_section_contents (section, file);
10237 if (start == NULL)
10238 return;
10239
10240 printf (_("\nString dump of section '%s':\n"), name);
10241
10242 /* If the section being dumped has relocations against it the user might
10243 be expecting these relocations to have been applied. Check for this
10244 case and issue a warning message in order to avoid confusion.
10245 FIXME: Maybe we ought to have an option that dumps a section with
10246 relocs applied ? */
10247 for (relsec = section_headers;
10248 relsec < section_headers + elf_header.e_shnum;
10249 ++relsec)
10250 {
10251 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10252 || relsec->sh_info >= elf_header.e_shnum
10253 || section_headers + relsec->sh_info != section
10254 || relsec->sh_size == 0
10255 || relsec->sh_link >= elf_header.e_shnum)
10256 continue;
10257
10258 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10259 break;
10260 }
10261
10262 num_bytes = section->sh_size;
10263 data = start;
10264 end = start + num_bytes;
10265 some_strings_shown = FALSE;
10266
10267 while (data < end)
10268 {
10269 while (!ISPRINT (* data))
10270 if (++ data >= end)
10271 break;
10272
10273 if (data < end)
10274 {
10275 #ifndef __MSVCRT__
10276 /* PR 11128: Use two separate invocations in order to work
10277 around bugs in the Solaris 8 implementation of printf. */
10278 printf (" [%6tx] ", data - start);
10279 printf ("%s\n", data);
10280 #else
10281 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
10282 #endif
10283 data += strlen (data);
10284 some_strings_shown = TRUE;
10285 }
10286 }
10287
10288 if (! some_strings_shown)
10289 printf (_(" No strings found in this section."));
10290
10291 free (start);
10292
10293 putchar ('\n');
10294 }
10295
10296 static void
10297 dump_section_as_bytes (Elf_Internal_Shdr * section,
10298 FILE * file,
10299 bfd_boolean relocate)
10300 {
10301 Elf_Internal_Shdr * relsec;
10302 bfd_size_type bytes;
10303 bfd_vma addr;
10304 unsigned char * data;
10305 unsigned char * start;
10306
10307 start = (unsigned char *) get_section_contents (section, file);
10308 if (start == NULL)
10309 return;
10310
10311 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10312
10313 if (relocate)
10314 {
10315 apply_relocations (file, section, start);
10316 }
10317 else
10318 {
10319 /* If the section being dumped has relocations against it the user might
10320 be expecting these relocations to have been applied. Check for this
10321 case and issue a warning message in order to avoid confusion.
10322 FIXME: Maybe we ought to have an option that dumps a section with
10323 relocs applied ? */
10324 for (relsec = section_headers;
10325 relsec < section_headers + elf_header.e_shnum;
10326 ++relsec)
10327 {
10328 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10329 || relsec->sh_info >= elf_header.e_shnum
10330 || section_headers + relsec->sh_info != section
10331 || relsec->sh_size == 0
10332 || relsec->sh_link >= elf_header.e_shnum)
10333 continue;
10334
10335 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10336 break;
10337 }
10338 }
10339
10340 addr = section->sh_addr;
10341 bytes = section->sh_size;
10342 data = start;
10343
10344 while (bytes)
10345 {
10346 int j;
10347 int k;
10348 int lbytes;
10349
10350 lbytes = (bytes > 16 ? 16 : bytes);
10351
10352 printf (" 0x%8.8lx ", (unsigned long) addr);
10353
10354 for (j = 0; j < 16; j++)
10355 {
10356 if (j < lbytes)
10357 printf ("%2.2x", data[j]);
10358 else
10359 printf (" ");
10360
10361 if ((j & 3) == 3)
10362 printf (" ");
10363 }
10364
10365 for (j = 0; j < lbytes; j++)
10366 {
10367 k = data[j];
10368 if (k >= ' ' && k < 0x7f)
10369 printf ("%c", k);
10370 else
10371 printf (".");
10372 }
10373
10374 putchar ('\n');
10375
10376 data += lbytes;
10377 addr += lbytes;
10378 bytes -= lbytes;
10379 }
10380
10381 free (start);
10382
10383 putchar ('\n');
10384 }
10385
10386 /* Uncompresses a section that was compressed using zlib, in place. */
10387
10388 static int
10389 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10390 dwarf_size_type *size ATTRIBUTE_UNUSED)
10391 {
10392 #ifndef HAVE_ZLIB_H
10393 return FALSE;
10394 #else
10395 dwarf_size_type compressed_size = *size;
10396 unsigned char * compressed_buffer = *buffer;
10397 dwarf_size_type uncompressed_size;
10398 unsigned char * uncompressed_buffer;
10399 z_stream strm;
10400 int rc;
10401 dwarf_size_type header_size = 12;
10402
10403 /* Read the zlib header. In this case, it should be "ZLIB" followed
10404 by the uncompressed section size, 8 bytes in big-endian order. */
10405 if (compressed_size < header_size
10406 || ! streq ((char *) compressed_buffer, "ZLIB"))
10407 return 0;
10408
10409 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10410 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10411 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10412 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10413 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10414 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10415 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10416 uncompressed_size += compressed_buffer[11];
10417
10418 /* It is possible the section consists of several compressed
10419 buffers concatenated together, so we uncompress in a loop. */
10420 strm.zalloc = NULL;
10421 strm.zfree = NULL;
10422 strm.opaque = NULL;
10423 strm.avail_in = compressed_size - header_size;
10424 strm.next_in = (Bytef *) compressed_buffer + header_size;
10425 strm.avail_out = uncompressed_size;
10426 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10427
10428 rc = inflateInit (& strm);
10429 while (strm.avail_in > 0)
10430 {
10431 if (rc != Z_OK)
10432 goto fail;
10433 strm.next_out = ((Bytef *) uncompressed_buffer
10434 + (uncompressed_size - strm.avail_out));
10435 rc = inflate (&strm, Z_FINISH);
10436 if (rc != Z_STREAM_END)
10437 goto fail;
10438 rc = inflateReset (& strm);
10439 }
10440 rc = inflateEnd (& strm);
10441 if (rc != Z_OK
10442 || strm.avail_out != 0)
10443 goto fail;
10444
10445 free (compressed_buffer);
10446 *buffer = uncompressed_buffer;
10447 *size = uncompressed_size;
10448 return 1;
10449
10450 fail:
10451 free (uncompressed_buffer);
10452 /* Indicate decompression failure. */
10453 *buffer = NULL;
10454 return 0;
10455 #endif /* HAVE_ZLIB_H */
10456 }
10457
10458 static int
10459 load_specific_debug_section (enum dwarf_section_display_enum debug,
10460 Elf_Internal_Shdr * sec, void * file)
10461 {
10462 struct dwarf_section * section = &debug_displays [debug].section;
10463 char buf [64];
10464
10465 /* If it is already loaded, do nothing. */
10466 if (section->start != NULL)
10467 return 1;
10468
10469 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10470 section->address = sec->sh_addr;
10471 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10472 sec->sh_offset, 1,
10473 sec->sh_size, buf);
10474 if (section->start == NULL)
10475 section->size = 0;
10476 else
10477 {
10478 section->size = sec->sh_size;
10479 if (uncompress_section_contents (&section->start, &section->size))
10480 sec->sh_size = section->size;
10481 }
10482
10483 if (section->start == NULL)
10484 return 0;
10485
10486 if (debug_displays [debug].relocate)
10487 apply_relocations ((FILE *) file, sec, section->start);
10488
10489 return 1;
10490 }
10491
10492 int
10493 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10494 {
10495 struct dwarf_section * section = &debug_displays [debug].section;
10496 Elf_Internal_Shdr * sec;
10497
10498 /* Locate the debug section. */
10499 sec = find_section (section->uncompressed_name);
10500 if (sec != NULL)
10501 section->name = section->uncompressed_name;
10502 else
10503 {
10504 sec = find_section (section->compressed_name);
10505 if (sec != NULL)
10506 section->name = section->compressed_name;
10507 }
10508 if (sec == NULL)
10509 return 0;
10510
10511 return load_specific_debug_section (debug, sec, (FILE *) file);
10512 }
10513
10514 void
10515 free_debug_section (enum dwarf_section_display_enum debug)
10516 {
10517 struct dwarf_section * section = &debug_displays [debug].section;
10518
10519 if (section->start == NULL)
10520 return;
10521
10522 free ((char *) section->start);
10523 section->start = NULL;
10524 section->address = 0;
10525 section->size = 0;
10526 }
10527
10528 static int
10529 display_debug_section (Elf_Internal_Shdr * section, FILE * file)
10530 {
10531 char * name = SECTION_NAME (section);
10532 bfd_size_type length;
10533 int result = 1;
10534 int i;
10535
10536 length = section->sh_size;
10537 if (length == 0)
10538 {
10539 printf (_("\nSection '%s' has no debugging data.\n"), name);
10540 return 0;
10541 }
10542 if (section->sh_type == SHT_NOBITS)
10543 {
10544 /* There is no point in dumping the contents of a debugging section
10545 which has the NOBITS type - the bits in the file will be random.
10546 This can happen when a file containing a .eh_frame section is
10547 stripped with the --only-keep-debug command line option. */
10548 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10549 return 0;
10550 }
10551
10552 if (const_strneq (name, ".gnu.linkonce.wi."))
10553 name = ".debug_info";
10554
10555 /* See if we know how to display the contents of this section. */
10556 for (i = 0; i < max; i++)
10557 if (streq (debug_displays[i].section.uncompressed_name, name)
10558 || streq (debug_displays[i].section.compressed_name, name))
10559 {
10560 struct dwarf_section * sec = &debug_displays [i].section;
10561 int secondary = (section != find_section (name));
10562
10563 if (secondary)
10564 free_debug_section ((enum dwarf_section_display_enum) i);
10565
10566 if (streq (sec->uncompressed_name, name))
10567 sec->name = sec->uncompressed_name;
10568 else
10569 sec->name = sec->compressed_name;
10570 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10571 section, file))
10572 {
10573 result &= debug_displays[i].display (sec, file);
10574
10575 if (secondary || (i != info && i != abbrev))
10576 free_debug_section ((enum dwarf_section_display_enum) i);
10577 }
10578
10579 break;
10580 }
10581
10582 if (i == max)
10583 {
10584 printf (_("Unrecognized debug section: %s\n"), name);
10585 result = 0;
10586 }
10587
10588 return result;
10589 }
10590
10591 /* Set DUMP_SECTS for all sections where dumps were requested
10592 based on section name. */
10593
10594 static void
10595 initialise_dumps_byname (void)
10596 {
10597 struct dump_list_entry * cur;
10598
10599 for (cur = dump_sects_byname; cur; cur = cur->next)
10600 {
10601 unsigned int i;
10602 int any;
10603
10604 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10605 if (streq (SECTION_NAME (section_headers + i), cur->name))
10606 {
10607 request_dump_bynumber (i, cur->type);
10608 any = 1;
10609 }
10610
10611 if (!any)
10612 warn (_("Section '%s' was not dumped because it does not exist!\n"),
10613 cur->name);
10614 }
10615 }
10616
10617 static void
10618 process_section_contents (FILE * file)
10619 {
10620 Elf_Internal_Shdr * section;
10621 unsigned int i;
10622
10623 if (! do_dump)
10624 return;
10625
10626 initialise_dumps_byname ();
10627
10628 for (i = 0, section = section_headers;
10629 i < elf_header.e_shnum && i < num_dump_sects;
10630 i++, section++)
10631 {
10632 #ifdef SUPPORT_DISASSEMBLY
10633 if (dump_sects[i] & DISASS_DUMP)
10634 disassemble_section (section, file);
10635 #endif
10636 if (dump_sects[i] & HEX_DUMP)
10637 dump_section_as_bytes (section, file, FALSE);
10638
10639 if (dump_sects[i] & RELOC_DUMP)
10640 dump_section_as_bytes (section, file, TRUE);
10641
10642 if (dump_sects[i] & STRING_DUMP)
10643 dump_section_as_strings (section, file);
10644
10645 if (dump_sects[i] & DEBUG_DUMP)
10646 display_debug_section (section, file);
10647 }
10648
10649 /* Check to see if the user requested a
10650 dump of a section that does not exist. */
10651 while (i++ < num_dump_sects)
10652 if (dump_sects[i])
10653 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10654 }
10655
10656 static void
10657 process_mips_fpe_exception (int mask)
10658 {
10659 if (mask)
10660 {
10661 int first = 1;
10662 if (mask & OEX_FPU_INEX)
10663 fputs ("INEX", stdout), first = 0;
10664 if (mask & OEX_FPU_UFLO)
10665 printf ("%sUFLO", first ? "" : "|"), first = 0;
10666 if (mask & OEX_FPU_OFLO)
10667 printf ("%sOFLO", first ? "" : "|"), first = 0;
10668 if (mask & OEX_FPU_DIV0)
10669 printf ("%sDIV0", first ? "" : "|"), first = 0;
10670 if (mask & OEX_FPU_INVAL)
10671 printf ("%sINVAL", first ? "" : "|");
10672 }
10673 else
10674 fputs ("0", stdout);
10675 }
10676
10677 /* ARM EABI attributes section. */
10678 typedef struct
10679 {
10680 int tag;
10681 const char * name;
10682 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
10683 int type;
10684 const char ** table;
10685 } arm_attr_public_tag;
10686
10687 static const char * arm_attr_tag_CPU_arch[] =
10688 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10689 "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
10690 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10691 static const char * arm_attr_tag_THUMB_ISA_use[] =
10692 {"No", "Thumb-1", "Thumb-2"};
10693 static const char * arm_attr_tag_FP_arch[] =
10694 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
10695 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10696 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10697 {"No", "NEONv1", "NEONv1 with Fused-MAC"};
10698 static const char * arm_attr_tag_PCS_config[] =
10699 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10700 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10701 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10702 {"V6", "SB", "TLS", "Unused"};
10703 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10704 {"Absolute", "PC-relative", "SB-relative", "None"};
10705 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10706 {"Absolute", "PC-relative", "None"};
10707 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10708 {"None", "direct", "GOT-indirect"};
10709 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10710 {"None", "??? 1", "2", "??? 3", "4"};
10711 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10712 static const char * arm_attr_tag_ABI_FP_denormal[] =
10713 {"Unused", "Needed", "Sign only"};
10714 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10715 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10716 static const char * arm_attr_tag_ABI_FP_number_model[] =
10717 {"Unused", "Finite", "RTABI", "IEEE 754"};
10718 static const char * arm_attr_tag_ABI_enum_size[] =
10719 {"Unused", "small", "int", "forced to int"};
10720 static const char * arm_attr_tag_ABI_HardFP_use[] =
10721 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10722 static const char * arm_attr_tag_ABI_VFP_args[] =
10723 {"AAPCS", "VFP registers", "custom"};
10724 static const char * arm_attr_tag_ABI_WMMX_args[] =
10725 {"AAPCS", "WMMX registers", "custom"};
10726 static const char * arm_attr_tag_ABI_optimization_goals[] =
10727 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10728 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10729 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10730 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10731 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10732 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10733 static const char * arm_attr_tag_FP_HP_extension[] =
10734 {"Not Allowed", "Allowed"};
10735 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10736 {"None", "IEEE 754", "Alternative Format"};
10737 static const char * arm_attr_tag_MPextension_use[] =
10738 {"Not Allowed", "Allowed"};
10739 static const char * arm_attr_tag_DIV_use[] =
10740 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10741 "Allowed in v7-A with integer division extension"};
10742 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10743 static const char * arm_attr_tag_Virtualization_use[] =
10744 {"Not Allowed", "TrustZone", "Virtualization Extensions",
10745 "TrustZone and Virtualization Extensions"};
10746 static const char * arm_attr_tag_MPextension_use_legacy[] =
10747 {"Not Allowed", "Allowed"};
10748
10749 #define LOOKUP(id, name) \
10750 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10751 static arm_attr_public_tag arm_attr_public_tags[] =
10752 {
10753 {4, "CPU_raw_name", 1, NULL},
10754 {5, "CPU_name", 1, NULL},
10755 LOOKUP(6, CPU_arch),
10756 {7, "CPU_arch_profile", 0, NULL},
10757 LOOKUP(8, ARM_ISA_use),
10758 LOOKUP(9, THUMB_ISA_use),
10759 LOOKUP(10, FP_arch),
10760 LOOKUP(11, WMMX_arch),
10761 LOOKUP(12, Advanced_SIMD_arch),
10762 LOOKUP(13, PCS_config),
10763 LOOKUP(14, ABI_PCS_R9_use),
10764 LOOKUP(15, ABI_PCS_RW_data),
10765 LOOKUP(16, ABI_PCS_RO_data),
10766 LOOKUP(17, ABI_PCS_GOT_use),
10767 LOOKUP(18, ABI_PCS_wchar_t),
10768 LOOKUP(19, ABI_FP_rounding),
10769 LOOKUP(20, ABI_FP_denormal),
10770 LOOKUP(21, ABI_FP_exceptions),
10771 LOOKUP(22, ABI_FP_user_exceptions),
10772 LOOKUP(23, ABI_FP_number_model),
10773 {24, "ABI_align_needed", 0, NULL},
10774 {25, "ABI_align_preserved", 0, NULL},
10775 LOOKUP(26, ABI_enum_size),
10776 LOOKUP(27, ABI_HardFP_use),
10777 LOOKUP(28, ABI_VFP_args),
10778 LOOKUP(29, ABI_WMMX_args),
10779 LOOKUP(30, ABI_optimization_goals),
10780 LOOKUP(31, ABI_FP_optimization_goals),
10781 {32, "compatibility", 0, NULL},
10782 LOOKUP(34, CPU_unaligned_access),
10783 LOOKUP(36, FP_HP_extension),
10784 LOOKUP(38, ABI_FP_16bit_format),
10785 LOOKUP(42, MPextension_use),
10786 LOOKUP(44, DIV_use),
10787 {64, "nodefaults", 0, NULL},
10788 {65, "also_compatible_with", 0, NULL},
10789 LOOKUP(66, T2EE_use),
10790 {67, "conformance", 1, NULL},
10791 LOOKUP(68, Virtualization_use),
10792 LOOKUP(70, MPextension_use_legacy)
10793 };
10794 #undef LOOKUP
10795
10796 static unsigned char *
10797 display_arm_attribute (unsigned char * p)
10798 {
10799 int tag;
10800 unsigned int len;
10801 int val;
10802 arm_attr_public_tag * attr;
10803 unsigned i;
10804 int type;
10805
10806 tag = read_uleb128 (p, &len);
10807 p += len;
10808 attr = NULL;
10809 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
10810 {
10811 if (arm_attr_public_tags[i].tag == tag)
10812 {
10813 attr = &arm_attr_public_tags[i];
10814 break;
10815 }
10816 }
10817
10818 if (attr)
10819 {
10820 printf (" Tag_%s: ", attr->name);
10821 switch (attr->type)
10822 {
10823 case 0:
10824 switch (tag)
10825 {
10826 case 7: /* Tag_CPU_arch_profile. */
10827 val = read_uleb128 (p, &len);
10828 p += len;
10829 switch (val)
10830 {
10831 case 0: printf (_("None\n")); break;
10832 case 'A': printf (_("Application\n")); break;
10833 case 'R': printf (_("Realtime\n")); break;
10834 case 'M': printf (_("Microcontroller\n")); break;
10835 case 'S': printf (_("Application or Realtime\n")); break;
10836 default: printf ("??? (%d)\n", val); break;
10837 }
10838 break;
10839
10840 case 24: /* Tag_align_needed. */
10841 val = read_uleb128 (p, &len);
10842 p += len;
10843 switch (val)
10844 {
10845 case 0: printf (_("None\n")); break;
10846 case 1: printf (_("8-byte\n")); break;
10847 case 2: printf (_("4-byte\n")); break;
10848 case 3: printf ("??? 3\n"); break;
10849 default:
10850 if (val <= 12)
10851 printf (_("8-byte and up to %d-byte extended\n"),
10852 1 << val);
10853 else
10854 printf ("??? (%d)\n", val);
10855 break;
10856 }
10857 break;
10858
10859 case 25: /* Tag_align_preserved. */
10860 val = read_uleb128 (p, &len);
10861 p += len;
10862 switch (val)
10863 {
10864 case 0: printf (_("None\n")); break;
10865 case 1: printf (_("8-byte, except leaf SP\n")); break;
10866 case 2: printf (_("8-byte\n")); break;
10867 case 3: printf ("??? 3\n"); break;
10868 default:
10869 if (val <= 12)
10870 printf (_("8-byte and up to %d-byte extended\n"),
10871 1 << val);
10872 else
10873 printf ("??? (%d)\n", val);
10874 break;
10875 }
10876 break;
10877
10878 case 32: /* Tag_compatibility. */
10879 val = read_uleb128 (p, &len);
10880 p += len;
10881 printf (_("flag = %d, vendor = %s\n"), val, p);
10882 p += strlen ((char *) p) + 1;
10883 break;
10884
10885 case 64: /* Tag_nodefaults. */
10886 p++;
10887 printf (_("True\n"));
10888 break;
10889
10890 case 65: /* Tag_also_compatible_with. */
10891 val = read_uleb128 (p, &len);
10892 p += len;
10893 if (val == 6 /* Tag_CPU_arch. */)
10894 {
10895 val = read_uleb128 (p, &len);
10896 p += len;
10897 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
10898 printf ("??? (%d)\n", val);
10899 else
10900 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
10901 }
10902 else
10903 printf ("???\n");
10904 while (*(p++) != '\0' /* NUL terminator. */);
10905 break;
10906
10907 default:
10908 abort ();
10909 }
10910 return p;
10911
10912 case 1:
10913 case 2:
10914 type = attr->type;
10915 break;
10916
10917 default:
10918 assert (attr->type & 0x80);
10919 val = read_uleb128 (p, &len);
10920 p += len;
10921 type = attr->type & 0x7f;
10922 if (val >= type)
10923 printf ("??? (%d)\n", val);
10924 else
10925 printf ("%s\n", attr->table[val]);
10926 return p;
10927 }
10928 }
10929 else
10930 {
10931 if (tag & 1)
10932 type = 1; /* String. */
10933 else
10934 type = 2; /* uleb128. */
10935 printf (" Tag_unknown_%d: ", tag);
10936 }
10937
10938 if (type == 1)
10939 {
10940 printf ("\"%s\"\n", p);
10941 p += strlen ((char *) p) + 1;
10942 }
10943 else
10944 {
10945 val = read_uleb128 (p, &len);
10946 p += len;
10947 printf ("%d (0x%x)\n", val, val);
10948 }
10949
10950 return p;
10951 }
10952
10953 static unsigned char *
10954 display_gnu_attribute (unsigned char * p,
10955 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10956 {
10957 int tag;
10958 unsigned int len;
10959 int val;
10960 int type;
10961
10962 tag = read_uleb128 (p, &len);
10963 p += len;
10964
10965 /* Tag_compatibility is the only generic GNU attribute defined at
10966 present. */
10967 if (tag == 32)
10968 {
10969 val = read_uleb128 (p, &len);
10970 p += len;
10971 printf (_("flag = %d, vendor = %s\n"), val, p);
10972 p += strlen ((char *) p) + 1;
10973 return p;
10974 }
10975
10976 if ((tag & 2) == 0 && display_proc_gnu_attribute)
10977 return display_proc_gnu_attribute (p, tag);
10978
10979 if (tag & 1)
10980 type = 1; /* String. */
10981 else
10982 type = 2; /* uleb128. */
10983 printf (" Tag_unknown_%d: ", tag);
10984
10985 if (type == 1)
10986 {
10987 printf ("\"%s\"\n", p);
10988 p += strlen ((char *) p) + 1;
10989 }
10990 else
10991 {
10992 val = read_uleb128 (p, &len);
10993 p += len;
10994 printf ("%d (0x%x)\n", val, val);
10995 }
10996
10997 return p;
10998 }
10999
11000 static unsigned char *
11001 display_power_gnu_attribute (unsigned char * p, int tag)
11002 {
11003 int type;
11004 unsigned int len;
11005 int val;
11006
11007 if (tag == Tag_GNU_Power_ABI_FP)
11008 {
11009 val = read_uleb128 (p, &len);
11010 p += len;
11011 printf (" Tag_GNU_Power_ABI_FP: ");
11012
11013 switch (val)
11014 {
11015 case 0:
11016 printf (_("Hard or soft float\n"));
11017 break;
11018 case 1:
11019 printf (_("Hard float\n"));
11020 break;
11021 case 2:
11022 printf (_("Soft float\n"));
11023 break;
11024 case 3:
11025 printf (_("Single-precision hard float\n"));
11026 break;
11027 default:
11028 printf ("??? (%d)\n", val);
11029 break;
11030 }
11031 return p;
11032 }
11033
11034 if (tag == Tag_GNU_Power_ABI_Vector)
11035 {
11036 val = read_uleb128 (p, &len);
11037 p += len;
11038 printf (" Tag_GNU_Power_ABI_Vector: ");
11039 switch (val)
11040 {
11041 case 0:
11042 printf (_("Any\n"));
11043 break;
11044 case 1:
11045 printf (_("Generic\n"));
11046 break;
11047 case 2:
11048 printf ("AltiVec\n");
11049 break;
11050 case 3:
11051 printf ("SPE\n");
11052 break;
11053 default:
11054 printf ("??? (%d)\n", val);
11055 break;
11056 }
11057 return p;
11058 }
11059
11060 if (tag == Tag_GNU_Power_ABI_Struct_Return)
11061 {
11062 val = read_uleb128 (p, &len);
11063 p += len;
11064 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
11065 switch (val)
11066 {
11067 case 0:
11068 printf (_("Any\n"));
11069 break;
11070 case 1:
11071 printf ("r3/r4\n");
11072 break;
11073 case 2:
11074 printf (_("Memory\n"));
11075 break;
11076 default:
11077 printf ("??? (%d)\n", val);
11078 break;
11079 }
11080 return p;
11081 }
11082
11083 if (tag & 1)
11084 type = 1; /* String. */
11085 else
11086 type = 2; /* uleb128. */
11087 printf (" Tag_unknown_%d: ", tag);
11088
11089 if (type == 1)
11090 {
11091 printf ("\"%s\"\n", p);
11092 p += strlen ((char *) p) + 1;
11093 }
11094 else
11095 {
11096 val = read_uleb128 (p, &len);
11097 p += len;
11098 printf ("%d (0x%x)\n", val, val);
11099 }
11100
11101 return p;
11102 }
11103
11104 static void
11105 display_sparc_hwcaps (int mask)
11106 {
11107 if (mask)
11108 {
11109 int first = 1;
11110 if (mask & ELF_SPARC_HWCAP_MUL32)
11111 fputs ("mul32", stdout), first = 0;
11112 if (mask & ELF_SPARC_HWCAP_DIV32)
11113 printf ("%sdiv32", first ? "" : "|"), first = 0;
11114 if (mask & ELF_SPARC_HWCAP_FSMULD)
11115 printf ("%sfsmuld", first ? "" : "|"), first = 0;
11116 if (mask & ELF_SPARC_HWCAP_V8PLUS)
11117 printf ("%sv8plus", first ? "" : "|"), first = 0;
11118 if (mask & ELF_SPARC_HWCAP_POPC)
11119 printf ("%spopc", first ? "" : "|"), first = 0;
11120 if (mask & ELF_SPARC_HWCAP_VIS)
11121 printf ("%svis", first ? "" : "|"), first = 0;
11122 if (mask & ELF_SPARC_HWCAP_VIS2)
11123 printf ("%svis2", first ? "" : "|"), first = 0;
11124 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11125 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11126 if (mask & ELF_SPARC_HWCAP_FMAF)
11127 printf ("%sfmaf", first ? "" : "|"), first = 0;
11128 if (mask & ELF_SPARC_HWCAP_VIS3)
11129 printf ("%svis3", first ? "" : "|"), first = 0;
11130 if (mask & ELF_SPARC_HWCAP_HPC)
11131 printf ("%shpc", first ? "" : "|"), first = 0;
11132 if (mask & ELF_SPARC_HWCAP_RANDOM)
11133 printf ("%srandom", first ? "" : "|"), first = 0;
11134 if (mask & ELF_SPARC_HWCAP_TRANS)
11135 printf ("%strans", first ? "" : "|"), first = 0;
11136 if (mask & ELF_SPARC_HWCAP_FJFMAU)
11137 printf ("%sfjfmau", first ? "" : "|"), first = 0;
11138 if (mask & ELF_SPARC_HWCAP_IMA)
11139 printf ("%sima", first ? "" : "|"), first = 0;
11140 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11141 printf ("%scspare", first ? "" : "|"), first = 0;
11142 }
11143 else
11144 fputc('0', stdout);
11145 fputc('\n', stdout);
11146 }
11147
11148 static unsigned char *
11149 display_sparc_gnu_attribute (unsigned char * p, int tag)
11150 {
11151 int type;
11152 unsigned int len;
11153 int val;
11154
11155 if (tag == Tag_GNU_Sparc_HWCAPS)
11156 {
11157 val = read_uleb128 (p, &len);
11158 p += len;
11159 printf (" Tag_GNU_Sparc_HWCAPS: ");
11160
11161 display_sparc_hwcaps (val);
11162 return p;
11163 }
11164
11165 if (tag & 1)
11166 type = 1; /* String. */
11167 else
11168 type = 2; /* uleb128. */
11169 printf (" Tag_unknown_%d: ", tag);
11170
11171 if (type == 1)
11172 {
11173 printf ("\"%s\"\n", p);
11174 p += strlen ((char *) p) + 1;
11175 }
11176 else
11177 {
11178 val = read_uleb128 (p, &len);
11179 p += len;
11180 printf ("%d (0x%x)\n", val, val);
11181 }
11182
11183 return p;
11184 }
11185
11186 static unsigned char *
11187 display_mips_gnu_attribute (unsigned char * p, int tag)
11188 {
11189 int type;
11190 unsigned int len;
11191 int val;
11192
11193 if (tag == Tag_GNU_MIPS_ABI_FP)
11194 {
11195 val = read_uleb128 (p, &len);
11196 p += len;
11197 printf (" Tag_GNU_MIPS_ABI_FP: ");
11198
11199 switch (val)
11200 {
11201 case 0:
11202 printf (_("Hard or soft float\n"));
11203 break;
11204 case 1:
11205 printf (_("Hard float (double precision)\n"));
11206 break;
11207 case 2:
11208 printf (_("Hard float (single precision)\n"));
11209 break;
11210 case 3:
11211 printf (_("Soft float\n"));
11212 break;
11213 case 4:
11214 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11215 break;
11216 default:
11217 printf ("??? (%d)\n", val);
11218 break;
11219 }
11220 return p;
11221 }
11222
11223 if (tag & 1)
11224 type = 1; /* String. */
11225 else
11226 type = 2; /* uleb128. */
11227 printf (" Tag_unknown_%d: ", tag);
11228
11229 if (type == 1)
11230 {
11231 printf ("\"%s\"\n", p);
11232 p += strlen ((char *) p) + 1;
11233 }
11234 else
11235 {
11236 val = read_uleb128 (p, &len);
11237 p += len;
11238 printf ("%d (0x%x)\n", val, val);
11239 }
11240
11241 return p;
11242 }
11243
11244 static unsigned char *
11245 display_tic6x_attribute (unsigned char * p)
11246 {
11247 int tag;
11248 unsigned int len;
11249 int val;
11250
11251 tag = read_uleb128 (p, &len);
11252 p += len;
11253
11254 switch (tag)
11255 {
11256 case Tag_ISA:
11257 val = read_uleb128 (p, &len);
11258 p += len;
11259 printf (" Tag_ISA: ");
11260
11261 switch (val)
11262 {
11263 case C6XABI_Tag_ISA_none:
11264 printf (_("None\n"));
11265 break;
11266 case C6XABI_Tag_ISA_C62X:
11267 printf ("C62x\n");
11268 break;
11269 case C6XABI_Tag_ISA_C67X:
11270 printf ("C67x\n");
11271 break;
11272 case C6XABI_Tag_ISA_C67XP:
11273 printf ("C67x+\n");
11274 break;
11275 case C6XABI_Tag_ISA_C64X:
11276 printf ("C64x\n");
11277 break;
11278 case C6XABI_Tag_ISA_C64XP:
11279 printf ("C64x+\n");
11280 break;
11281 case C6XABI_Tag_ISA_C674X:
11282 printf ("C674x\n");
11283 break;
11284 default:
11285 printf ("??? (%d)\n", val);
11286 break;
11287 }
11288 return p;
11289
11290 case Tag_ABI_wchar_t:
11291 val = read_uleb128 (p, &len);
11292 p += len;
11293 printf (" Tag_ABI_wchar_t: ");
11294 switch (val)
11295 {
11296 case 0:
11297 printf (_("Not used\n"));
11298 break;
11299 case 1:
11300 printf (_("2 bytes\n"));
11301 break;
11302 case 2:
11303 printf (_("4 bytes\n"));
11304 break;
11305 default:
11306 printf ("??? (%d)\n", val);
11307 break;
11308 }
11309 return p;
11310
11311 case Tag_ABI_stack_align_needed:
11312 val = read_uleb128 (p, &len);
11313 p += len;
11314 printf (" Tag_ABI_stack_align_needed: ");
11315 switch (val)
11316 {
11317 case 0:
11318 printf (_("8-byte\n"));
11319 break;
11320 case 1:
11321 printf (_("16-byte\n"));
11322 break;
11323 default:
11324 printf ("??? (%d)\n", val);
11325 break;
11326 }
11327 return p;
11328
11329 case Tag_ABI_stack_align_preserved:
11330 val = read_uleb128 (p, &len);
11331 p += len;
11332 printf (" Tag_ABI_stack_align_preserved: ");
11333 switch (val)
11334 {
11335 case 0:
11336 printf (_("8-byte\n"));
11337 break;
11338 case 1:
11339 printf (_("16-byte\n"));
11340 break;
11341 default:
11342 printf ("??? (%d)\n", val);
11343 break;
11344 }
11345 return p;
11346
11347 case Tag_ABI_DSBT:
11348 val = read_uleb128 (p, &len);
11349 p += len;
11350 printf (" Tag_ABI_DSBT: ");
11351 switch (val)
11352 {
11353 case 0:
11354 printf (_("DSBT addressing not used\n"));
11355 break;
11356 case 1:
11357 printf (_("DSBT addressing used\n"));
11358 break;
11359 default:
11360 printf ("??? (%d)\n", val);
11361 break;
11362 }
11363 return p;
11364
11365 case Tag_ABI_PID:
11366 val = read_uleb128 (p, &len);
11367 p += len;
11368 printf (" Tag_ABI_PID: ");
11369 switch (val)
11370 {
11371 case 0:
11372 printf (_("Data addressing position-dependent\n"));
11373 break;
11374 case 1:
11375 printf (_("Data addressing position-independent, GOT near DP\n"));
11376 break;
11377 case 2:
11378 printf (_("Data addressing position-independent, GOT far from DP\n"));
11379 break;
11380 default:
11381 printf ("??? (%d)\n", val);
11382 break;
11383 }
11384 return p;
11385
11386 case Tag_ABI_PIC:
11387 val = read_uleb128 (p, &len);
11388 p += len;
11389 printf (" Tag_ABI_PIC: ");
11390 switch (val)
11391 {
11392 case 0:
11393 printf (_("Code addressing position-dependent\n"));
11394 break;
11395 case 1:
11396 printf (_("Code addressing position-independent\n"));
11397 break;
11398 default:
11399 printf ("??? (%d)\n", val);
11400 break;
11401 }
11402 return p;
11403
11404 case Tag_ABI_array_object_alignment:
11405 val = read_uleb128 (p, &len);
11406 p += len;
11407 printf (" Tag_ABI_array_object_alignment: ");
11408 switch (val)
11409 {
11410 case 0:
11411 printf (_("8-byte\n"));
11412 break;
11413 case 1:
11414 printf (_("4-byte\n"));
11415 break;
11416 case 2:
11417 printf (_("16-byte\n"));
11418 break;
11419 default:
11420 printf ("??? (%d)\n", val);
11421 break;
11422 }
11423 return p;
11424
11425 case Tag_ABI_array_object_align_expected:
11426 val = read_uleb128 (p, &len);
11427 p += len;
11428 printf (" Tag_ABI_array_object_align_expected: ");
11429 switch (val)
11430 {
11431 case 0:
11432 printf (_("8-byte\n"));
11433 break;
11434 case 1:
11435 printf (_("4-byte\n"));
11436 break;
11437 case 2:
11438 printf (_("16-byte\n"));
11439 break;
11440 default:
11441 printf ("??? (%d)\n", val);
11442 break;
11443 }
11444 return p;
11445
11446 case Tag_ABI_compatibility:
11447 val = read_uleb128 (p, &len);
11448 p += len;
11449 printf (" Tag_ABI_compatibility: ");
11450 printf (_("flag = %d, vendor = %s\n"), val, p);
11451 p += strlen ((char *) p) + 1;
11452 return p;
11453
11454 case Tag_ABI_conformance:
11455 printf (" Tag_ABI_conformance: ");
11456 printf ("\"%s\"\n", p);
11457 p += strlen ((char *) p) + 1;
11458 return p;
11459 }
11460
11461 printf (" Tag_unknown_%d: ", tag);
11462
11463 if (tag & 1)
11464 {
11465 printf ("\"%s\"\n", p);
11466 p += strlen ((char *) p) + 1;
11467 }
11468 else
11469 {
11470 val = read_uleb128 (p, &len);
11471 p += len;
11472 printf ("%d (0x%x)\n", val, val);
11473 }
11474
11475 return p;
11476 }
11477
11478 static int
11479 process_attributes (FILE * file,
11480 const char * public_name,
11481 unsigned int proc_type,
11482 unsigned char * (* display_pub_attribute) (unsigned char *),
11483 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11484 {
11485 Elf_Internal_Shdr * sect;
11486 unsigned char * contents;
11487 unsigned char * p;
11488 unsigned char * end;
11489 bfd_vma section_len;
11490 bfd_vma len;
11491 unsigned i;
11492
11493 /* Find the section header so that we get the size. */
11494 for (i = 0, sect = section_headers;
11495 i < elf_header.e_shnum;
11496 i++, sect++)
11497 {
11498 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11499 continue;
11500
11501 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11502 sect->sh_size, _("attributes"));
11503 if (contents == NULL)
11504 continue;
11505
11506 p = contents;
11507 if (*p == 'A')
11508 {
11509 len = sect->sh_size - 1;
11510 p++;
11511
11512 while (len > 0)
11513 {
11514 int namelen;
11515 bfd_boolean public_section;
11516 bfd_boolean gnu_section;
11517
11518 section_len = byte_get (p, 4);
11519 p += 4;
11520
11521 if (section_len > len)
11522 {
11523 printf (_("ERROR: Bad section length (%d > %d)\n"),
11524 (int) section_len, (int) len);
11525 section_len = len;
11526 }
11527
11528 len -= section_len;
11529 printf (_("Attribute Section: %s\n"), p);
11530
11531 if (public_name && streq ((char *) p, public_name))
11532 public_section = TRUE;
11533 else
11534 public_section = FALSE;
11535
11536 if (streq ((char *) p, "gnu"))
11537 gnu_section = TRUE;
11538 else
11539 gnu_section = FALSE;
11540
11541 namelen = strlen ((char *) p) + 1;
11542 p += namelen;
11543 section_len -= namelen + 4;
11544
11545 while (section_len > 0)
11546 {
11547 int tag = *(p++);
11548 int val;
11549 bfd_vma size;
11550
11551 size = byte_get (p, 4);
11552 if (size > section_len)
11553 {
11554 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11555 (int) size, (int) section_len);
11556 size = section_len;
11557 }
11558
11559 section_len -= size;
11560 end = p + size - 1;
11561 p += 4;
11562
11563 switch (tag)
11564 {
11565 case 1:
11566 printf (_("File Attributes\n"));
11567 break;
11568 case 2:
11569 printf (_("Section Attributes:"));
11570 goto do_numlist;
11571 case 3:
11572 printf (_("Symbol Attributes:"));
11573 do_numlist:
11574 for (;;)
11575 {
11576 unsigned int j;
11577
11578 val = read_uleb128 (p, &j);
11579 p += j;
11580 if (val == 0)
11581 break;
11582 printf (" %d", val);
11583 }
11584 printf ("\n");
11585 break;
11586 default:
11587 printf (_("Unknown tag: %d\n"), tag);
11588 public_section = FALSE;
11589 break;
11590 }
11591
11592 if (public_section)
11593 {
11594 while (p < end)
11595 p = display_pub_attribute (p);
11596 }
11597 else if (gnu_section)
11598 {
11599 while (p < end)
11600 p = display_gnu_attribute (p,
11601 display_proc_gnu_attribute);
11602 }
11603 else
11604 {
11605 /* ??? Do something sensible, like dump hex. */
11606 printf (_(" Unknown section contexts\n"));
11607 p = end;
11608 }
11609 }
11610 }
11611 }
11612 else
11613 printf (_("Unknown format '%c'\n"), *p);
11614
11615 free (contents);
11616 }
11617 return 1;
11618 }
11619
11620 static int
11621 process_arm_specific (FILE * file)
11622 {
11623 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
11624 display_arm_attribute, NULL);
11625 }
11626
11627 static int
11628 process_power_specific (FILE * file)
11629 {
11630 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11631 display_power_gnu_attribute);
11632 }
11633
11634 static int
11635 process_sparc_specific (FILE * file)
11636 {
11637 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11638 display_sparc_gnu_attribute);
11639 }
11640
11641 static int
11642 process_tic6x_specific (FILE * file)
11643 {
11644 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11645 display_tic6x_attribute, NULL);
11646 }
11647
11648 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11649 Print the Address, Access and Initial fields of an entry at VMA ADDR
11650 and return the VMA of the next entry. */
11651
11652 static bfd_vma
11653 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11654 {
11655 printf (" ");
11656 print_vma (addr, LONG_HEX);
11657 printf (" ");
11658 if (addr < pltgot + 0xfff0)
11659 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11660 else
11661 printf ("%10s", "");
11662 printf (" ");
11663 if (data == NULL)
11664 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11665 else
11666 {
11667 bfd_vma entry;
11668
11669 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11670 print_vma (entry, LONG_HEX);
11671 }
11672 return addr + (is_32bit_elf ? 4 : 8);
11673 }
11674
11675 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11676 PLTGOT. Print the Address and Initial fields of an entry at VMA
11677 ADDR and return the VMA of the next entry. */
11678
11679 static bfd_vma
11680 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11681 {
11682 printf (" ");
11683 print_vma (addr, LONG_HEX);
11684 printf (" ");
11685 if (data == NULL)
11686 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11687 else
11688 {
11689 bfd_vma entry;
11690
11691 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11692 print_vma (entry, LONG_HEX);
11693 }
11694 return addr + (is_32bit_elf ? 4 : 8);
11695 }
11696
11697 static int
11698 process_mips_specific (FILE * file)
11699 {
11700 Elf_Internal_Dyn * entry;
11701 size_t liblist_offset = 0;
11702 size_t liblistno = 0;
11703 size_t conflictsno = 0;
11704 size_t options_offset = 0;
11705 size_t conflicts_offset = 0;
11706 size_t pltrelsz = 0;
11707 size_t pltrel = 0;
11708 bfd_vma pltgot = 0;
11709 bfd_vma mips_pltgot = 0;
11710 bfd_vma jmprel = 0;
11711 bfd_vma local_gotno = 0;
11712 bfd_vma gotsym = 0;
11713 bfd_vma symtabno = 0;
11714
11715 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11716 display_mips_gnu_attribute);
11717
11718 /* We have a lot of special sections. Thanks SGI! */
11719 if (dynamic_section == NULL)
11720 /* No information available. */
11721 return 0;
11722
11723 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11724 switch (entry->d_tag)
11725 {
11726 case DT_MIPS_LIBLIST:
11727 liblist_offset
11728 = offset_from_vma (file, entry->d_un.d_val,
11729 liblistno * sizeof (Elf32_External_Lib));
11730 break;
11731 case DT_MIPS_LIBLISTNO:
11732 liblistno = entry->d_un.d_val;
11733 break;
11734 case DT_MIPS_OPTIONS:
11735 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11736 break;
11737 case DT_MIPS_CONFLICT:
11738 conflicts_offset
11739 = offset_from_vma (file, entry->d_un.d_val,
11740 conflictsno * sizeof (Elf32_External_Conflict));
11741 break;
11742 case DT_MIPS_CONFLICTNO:
11743 conflictsno = entry->d_un.d_val;
11744 break;
11745 case DT_PLTGOT:
11746 pltgot = entry->d_un.d_ptr;
11747 break;
11748 case DT_MIPS_LOCAL_GOTNO:
11749 local_gotno = entry->d_un.d_val;
11750 break;
11751 case DT_MIPS_GOTSYM:
11752 gotsym = entry->d_un.d_val;
11753 break;
11754 case DT_MIPS_SYMTABNO:
11755 symtabno = entry->d_un.d_val;
11756 break;
11757 case DT_MIPS_PLTGOT:
11758 mips_pltgot = entry->d_un.d_ptr;
11759 break;
11760 case DT_PLTREL:
11761 pltrel = entry->d_un.d_val;
11762 break;
11763 case DT_PLTRELSZ:
11764 pltrelsz = entry->d_un.d_val;
11765 break;
11766 case DT_JMPREL:
11767 jmprel = entry->d_un.d_ptr;
11768 break;
11769 default:
11770 break;
11771 }
11772
11773 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11774 {
11775 Elf32_External_Lib * elib;
11776 size_t cnt;
11777
11778 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
11779 liblistno,
11780 sizeof (Elf32_External_Lib),
11781 _("liblist"));
11782 if (elib)
11783 {
11784 printf (_("\nSection '.liblist' contains %lu entries:\n"),
11785 (unsigned long) liblistno);
11786 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
11787 stdout);
11788
11789 for (cnt = 0; cnt < liblistno; ++cnt)
11790 {
11791 Elf32_Lib liblist;
11792 time_t atime;
11793 char timebuf[20];
11794 struct tm * tmp;
11795
11796 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11797 atime = BYTE_GET (elib[cnt].l_time_stamp);
11798 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11799 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11800 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11801
11802 tmp = gmtime (&atime);
11803 snprintf (timebuf, sizeof (timebuf),
11804 "%04u-%02u-%02uT%02u:%02u:%02u",
11805 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11806 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11807
11808 printf ("%3lu: ", (unsigned long) cnt);
11809 if (VALID_DYNAMIC_NAME (liblist.l_name))
11810 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11811 else
11812 printf (_("<corrupt: %9ld>"), liblist.l_name);
11813 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11814 liblist.l_version);
11815
11816 if (liblist.l_flags == 0)
11817 puts (_(" NONE"));
11818 else
11819 {
11820 static const struct
11821 {
11822 const char * name;
11823 int bit;
11824 }
11825 l_flags_vals[] =
11826 {
11827 { " EXACT_MATCH", LL_EXACT_MATCH },
11828 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11829 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11830 { " EXPORTS", LL_EXPORTS },
11831 { " DELAY_LOAD", LL_DELAY_LOAD },
11832 { " DELTA", LL_DELTA }
11833 };
11834 int flags = liblist.l_flags;
11835 size_t fcnt;
11836
11837 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
11838 if ((flags & l_flags_vals[fcnt].bit) != 0)
11839 {
11840 fputs (l_flags_vals[fcnt].name, stdout);
11841 flags ^= l_flags_vals[fcnt].bit;
11842 }
11843 if (flags != 0)
11844 printf (" %#x", (unsigned int) flags);
11845
11846 puts ("");
11847 }
11848 }
11849
11850 free (elib);
11851 }
11852 }
11853
11854 if (options_offset != 0)
11855 {
11856 Elf_External_Options * eopt;
11857 Elf_Internal_Shdr * sect = section_headers;
11858 Elf_Internal_Options * iopt;
11859 Elf_Internal_Options * option;
11860 size_t offset;
11861 int cnt;
11862
11863 /* Find the section header so that we get the size. */
11864 while (sect->sh_type != SHT_MIPS_OPTIONS)
11865 ++sect;
11866
11867 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
11868 sect->sh_size, _("options"));
11869 if (eopt)
11870 {
11871 iopt = (Elf_Internal_Options *)
11872 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
11873 if (iopt == NULL)
11874 {
11875 error (_("Out of memory\n"));
11876 return 0;
11877 }
11878
11879 offset = cnt = 0;
11880 option = iopt;
11881
11882 while (offset < sect->sh_size)
11883 {
11884 Elf_External_Options * eoption;
11885
11886 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11887
11888 option->kind = BYTE_GET (eoption->kind);
11889 option->size = BYTE_GET (eoption->size);
11890 option->section = BYTE_GET (eoption->section);
11891 option->info = BYTE_GET (eoption->info);
11892
11893 offset += option->size;
11894
11895 ++option;
11896 ++cnt;
11897 }
11898
11899 printf (_("\nSection '%s' contains %d entries:\n"),
11900 SECTION_NAME (sect), cnt);
11901
11902 option = iopt;
11903
11904 while (cnt-- > 0)
11905 {
11906 size_t len;
11907
11908 switch (option->kind)
11909 {
11910 case ODK_NULL:
11911 /* This shouldn't happen. */
11912 printf (" NULL %d %lx", option->section, option->info);
11913 break;
11914 case ODK_REGINFO:
11915 printf (" REGINFO ");
11916 if (elf_header.e_machine == EM_MIPS)
11917 {
11918 /* 32bit form. */
11919 Elf32_External_RegInfo * ereg;
11920 Elf32_RegInfo reginfo;
11921
11922 ereg = (Elf32_External_RegInfo *) (option + 1);
11923 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11924 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11925 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11926 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11927 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11928 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11929
11930 printf ("GPR %08lx GP 0x%lx\n",
11931 reginfo.ri_gprmask,
11932 (unsigned long) reginfo.ri_gp_value);
11933 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11934 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11935 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11936 }
11937 else
11938 {
11939 /* 64 bit form. */
11940 Elf64_External_RegInfo * ereg;
11941 Elf64_Internal_RegInfo reginfo;
11942
11943 ereg = (Elf64_External_RegInfo *) (option + 1);
11944 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11945 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11946 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11947 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11948 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11949 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11950
11951 printf ("GPR %08lx GP 0x",
11952 reginfo.ri_gprmask);
11953 printf_vma (reginfo.ri_gp_value);
11954 printf ("\n");
11955
11956 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11957 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11958 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11959 }
11960 ++option;
11961 continue;
11962 case ODK_EXCEPTIONS:
11963 fputs (" EXCEPTIONS fpe_min(", stdout);
11964 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11965 fputs (") fpe_max(", stdout);
11966 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11967 fputs (")", stdout);
11968
11969 if (option->info & OEX_PAGE0)
11970 fputs (" PAGE0", stdout);
11971 if (option->info & OEX_SMM)
11972 fputs (" SMM", stdout);
11973 if (option->info & OEX_FPDBUG)
11974 fputs (" FPDBUG", stdout);
11975 if (option->info & OEX_DISMISS)
11976 fputs (" DISMISS", stdout);
11977 break;
11978 case ODK_PAD:
11979 fputs (" PAD ", stdout);
11980 if (option->info & OPAD_PREFIX)
11981 fputs (" PREFIX", stdout);
11982 if (option->info & OPAD_POSTFIX)
11983 fputs (" POSTFIX", stdout);
11984 if (option->info & OPAD_SYMBOL)
11985 fputs (" SYMBOL", stdout);
11986 break;
11987 case ODK_HWPATCH:
11988 fputs (" HWPATCH ", stdout);
11989 if (option->info & OHW_R4KEOP)
11990 fputs (" R4KEOP", stdout);
11991 if (option->info & OHW_R8KPFETCH)
11992 fputs (" R8KPFETCH", stdout);
11993 if (option->info & OHW_R5KEOP)
11994 fputs (" R5KEOP", stdout);
11995 if (option->info & OHW_R5KCVTL)
11996 fputs (" R5KCVTL", stdout);
11997 break;
11998 case ODK_FILL:
11999 fputs (" FILL ", stdout);
12000 /* XXX Print content of info word? */
12001 break;
12002 case ODK_TAGS:
12003 fputs (" TAGS ", stdout);
12004 /* XXX Print content of info word? */
12005 break;
12006 case ODK_HWAND:
12007 fputs (" HWAND ", stdout);
12008 if (option->info & OHWA0_R4KEOP_CHECKED)
12009 fputs (" R4KEOP_CHECKED", stdout);
12010 if (option->info & OHWA0_R4KEOP_CLEAN)
12011 fputs (" R4KEOP_CLEAN", stdout);
12012 break;
12013 case ODK_HWOR:
12014 fputs (" HWOR ", stdout);
12015 if (option->info & OHWA0_R4KEOP_CHECKED)
12016 fputs (" R4KEOP_CHECKED", stdout);
12017 if (option->info & OHWA0_R4KEOP_CLEAN)
12018 fputs (" R4KEOP_CLEAN", stdout);
12019 break;
12020 case ODK_GP_GROUP:
12021 printf (" GP_GROUP %#06lx self-contained %#06lx",
12022 option->info & OGP_GROUP,
12023 (option->info & OGP_SELF) >> 16);
12024 break;
12025 case ODK_IDENT:
12026 printf (" IDENT %#06lx self-contained %#06lx",
12027 option->info & OGP_GROUP,
12028 (option->info & OGP_SELF) >> 16);
12029 break;
12030 default:
12031 /* This shouldn't happen. */
12032 printf (" %3d ??? %d %lx",
12033 option->kind, option->section, option->info);
12034 break;
12035 }
12036
12037 len = sizeof (* eopt);
12038 while (len < option->size)
12039 if (((char *) option)[len] >= ' '
12040 && ((char *) option)[len] < 0x7f)
12041 printf ("%c", ((char *) option)[len++]);
12042 else
12043 printf ("\\%03o", ((char *) option)[len++]);
12044
12045 fputs ("\n", stdout);
12046 ++option;
12047 }
12048
12049 free (eopt);
12050 }
12051 }
12052
12053 if (conflicts_offset != 0 && conflictsno != 0)
12054 {
12055 Elf32_Conflict * iconf;
12056 size_t cnt;
12057
12058 if (dynamic_symbols == NULL)
12059 {
12060 error (_("conflict list found without a dynamic symbol table\n"));
12061 return 0;
12062 }
12063
12064 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
12065 if (iconf == NULL)
12066 {
12067 error (_("Out of memory\n"));
12068 return 0;
12069 }
12070
12071 if (is_32bit_elf)
12072 {
12073 Elf32_External_Conflict * econf32;
12074
12075 econf32 = (Elf32_External_Conflict *)
12076 get_data (NULL, file, conflicts_offset, conflictsno,
12077 sizeof (* econf32), _("conflict"));
12078 if (!econf32)
12079 return 0;
12080
12081 for (cnt = 0; cnt < conflictsno; ++cnt)
12082 iconf[cnt] = BYTE_GET (econf32[cnt]);
12083
12084 free (econf32);
12085 }
12086 else
12087 {
12088 Elf64_External_Conflict * econf64;
12089
12090 econf64 = (Elf64_External_Conflict *)
12091 get_data (NULL, file, conflicts_offset, conflictsno,
12092 sizeof (* econf64), _("conflict"));
12093 if (!econf64)
12094 return 0;
12095
12096 for (cnt = 0; cnt < conflictsno; ++cnt)
12097 iconf[cnt] = BYTE_GET (econf64[cnt]);
12098
12099 free (econf64);
12100 }
12101
12102 printf (_("\nSection '.conflict' contains %lu entries:\n"),
12103 (unsigned long) conflictsno);
12104 puts (_(" Num: Index Value Name"));
12105
12106 for (cnt = 0; cnt < conflictsno; ++cnt)
12107 {
12108 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
12109
12110 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
12111 print_vma (psym->st_value, FULL_HEX);
12112 putchar (' ');
12113 if (VALID_DYNAMIC_NAME (psym->st_name))
12114 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
12115 else
12116 printf (_("<corrupt: %14ld>"), psym->st_name);
12117 putchar ('\n');
12118 }
12119
12120 free (iconf);
12121 }
12122
12123 if (pltgot != 0 && local_gotno != 0)
12124 {
12125 bfd_vma ent, local_end, global_end;
12126 size_t i, offset;
12127 unsigned char * data;
12128 int addr_size;
12129
12130 ent = pltgot;
12131 addr_size = (is_32bit_elf ? 4 : 8);
12132 local_end = pltgot + local_gotno * addr_size;
12133 global_end = local_end + (symtabno - gotsym) * addr_size;
12134
12135 offset = offset_from_vma (file, pltgot, global_end - pltgot);
12136 data = (unsigned char *) get_data (NULL, file, offset,
12137 global_end - pltgot, 1, _("GOT"));
12138 if (data == NULL)
12139 return 0;
12140
12141 printf (_("\nPrimary GOT:\n"));
12142 printf (_(" Canonical gp value: "));
12143 print_vma (pltgot + 0x7ff0, LONG_HEX);
12144 printf ("\n\n");
12145
12146 printf (_(" Reserved entries:\n"));
12147 printf (_(" %*s %10s %*s Purpose\n"),
12148 addr_size * 2, _("Address"), _("Access"),
12149 addr_size * 2, _("Initial"));
12150 ent = print_mips_got_entry (data, pltgot, ent);
12151 printf (_(" Lazy resolver\n"));
12152 if (data
12153 && (byte_get (data + ent - pltgot, addr_size)
12154 >> (addr_size * 8 - 1)) != 0)
12155 {
12156 ent = print_mips_got_entry (data, pltgot, ent);
12157 printf (_(" Module pointer (GNU extension)\n"));
12158 }
12159 printf ("\n");
12160
12161 if (ent < local_end)
12162 {
12163 printf (_(" Local entries:\n"));
12164 printf (" %*s %10s %*s\n",
12165 addr_size * 2, _("Address"), _("Access"),
12166 addr_size * 2, _("Initial"));
12167 while (ent < local_end)
12168 {
12169 ent = print_mips_got_entry (data, pltgot, ent);
12170 printf ("\n");
12171 }
12172 printf ("\n");
12173 }
12174
12175 if (gotsym < symtabno)
12176 {
12177 int sym_width;
12178
12179 printf (_(" Global entries:\n"));
12180 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
12181 addr_size * 2, _("Address"), _("Access"),
12182 addr_size * 2, _("Initial"),
12183 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12184 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12185 for (i = gotsym; i < symtabno; i++)
12186 {
12187 Elf_Internal_Sym * psym;
12188
12189 psym = dynamic_symbols + i;
12190 ent = print_mips_got_entry (data, pltgot, ent);
12191 printf (" ");
12192 print_vma (psym->st_value, LONG_HEX);
12193 printf (" %-7s %3s ",
12194 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12195 get_symbol_index_type (psym->st_shndx));
12196 if (VALID_DYNAMIC_NAME (psym->st_name))
12197 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12198 else
12199 printf (_("<corrupt: %14ld>"), psym->st_name);
12200 printf ("\n");
12201 }
12202 printf ("\n");
12203 }
12204
12205 if (data)
12206 free (data);
12207 }
12208
12209 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12210 {
12211 bfd_vma ent, end;
12212 size_t offset, rel_offset;
12213 unsigned long count, i;
12214 unsigned char * data;
12215 int addr_size, sym_width;
12216 Elf_Internal_Rela * rels;
12217
12218 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12219 if (pltrel == DT_RELA)
12220 {
12221 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12222 return 0;
12223 }
12224 else
12225 {
12226 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12227 return 0;
12228 }
12229
12230 ent = mips_pltgot;
12231 addr_size = (is_32bit_elf ? 4 : 8);
12232 end = mips_pltgot + (2 + count) * addr_size;
12233
12234 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12235 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12236 1, _("PLT GOT"));
12237 if (data == NULL)
12238 return 0;
12239
12240 printf (_("\nPLT GOT:\n\n"));
12241 printf (_(" Reserved entries:\n"));
12242 printf (_(" %*s %*s Purpose\n"),
12243 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12244 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12245 printf (_(" PLT lazy resolver\n"));
12246 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12247 printf (_(" Module pointer\n"));
12248 printf ("\n");
12249
12250 printf (_(" Entries:\n"));
12251 printf (" %*s %*s %*s %-7s %3s %s\n",
12252 addr_size * 2, _("Address"),
12253 addr_size * 2, _("Initial"),
12254 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12255 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12256 for (i = 0; i < count; i++)
12257 {
12258 Elf_Internal_Sym * psym;
12259
12260 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12261 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12262 printf (" ");
12263 print_vma (psym->st_value, LONG_HEX);
12264 printf (" %-7s %3s ",
12265 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12266 get_symbol_index_type (psym->st_shndx));
12267 if (VALID_DYNAMIC_NAME (psym->st_name))
12268 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12269 else
12270 printf (_("<corrupt: %14ld>"), psym->st_name);
12271 printf ("\n");
12272 }
12273 printf ("\n");
12274
12275 if (data)
12276 free (data);
12277 free (rels);
12278 }
12279
12280 return 1;
12281 }
12282
12283 static int
12284 process_gnu_liblist (FILE * file)
12285 {
12286 Elf_Internal_Shdr * section;
12287 Elf_Internal_Shdr * string_sec;
12288 Elf32_External_Lib * elib;
12289 char * strtab;
12290 size_t strtab_size;
12291 size_t cnt;
12292 unsigned i;
12293
12294 if (! do_arch)
12295 return 0;
12296
12297 for (i = 0, section = section_headers;
12298 i < elf_header.e_shnum;
12299 i++, section++)
12300 {
12301 switch (section->sh_type)
12302 {
12303 case SHT_GNU_LIBLIST:
12304 if (section->sh_link >= elf_header.e_shnum)
12305 break;
12306
12307 elib = (Elf32_External_Lib *)
12308 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12309 _("liblist"));
12310
12311 if (elib == NULL)
12312 break;
12313 string_sec = section_headers + section->sh_link;
12314
12315 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12316 string_sec->sh_size,
12317 _("liblist string table"));
12318 if (strtab == NULL
12319 || section->sh_entsize != sizeof (Elf32_External_Lib))
12320 {
12321 free (elib);
12322 free (strtab);
12323 break;
12324 }
12325 strtab_size = string_sec->sh_size;
12326
12327 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
12328 SECTION_NAME (section),
12329 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
12330
12331 puts (_(" Library Time Stamp Checksum Version Flags"));
12332
12333 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
12334 ++cnt)
12335 {
12336 Elf32_Lib liblist;
12337 time_t atime;
12338 char timebuf[20];
12339 struct tm * tmp;
12340
12341 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12342 atime = BYTE_GET (elib[cnt].l_time_stamp);
12343 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12344 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12345 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12346
12347 tmp = gmtime (&atime);
12348 snprintf (timebuf, sizeof (timebuf),
12349 "%04u-%02u-%02uT%02u:%02u:%02u",
12350 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12351 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12352
12353 printf ("%3lu: ", (unsigned long) cnt);
12354 if (do_wide)
12355 printf ("%-20s", liblist.l_name < strtab_size
12356 ? strtab + liblist.l_name : _("<corrupt>"));
12357 else
12358 printf ("%-20.20s", liblist.l_name < strtab_size
12359 ? strtab + liblist.l_name : _("<corrupt>"));
12360 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
12361 liblist.l_version, liblist.l_flags);
12362 }
12363
12364 free (elib);
12365 free (strtab);
12366 }
12367 }
12368
12369 return 1;
12370 }
12371
12372 static const char *
12373 get_note_type (unsigned e_type)
12374 {
12375 static char buff[64];
12376
12377 if (elf_header.e_type == ET_CORE)
12378 switch (e_type)
12379 {
12380 case NT_AUXV:
12381 return _("NT_AUXV (auxiliary vector)");
12382 case NT_PRSTATUS:
12383 return _("NT_PRSTATUS (prstatus structure)");
12384 case NT_FPREGSET:
12385 return _("NT_FPREGSET (floating point registers)");
12386 case NT_PRPSINFO:
12387 return _("NT_PRPSINFO (prpsinfo structure)");
12388 case NT_TASKSTRUCT:
12389 return _("NT_TASKSTRUCT (task structure)");
12390 case NT_PRXFPREG:
12391 return _("NT_PRXFPREG (user_xfpregs structure)");
12392 case NT_PPC_VMX:
12393 return _("NT_PPC_VMX (ppc Altivec registers)");
12394 case NT_PPC_VSX:
12395 return _("NT_PPC_VSX (ppc VSX registers)");
12396 case NT_X86_XSTATE:
12397 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
12398 case NT_S390_HIGH_GPRS:
12399 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
12400 case NT_S390_TIMER:
12401 return _("NT_S390_TIMER (s390 timer register)");
12402 case NT_S390_TODCMP:
12403 return _("NT_S390_TODCMP (s390 TOD comparator register)");
12404 case NT_S390_TODPREG:
12405 return _("NT_S390_TODPREG (s390 TOD programmable register)");
12406 case NT_S390_CTRS:
12407 return _("NT_S390_CTRS (s390 control registers)");
12408 case NT_S390_PREFIX:
12409 return _("NT_S390_PREFIX (s390 prefix register)");
12410 case NT_ARM_VFP:
12411 return _("NT_ARM_VFP (arm VFP registers)");
12412 case NT_PSTATUS:
12413 return _("NT_PSTATUS (pstatus structure)");
12414 case NT_FPREGS:
12415 return _("NT_FPREGS (floating point registers)");
12416 case NT_PSINFO:
12417 return _("NT_PSINFO (psinfo structure)");
12418 case NT_LWPSTATUS:
12419 return _("NT_LWPSTATUS (lwpstatus_t structure)");
12420 case NT_LWPSINFO:
12421 return _("NT_LWPSINFO (lwpsinfo_t structure)");
12422 case NT_WIN32PSTATUS:
12423 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
12424 default:
12425 break;
12426 }
12427 else
12428 switch (e_type)
12429 {
12430 case NT_VERSION:
12431 return _("NT_VERSION (version)");
12432 case NT_ARCH:
12433 return _("NT_ARCH (architecture)");
12434 default:
12435 break;
12436 }
12437
12438 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12439 return buff;
12440 }
12441
12442 static const char *
12443 get_gnu_elf_note_type (unsigned e_type)
12444 {
12445 static char buff[64];
12446
12447 switch (e_type)
12448 {
12449 case NT_GNU_ABI_TAG:
12450 return _("NT_GNU_ABI_TAG (ABI version tag)");
12451 case NT_GNU_HWCAP:
12452 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
12453 case NT_GNU_BUILD_ID:
12454 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
12455 case NT_GNU_GOLD_VERSION:
12456 return _("NT_GNU_GOLD_VERSION (gold version)");
12457 default:
12458 break;
12459 }
12460
12461 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12462 return buff;
12463 }
12464
12465 static int
12466 print_gnu_note (Elf_Internal_Note *pnote)
12467 {
12468 switch (pnote->type)
12469 {
12470 case NT_GNU_BUILD_ID:
12471 {
12472 unsigned long i;
12473
12474 printf (_(" Build ID: "));
12475 for (i = 0; i < pnote->descsz; ++i)
12476 printf ("%02x", pnote->descdata[i] & 0xff);
12477 printf (_("\n"));
12478 }
12479 break;
12480
12481 case NT_GNU_ABI_TAG:
12482 {
12483 unsigned long os, major, minor, subminor;
12484 const char *osname;
12485
12486 os = byte_get ((unsigned char *) pnote->descdata, 4);
12487 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
12488 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
12489 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
12490
12491 switch (os)
12492 {
12493 case GNU_ABI_TAG_LINUX:
12494 osname = "Linux";
12495 break;
12496 case GNU_ABI_TAG_HURD:
12497 osname = "Hurd";
12498 break;
12499 case GNU_ABI_TAG_SOLARIS:
12500 osname = "Solaris";
12501 break;
12502 case GNU_ABI_TAG_FREEBSD:
12503 osname = "FreeBSD";
12504 break;
12505 case GNU_ABI_TAG_NETBSD:
12506 osname = "NetBSD";
12507 break;
12508 default:
12509 osname = "Unknown";
12510 break;
12511 }
12512
12513 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
12514 major, minor, subminor);
12515 }
12516 break;
12517 }
12518
12519 return 1;
12520 }
12521
12522 static const char *
12523 get_netbsd_elfcore_note_type (unsigned e_type)
12524 {
12525 static char buff[64];
12526
12527 if (e_type == NT_NETBSDCORE_PROCINFO)
12528 {
12529 /* NetBSD core "procinfo" structure. */
12530 return _("NetBSD procinfo structure");
12531 }
12532
12533 /* As of Jan 2002 there are no other machine-independent notes
12534 defined for NetBSD core files. If the note type is less
12535 than the start of the machine-dependent note types, we don't
12536 understand it. */
12537
12538 if (e_type < NT_NETBSDCORE_FIRSTMACH)
12539 {
12540 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12541 return buff;
12542 }
12543
12544 switch (elf_header.e_machine)
12545 {
12546 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
12547 and PT_GETFPREGS == mach+2. */
12548
12549 case EM_OLD_ALPHA:
12550 case EM_ALPHA:
12551 case EM_SPARC:
12552 case EM_SPARC32PLUS:
12553 case EM_SPARCV9:
12554 switch (e_type)
12555 {
12556 case NT_NETBSDCORE_FIRSTMACH + 0:
12557 return _("PT_GETREGS (reg structure)");
12558 case NT_NETBSDCORE_FIRSTMACH + 2:
12559 return _("PT_GETFPREGS (fpreg structure)");
12560 default:
12561 break;
12562 }
12563 break;
12564
12565 /* On all other arch's, PT_GETREGS == mach+1 and
12566 PT_GETFPREGS == mach+3. */
12567 default:
12568 switch (e_type)
12569 {
12570 case NT_NETBSDCORE_FIRSTMACH + 1:
12571 return _("PT_GETREGS (reg structure)");
12572 case NT_NETBSDCORE_FIRSTMACH + 3:
12573 return _("PT_GETFPREGS (fpreg structure)");
12574 default:
12575 break;
12576 }
12577 }
12578
12579 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
12580 e_type - NT_NETBSDCORE_FIRSTMACH);
12581 return buff;
12582 }
12583
12584 static const char *
12585 get_stapsdt_note_type (unsigned e_type)
12586 {
12587 static char buff[64];
12588
12589 switch (e_type)
12590 {
12591 case NT_STAPSDT:
12592 return _("NT_STAPSDT (SystemTap probe descriptors)");
12593
12594 default:
12595 break;
12596 }
12597
12598 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12599 return buff;
12600 }
12601
12602 static int
12603 print_stapsdt_note (Elf_Internal_Note *pnote)
12604 {
12605 int addr_size = is_32bit_elf ? 4 : 8;
12606 char *data = pnote->descdata;
12607 char *data_end = pnote->descdata + pnote->descsz;
12608 bfd_vma pc, base_addr, semaphore;
12609 char *provider, *probe, *arg_fmt;
12610
12611 pc = byte_get ((unsigned char *) data, addr_size);
12612 data += addr_size;
12613 base_addr = byte_get ((unsigned char *) data, addr_size);
12614 data += addr_size;
12615 semaphore = byte_get ((unsigned char *) data, addr_size);
12616 data += addr_size;
12617
12618 provider = data;
12619 data += strlen (data) + 1;
12620 probe = data;
12621 data += strlen (data) + 1;
12622 arg_fmt = data;
12623 data += strlen (data) + 1;
12624
12625 printf (_(" Provider: %s\n"), provider);
12626 printf (_(" Name: %s\n"), probe);
12627 printf (_(" Location: "));
12628 print_vma (pc, FULL_HEX);
12629 printf (_(", Base: "));
12630 print_vma (base_addr, FULL_HEX);
12631 printf (_(", Semaphore: "));
12632 print_vma (semaphore, FULL_HEX);
12633 printf (_("\n"));
12634 printf (_(" Arguments: %s\n"), arg_fmt);
12635
12636 return data == data_end;
12637 }
12638
12639 static const char *
12640 get_ia64_vms_note_type (unsigned e_type)
12641 {
12642 static char buff[64];
12643
12644 switch (e_type)
12645 {
12646 case NT_VMS_MHD:
12647 return _("NT_VMS_MHD (module header)");
12648 case NT_VMS_LNM:
12649 return _("NT_VMS_LNM (language name)");
12650 case NT_VMS_SRC:
12651 return _("NT_VMS_SRC (source files)");
12652 case NT_VMS_TITLE:
12653 return _("NT_VMS_TITLE");
12654 case NT_VMS_EIDC:
12655 return _("NT_VMS_EIDC (consistency check)");
12656 case NT_VMS_FPMODE:
12657 return _("NT_VMS_FPMODE (FP mode)");
12658 case NT_VMS_LINKTIME:
12659 return _("NT_VMS_LINKTIME");
12660 case NT_VMS_IMGNAM:
12661 return _("NT_VMS_IMGNAM (image name)");
12662 case NT_VMS_IMGID:
12663 return _("NT_VMS_IMGID (image id)");
12664 case NT_VMS_LINKID:
12665 return _("NT_VMS_LINKID (link id)");
12666 case NT_VMS_IMGBID:
12667 return _("NT_VMS_IMGBID (build id)");
12668 case NT_VMS_GSTNAM:
12669 return _("NT_VMS_GSTNAM (sym table name)");
12670 case NT_VMS_ORIG_DYN:
12671 return _("NT_VMS_ORIG_DYN");
12672 case NT_VMS_PATCHTIME:
12673 return _("NT_VMS_PATCHTIME");
12674 default:
12675 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12676 return buff;
12677 }
12678 }
12679
12680 static int
12681 print_ia64_vms_note (Elf_Internal_Note * pnote)
12682 {
12683 switch (pnote->type)
12684 {
12685 case NT_VMS_MHD:
12686 if (pnote->descsz > 36)
12687 {
12688 size_t l = strlen (pnote->descdata + 34);
12689 printf (_(" Creation date : %.17s\n"), pnote->descdata);
12690 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
12691 printf (_(" Module name : %s\n"), pnote->descdata + 34);
12692 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
12693 }
12694 else
12695 printf (_(" Invalid size\n"));
12696 break;
12697 case NT_VMS_LNM:
12698 printf (_(" Language: %s\n"), pnote->descdata);
12699 break;
12700 #ifdef BFD64
12701 case NT_VMS_FPMODE:
12702 printf (_(" FP mode: "));
12703 printf ("0x%016" BFD_VMA_FMT "x\n",
12704 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
12705 break;
12706 case NT_VMS_LINKTIME:
12707 printf (_(" Link time: "));
12708 print_vms_time
12709 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
12710 printf ("\n");
12711 break;
12712 case NT_VMS_PATCHTIME:
12713 printf (_(" Patch time: "));
12714 print_vms_time
12715 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
12716 printf ("\n");
12717 break;
12718 case NT_VMS_ORIG_DYN:
12719 printf (_(" Major id: %u, minor id: %u\n"),
12720 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
12721 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
12722 printf (_(" Manip date : "));
12723 print_vms_time
12724 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
12725 printf (_("\n"
12726 " Link flags : "));
12727 printf ("0x%016" BFD_VMA_FMT "x\n",
12728 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
12729 printf (_(" Header flags: 0x%08x\n"),
12730 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
12731 printf (_(" Image id : %s\n"), pnote->descdata + 32);
12732 break;
12733 #endif
12734 case NT_VMS_IMGNAM:
12735 printf (_(" Image name: %s\n"), pnote->descdata);
12736 break;
12737 case NT_VMS_GSTNAM:
12738 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
12739 break;
12740 case NT_VMS_IMGID:
12741 printf (_(" Image id: %s\n"), pnote->descdata);
12742 break;
12743 case NT_VMS_LINKID:
12744 printf (_(" Linker id: %s\n"), pnote->descdata);
12745 break;
12746 default:
12747 break;
12748 }
12749 return 1;
12750 }
12751
12752 /* Note that by the ELF standard, the name field is already null byte
12753 terminated, and namesz includes the terminating null byte.
12754 I.E. the value of namesz for the name "FSF" is 4.
12755
12756 If the value of namesz is zero, there is no name present. */
12757 static int
12758 process_note (Elf_Internal_Note * pnote)
12759 {
12760 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
12761 const char * nt;
12762
12763 if (pnote->namesz == 0)
12764 /* If there is no note name, then use the default set of
12765 note type strings. */
12766 nt = get_note_type (pnote->type);
12767
12768 else if (const_strneq (pnote->namedata, "GNU"))
12769 /* GNU-specific object file notes. */
12770 nt = get_gnu_elf_note_type (pnote->type);
12771
12772 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
12773 /* NetBSD-specific core file notes. */
12774 nt = get_netbsd_elfcore_note_type (pnote->type);
12775
12776 else if (strneq (pnote->namedata, "SPU/", 4))
12777 {
12778 /* SPU-specific core file notes. */
12779 nt = pnote->namedata + 4;
12780 name = "SPU";
12781 }
12782
12783 else if (const_strneq (pnote->namedata, "IPF/VMS"))
12784 /* VMS/ia64-specific file notes. */
12785 nt = get_ia64_vms_note_type (pnote->type);
12786
12787 else if (const_strneq (pnote->namedata, "stapsdt"))
12788 nt = get_stapsdt_note_type (pnote->type);
12789
12790 else
12791 /* Don't recognize this note name; just use the default set of
12792 note type strings. */
12793 nt = get_note_type (pnote->type);
12794
12795 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
12796
12797 if (const_strneq (pnote->namedata, "IPF/VMS"))
12798 return print_ia64_vms_note (pnote);
12799 else if (const_strneq (pnote->namedata, "GNU"))
12800 return print_gnu_note (pnote);
12801 else if (const_strneq (pnote->namedata, "stapsdt"))
12802 return print_stapsdt_note (pnote);
12803 else
12804 return 1;
12805 }
12806
12807
12808 static int
12809 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
12810 {
12811 Elf_External_Note * pnotes;
12812 Elf_External_Note * external;
12813 int res = 1;
12814
12815 if (length <= 0)
12816 return 0;
12817
12818 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
12819 _("notes"));
12820 if (pnotes == NULL)
12821 return 0;
12822
12823 external = pnotes;
12824
12825 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
12826 (unsigned long) offset, (unsigned long) length);
12827 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
12828
12829 while (external < (Elf_External_Note *) ((char *) pnotes + length))
12830 {
12831 Elf_External_Note * next;
12832 Elf_Internal_Note inote;
12833 char * temp = NULL;
12834
12835 if (!is_ia64_vms ())
12836 {
12837 inote.type = BYTE_GET (external->type);
12838 inote.namesz = BYTE_GET (external->namesz);
12839 inote.namedata = external->name;
12840 inote.descsz = BYTE_GET (external->descsz);
12841 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
12842 inote.descpos = offset + (inote.descdata - (char *) pnotes);
12843
12844 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
12845 }
12846 else
12847 {
12848 Elf64_External_VMS_Note *vms_external;
12849
12850 vms_external = (Elf64_External_VMS_Note *)external;
12851 inote.type = BYTE_GET (vms_external->type);
12852 inote.namesz = BYTE_GET (vms_external->namesz);
12853 inote.namedata = vms_external->name;
12854 inote.descsz = BYTE_GET (vms_external->descsz);
12855 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
12856 inote.descpos = offset + (inote.descdata - (char *) pnotes);
12857
12858 next = (Elf_External_Note *)
12859 (inote.descdata + align_power (inote.descsz, 3));
12860 }
12861
12862 if ( ((char *) next > ((char *) pnotes) + length)
12863 || ((char *) next < (char *) pnotes))
12864 {
12865 warn (_("corrupt note found at offset %lx into core notes\n"),
12866 (unsigned long) ((char *) external - (char *) pnotes));
12867 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12868 inote.type, inote.namesz, inote.descsz);
12869 break;
12870 }
12871
12872 external = next;
12873
12874 /* Prevent out-of-bounds indexing. */
12875 if (inote.namedata + inote.namesz >= (char *) pnotes + length
12876 || inote.namedata + inote.namesz < inote.namedata)
12877 {
12878 warn (_("corrupt note found at offset %lx into core notes\n"),
12879 (unsigned long) ((char *) external - (char *) pnotes));
12880 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12881 inote.type, inote.namesz, inote.descsz);
12882 break;
12883 }
12884
12885 /* Verify that name is null terminated. It appears that at least
12886 one version of Linux (RedHat 6.0) generates corefiles that don't
12887 comply with the ELF spec by failing to include the null byte in
12888 namesz. */
12889 if (inote.namedata[inote.namesz] != '\0')
12890 {
12891 temp = (char *) malloc (inote.namesz + 1);
12892
12893 if (temp == NULL)
12894 {
12895 error (_("Out of memory\n"));
12896 res = 0;
12897 break;
12898 }
12899
12900 strncpy (temp, inote.namedata, inote.namesz);
12901 temp[inote.namesz] = 0;
12902
12903 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
12904 inote.namedata = temp;
12905 }
12906
12907 res &= process_note (& inote);
12908
12909 if (temp != NULL)
12910 {
12911 free (temp);
12912 temp = NULL;
12913 }
12914 }
12915
12916 free (pnotes);
12917
12918 return res;
12919 }
12920
12921 static int
12922 process_corefile_note_segments (FILE * file)
12923 {
12924 Elf_Internal_Phdr * segment;
12925 unsigned int i;
12926 int res = 1;
12927
12928 if (! get_program_headers (file))
12929 return 0;
12930
12931 for (i = 0, segment = program_headers;
12932 i < elf_header.e_phnum;
12933 i++, segment++)
12934 {
12935 if (segment->p_type == PT_NOTE)
12936 res &= process_corefile_note_segment (file,
12937 (bfd_vma) segment->p_offset,
12938 (bfd_vma) segment->p_filesz);
12939 }
12940
12941 return res;
12942 }
12943
12944 static int
12945 process_note_sections (FILE * file)
12946 {
12947 Elf_Internal_Shdr * section;
12948 unsigned long i;
12949 int res = 1;
12950
12951 for (i = 0, section = section_headers;
12952 i < elf_header.e_shnum;
12953 i++, section++)
12954 if (section->sh_type == SHT_NOTE)
12955 res &= process_corefile_note_segment (file,
12956 (bfd_vma) section->sh_offset,
12957 (bfd_vma) section->sh_size);
12958
12959 return res;
12960 }
12961
12962 static int
12963 process_notes (FILE * file)
12964 {
12965 /* If we have not been asked to display the notes then do nothing. */
12966 if (! do_notes)
12967 return 1;
12968
12969 if (elf_header.e_type != ET_CORE)
12970 return process_note_sections (file);
12971
12972 /* No program headers means no NOTE segment. */
12973 if (elf_header.e_phnum > 0)
12974 return process_corefile_note_segments (file);
12975
12976 printf (_("No note segments present in the core file.\n"));
12977 return 1;
12978 }
12979
12980 static int
12981 process_arch_specific (FILE * file)
12982 {
12983 if (! do_arch)
12984 return 1;
12985
12986 switch (elf_header.e_machine)
12987 {
12988 case EM_ARM:
12989 return process_arm_specific (file);
12990 case EM_MIPS:
12991 case EM_MIPS_RS3_LE:
12992 return process_mips_specific (file);
12993 break;
12994 case EM_PPC:
12995 return process_power_specific (file);
12996 break;
12997 case EM_SPARC:
12998 case EM_SPARC32PLUS:
12999 case EM_SPARCV9:
13000 return process_sparc_specific (file);
13001 break;
13002 case EM_TI_C6000:
13003 return process_tic6x_specific (file);
13004 break;
13005 default:
13006 break;
13007 }
13008 return 1;
13009 }
13010
13011 static int
13012 get_file_header (FILE * file)
13013 {
13014 /* Read in the identity array. */
13015 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
13016 return 0;
13017
13018 /* Determine how to read the rest of the header. */
13019 switch (elf_header.e_ident[EI_DATA])
13020 {
13021 default: /* fall through */
13022 case ELFDATANONE: /* fall through */
13023 case ELFDATA2LSB:
13024 byte_get = byte_get_little_endian;
13025 byte_put = byte_put_little_endian;
13026 break;
13027 case ELFDATA2MSB:
13028 byte_get = byte_get_big_endian;
13029 byte_put = byte_put_big_endian;
13030 break;
13031 }
13032
13033 /* For now we only support 32 bit and 64 bit ELF files. */
13034 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
13035
13036 /* Read in the rest of the header. */
13037 if (is_32bit_elf)
13038 {
13039 Elf32_External_Ehdr ehdr32;
13040
13041 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
13042 return 0;
13043
13044 elf_header.e_type = BYTE_GET (ehdr32.e_type);
13045 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
13046 elf_header.e_version = BYTE_GET (ehdr32.e_version);
13047 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
13048 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
13049 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
13050 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
13051 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
13052 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
13053 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
13054 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
13055 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
13056 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
13057 }
13058 else
13059 {
13060 Elf64_External_Ehdr ehdr64;
13061
13062 /* If we have been compiled with sizeof (bfd_vma) == 4, then
13063 we will not be able to cope with the 64bit data found in
13064 64 ELF files. Detect this now and abort before we start
13065 overwriting things. */
13066 if (sizeof (bfd_vma) < 8)
13067 {
13068 error (_("This instance of readelf has been built without support for a\n\
13069 64 bit data type and so it cannot read 64 bit ELF files.\n"));
13070 return 0;
13071 }
13072
13073 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
13074 return 0;
13075
13076 elf_header.e_type = BYTE_GET (ehdr64.e_type);
13077 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
13078 elf_header.e_version = BYTE_GET (ehdr64.e_version);
13079 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
13080 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
13081 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
13082 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
13083 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
13084 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
13085 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
13086 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
13087 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
13088 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
13089 }
13090
13091 if (elf_header.e_shoff)
13092 {
13093 /* There may be some extensions in the first section header. Don't
13094 bomb if we can't read it. */
13095 if (is_32bit_elf)
13096 get_32bit_section_headers (file, 1);
13097 else
13098 get_64bit_section_headers (file, 1);
13099 }
13100
13101 return 1;
13102 }
13103
13104 /* Process one ELF object file according to the command line options.
13105 This file may actually be stored in an archive. The file is
13106 positioned at the start of the ELF object. */
13107
13108 static int
13109 process_object (char * file_name, FILE * file)
13110 {
13111 unsigned int i;
13112
13113 if (! get_file_header (file))
13114 {
13115 error (_("%s: Failed to read file header\n"), file_name);
13116 return 1;
13117 }
13118
13119 /* Initialise per file variables. */
13120 for (i = ARRAY_SIZE (version_info); i--;)
13121 version_info[i] = 0;
13122
13123 for (i = ARRAY_SIZE (dynamic_info); i--;)
13124 dynamic_info[i] = 0;
13125 dynamic_info_DT_GNU_HASH = 0;
13126
13127 /* Process the file. */
13128 if (show_name)
13129 printf (_("\nFile: %s\n"), file_name);
13130
13131 /* Initialise the dump_sects array from the cmdline_dump_sects array.
13132 Note we do this even if cmdline_dump_sects is empty because we
13133 must make sure that the dump_sets array is zeroed out before each
13134 object file is processed. */
13135 if (num_dump_sects > num_cmdline_dump_sects)
13136 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
13137
13138 if (num_cmdline_dump_sects > 0)
13139 {
13140 if (num_dump_sects == 0)
13141 /* A sneaky way of allocating the dump_sects array. */
13142 request_dump_bynumber (num_cmdline_dump_sects, 0);
13143
13144 assert (num_dump_sects >= num_cmdline_dump_sects);
13145 memcpy (dump_sects, cmdline_dump_sects,
13146 num_cmdline_dump_sects * sizeof (* dump_sects));
13147 }
13148
13149 if (! process_file_header ())
13150 return 1;
13151
13152 if (! process_section_headers (file))
13153 {
13154 /* Without loaded section headers we cannot process lots of
13155 things. */
13156 do_unwind = do_version = do_dump = do_arch = 0;
13157
13158 if (! do_using_dynamic)
13159 do_syms = do_dyn_syms = do_reloc = 0;
13160 }
13161
13162 if (! process_section_groups (file))
13163 {
13164 /* Without loaded section groups we cannot process unwind. */
13165 do_unwind = 0;
13166 }
13167
13168 if (process_program_headers (file))
13169 process_dynamic_section (file);
13170
13171 process_relocs (file);
13172
13173 process_unwind (file);
13174
13175 process_symbol_table (file);
13176
13177 process_syminfo (file);
13178
13179 process_version_sections (file);
13180
13181 process_section_contents (file);
13182
13183 process_notes (file);
13184
13185 process_gnu_liblist (file);
13186
13187 process_arch_specific (file);
13188
13189 if (program_headers)
13190 {
13191 free (program_headers);
13192 program_headers = NULL;
13193 }
13194
13195 if (section_headers)
13196 {
13197 free (section_headers);
13198 section_headers = NULL;
13199 }
13200
13201 if (string_table)
13202 {
13203 free (string_table);
13204 string_table = NULL;
13205 string_table_length = 0;
13206 }
13207
13208 if (dynamic_strings)
13209 {
13210 free (dynamic_strings);
13211 dynamic_strings = NULL;
13212 dynamic_strings_length = 0;
13213 }
13214
13215 if (dynamic_symbols)
13216 {
13217 free (dynamic_symbols);
13218 dynamic_symbols = NULL;
13219 num_dynamic_syms = 0;
13220 }
13221
13222 if (dynamic_syminfo)
13223 {
13224 free (dynamic_syminfo);
13225 dynamic_syminfo = NULL;
13226 }
13227
13228 if (dynamic_section)
13229 {
13230 free (dynamic_section);
13231 dynamic_section = NULL;
13232 }
13233
13234 if (section_headers_groups)
13235 {
13236 free (section_headers_groups);
13237 section_headers_groups = NULL;
13238 }
13239
13240 if (section_groups)
13241 {
13242 struct group_list * g;
13243 struct group_list * next;
13244
13245 for (i = 0; i < group_count; i++)
13246 {
13247 for (g = section_groups [i].root; g != NULL; g = next)
13248 {
13249 next = g->next;
13250 free (g);
13251 }
13252 }
13253
13254 free (section_groups);
13255 section_groups = NULL;
13256 }
13257
13258 free_debug_memory ();
13259
13260 return 0;
13261 }
13262
13263 /* Process an ELF archive.
13264 On entry the file is positioned just after the ARMAG string. */
13265
13266 static int
13267 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
13268 {
13269 struct archive_info arch;
13270 struct archive_info nested_arch;
13271 size_t got;
13272 int ret;
13273
13274 show_name = 1;
13275
13276 /* The ARCH structure is used to hold information about this archive. */
13277 arch.file_name = NULL;
13278 arch.file = NULL;
13279 arch.index_array = NULL;
13280 arch.sym_table = NULL;
13281 arch.longnames = NULL;
13282
13283 /* The NESTED_ARCH structure is used as a single-item cache of information
13284 about a nested archive (when members of a thin archive reside within
13285 another regular archive file). */
13286 nested_arch.file_name = NULL;
13287 nested_arch.file = NULL;
13288 nested_arch.index_array = NULL;
13289 nested_arch.sym_table = NULL;
13290 nested_arch.longnames = NULL;
13291
13292 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
13293 {
13294 ret = 1;
13295 goto out;
13296 }
13297
13298 if (do_archive_index)
13299 {
13300 if (arch.sym_table == NULL)
13301 error (_("%s: unable to dump the index as none was found\n"), file_name);
13302 else
13303 {
13304 unsigned int i, l;
13305 unsigned long current_pos;
13306
13307 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
13308 file_name, arch.index_num, arch.sym_size);
13309 current_pos = ftell (file);
13310
13311 for (i = l = 0; i < arch.index_num; i++)
13312 {
13313 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
13314 {
13315 char * member_name;
13316
13317 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
13318
13319 if (member_name != NULL)
13320 {
13321 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
13322
13323 if (qualified_name != NULL)
13324 {
13325 printf (_("Binary %s contains:\n"), qualified_name);
13326 free (qualified_name);
13327 }
13328 }
13329 }
13330
13331 if (l >= arch.sym_size)
13332 {
13333 error (_("%s: end of the symbol table reached before the end of the index\n"),
13334 file_name);
13335 break;
13336 }
13337 printf ("\t%s\n", arch.sym_table + l);
13338 l += strlen (arch.sym_table + l) + 1;
13339 }
13340
13341 if (l & 01)
13342 ++l;
13343 if (l < arch.sym_size)
13344 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
13345 file_name);
13346
13347 if (fseek (file, current_pos, SEEK_SET) != 0)
13348 {
13349 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
13350 ret = 1;
13351 goto out;
13352 }
13353 }
13354
13355 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
13356 && !do_segments && !do_header && !do_dump && !do_version
13357 && !do_histogram && !do_debugging && !do_arch && !do_notes
13358 && !do_section_groups && !do_dyn_syms)
13359 {
13360 ret = 0; /* Archive index only. */
13361 goto out;
13362 }
13363 }
13364
13365 ret = 0;
13366
13367 while (1)
13368 {
13369 char * name;
13370 size_t namelen;
13371 char * qualified_name;
13372
13373 /* Read the next archive header. */
13374 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13375 {
13376 error (_("%s: failed to seek to next archive header\n"), file_name);
13377 return 1;
13378 }
13379 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13380 if (got != sizeof arch.arhdr)
13381 {
13382 if (got == 0)
13383 break;
13384 error (_("%s: failed to read archive header\n"), file_name);
13385 ret = 1;
13386 break;
13387 }
13388 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13389 {
13390 error (_("%s: did not find a valid archive header\n"), arch.file_name);
13391 ret = 1;
13392 break;
13393 }
13394
13395 arch.next_arhdr_offset += sizeof arch.arhdr;
13396
13397 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13398 if (archive_file_size & 01)
13399 ++archive_file_size;
13400
13401 name = get_archive_member_name (&arch, &nested_arch);
13402 if (name == NULL)
13403 {
13404 error (_("%s: bad archive file name\n"), file_name);
13405 ret = 1;
13406 break;
13407 }
13408 namelen = strlen (name);
13409
13410 qualified_name = make_qualified_name (&arch, &nested_arch, name);
13411 if (qualified_name == NULL)
13412 {
13413 error (_("%s: bad archive file name\n"), file_name);
13414 ret = 1;
13415 break;
13416 }
13417
13418 if (is_thin_archive && arch.nested_member_origin == 0)
13419 {
13420 /* This is a proxy for an external member of a thin archive. */
13421 FILE * member_file;
13422 char * member_file_name = adjust_relative_path (file_name, name, namelen);
13423 if (member_file_name == NULL)
13424 {
13425 ret = 1;
13426 break;
13427 }
13428
13429 member_file = fopen (member_file_name, "rb");
13430 if (member_file == NULL)
13431 {
13432 error (_("Input file '%s' is not readable.\n"), member_file_name);
13433 free (member_file_name);
13434 ret = 1;
13435 break;
13436 }
13437
13438 archive_file_offset = arch.nested_member_origin;
13439
13440 ret |= process_object (qualified_name, member_file);
13441
13442 fclose (member_file);
13443 free (member_file_name);
13444 }
13445 else if (is_thin_archive)
13446 {
13447 /* This is a proxy for a member of a nested archive. */
13448 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
13449
13450 /* The nested archive file will have been opened and setup by
13451 get_archive_member_name. */
13452 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
13453 {
13454 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
13455 ret = 1;
13456 break;
13457 }
13458
13459 ret |= process_object (qualified_name, nested_arch.file);
13460 }
13461 else
13462 {
13463 archive_file_offset = arch.next_arhdr_offset;
13464 arch.next_arhdr_offset += archive_file_size;
13465
13466 ret |= process_object (qualified_name, file);
13467 }
13468
13469 if (dump_sects != NULL)
13470 {
13471 free (dump_sects);
13472 dump_sects = NULL;
13473 num_dump_sects = 0;
13474 }
13475
13476 free (qualified_name);
13477 }
13478
13479 out:
13480 if (nested_arch.file != NULL)
13481 fclose (nested_arch.file);
13482 release_archive (&nested_arch);
13483 release_archive (&arch);
13484
13485 return ret;
13486 }
13487
13488 static int
13489 process_file (char * file_name)
13490 {
13491 FILE * file;
13492 struct stat statbuf;
13493 char armag[SARMAG];
13494 int ret;
13495
13496 if (stat (file_name, &statbuf) < 0)
13497 {
13498 if (errno == ENOENT)
13499 error (_("'%s': No such file\n"), file_name);
13500 else
13501 error (_("Could not locate '%s'. System error message: %s\n"),
13502 file_name, strerror (errno));
13503 return 1;
13504 }
13505
13506 if (! S_ISREG (statbuf.st_mode))
13507 {
13508 error (_("'%s' is not an ordinary file\n"), file_name);
13509 return 1;
13510 }
13511
13512 file = fopen (file_name, "rb");
13513 if (file == NULL)
13514 {
13515 error (_("Input file '%s' is not readable.\n"), file_name);
13516 return 1;
13517 }
13518
13519 if (fread (armag, SARMAG, 1, file) != 1)
13520 {
13521 error (_("%s: Failed to read file's magic number\n"), file_name);
13522 fclose (file);
13523 return 1;
13524 }
13525
13526 if (memcmp (armag, ARMAG, SARMAG) == 0)
13527 ret = process_archive (file_name, file, FALSE);
13528 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13529 ret = process_archive (file_name, file, TRUE);
13530 else
13531 {
13532 if (do_archive_index)
13533 error (_("File %s is not an archive so its index cannot be displayed.\n"),
13534 file_name);
13535
13536 rewind (file);
13537 archive_file_size = archive_file_offset = 0;
13538 ret = process_object (file_name, file);
13539 }
13540
13541 fclose (file);
13542
13543 return ret;
13544 }
13545
13546 #ifdef SUPPORT_DISASSEMBLY
13547 /* Needed by the i386 disassembler. For extra credit, someone could
13548 fix this so that we insert symbolic addresses here, esp for GOT/PLT
13549 symbols. */
13550
13551 void
13552 print_address (unsigned int addr, FILE * outfile)
13553 {
13554 fprintf (outfile,"0x%8.8x", addr);
13555 }
13556
13557 /* Needed by the i386 disassembler. */
13558 void
13559 db_task_printsym (unsigned int addr)
13560 {
13561 print_address (addr, stderr);
13562 }
13563 #endif
13564
13565 int
13566 main (int argc, char ** argv)
13567 {
13568 int err;
13569
13570 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13571 setlocale (LC_MESSAGES, "");
13572 #endif
13573 #if defined (HAVE_SETLOCALE)
13574 setlocale (LC_CTYPE, "");
13575 #endif
13576 bindtextdomain (PACKAGE, LOCALEDIR);
13577 textdomain (PACKAGE);
13578
13579 expandargv (&argc, &argv);
13580
13581 parse_args (argc, argv);
13582
13583 if (num_dump_sects > 0)
13584 {
13585 /* Make a copy of the dump_sects array. */
13586 cmdline_dump_sects = (dump_type *)
13587 malloc (num_dump_sects * sizeof (* dump_sects));
13588 if (cmdline_dump_sects == NULL)
13589 error (_("Out of memory allocating dump request table.\n"));
13590 else
13591 {
13592 memcpy (cmdline_dump_sects, dump_sects,
13593 num_dump_sects * sizeof (* dump_sects));
13594 num_cmdline_dump_sects = num_dump_sects;
13595 }
13596 }
13597
13598 if (optind < (argc - 1))
13599 show_name = 1;
13600
13601 err = 0;
13602 while (optind < argc)
13603 err |= process_file (argv[optind++]);
13604
13605 if (dump_sects != NULL)
13606 free (dump_sects);
13607 if (cmdline_dump_sects != NULL)
13608 free (cmdline_dump_sects);
13609
13610 return err;
13611 }
This page took 0.295251 seconds and 5 git commands to generate.