More fixes for memory corruption when readelf processes corrupt files.
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2014 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23 \f
24 /* The difference between readelf and objdump:
25
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
28
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55 as this will allow us to read in and parse 64bit and 32bit ELF files.
56 Only do this if we believe that the compiler can support a 64 bit
57 data type. For now we only rely on GCC being able to do this. */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72 we can obtain the H8 reloc numbers. We need these for the
73 get_reloc_size() function. We include h8.h again after defining
74 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h. */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89 automatically generate relocation recognition functions
90 such as elf_mips_reloc_type() */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
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/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 char * program_name = "readelf";
168 static long archive_file_offset;
169 static unsigned long archive_file_size;
170 static bfd_size_type current_file_size;
171 static unsigned long dynamic_addr;
172 static bfd_size_type dynamic_size;
173 static unsigned int dynamic_nent;
174 static char * dynamic_strings;
175 static unsigned long dynamic_strings_length;
176 static char * string_table;
177 static unsigned long string_table_length;
178 static unsigned long num_dynamic_syms;
179 static Elf_Internal_Sym * dynamic_symbols;
180 static Elf_Internal_Syminfo * dynamic_syminfo;
181 static unsigned long dynamic_syminfo_offset;
182 static unsigned int dynamic_syminfo_nent;
183 static char program_interpreter[PATH_MAX];
184 static bfd_vma dynamic_info[DT_ENCODING];
185 static bfd_vma dynamic_info_DT_GNU_HASH;
186 static bfd_vma version_info[16];
187 static Elf_Internal_Ehdr elf_header;
188 static Elf_Internal_Shdr * section_headers;
189 static Elf_Internal_Phdr * program_headers;
190 static Elf_Internal_Dyn * dynamic_section;
191 static Elf_Internal_Shdr * symtab_shndx_hdr;
192 static int show_name;
193 static int do_dynamic;
194 static int do_syms;
195 static int do_dyn_syms;
196 static int do_reloc;
197 static int do_sections;
198 static int do_section_groups;
199 static int do_section_details;
200 static int do_segments;
201 static int do_unwind;
202 static int do_using_dynamic;
203 static int do_header;
204 static int do_dump;
205 static int do_version;
206 static int do_histogram;
207 static int do_debugging;
208 static int do_arch;
209 static int do_notes;
210 static int do_archive_index;
211 static int is_32bit_elf;
212
213 struct group_list
214 {
215 struct group_list * next;
216 unsigned int section_index;
217 };
218
219 struct group
220 {
221 struct group_list * root;
222 unsigned int group_index;
223 };
224
225 static size_t group_count;
226 static struct group * section_groups;
227 static struct group ** section_headers_groups;
228
229
230 /* Flag bits indicating particular types of dump. */
231 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
232 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
233 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
234 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
235 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
236
237 typedef unsigned char dump_type;
238
239 /* A linked list of the section names for which dumps were requested. */
240 struct dump_list_entry
241 {
242 char * name;
243 dump_type type;
244 struct dump_list_entry * next;
245 };
246 static struct dump_list_entry * dump_sects_byname;
247
248 /* A dynamic array of flags indicating for which sections a dump
249 has been requested via command line switches. */
250 static dump_type * cmdline_dump_sects = NULL;
251 static unsigned int num_cmdline_dump_sects = 0;
252
253 /* A dynamic array of flags indicating for which sections a dump of
254 some kind has been requested. It is reset on a per-object file
255 basis and then initialised from the cmdline_dump_sects array,
256 the results of interpreting the -w switch, and the
257 dump_sects_byname list. */
258 static dump_type * dump_sects = NULL;
259 static unsigned int num_dump_sects = 0;
260
261
262 /* How to print a vma value. */
263 typedef enum print_mode
264 {
265 HEX,
266 DEC,
267 DEC_5,
268 UNSIGNED,
269 PREFIX_HEX,
270 FULL_HEX,
271 LONG_HEX
272 }
273 print_mode;
274
275 #define UNKNOWN -1
276
277 #define SECTION_NAME(X) \
278 ((X) == NULL ? _("<none>") \
279 : string_table == NULL ? _("<no-name>") \
280 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
281 : string_table + (X)->sh_name))
282
283 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
284
285 #define GET_ELF_SYMBOLS(file, section, sym_count) \
286 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
287 : get_64bit_elf_symbols (file, section, sym_count))
288
289 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
290 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
291 already been called and verified that the string exists. */
292 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
293
294 #define REMOVE_ARCH_BITS(ADDR) \
295 do \
296 { \
297 if (elf_header.e_machine == EM_ARM) \
298 (ADDR) &= ~1; \
299 } \
300 while (0)
301 \f
302 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
303 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
304 using malloc and fill that. In either case return the pointer to the start of
305 the retrieved data or NULL if something went wrong. If something does go wrong
306 emit an error message using REASON as part of the context. */
307
308 static void *
309 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
310 const char * reason)
311 {
312 void * mvar;
313
314 if (size == 0 || nmemb == 0)
315 return NULL;
316
317 if (fseek (file, archive_file_offset + offset, SEEK_SET))
318 {
319 if (reason)
320 error (_("Unable to seek to 0x%lx for %s\n"),
321 (unsigned long) archive_file_offset + offset, reason);
322 return NULL;
323 }
324
325 mvar = var;
326 if (mvar == NULL)
327 {
328 /* Check for overflow. */
329 if (nmemb < (~(size_t) 0 - 1) / size)
330 /* + 1 so that we can '\0' terminate invalid string table sections. */
331 mvar = malloc (size * nmemb + 1);
332
333 if (mvar == NULL)
334 {
335 if (reason)
336 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
337 (unsigned long)(size * nmemb), reason);
338 return NULL;
339 }
340
341 ((char *) mvar)[size * nmemb] = '\0';
342 }
343
344 if (fread (mvar, size, nmemb, file) != nmemb)
345 {
346 if (reason)
347 error (_("Unable to read in 0x%lx bytes of %s\n"),
348 (unsigned long)(size * nmemb), reason);
349 if (mvar != var)
350 free (mvar);
351 return NULL;
352 }
353
354 return mvar;
355 }
356
357 /* Print a VMA value. */
358
359 static int
360 print_vma (bfd_vma vma, print_mode mode)
361 {
362 int nc = 0;
363
364 switch (mode)
365 {
366 case FULL_HEX:
367 nc = printf ("0x");
368 /* Drop through. */
369
370 case LONG_HEX:
371 #ifdef BFD64
372 if (is_32bit_elf)
373 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
374 #endif
375 printf_vma (vma);
376 return nc + 16;
377
378 case DEC_5:
379 if (vma <= 99999)
380 return printf ("%5" BFD_VMA_FMT "d", vma);
381 /* Drop through. */
382
383 case PREFIX_HEX:
384 nc = printf ("0x");
385 /* Drop through. */
386
387 case HEX:
388 return nc + printf ("%" BFD_VMA_FMT "x", vma);
389
390 case DEC:
391 return printf ("%" BFD_VMA_FMT "d", vma);
392
393 case UNSIGNED:
394 return printf ("%" BFD_VMA_FMT "u", vma);
395 }
396 return 0;
397 }
398
399 /* Display a symbol on stdout. Handles the display of control characters and
400 multibye characters (assuming the host environment supports them).
401
402 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
403
404 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
405 padding as necessary.
406
407 Returns the number of emitted characters. */
408
409 static unsigned int
410 print_symbol (int width, const char *symbol)
411 {
412 bfd_boolean extra_padding = FALSE;
413 int num_printed = 0;
414 #ifdef HAVE_MBSTATE_T
415 mbstate_t state;
416 #endif
417 int width_remaining;
418
419 if (width < 0)
420 {
421 /* Keep the width positive. This also helps. */
422 width = - width;
423 extra_padding = TRUE;
424 }
425
426 if (do_wide)
427 /* Set the remaining width to a very large value.
428 This simplifies the code below. */
429 width_remaining = INT_MAX;
430 else
431 width_remaining = width;
432
433 #ifdef HAVE_MBSTATE_T
434 /* Initialise the multibyte conversion state. */
435 memset (& state, 0, sizeof (state));
436 #endif
437
438 while (width_remaining)
439 {
440 size_t n;
441 const char c = *symbol++;
442
443 if (c == 0)
444 break;
445
446 /* Do not print control characters directly as they can affect terminal
447 settings. Such characters usually appear in the names generated
448 by the assembler for local labels. */
449 if (ISCNTRL (c))
450 {
451 if (width_remaining < 2)
452 break;
453
454 printf ("^%c", c + 0x40);
455 width_remaining -= 2;
456 num_printed += 2;
457 }
458 else if (ISPRINT (c))
459 {
460 putchar (c);
461 width_remaining --;
462 num_printed ++;
463 }
464 else
465 {
466 #ifdef HAVE_MBSTATE_T
467 wchar_t w;
468 #endif
469 /* Let printf do the hard work of displaying multibyte characters. */
470 printf ("%.1s", symbol - 1);
471 width_remaining --;
472 num_printed ++;
473
474 #ifdef HAVE_MBSTATE_T
475 /* Try to find out how many bytes made up the character that was
476 just printed. Advance the symbol pointer past the bytes that
477 were displayed. */
478 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
479 #else
480 n = 1;
481 #endif
482 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
483 symbol += (n - 1);
484 }
485 }
486
487 if (extra_padding && num_printed < width)
488 {
489 /* Fill in the remaining spaces. */
490 printf ("%-*s", width - num_printed, " ");
491 num_printed = width;
492 }
493
494 return num_printed;
495 }
496
497 /* Return a pointer to section NAME, or NULL if no such section exists. */
498
499 static Elf_Internal_Shdr *
500 find_section (const char * name)
501 {
502 unsigned int i;
503
504 for (i = 0; i < elf_header.e_shnum; i++)
505 if (streq (SECTION_NAME (section_headers + i), name))
506 return section_headers + i;
507
508 return NULL;
509 }
510
511 /* Return a pointer to a section containing ADDR, or NULL if no such
512 section exists. */
513
514 static Elf_Internal_Shdr *
515 find_section_by_address (bfd_vma addr)
516 {
517 unsigned int i;
518
519 for (i = 0; i < elf_header.e_shnum; i++)
520 {
521 Elf_Internal_Shdr *sec = section_headers + i;
522 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
523 return sec;
524 }
525
526 return NULL;
527 }
528
529 /* Return a pointer to section NAME, or NULL if no such section exists,
530 restricted to the list of sections given in SET. */
531
532 static Elf_Internal_Shdr *
533 find_section_in_set (const char * name, unsigned int * set)
534 {
535 unsigned int i;
536
537 if (set != NULL)
538 {
539 while ((i = *set++) > 0)
540 if (streq (SECTION_NAME (section_headers + i), name))
541 return section_headers + i;
542 }
543
544 return find_section (name);
545 }
546
547 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
548 bytes read. */
549
550 static inline unsigned long
551 read_uleb128 (unsigned char *data,
552 unsigned int *length_return,
553 const unsigned char * const end)
554 {
555 return read_leb128 (data, length_return, FALSE, end);
556 }
557
558 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
559 This OS has so many departures from the ELF standard that we test it at
560 many places. */
561
562 static inline int
563 is_ia64_vms (void)
564 {
565 return elf_header.e_machine == EM_IA_64
566 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
567 }
568
569 /* Guess the relocation size commonly used by the specific machines. */
570
571 static int
572 guess_is_rela (unsigned int e_machine)
573 {
574 switch (e_machine)
575 {
576 /* Targets that use REL relocations. */
577 case EM_386:
578 case EM_486:
579 case EM_960:
580 case EM_ARM:
581 case EM_D10V:
582 case EM_CYGNUS_D10V:
583 case EM_DLX:
584 case EM_MIPS:
585 case EM_MIPS_RS3_LE:
586 case EM_CYGNUS_M32R:
587 case EM_SCORE:
588 case EM_XGATE:
589 return FALSE;
590
591 /* Targets that use RELA relocations. */
592 case EM_68K:
593 case EM_860:
594 case EM_AARCH64:
595 case EM_ADAPTEVA_EPIPHANY:
596 case EM_ALPHA:
597 case EM_ALTERA_NIOS2:
598 case EM_AVR:
599 case EM_AVR_OLD:
600 case EM_BLACKFIN:
601 case EM_CR16:
602 case EM_CRIS:
603 case EM_CRX:
604 case EM_D30V:
605 case EM_CYGNUS_D30V:
606 case EM_FR30:
607 case EM_CYGNUS_FR30:
608 case EM_CYGNUS_FRV:
609 case EM_H8S:
610 case EM_H8_300:
611 case EM_H8_300H:
612 case EM_IA_64:
613 case EM_IP2K:
614 case EM_IP2K_OLD:
615 case EM_IQ2000:
616 case EM_LATTICEMICO32:
617 case EM_M32C_OLD:
618 case EM_M32C:
619 case EM_M32R:
620 case EM_MCORE:
621 case EM_CYGNUS_MEP:
622 case EM_METAG:
623 case EM_MMIX:
624 case EM_MN10200:
625 case EM_CYGNUS_MN10200:
626 case EM_MN10300:
627 case EM_CYGNUS_MN10300:
628 case EM_MOXIE:
629 case EM_MSP430:
630 case EM_MSP430_OLD:
631 case EM_MT:
632 case EM_NDS32:
633 case EM_NIOS32:
634 case EM_OR1K:
635 case EM_PPC64:
636 case EM_PPC:
637 case EM_RL78:
638 case EM_RX:
639 case EM_S390:
640 case EM_S390_OLD:
641 case EM_SH:
642 case EM_SPARC:
643 case EM_SPARC32PLUS:
644 case EM_SPARCV9:
645 case EM_SPU:
646 case EM_TI_C6000:
647 case EM_TILEGX:
648 case EM_TILEPRO:
649 case EM_V800:
650 case EM_V850:
651 case EM_CYGNUS_V850:
652 case EM_VAX:
653 case EM_X86_64:
654 case EM_L1OM:
655 case EM_K1OM:
656 case EM_XSTORMY16:
657 case EM_XTENSA:
658 case EM_XTENSA_OLD:
659 case EM_MICROBLAZE:
660 case EM_MICROBLAZE_OLD:
661 return TRUE;
662
663 case EM_68HC05:
664 case EM_68HC08:
665 case EM_68HC11:
666 case EM_68HC16:
667 case EM_FX66:
668 case EM_ME16:
669 case EM_MMA:
670 case EM_NCPU:
671 case EM_NDR1:
672 case EM_PCP:
673 case EM_ST100:
674 case EM_ST19:
675 case EM_ST7:
676 case EM_ST9PLUS:
677 case EM_STARCORE:
678 case EM_SVX:
679 case EM_TINYJ:
680 default:
681 warn (_("Don't know about relocations on this machine architecture\n"));
682 return FALSE;
683 }
684 }
685
686 static int
687 slurp_rela_relocs (FILE * file,
688 unsigned long rel_offset,
689 unsigned long rel_size,
690 Elf_Internal_Rela ** relasp,
691 unsigned long * nrelasp)
692 {
693 Elf_Internal_Rela * relas;
694 unsigned long nrelas;
695 unsigned int i;
696
697 if (is_32bit_elf)
698 {
699 Elf32_External_Rela * erelas;
700
701 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
702 rel_size, _("32-bit relocation data"));
703 if (!erelas)
704 return 0;
705
706 nrelas = rel_size / sizeof (Elf32_External_Rela);
707
708 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
709 sizeof (Elf_Internal_Rela));
710
711 if (relas == NULL)
712 {
713 free (erelas);
714 error (_("out of memory parsing relocs\n"));
715 return 0;
716 }
717
718 for (i = 0; i < nrelas; i++)
719 {
720 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
721 relas[i].r_info = BYTE_GET (erelas[i].r_info);
722 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
723 }
724
725 free (erelas);
726 }
727 else
728 {
729 Elf64_External_Rela * erelas;
730
731 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
732 rel_size, _("64-bit relocation data"));
733 if (!erelas)
734 return 0;
735
736 nrelas = rel_size / sizeof (Elf64_External_Rela);
737
738 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
739 sizeof (Elf_Internal_Rela));
740
741 if (relas == NULL)
742 {
743 free (erelas);
744 error (_("out of memory parsing relocs\n"));
745 return 0;
746 }
747
748 for (i = 0; i < nrelas; i++)
749 {
750 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
751 relas[i].r_info = BYTE_GET (erelas[i].r_info);
752 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
753
754 /* The #ifdef BFD64 below is to prevent a compile time
755 warning. We know that if we do not have a 64 bit data
756 type that we will never execute this code anyway. */
757 #ifdef BFD64
758 if (elf_header.e_machine == EM_MIPS
759 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
760 {
761 /* In little-endian objects, r_info isn't really a
762 64-bit little-endian value: it has a 32-bit
763 little-endian symbol index followed by four
764 individual byte fields. Reorder INFO
765 accordingly. */
766 bfd_vma inf = relas[i].r_info;
767 inf = (((inf & 0xffffffff) << 32)
768 | ((inf >> 56) & 0xff)
769 | ((inf >> 40) & 0xff00)
770 | ((inf >> 24) & 0xff0000)
771 | ((inf >> 8) & 0xff000000));
772 relas[i].r_info = inf;
773 }
774 #endif /* BFD64 */
775 }
776
777 free (erelas);
778 }
779 *relasp = relas;
780 *nrelasp = nrelas;
781 return 1;
782 }
783
784 static int
785 slurp_rel_relocs (FILE * file,
786 unsigned long rel_offset,
787 unsigned long rel_size,
788 Elf_Internal_Rela ** relsp,
789 unsigned long * nrelsp)
790 {
791 Elf_Internal_Rela * rels;
792 unsigned long nrels;
793 unsigned int i;
794
795 if (is_32bit_elf)
796 {
797 Elf32_External_Rel * erels;
798
799 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
800 rel_size, _("32-bit relocation data"));
801 if (!erels)
802 return 0;
803
804 nrels = rel_size / sizeof (Elf32_External_Rel);
805
806 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
807
808 if (rels == NULL)
809 {
810 free (erels);
811 error (_("out of memory parsing relocs\n"));
812 return 0;
813 }
814
815 for (i = 0; i < nrels; i++)
816 {
817 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
818 rels[i].r_info = BYTE_GET (erels[i].r_info);
819 rels[i].r_addend = 0;
820 }
821
822 free (erels);
823 }
824 else
825 {
826 Elf64_External_Rel * erels;
827
828 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
829 rel_size, _("64-bit relocation data"));
830 if (!erels)
831 return 0;
832
833 nrels = rel_size / sizeof (Elf64_External_Rel);
834
835 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
836
837 if (rels == NULL)
838 {
839 free (erels);
840 error (_("out of memory parsing relocs\n"));
841 return 0;
842 }
843
844 for (i = 0; i < nrels; i++)
845 {
846 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
847 rels[i].r_info = BYTE_GET (erels[i].r_info);
848 rels[i].r_addend = 0;
849
850 /* The #ifdef BFD64 below is to prevent a compile time
851 warning. We know that if we do not have a 64 bit data
852 type that we will never execute this code anyway. */
853 #ifdef BFD64
854 if (elf_header.e_machine == EM_MIPS
855 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
856 {
857 /* In little-endian objects, r_info isn't really a
858 64-bit little-endian value: it has a 32-bit
859 little-endian symbol index followed by four
860 individual byte fields. Reorder INFO
861 accordingly. */
862 bfd_vma inf = rels[i].r_info;
863 inf = (((inf & 0xffffffff) << 32)
864 | ((inf >> 56) & 0xff)
865 | ((inf >> 40) & 0xff00)
866 | ((inf >> 24) & 0xff0000)
867 | ((inf >> 8) & 0xff000000));
868 rels[i].r_info = inf;
869 }
870 #endif /* BFD64 */
871 }
872
873 free (erels);
874 }
875 *relsp = rels;
876 *nrelsp = nrels;
877 return 1;
878 }
879
880 /* Returns the reloc type extracted from the reloc info field. */
881
882 static unsigned int
883 get_reloc_type (bfd_vma reloc_info)
884 {
885 if (is_32bit_elf)
886 return ELF32_R_TYPE (reloc_info);
887
888 switch (elf_header.e_machine)
889 {
890 case EM_MIPS:
891 /* Note: We assume that reloc_info has already been adjusted for us. */
892 return ELF64_MIPS_R_TYPE (reloc_info);
893
894 case EM_SPARCV9:
895 return ELF64_R_TYPE_ID (reloc_info);
896
897 default:
898 return ELF64_R_TYPE (reloc_info);
899 }
900 }
901
902 /* Return the symbol index extracted from the reloc info field. */
903
904 static bfd_vma
905 get_reloc_symindex (bfd_vma reloc_info)
906 {
907 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
908 }
909
910 static inline bfd_boolean
911 uses_msp430x_relocs (void)
912 {
913 return
914 elf_header.e_machine == EM_MSP430 /* Paranoia. */
915 /* GCC uses osabi == ELFOSBI_STANDALONE. */
916 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
917 /* TI compiler uses ELFOSABI_NONE. */
918 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
919 }
920
921 /* Display the contents of the relocation data found at the specified
922 offset. */
923
924 static void
925 dump_relocations (FILE * file,
926 unsigned long rel_offset,
927 unsigned long rel_size,
928 Elf_Internal_Sym * symtab,
929 unsigned long nsyms,
930 char * strtab,
931 unsigned long strtablen,
932 int is_rela)
933 {
934 unsigned int i;
935 Elf_Internal_Rela * rels;
936
937 if (is_rela == UNKNOWN)
938 is_rela = guess_is_rela (elf_header.e_machine);
939
940 if (is_rela)
941 {
942 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
943 return;
944 }
945 else
946 {
947 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
948 return;
949 }
950
951 if (is_32bit_elf)
952 {
953 if (is_rela)
954 {
955 if (do_wide)
956 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
957 else
958 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
959 }
960 else
961 {
962 if (do_wide)
963 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
964 else
965 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
966 }
967 }
968 else
969 {
970 if (is_rela)
971 {
972 if (do_wide)
973 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
974 else
975 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
976 }
977 else
978 {
979 if (do_wide)
980 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
981 else
982 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
983 }
984 }
985
986 for (i = 0; i < rel_size; i++)
987 {
988 const char * rtype;
989 bfd_vma offset;
990 bfd_vma inf;
991 bfd_vma symtab_index;
992 bfd_vma type;
993
994 offset = rels[i].r_offset;
995 inf = rels[i].r_info;
996
997 type = get_reloc_type (inf);
998 symtab_index = get_reloc_symindex (inf);
999
1000 if (is_32bit_elf)
1001 {
1002 printf ("%8.8lx %8.8lx ",
1003 (unsigned long) offset & 0xffffffff,
1004 (unsigned long) inf & 0xffffffff);
1005 }
1006 else
1007 {
1008 #if BFD_HOST_64BIT_LONG
1009 printf (do_wide
1010 ? "%16.16lx %16.16lx "
1011 : "%12.12lx %12.12lx ",
1012 offset, inf);
1013 #elif BFD_HOST_64BIT_LONG_LONG
1014 #ifndef __MSVCRT__
1015 printf (do_wide
1016 ? "%16.16llx %16.16llx "
1017 : "%12.12llx %12.12llx ",
1018 offset, inf);
1019 #else
1020 printf (do_wide
1021 ? "%16.16I64x %16.16I64x "
1022 : "%12.12I64x %12.12I64x ",
1023 offset, inf);
1024 #endif
1025 #else
1026 printf (do_wide
1027 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1028 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1029 _bfd_int64_high (offset),
1030 _bfd_int64_low (offset),
1031 _bfd_int64_high (inf),
1032 _bfd_int64_low (inf));
1033 #endif
1034 }
1035
1036 switch (elf_header.e_machine)
1037 {
1038 default:
1039 rtype = NULL;
1040 break;
1041
1042 case EM_AARCH64:
1043 rtype = elf_aarch64_reloc_type (type);
1044 break;
1045
1046 case EM_M32R:
1047 case EM_CYGNUS_M32R:
1048 rtype = elf_m32r_reloc_type (type);
1049 break;
1050
1051 case EM_386:
1052 case EM_486:
1053 rtype = elf_i386_reloc_type (type);
1054 break;
1055
1056 case EM_68HC11:
1057 case EM_68HC12:
1058 rtype = elf_m68hc11_reloc_type (type);
1059 break;
1060
1061 case EM_68K:
1062 rtype = elf_m68k_reloc_type (type);
1063 break;
1064
1065 case EM_960:
1066 rtype = elf_i960_reloc_type (type);
1067 break;
1068
1069 case EM_AVR:
1070 case EM_AVR_OLD:
1071 rtype = elf_avr_reloc_type (type);
1072 break;
1073
1074 case EM_OLD_SPARCV9:
1075 case EM_SPARC32PLUS:
1076 case EM_SPARCV9:
1077 case EM_SPARC:
1078 rtype = elf_sparc_reloc_type (type);
1079 break;
1080
1081 case EM_SPU:
1082 rtype = elf_spu_reloc_type (type);
1083 break;
1084
1085 case EM_V800:
1086 rtype = v800_reloc_type (type);
1087 break;
1088 case EM_V850:
1089 case EM_CYGNUS_V850:
1090 rtype = v850_reloc_type (type);
1091 break;
1092
1093 case EM_D10V:
1094 case EM_CYGNUS_D10V:
1095 rtype = elf_d10v_reloc_type (type);
1096 break;
1097
1098 case EM_D30V:
1099 case EM_CYGNUS_D30V:
1100 rtype = elf_d30v_reloc_type (type);
1101 break;
1102
1103 case EM_DLX:
1104 rtype = elf_dlx_reloc_type (type);
1105 break;
1106
1107 case EM_SH:
1108 rtype = elf_sh_reloc_type (type);
1109 break;
1110
1111 case EM_MN10300:
1112 case EM_CYGNUS_MN10300:
1113 rtype = elf_mn10300_reloc_type (type);
1114 break;
1115
1116 case EM_MN10200:
1117 case EM_CYGNUS_MN10200:
1118 rtype = elf_mn10200_reloc_type (type);
1119 break;
1120
1121 case EM_FR30:
1122 case EM_CYGNUS_FR30:
1123 rtype = elf_fr30_reloc_type (type);
1124 break;
1125
1126 case EM_CYGNUS_FRV:
1127 rtype = elf_frv_reloc_type (type);
1128 break;
1129
1130 case EM_MCORE:
1131 rtype = elf_mcore_reloc_type (type);
1132 break;
1133
1134 case EM_MMIX:
1135 rtype = elf_mmix_reloc_type (type);
1136 break;
1137
1138 case EM_MOXIE:
1139 rtype = elf_moxie_reloc_type (type);
1140 break;
1141
1142 case EM_MSP430:
1143 if (uses_msp430x_relocs ())
1144 {
1145 rtype = elf_msp430x_reloc_type (type);
1146 break;
1147 }
1148 case EM_MSP430_OLD:
1149 rtype = elf_msp430_reloc_type (type);
1150 break;
1151
1152 case EM_NDS32:
1153 rtype = elf_nds32_reloc_type (type);
1154 break;
1155
1156 case EM_PPC:
1157 rtype = elf_ppc_reloc_type (type);
1158 break;
1159
1160 case EM_PPC64:
1161 rtype = elf_ppc64_reloc_type (type);
1162 break;
1163
1164 case EM_MIPS:
1165 case EM_MIPS_RS3_LE:
1166 rtype = elf_mips_reloc_type (type);
1167 break;
1168
1169 case EM_ALPHA:
1170 rtype = elf_alpha_reloc_type (type);
1171 break;
1172
1173 case EM_ARM:
1174 rtype = elf_arm_reloc_type (type);
1175 break;
1176
1177 case EM_ARC:
1178 rtype = elf_arc_reloc_type (type);
1179 break;
1180
1181 case EM_PARISC:
1182 rtype = elf_hppa_reloc_type (type);
1183 break;
1184
1185 case EM_H8_300:
1186 case EM_H8_300H:
1187 case EM_H8S:
1188 rtype = elf_h8_reloc_type (type);
1189 break;
1190
1191 case EM_OR1K:
1192 rtype = elf_or1k_reloc_type (type);
1193 break;
1194
1195 case EM_PJ:
1196 case EM_PJ_OLD:
1197 rtype = elf_pj_reloc_type (type);
1198 break;
1199 case EM_IA_64:
1200 rtype = elf_ia64_reloc_type (type);
1201 break;
1202
1203 case EM_CRIS:
1204 rtype = elf_cris_reloc_type (type);
1205 break;
1206
1207 case EM_860:
1208 rtype = elf_i860_reloc_type (type);
1209 break;
1210
1211 case EM_X86_64:
1212 case EM_L1OM:
1213 case EM_K1OM:
1214 rtype = elf_x86_64_reloc_type (type);
1215 break;
1216
1217 case EM_S370:
1218 rtype = i370_reloc_type (type);
1219 break;
1220
1221 case EM_S390_OLD:
1222 case EM_S390:
1223 rtype = elf_s390_reloc_type (type);
1224 break;
1225
1226 case EM_SCORE:
1227 rtype = elf_score_reloc_type (type);
1228 break;
1229
1230 case EM_XSTORMY16:
1231 rtype = elf_xstormy16_reloc_type (type);
1232 break;
1233
1234 case EM_CRX:
1235 rtype = elf_crx_reloc_type (type);
1236 break;
1237
1238 case EM_VAX:
1239 rtype = elf_vax_reloc_type (type);
1240 break;
1241
1242 case EM_ADAPTEVA_EPIPHANY:
1243 rtype = elf_epiphany_reloc_type (type);
1244 break;
1245
1246 case EM_IP2K:
1247 case EM_IP2K_OLD:
1248 rtype = elf_ip2k_reloc_type (type);
1249 break;
1250
1251 case EM_IQ2000:
1252 rtype = elf_iq2000_reloc_type (type);
1253 break;
1254
1255 case EM_XTENSA_OLD:
1256 case EM_XTENSA:
1257 rtype = elf_xtensa_reloc_type (type);
1258 break;
1259
1260 case EM_LATTICEMICO32:
1261 rtype = elf_lm32_reloc_type (type);
1262 break;
1263
1264 case EM_M32C_OLD:
1265 case EM_M32C:
1266 rtype = elf_m32c_reloc_type (type);
1267 break;
1268
1269 case EM_MT:
1270 rtype = elf_mt_reloc_type (type);
1271 break;
1272
1273 case EM_BLACKFIN:
1274 rtype = elf_bfin_reloc_type (type);
1275 break;
1276
1277 case EM_CYGNUS_MEP:
1278 rtype = elf_mep_reloc_type (type);
1279 break;
1280
1281 case EM_CR16:
1282 rtype = elf_cr16_reloc_type (type);
1283 break;
1284
1285 case EM_MICROBLAZE:
1286 case EM_MICROBLAZE_OLD:
1287 rtype = elf_microblaze_reloc_type (type);
1288 break;
1289
1290 case EM_RL78:
1291 rtype = elf_rl78_reloc_type (type);
1292 break;
1293
1294 case EM_RX:
1295 rtype = elf_rx_reloc_type (type);
1296 break;
1297
1298 case EM_METAG:
1299 rtype = elf_metag_reloc_type (type);
1300 break;
1301
1302 case EM_XC16X:
1303 case EM_C166:
1304 rtype = elf_xc16x_reloc_type (type);
1305 break;
1306
1307 case EM_TI_C6000:
1308 rtype = elf_tic6x_reloc_type (type);
1309 break;
1310
1311 case EM_TILEGX:
1312 rtype = elf_tilegx_reloc_type (type);
1313 break;
1314
1315 case EM_TILEPRO:
1316 rtype = elf_tilepro_reloc_type (type);
1317 break;
1318
1319 case EM_XGATE:
1320 rtype = elf_xgate_reloc_type (type);
1321 break;
1322
1323 case EM_ALTERA_NIOS2:
1324 rtype = elf_nios2_reloc_type (type);
1325 break;
1326 }
1327
1328 if (rtype == NULL)
1329 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1330 else
1331 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1332
1333 if (elf_header.e_machine == EM_ALPHA
1334 && rtype != NULL
1335 && streq (rtype, "R_ALPHA_LITUSE")
1336 && is_rela)
1337 {
1338 switch (rels[i].r_addend)
1339 {
1340 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1341 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1342 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1343 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1344 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1345 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1346 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1347 default: rtype = NULL;
1348 }
1349 if (rtype)
1350 printf (" (%s)", rtype);
1351 else
1352 {
1353 putchar (' ');
1354 printf (_("<unknown addend: %lx>"),
1355 (unsigned long) rels[i].r_addend);
1356 }
1357 }
1358 else if (symtab_index)
1359 {
1360 if (symtab == NULL || symtab_index >= nsyms)
1361 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1362 else
1363 {
1364 Elf_Internal_Sym * psym;
1365
1366 psym = symtab + symtab_index;
1367
1368 printf (" ");
1369
1370 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1371 {
1372 const char * name;
1373 unsigned int len;
1374 unsigned int width = is_32bit_elf ? 8 : 14;
1375
1376 /* Relocations against GNU_IFUNC symbols do not use the value
1377 of the symbol as the address to relocate against. Instead
1378 they invoke the function named by the symbol and use its
1379 result as the address for relocation.
1380
1381 To indicate this to the user, do not display the value of
1382 the symbol in the "Symbols's Value" field. Instead show
1383 its name followed by () as a hint that the symbol is
1384 invoked. */
1385
1386 if (strtab == NULL
1387 || psym->st_name == 0
1388 || psym->st_name >= strtablen)
1389 name = "??";
1390 else
1391 name = strtab + psym->st_name;
1392
1393 len = print_symbol (width, name);
1394 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1395 }
1396 else
1397 {
1398 print_vma (psym->st_value, LONG_HEX);
1399
1400 printf (is_32bit_elf ? " " : " ");
1401 }
1402
1403 if (psym->st_name == 0)
1404 {
1405 const char * sec_name = "<null>";
1406 char name_buf[40];
1407
1408 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1409 {
1410 if (psym->st_shndx < elf_header.e_shnum)
1411 sec_name
1412 = SECTION_NAME (section_headers + psym->st_shndx);
1413 else if (psym->st_shndx == SHN_ABS)
1414 sec_name = "ABS";
1415 else if (psym->st_shndx == SHN_COMMON)
1416 sec_name = "COMMON";
1417 else if ((elf_header.e_machine == EM_MIPS
1418 && psym->st_shndx == SHN_MIPS_SCOMMON)
1419 || (elf_header.e_machine == EM_TI_C6000
1420 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1421 sec_name = "SCOMMON";
1422 else if (elf_header.e_machine == EM_MIPS
1423 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1424 sec_name = "SUNDEF";
1425 else if ((elf_header.e_machine == EM_X86_64
1426 || elf_header.e_machine == EM_L1OM
1427 || elf_header.e_machine == EM_K1OM)
1428 && psym->st_shndx == SHN_X86_64_LCOMMON)
1429 sec_name = "LARGE_COMMON";
1430 else if (elf_header.e_machine == EM_IA_64
1431 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1432 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1433 sec_name = "ANSI_COM";
1434 else if (is_ia64_vms ()
1435 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1436 sec_name = "VMS_SYMVEC";
1437 else
1438 {
1439 sprintf (name_buf, "<section 0x%x>",
1440 (unsigned int) psym->st_shndx);
1441 sec_name = name_buf;
1442 }
1443 }
1444 print_symbol (22, sec_name);
1445 }
1446 else if (strtab == NULL)
1447 printf (_("<string table index: %3ld>"), psym->st_name);
1448 else if (psym->st_name >= strtablen)
1449 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1450 else
1451 print_symbol (22, strtab + psym->st_name);
1452
1453 if (is_rela)
1454 {
1455 bfd_signed_vma off = rels[i].r_addend;
1456
1457 if (off < 0)
1458 printf (" - %" BFD_VMA_FMT "x", - off);
1459 else
1460 printf (" + %" BFD_VMA_FMT "x", off);
1461 }
1462 }
1463 }
1464 else if (is_rela)
1465 {
1466 bfd_signed_vma off = rels[i].r_addend;
1467
1468 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1469 if (off < 0)
1470 printf ("-%" BFD_VMA_FMT "x", - off);
1471 else
1472 printf ("%" BFD_VMA_FMT "x", off);
1473 }
1474
1475 if (elf_header.e_machine == EM_SPARCV9
1476 && rtype != NULL
1477 && streq (rtype, "R_SPARC_OLO10"))
1478 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1479
1480 putchar ('\n');
1481
1482 #ifdef BFD64
1483 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1484 {
1485 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1486 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1487 const char * rtype2 = elf_mips_reloc_type (type2);
1488 const char * rtype3 = elf_mips_reloc_type (type3);
1489
1490 printf (" Type2: ");
1491
1492 if (rtype2 == NULL)
1493 printf (_("unrecognized: %-7lx"),
1494 (unsigned long) type2 & 0xffffffff);
1495 else
1496 printf ("%-17.17s", rtype2);
1497
1498 printf ("\n Type3: ");
1499
1500 if (rtype3 == NULL)
1501 printf (_("unrecognized: %-7lx"),
1502 (unsigned long) type3 & 0xffffffff);
1503 else
1504 printf ("%-17.17s", rtype3);
1505
1506 putchar ('\n');
1507 }
1508 #endif /* BFD64 */
1509 }
1510
1511 free (rels);
1512 }
1513
1514 static const char *
1515 get_mips_dynamic_type (unsigned long type)
1516 {
1517 switch (type)
1518 {
1519 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1520 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1521 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1522 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1523 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1524 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1525 case DT_MIPS_MSYM: return "MIPS_MSYM";
1526 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1527 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1528 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1529 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1530 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1531 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1532 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1533 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1534 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1535 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1536 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1537 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1538 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1539 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1540 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1541 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1542 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1543 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1544 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1545 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1546 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1547 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1548 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1549 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1550 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1551 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1552 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1553 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1554 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1555 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1556 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1557 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1558 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1559 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1560 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1561 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1562 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1563 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1564 default:
1565 return NULL;
1566 }
1567 }
1568
1569 static const char *
1570 get_sparc64_dynamic_type (unsigned long type)
1571 {
1572 switch (type)
1573 {
1574 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1575 default:
1576 return NULL;
1577 }
1578 }
1579
1580 static const char *
1581 get_ppc_dynamic_type (unsigned long type)
1582 {
1583 switch (type)
1584 {
1585 case DT_PPC_GOT: return "PPC_GOT";
1586 case DT_PPC_OPT: return "PPC_OPT";
1587 default:
1588 return NULL;
1589 }
1590 }
1591
1592 static const char *
1593 get_ppc64_dynamic_type (unsigned long type)
1594 {
1595 switch (type)
1596 {
1597 case DT_PPC64_GLINK: return "PPC64_GLINK";
1598 case DT_PPC64_OPD: return "PPC64_OPD";
1599 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1600 case DT_PPC64_OPT: return "PPC64_OPT";
1601 default:
1602 return NULL;
1603 }
1604 }
1605
1606 static const char *
1607 get_parisc_dynamic_type (unsigned long type)
1608 {
1609 switch (type)
1610 {
1611 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1612 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1613 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1614 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1615 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1616 case DT_HP_PREINIT: return "HP_PREINIT";
1617 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1618 case DT_HP_NEEDED: return "HP_NEEDED";
1619 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1620 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1621 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1622 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1623 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1624 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1625 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1626 case DT_HP_FILTERED: return "HP_FILTERED";
1627 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1628 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1629 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1630 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1631 case DT_PLT: return "PLT";
1632 case DT_PLT_SIZE: return "PLT_SIZE";
1633 case DT_DLT: return "DLT";
1634 case DT_DLT_SIZE: return "DLT_SIZE";
1635 default:
1636 return NULL;
1637 }
1638 }
1639
1640 static const char *
1641 get_ia64_dynamic_type (unsigned long type)
1642 {
1643 switch (type)
1644 {
1645 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1646 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1647 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1648 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1649 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1650 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1651 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1652 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1653 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1654 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1655 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1656 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1657 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1658 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1659 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1660 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1661 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1662 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1663 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1664 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1665 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1666 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1667 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1668 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1669 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1670 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1671 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1672 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1673 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1674 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1675 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1676 default:
1677 return NULL;
1678 }
1679 }
1680
1681 static const char *
1682 get_alpha_dynamic_type (unsigned long type)
1683 {
1684 switch (type)
1685 {
1686 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1687 default:
1688 return NULL;
1689 }
1690 }
1691
1692 static const char *
1693 get_score_dynamic_type (unsigned long type)
1694 {
1695 switch (type)
1696 {
1697 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1698 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1699 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1700 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1701 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1702 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1703 default:
1704 return NULL;
1705 }
1706 }
1707
1708 static const char *
1709 get_tic6x_dynamic_type (unsigned long type)
1710 {
1711 switch (type)
1712 {
1713 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1714 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1715 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1716 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1717 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1718 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1719 default:
1720 return NULL;
1721 }
1722 }
1723
1724 static const char *
1725 get_nios2_dynamic_type (unsigned long type)
1726 {
1727 switch (type)
1728 {
1729 case DT_NIOS2_GP: return "NIOS2_GP";
1730 default:
1731 return NULL;
1732 }
1733 }
1734
1735 static const char *
1736 get_dynamic_type (unsigned long type)
1737 {
1738 static char buff[64];
1739
1740 switch (type)
1741 {
1742 case DT_NULL: return "NULL";
1743 case DT_NEEDED: return "NEEDED";
1744 case DT_PLTRELSZ: return "PLTRELSZ";
1745 case DT_PLTGOT: return "PLTGOT";
1746 case DT_HASH: return "HASH";
1747 case DT_STRTAB: return "STRTAB";
1748 case DT_SYMTAB: return "SYMTAB";
1749 case DT_RELA: return "RELA";
1750 case DT_RELASZ: return "RELASZ";
1751 case DT_RELAENT: return "RELAENT";
1752 case DT_STRSZ: return "STRSZ";
1753 case DT_SYMENT: return "SYMENT";
1754 case DT_INIT: return "INIT";
1755 case DT_FINI: return "FINI";
1756 case DT_SONAME: return "SONAME";
1757 case DT_RPATH: return "RPATH";
1758 case DT_SYMBOLIC: return "SYMBOLIC";
1759 case DT_REL: return "REL";
1760 case DT_RELSZ: return "RELSZ";
1761 case DT_RELENT: return "RELENT";
1762 case DT_PLTREL: return "PLTREL";
1763 case DT_DEBUG: return "DEBUG";
1764 case DT_TEXTREL: return "TEXTREL";
1765 case DT_JMPREL: return "JMPREL";
1766 case DT_BIND_NOW: return "BIND_NOW";
1767 case DT_INIT_ARRAY: return "INIT_ARRAY";
1768 case DT_FINI_ARRAY: return "FINI_ARRAY";
1769 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1770 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1771 case DT_RUNPATH: return "RUNPATH";
1772 case DT_FLAGS: return "FLAGS";
1773
1774 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1775 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1776
1777 case DT_CHECKSUM: return "CHECKSUM";
1778 case DT_PLTPADSZ: return "PLTPADSZ";
1779 case DT_MOVEENT: return "MOVEENT";
1780 case DT_MOVESZ: return "MOVESZ";
1781 case DT_FEATURE: return "FEATURE";
1782 case DT_POSFLAG_1: return "POSFLAG_1";
1783 case DT_SYMINSZ: return "SYMINSZ";
1784 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1785
1786 case DT_ADDRRNGLO: return "ADDRRNGLO";
1787 case DT_CONFIG: return "CONFIG";
1788 case DT_DEPAUDIT: return "DEPAUDIT";
1789 case DT_AUDIT: return "AUDIT";
1790 case DT_PLTPAD: return "PLTPAD";
1791 case DT_MOVETAB: return "MOVETAB";
1792 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1793
1794 case DT_VERSYM: return "VERSYM";
1795
1796 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1797 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1798 case DT_RELACOUNT: return "RELACOUNT";
1799 case DT_RELCOUNT: return "RELCOUNT";
1800 case DT_FLAGS_1: return "FLAGS_1";
1801 case DT_VERDEF: return "VERDEF";
1802 case DT_VERDEFNUM: return "VERDEFNUM";
1803 case DT_VERNEED: return "VERNEED";
1804 case DT_VERNEEDNUM: return "VERNEEDNUM";
1805
1806 case DT_AUXILIARY: return "AUXILIARY";
1807 case DT_USED: return "USED";
1808 case DT_FILTER: return "FILTER";
1809
1810 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1811 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1812 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1813 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1814 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1815 case DT_GNU_HASH: return "GNU_HASH";
1816
1817 default:
1818 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1819 {
1820 const char * result;
1821
1822 switch (elf_header.e_machine)
1823 {
1824 case EM_MIPS:
1825 case EM_MIPS_RS3_LE:
1826 result = get_mips_dynamic_type (type);
1827 break;
1828 case EM_SPARCV9:
1829 result = get_sparc64_dynamic_type (type);
1830 break;
1831 case EM_PPC:
1832 result = get_ppc_dynamic_type (type);
1833 break;
1834 case EM_PPC64:
1835 result = get_ppc64_dynamic_type (type);
1836 break;
1837 case EM_IA_64:
1838 result = get_ia64_dynamic_type (type);
1839 break;
1840 case EM_ALPHA:
1841 result = get_alpha_dynamic_type (type);
1842 break;
1843 case EM_SCORE:
1844 result = get_score_dynamic_type (type);
1845 break;
1846 case EM_TI_C6000:
1847 result = get_tic6x_dynamic_type (type);
1848 break;
1849 case EM_ALTERA_NIOS2:
1850 result = get_nios2_dynamic_type (type);
1851 break;
1852 default:
1853 result = NULL;
1854 break;
1855 }
1856
1857 if (result != NULL)
1858 return result;
1859
1860 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1861 }
1862 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1863 || (elf_header.e_machine == EM_PARISC
1864 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1865 {
1866 const char * result;
1867
1868 switch (elf_header.e_machine)
1869 {
1870 case EM_PARISC:
1871 result = get_parisc_dynamic_type (type);
1872 break;
1873 case EM_IA_64:
1874 result = get_ia64_dynamic_type (type);
1875 break;
1876 default:
1877 result = NULL;
1878 break;
1879 }
1880
1881 if (result != NULL)
1882 return result;
1883
1884 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1885 type);
1886 }
1887 else
1888 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1889
1890 return buff;
1891 }
1892 }
1893
1894 static char *
1895 get_file_type (unsigned e_type)
1896 {
1897 static char buff[32];
1898
1899 switch (e_type)
1900 {
1901 case ET_NONE: return _("NONE (None)");
1902 case ET_REL: return _("REL (Relocatable file)");
1903 case ET_EXEC: return _("EXEC (Executable file)");
1904 case ET_DYN: return _("DYN (Shared object file)");
1905 case ET_CORE: return _("CORE (Core file)");
1906
1907 default:
1908 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1909 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1910 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1911 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1912 else
1913 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1914 return buff;
1915 }
1916 }
1917
1918 static char *
1919 get_machine_name (unsigned e_machine)
1920 {
1921 static char buff[64]; /* XXX */
1922
1923 switch (e_machine)
1924 {
1925 case EM_NONE: return _("None");
1926 case EM_AARCH64: return "AArch64";
1927 case EM_M32: return "WE32100";
1928 case EM_SPARC: return "Sparc";
1929 case EM_SPU: return "SPU";
1930 case EM_386: return "Intel 80386";
1931 case EM_68K: return "MC68000";
1932 case EM_88K: return "MC88000";
1933 case EM_486: return "Intel 80486";
1934 case EM_860: return "Intel 80860";
1935 case EM_MIPS: return "MIPS R3000";
1936 case EM_S370: return "IBM System/370";
1937 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1938 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1939 case EM_PARISC: return "HPPA";
1940 case EM_PPC_OLD: return "Power PC (old)";
1941 case EM_SPARC32PLUS: return "Sparc v8+" ;
1942 case EM_960: return "Intel 90860";
1943 case EM_PPC: return "PowerPC";
1944 case EM_PPC64: return "PowerPC64";
1945 case EM_FR20: return "Fujitsu FR20";
1946 case EM_RH32: return "TRW RH32";
1947 case EM_MCORE: return "MCORE";
1948 case EM_ARM: return "ARM";
1949 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1950 case EM_SH: return "Renesas / SuperH SH";
1951 case EM_SPARCV9: return "Sparc v9";
1952 case EM_TRICORE: return "Siemens Tricore";
1953 case EM_ARC: return "ARC";
1954 case EM_H8_300: return "Renesas H8/300";
1955 case EM_H8_300H: return "Renesas H8/300H";
1956 case EM_H8S: return "Renesas H8S";
1957 case EM_H8_500: return "Renesas H8/500";
1958 case EM_IA_64: return "Intel IA-64";
1959 case EM_MIPS_X: return "Stanford MIPS-X";
1960 case EM_COLDFIRE: return "Motorola Coldfire";
1961 case EM_ALPHA: return "Alpha";
1962 case EM_CYGNUS_D10V:
1963 case EM_D10V: return "d10v";
1964 case EM_CYGNUS_D30V:
1965 case EM_D30V: return "d30v";
1966 case EM_CYGNUS_M32R:
1967 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1968 case EM_CYGNUS_V850:
1969 case EM_V800: return "Renesas V850 (using RH850 ABI)";
1970 case EM_V850: return "Renesas V850";
1971 case EM_CYGNUS_MN10300:
1972 case EM_MN10300: return "mn10300";
1973 case EM_CYGNUS_MN10200:
1974 case EM_MN10200: return "mn10200";
1975 case EM_MOXIE: return "Moxie";
1976 case EM_CYGNUS_FR30:
1977 case EM_FR30: return "Fujitsu FR30";
1978 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1979 case EM_PJ_OLD:
1980 case EM_PJ: return "picoJava";
1981 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1982 case EM_PCP: return "Siemens PCP";
1983 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1984 case EM_NDR1: return "Denso NDR1 microprocesspr";
1985 case EM_STARCORE: return "Motorola Star*Core processor";
1986 case EM_ME16: return "Toyota ME16 processor";
1987 case EM_ST100: return "STMicroelectronics ST100 processor";
1988 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1989 case EM_PDSP: return "Sony DSP processor";
1990 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1991 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1992 case EM_FX66: return "Siemens FX66 microcontroller";
1993 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1994 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1995 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1996 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
1997 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1998 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1999 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2000 case EM_SVX: return "Silicon Graphics SVx";
2001 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2002 case EM_VAX: return "Digital VAX";
2003 case EM_AVR_OLD:
2004 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2005 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2006 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2007 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2008 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2009 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2010 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2011 case EM_PRISM: return "Vitesse Prism";
2012 case EM_X86_64: return "Advanced Micro Devices X86-64";
2013 case EM_L1OM: return "Intel L1OM";
2014 case EM_K1OM: return "Intel K1OM";
2015 case EM_S390_OLD:
2016 case EM_S390: return "IBM S/390";
2017 case EM_SCORE: return "SUNPLUS S+Core";
2018 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2019 case EM_OR1K: return "OpenRISC 1000";
2020 case EM_ARC_A5: return "ARC International ARCompact processor";
2021 case EM_CRX: return "National Semiconductor CRX microprocessor";
2022 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2023 case EM_DLX: return "OpenDLX";
2024 case EM_IP2K_OLD:
2025 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2026 case EM_IQ2000: return "Vitesse IQ2000";
2027 case EM_XTENSA_OLD:
2028 case EM_XTENSA: return "Tensilica Xtensa Processor";
2029 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2030 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2031 case EM_NS32K: return "National Semiconductor 32000 series";
2032 case EM_TPC: return "Tenor Network TPC processor";
2033 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2034 case EM_MAX: return "MAX Processor";
2035 case EM_CR: return "National Semiconductor CompactRISC";
2036 case EM_F2MC16: return "Fujitsu F2MC16";
2037 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2038 case EM_LATTICEMICO32: return "Lattice Mico32";
2039 case EM_M32C_OLD:
2040 case EM_M32C: return "Renesas M32c";
2041 case EM_MT: return "Morpho Techologies MT processor";
2042 case EM_BLACKFIN: return "Analog Devices Blackfin";
2043 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2044 case EM_SEP: return "Sharp embedded microprocessor";
2045 case EM_ARCA: return "Arca RISC microprocessor";
2046 case EM_UNICORE: return "Unicore";
2047 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2048 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2049 case EM_NIOS32: return "Altera Nios";
2050 case EM_ALTERA_NIOS2: return "Altera Nios II";
2051 case EM_C166:
2052 case EM_XC16X: return "Infineon Technologies xc16x";
2053 case EM_M16C: return "Renesas M16C series microprocessors";
2054 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2055 case EM_CE: return "Freescale Communication Engine RISC core";
2056 case EM_TSK3000: return "Altium TSK3000 core";
2057 case EM_RS08: return "Freescale RS08 embedded processor";
2058 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2059 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2060 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2061 case EM_SE_C17: return "Seiko Epson C17 family";
2062 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2063 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2064 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2065 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2066 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2067 case EM_R32C: return "Renesas R32C series microprocessors";
2068 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2069 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2070 case EM_8051: return "Intel 8051 and variants";
2071 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2072 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2073 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2074 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2075 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2076 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2077 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2078 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2079 case EM_CR16:
2080 case EM_MICROBLAZE:
2081 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2082 case EM_RL78: return "Renesas RL78";
2083 case EM_RX: return "Renesas RX";
2084 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2085 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2086 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2087 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2088 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2089 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2090 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2091 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2092 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2093 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2094 case EM_CUDA: return "NVIDIA CUDA architecture";
2095 case EM_XGATE: return "Motorola XGATE embedded processor";
2096 default:
2097 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2098 return buff;
2099 }
2100 }
2101
2102 static void
2103 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2104 {
2105 unsigned eabi;
2106 int unknown = 0;
2107
2108 eabi = EF_ARM_EABI_VERSION (e_flags);
2109 e_flags &= ~ EF_ARM_EABIMASK;
2110
2111 /* Handle "generic" ARM flags. */
2112 if (e_flags & EF_ARM_RELEXEC)
2113 {
2114 strcat (buf, ", relocatable executable");
2115 e_flags &= ~ EF_ARM_RELEXEC;
2116 }
2117
2118 if (e_flags & EF_ARM_HASENTRY)
2119 {
2120 strcat (buf, ", has entry point");
2121 e_flags &= ~ EF_ARM_HASENTRY;
2122 }
2123
2124 /* Now handle EABI specific flags. */
2125 switch (eabi)
2126 {
2127 default:
2128 strcat (buf, ", <unrecognized EABI>");
2129 if (e_flags)
2130 unknown = 1;
2131 break;
2132
2133 case EF_ARM_EABI_VER1:
2134 strcat (buf, ", Version1 EABI");
2135 while (e_flags)
2136 {
2137 unsigned flag;
2138
2139 /* Process flags one bit at a time. */
2140 flag = e_flags & - e_flags;
2141 e_flags &= ~ flag;
2142
2143 switch (flag)
2144 {
2145 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2146 strcat (buf, ", sorted symbol tables");
2147 break;
2148
2149 default:
2150 unknown = 1;
2151 break;
2152 }
2153 }
2154 break;
2155
2156 case EF_ARM_EABI_VER2:
2157 strcat (buf, ", Version2 EABI");
2158 while (e_flags)
2159 {
2160 unsigned flag;
2161
2162 /* Process flags one bit at a time. */
2163 flag = e_flags & - e_flags;
2164 e_flags &= ~ flag;
2165
2166 switch (flag)
2167 {
2168 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2169 strcat (buf, ", sorted symbol tables");
2170 break;
2171
2172 case EF_ARM_DYNSYMSUSESEGIDX:
2173 strcat (buf, ", dynamic symbols use segment index");
2174 break;
2175
2176 case EF_ARM_MAPSYMSFIRST:
2177 strcat (buf, ", mapping symbols precede others");
2178 break;
2179
2180 default:
2181 unknown = 1;
2182 break;
2183 }
2184 }
2185 break;
2186
2187 case EF_ARM_EABI_VER3:
2188 strcat (buf, ", Version3 EABI");
2189 break;
2190
2191 case EF_ARM_EABI_VER4:
2192 strcat (buf, ", Version4 EABI");
2193 while (e_flags)
2194 {
2195 unsigned flag;
2196
2197 /* Process flags one bit at a time. */
2198 flag = e_flags & - e_flags;
2199 e_flags &= ~ flag;
2200
2201 switch (flag)
2202 {
2203 case EF_ARM_BE8:
2204 strcat (buf, ", BE8");
2205 break;
2206
2207 case EF_ARM_LE8:
2208 strcat (buf, ", LE8");
2209 break;
2210
2211 default:
2212 unknown = 1;
2213 break;
2214 }
2215 break;
2216 }
2217 break;
2218
2219 case EF_ARM_EABI_VER5:
2220 strcat (buf, ", Version5 EABI");
2221 while (e_flags)
2222 {
2223 unsigned flag;
2224
2225 /* Process flags one bit at a time. */
2226 flag = e_flags & - e_flags;
2227 e_flags &= ~ flag;
2228
2229 switch (flag)
2230 {
2231 case EF_ARM_BE8:
2232 strcat (buf, ", BE8");
2233 break;
2234
2235 case EF_ARM_LE8:
2236 strcat (buf, ", LE8");
2237 break;
2238
2239 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2240 strcat (buf, ", soft-float ABI");
2241 break;
2242
2243 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2244 strcat (buf, ", hard-float ABI");
2245 break;
2246
2247 default:
2248 unknown = 1;
2249 break;
2250 }
2251 }
2252 break;
2253
2254 case EF_ARM_EABI_UNKNOWN:
2255 strcat (buf, ", GNU EABI");
2256 while (e_flags)
2257 {
2258 unsigned flag;
2259
2260 /* Process flags one bit at a time. */
2261 flag = e_flags & - e_flags;
2262 e_flags &= ~ flag;
2263
2264 switch (flag)
2265 {
2266 case EF_ARM_INTERWORK:
2267 strcat (buf, ", interworking enabled");
2268 break;
2269
2270 case EF_ARM_APCS_26:
2271 strcat (buf, ", uses APCS/26");
2272 break;
2273
2274 case EF_ARM_APCS_FLOAT:
2275 strcat (buf, ", uses APCS/float");
2276 break;
2277
2278 case EF_ARM_PIC:
2279 strcat (buf, ", position independent");
2280 break;
2281
2282 case EF_ARM_ALIGN8:
2283 strcat (buf, ", 8 bit structure alignment");
2284 break;
2285
2286 case EF_ARM_NEW_ABI:
2287 strcat (buf, ", uses new ABI");
2288 break;
2289
2290 case EF_ARM_OLD_ABI:
2291 strcat (buf, ", uses old ABI");
2292 break;
2293
2294 case EF_ARM_SOFT_FLOAT:
2295 strcat (buf, ", software FP");
2296 break;
2297
2298 case EF_ARM_VFP_FLOAT:
2299 strcat (buf, ", VFP");
2300 break;
2301
2302 case EF_ARM_MAVERICK_FLOAT:
2303 strcat (buf, ", Maverick FP");
2304 break;
2305
2306 default:
2307 unknown = 1;
2308 break;
2309 }
2310 }
2311 }
2312
2313 if (unknown)
2314 strcat (buf,_(", <unknown>"));
2315 }
2316
2317 static void
2318 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2319 {
2320 unsigned abi;
2321 unsigned arch;
2322 unsigned config;
2323 unsigned version;
2324 int has_fpu = 0;
2325 int r = 0;
2326
2327 static const char *ABI_STRINGS[] =
2328 {
2329 "ABI v0", /* use r5 as return register; only used in N1213HC */
2330 "ABI v1", /* use r0 as return register */
2331 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2332 "ABI v2fp", /* for FPU */
2333 "AABI",
2334 "ABI2 FP+"
2335 };
2336 static const char *VER_STRINGS[] =
2337 {
2338 "Andes ELF V1.3 or older",
2339 "Andes ELF V1.3.1",
2340 "Andes ELF V1.4"
2341 };
2342 static const char *ARCH_STRINGS[] =
2343 {
2344 "",
2345 "Andes Star v1.0",
2346 "Andes Star v2.0",
2347 "Andes Star v3.0",
2348 "Andes Star v3.0m"
2349 };
2350
2351 abi = EF_NDS_ABI & e_flags;
2352 arch = EF_NDS_ARCH & e_flags;
2353 config = EF_NDS_INST & e_flags;
2354 version = EF_NDS32_ELF_VERSION & e_flags;
2355
2356 memset (buf, 0, size);
2357
2358 switch (abi)
2359 {
2360 case E_NDS_ABI_V0:
2361 case E_NDS_ABI_V1:
2362 case E_NDS_ABI_V2:
2363 case E_NDS_ABI_V2FP:
2364 case E_NDS_ABI_AABI:
2365 case E_NDS_ABI_V2FP_PLUS:
2366 /* In case there are holes in the array. */
2367 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2368 break;
2369
2370 default:
2371 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2372 break;
2373 }
2374
2375 switch (version)
2376 {
2377 case E_NDS32_ELF_VER_1_2:
2378 case E_NDS32_ELF_VER_1_3:
2379 case E_NDS32_ELF_VER_1_4:
2380 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2381 break;
2382
2383 default:
2384 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2385 break;
2386 }
2387
2388 if (E_NDS_ABI_V0 == abi)
2389 {
2390 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2391 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2392 if (arch == E_NDS_ARCH_STAR_V1_0)
2393 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2394 return;
2395 }
2396
2397 switch (arch)
2398 {
2399 case E_NDS_ARCH_STAR_V1_0:
2400 case E_NDS_ARCH_STAR_V2_0:
2401 case E_NDS_ARCH_STAR_V3_0:
2402 case E_NDS_ARCH_STAR_V3_M:
2403 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2404 break;
2405
2406 default:
2407 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2408 /* ARCH version determines how the e_flags are interpreted.
2409 If it is unknown, we cannot proceed. */
2410 return;
2411 }
2412
2413 /* Newer ABI; Now handle architecture specific flags. */
2414 if (arch == E_NDS_ARCH_STAR_V1_0)
2415 {
2416 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2417 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2418
2419 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2420 r += snprintf (buf + r, size -r, ", MAC");
2421
2422 if (config & E_NDS32_HAS_DIV_INST)
2423 r += snprintf (buf + r, size -r, ", DIV");
2424
2425 if (config & E_NDS32_HAS_16BIT_INST)
2426 r += snprintf (buf + r, size -r, ", 16b");
2427 }
2428 else
2429 {
2430 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2431 {
2432 if (version <= E_NDS32_ELF_VER_1_3)
2433 r += snprintf (buf + r, size -r, ", [B8]");
2434 else
2435 r += snprintf (buf + r, size -r, ", EX9");
2436 }
2437
2438 if (config & E_NDS32_HAS_MAC_DX_INST)
2439 r += snprintf (buf + r, size -r, ", MAC_DX");
2440
2441 if (config & E_NDS32_HAS_DIV_DX_INST)
2442 r += snprintf (buf + r, size -r, ", DIV_DX");
2443
2444 if (config & E_NDS32_HAS_16BIT_INST)
2445 {
2446 if (version <= E_NDS32_ELF_VER_1_3)
2447 r += snprintf (buf + r, size -r, ", 16b");
2448 else
2449 r += snprintf (buf + r, size -r, ", IFC");
2450 }
2451 }
2452
2453 if (config & E_NDS32_HAS_EXT_INST)
2454 r += snprintf (buf + r, size -r, ", PERF1");
2455
2456 if (config & E_NDS32_HAS_EXT2_INST)
2457 r += snprintf (buf + r, size -r, ", PERF2");
2458
2459 if (config & E_NDS32_HAS_FPU_INST)
2460 {
2461 has_fpu = 1;
2462 r += snprintf (buf + r, size -r, ", FPU_SP");
2463 }
2464
2465 if (config & E_NDS32_HAS_FPU_DP_INST)
2466 {
2467 has_fpu = 1;
2468 r += snprintf (buf + r, size -r, ", FPU_DP");
2469 }
2470
2471 if (config & E_NDS32_HAS_FPU_MAC_INST)
2472 {
2473 has_fpu = 1;
2474 r += snprintf (buf + r, size -r, ", FPU_MAC");
2475 }
2476
2477 if (has_fpu)
2478 {
2479 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2480 {
2481 case E_NDS32_FPU_REG_8SP_4DP:
2482 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2483 break;
2484 case E_NDS32_FPU_REG_16SP_8DP:
2485 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2486 break;
2487 case E_NDS32_FPU_REG_32SP_16DP:
2488 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2489 break;
2490 case E_NDS32_FPU_REG_32SP_32DP:
2491 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2492 break;
2493 }
2494 }
2495
2496 if (config & E_NDS32_HAS_AUDIO_INST)
2497 r += snprintf (buf + r, size -r, ", AUDIO");
2498
2499 if (config & E_NDS32_HAS_STRING_INST)
2500 r += snprintf (buf + r, size -r, ", STR");
2501
2502 if (config & E_NDS32_HAS_REDUCED_REGS)
2503 r += snprintf (buf + r, size -r, ", 16REG");
2504
2505 if (config & E_NDS32_HAS_VIDEO_INST)
2506 {
2507 if (version <= E_NDS32_ELF_VER_1_3)
2508 r += snprintf (buf + r, size -r, ", VIDEO");
2509 else
2510 r += snprintf (buf + r, size -r, ", SATURATION");
2511 }
2512
2513 if (config & E_NDS32_HAS_ENCRIPT_INST)
2514 r += snprintf (buf + r, size -r, ", ENCRP");
2515
2516 if (config & E_NDS32_HAS_L2C_INST)
2517 r += snprintf (buf + r, size -r, ", L2C");
2518 }
2519
2520 static char *
2521 get_machine_flags (unsigned e_flags, unsigned e_machine)
2522 {
2523 static char buf[1024];
2524
2525 buf[0] = '\0';
2526
2527 if (e_flags)
2528 {
2529 switch (e_machine)
2530 {
2531 default:
2532 break;
2533
2534 case EM_ARM:
2535 decode_ARM_machine_flags (e_flags, buf);
2536 break;
2537
2538 case EM_BLACKFIN:
2539 if (e_flags & EF_BFIN_PIC)
2540 strcat (buf, ", PIC");
2541
2542 if (e_flags & EF_BFIN_FDPIC)
2543 strcat (buf, ", FDPIC");
2544
2545 if (e_flags & EF_BFIN_CODE_IN_L1)
2546 strcat (buf, ", code in L1");
2547
2548 if (e_flags & EF_BFIN_DATA_IN_L1)
2549 strcat (buf, ", data in L1");
2550
2551 break;
2552
2553 case EM_CYGNUS_FRV:
2554 switch (e_flags & EF_FRV_CPU_MASK)
2555 {
2556 case EF_FRV_CPU_GENERIC:
2557 break;
2558
2559 default:
2560 strcat (buf, ", fr???");
2561 break;
2562
2563 case EF_FRV_CPU_FR300:
2564 strcat (buf, ", fr300");
2565 break;
2566
2567 case EF_FRV_CPU_FR400:
2568 strcat (buf, ", fr400");
2569 break;
2570 case EF_FRV_CPU_FR405:
2571 strcat (buf, ", fr405");
2572 break;
2573
2574 case EF_FRV_CPU_FR450:
2575 strcat (buf, ", fr450");
2576 break;
2577
2578 case EF_FRV_CPU_FR500:
2579 strcat (buf, ", fr500");
2580 break;
2581 case EF_FRV_CPU_FR550:
2582 strcat (buf, ", fr550");
2583 break;
2584
2585 case EF_FRV_CPU_SIMPLE:
2586 strcat (buf, ", simple");
2587 break;
2588 case EF_FRV_CPU_TOMCAT:
2589 strcat (buf, ", tomcat");
2590 break;
2591 }
2592 break;
2593
2594 case EM_68K:
2595 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2596 strcat (buf, ", m68000");
2597 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2598 strcat (buf, ", cpu32");
2599 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2600 strcat (buf, ", fido_a");
2601 else
2602 {
2603 char const * isa = _("unknown");
2604 char const * mac = _("unknown mac");
2605 char const * additional = NULL;
2606
2607 switch (e_flags & EF_M68K_CF_ISA_MASK)
2608 {
2609 case EF_M68K_CF_ISA_A_NODIV:
2610 isa = "A";
2611 additional = ", nodiv";
2612 break;
2613 case EF_M68K_CF_ISA_A:
2614 isa = "A";
2615 break;
2616 case EF_M68K_CF_ISA_A_PLUS:
2617 isa = "A+";
2618 break;
2619 case EF_M68K_CF_ISA_B_NOUSP:
2620 isa = "B";
2621 additional = ", nousp";
2622 break;
2623 case EF_M68K_CF_ISA_B:
2624 isa = "B";
2625 break;
2626 case EF_M68K_CF_ISA_C:
2627 isa = "C";
2628 break;
2629 case EF_M68K_CF_ISA_C_NODIV:
2630 isa = "C";
2631 additional = ", nodiv";
2632 break;
2633 }
2634 strcat (buf, ", cf, isa ");
2635 strcat (buf, isa);
2636 if (additional)
2637 strcat (buf, additional);
2638 if (e_flags & EF_M68K_CF_FLOAT)
2639 strcat (buf, ", float");
2640 switch (e_flags & EF_M68K_CF_MAC_MASK)
2641 {
2642 case 0:
2643 mac = NULL;
2644 break;
2645 case EF_M68K_CF_MAC:
2646 mac = "mac";
2647 break;
2648 case EF_M68K_CF_EMAC:
2649 mac = "emac";
2650 break;
2651 case EF_M68K_CF_EMAC_B:
2652 mac = "emac_b";
2653 break;
2654 }
2655 if (mac)
2656 {
2657 strcat (buf, ", ");
2658 strcat (buf, mac);
2659 }
2660 }
2661 break;
2662
2663 case EM_PPC:
2664 if (e_flags & EF_PPC_EMB)
2665 strcat (buf, ", emb");
2666
2667 if (e_flags & EF_PPC_RELOCATABLE)
2668 strcat (buf, _(", relocatable"));
2669
2670 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2671 strcat (buf, _(", relocatable-lib"));
2672 break;
2673
2674 case EM_PPC64:
2675 if (e_flags & EF_PPC64_ABI)
2676 {
2677 char abi[] = ", abiv0";
2678
2679 abi[6] += e_flags & EF_PPC64_ABI;
2680 strcat (buf, abi);
2681 }
2682 break;
2683
2684 case EM_V800:
2685 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2686 strcat (buf, ", RH850 ABI");
2687
2688 if (e_flags & EF_V800_850E3)
2689 strcat (buf, ", V3 architecture");
2690
2691 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2692 strcat (buf, ", FPU not used");
2693
2694 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2695 strcat (buf, ", regmode: COMMON");
2696
2697 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2698 strcat (buf, ", r4 not used");
2699
2700 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2701 strcat (buf, ", r30 not used");
2702
2703 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2704 strcat (buf, ", r5 not used");
2705
2706 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2707 strcat (buf, ", r2 not used");
2708
2709 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2710 {
2711 switch (e_flags & - e_flags)
2712 {
2713 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2714 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2715 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2716 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2717 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2718 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2719 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2720 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2721 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2722 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2723 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2724 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2725 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2726 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2727 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2728 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2729 default: break;
2730 }
2731 }
2732 break;
2733
2734 case EM_V850:
2735 case EM_CYGNUS_V850:
2736 switch (e_flags & EF_V850_ARCH)
2737 {
2738 case E_V850E3V5_ARCH:
2739 strcat (buf, ", v850e3v5");
2740 break;
2741 case E_V850E2V3_ARCH:
2742 strcat (buf, ", v850e2v3");
2743 break;
2744 case E_V850E2_ARCH:
2745 strcat (buf, ", v850e2");
2746 break;
2747 case E_V850E1_ARCH:
2748 strcat (buf, ", v850e1");
2749 break;
2750 case E_V850E_ARCH:
2751 strcat (buf, ", v850e");
2752 break;
2753 case E_V850_ARCH:
2754 strcat (buf, ", v850");
2755 break;
2756 default:
2757 strcat (buf, _(", unknown v850 architecture variant"));
2758 break;
2759 }
2760 break;
2761
2762 case EM_M32R:
2763 case EM_CYGNUS_M32R:
2764 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2765 strcat (buf, ", m32r");
2766 break;
2767
2768 case EM_MIPS:
2769 case EM_MIPS_RS3_LE:
2770 if (e_flags & EF_MIPS_NOREORDER)
2771 strcat (buf, ", noreorder");
2772
2773 if (e_flags & EF_MIPS_PIC)
2774 strcat (buf, ", pic");
2775
2776 if (e_flags & EF_MIPS_CPIC)
2777 strcat (buf, ", cpic");
2778
2779 if (e_flags & EF_MIPS_UCODE)
2780 strcat (buf, ", ugen_reserved");
2781
2782 if (e_flags & EF_MIPS_ABI2)
2783 strcat (buf, ", abi2");
2784
2785 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2786 strcat (buf, ", odk first");
2787
2788 if (e_flags & EF_MIPS_32BITMODE)
2789 strcat (buf, ", 32bitmode");
2790
2791 if (e_flags & EF_MIPS_NAN2008)
2792 strcat (buf, ", nan2008");
2793
2794 if (e_flags & EF_MIPS_FP64)
2795 strcat (buf, ", fp64");
2796
2797 switch ((e_flags & EF_MIPS_MACH))
2798 {
2799 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2800 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2801 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2802 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2803 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2804 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2805 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2806 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2807 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2808 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2809 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2810 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2811 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2812 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2813 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2814 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2815 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2816 case 0:
2817 /* We simply ignore the field in this case to avoid confusion:
2818 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2819 extension. */
2820 break;
2821 default: strcat (buf, _(", unknown CPU")); break;
2822 }
2823
2824 switch ((e_flags & EF_MIPS_ABI))
2825 {
2826 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2827 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2828 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2829 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2830 case 0:
2831 /* We simply ignore the field in this case to avoid confusion:
2832 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2833 This means it is likely to be an o32 file, but not for
2834 sure. */
2835 break;
2836 default: strcat (buf, _(", unknown ABI")); break;
2837 }
2838
2839 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2840 strcat (buf, ", mdmx");
2841
2842 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2843 strcat (buf, ", mips16");
2844
2845 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2846 strcat (buf, ", micromips");
2847
2848 switch ((e_flags & EF_MIPS_ARCH))
2849 {
2850 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2851 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2852 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2853 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2854 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2855 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2856 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2857 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
2858 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2859 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2860 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2861 default: strcat (buf, _(", unknown ISA")); break;
2862 }
2863 break;
2864
2865 case EM_NDS32:
2866 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2867 break;
2868
2869 case EM_SH:
2870 switch ((e_flags & EF_SH_MACH_MASK))
2871 {
2872 case EF_SH1: strcat (buf, ", sh1"); break;
2873 case EF_SH2: strcat (buf, ", sh2"); break;
2874 case EF_SH3: strcat (buf, ", sh3"); break;
2875 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2876 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2877 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2878 case EF_SH3E: strcat (buf, ", sh3e"); break;
2879 case EF_SH4: strcat (buf, ", sh4"); break;
2880 case EF_SH5: strcat (buf, ", sh5"); break;
2881 case EF_SH2E: strcat (buf, ", sh2e"); break;
2882 case EF_SH4A: strcat (buf, ", sh4a"); break;
2883 case EF_SH2A: strcat (buf, ", sh2a"); break;
2884 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2885 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2886 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2887 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2888 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2889 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2890 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2891 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2892 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2893 default: strcat (buf, _(", unknown ISA")); break;
2894 }
2895
2896 if (e_flags & EF_SH_PIC)
2897 strcat (buf, ", pic");
2898
2899 if (e_flags & EF_SH_FDPIC)
2900 strcat (buf, ", fdpic");
2901 break;
2902
2903 case EM_OR1K:
2904 if (e_flags & EF_OR1K_NODELAY)
2905 strcat (buf, ", no delay");
2906 break;
2907
2908 case EM_SPARCV9:
2909 if (e_flags & EF_SPARC_32PLUS)
2910 strcat (buf, ", v8+");
2911
2912 if (e_flags & EF_SPARC_SUN_US1)
2913 strcat (buf, ", ultrasparcI");
2914
2915 if (e_flags & EF_SPARC_SUN_US3)
2916 strcat (buf, ", ultrasparcIII");
2917
2918 if (e_flags & EF_SPARC_HAL_R1)
2919 strcat (buf, ", halr1");
2920
2921 if (e_flags & EF_SPARC_LEDATA)
2922 strcat (buf, ", ledata");
2923
2924 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2925 strcat (buf, ", tso");
2926
2927 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2928 strcat (buf, ", pso");
2929
2930 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2931 strcat (buf, ", rmo");
2932 break;
2933
2934 case EM_PARISC:
2935 switch (e_flags & EF_PARISC_ARCH)
2936 {
2937 case EFA_PARISC_1_0:
2938 strcpy (buf, ", PA-RISC 1.0");
2939 break;
2940 case EFA_PARISC_1_1:
2941 strcpy (buf, ", PA-RISC 1.1");
2942 break;
2943 case EFA_PARISC_2_0:
2944 strcpy (buf, ", PA-RISC 2.0");
2945 break;
2946 default:
2947 break;
2948 }
2949 if (e_flags & EF_PARISC_TRAPNIL)
2950 strcat (buf, ", trapnil");
2951 if (e_flags & EF_PARISC_EXT)
2952 strcat (buf, ", ext");
2953 if (e_flags & EF_PARISC_LSB)
2954 strcat (buf, ", lsb");
2955 if (e_flags & EF_PARISC_WIDE)
2956 strcat (buf, ", wide");
2957 if (e_flags & EF_PARISC_NO_KABP)
2958 strcat (buf, ", no kabp");
2959 if (e_flags & EF_PARISC_LAZYSWAP)
2960 strcat (buf, ", lazyswap");
2961 break;
2962
2963 case EM_PJ:
2964 case EM_PJ_OLD:
2965 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2966 strcat (buf, ", new calling convention");
2967
2968 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2969 strcat (buf, ", gnu calling convention");
2970 break;
2971
2972 case EM_IA_64:
2973 if ((e_flags & EF_IA_64_ABI64))
2974 strcat (buf, ", 64-bit");
2975 else
2976 strcat (buf, ", 32-bit");
2977 if ((e_flags & EF_IA_64_REDUCEDFP))
2978 strcat (buf, ", reduced fp model");
2979 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2980 strcat (buf, ", no function descriptors, constant gp");
2981 else if ((e_flags & EF_IA_64_CONS_GP))
2982 strcat (buf, ", constant gp");
2983 if ((e_flags & EF_IA_64_ABSOLUTE))
2984 strcat (buf, ", absolute");
2985 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2986 {
2987 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2988 strcat (buf, ", vms_linkages");
2989 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2990 {
2991 case EF_IA_64_VMS_COMCOD_SUCCESS:
2992 break;
2993 case EF_IA_64_VMS_COMCOD_WARNING:
2994 strcat (buf, ", warning");
2995 break;
2996 case EF_IA_64_VMS_COMCOD_ERROR:
2997 strcat (buf, ", error");
2998 break;
2999 case EF_IA_64_VMS_COMCOD_ABORT:
3000 strcat (buf, ", abort");
3001 break;
3002 default:
3003 abort ();
3004 }
3005 }
3006 break;
3007
3008 case EM_VAX:
3009 if ((e_flags & EF_VAX_NONPIC))
3010 strcat (buf, ", non-PIC");
3011 if ((e_flags & EF_VAX_DFLOAT))
3012 strcat (buf, ", D-Float");
3013 if ((e_flags & EF_VAX_GFLOAT))
3014 strcat (buf, ", G-Float");
3015 break;
3016
3017 case EM_RL78:
3018 if (e_flags & E_FLAG_RL78_G10)
3019 strcat (buf, ", G10");
3020 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3021 strcat (buf, ", 64-bit doubles");
3022 break;
3023
3024 case EM_RX:
3025 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3026 strcat (buf, ", 64-bit doubles");
3027 if (e_flags & E_FLAG_RX_DSP)
3028 strcat (buf, ", dsp");
3029 if (e_flags & E_FLAG_RX_PID)
3030 strcat (buf, ", pid");
3031 if (e_flags & E_FLAG_RX_ABI)
3032 strcat (buf, ", RX ABI");
3033 break;
3034
3035 case EM_S390:
3036 if (e_flags & EF_S390_HIGH_GPRS)
3037 strcat (buf, ", highgprs");
3038 break;
3039
3040 case EM_TI_C6000:
3041 if ((e_flags & EF_C6000_REL))
3042 strcat (buf, ", relocatable module");
3043 break;
3044
3045 case EM_MSP430:
3046 strcat (buf, _(": architecture variant: "));
3047 switch (e_flags & EF_MSP430_MACH)
3048 {
3049 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3050 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3051 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3052 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3053 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3054 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3055 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3056 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3057 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3058 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3059 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3060 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3061 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3062 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3063 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3064 default:
3065 strcat (buf, _(": unknown")); break;
3066 }
3067
3068 if (e_flags & ~ EF_MSP430_MACH)
3069 strcat (buf, _(": unknown extra flag bits also present"));
3070 }
3071 }
3072
3073 return buf;
3074 }
3075
3076 static const char *
3077 get_osabi_name (unsigned int osabi)
3078 {
3079 static char buff[32];
3080
3081 switch (osabi)
3082 {
3083 case ELFOSABI_NONE: return "UNIX - System V";
3084 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3085 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3086 case ELFOSABI_GNU: return "UNIX - GNU";
3087 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3088 case ELFOSABI_AIX: return "UNIX - AIX";
3089 case ELFOSABI_IRIX: return "UNIX - IRIX";
3090 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3091 case ELFOSABI_TRU64: return "UNIX - TRU64";
3092 case ELFOSABI_MODESTO: return "Novell - Modesto";
3093 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3094 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3095 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3096 case ELFOSABI_AROS: return "AROS";
3097 case ELFOSABI_FENIXOS: return "FenixOS";
3098 default:
3099 if (osabi >= 64)
3100 switch (elf_header.e_machine)
3101 {
3102 case EM_ARM:
3103 switch (osabi)
3104 {
3105 case ELFOSABI_ARM: return "ARM";
3106 default:
3107 break;
3108 }
3109 break;
3110
3111 case EM_MSP430:
3112 case EM_MSP430_OLD:
3113 switch (osabi)
3114 {
3115 case ELFOSABI_STANDALONE: return _("Standalone App");
3116 default:
3117 break;
3118 }
3119 break;
3120
3121 case EM_TI_C6000:
3122 switch (osabi)
3123 {
3124 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3125 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3126 default:
3127 break;
3128 }
3129 break;
3130
3131 default:
3132 break;
3133 }
3134 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3135 return buff;
3136 }
3137 }
3138
3139 static const char *
3140 get_aarch64_segment_type (unsigned long type)
3141 {
3142 switch (type)
3143 {
3144 case PT_AARCH64_ARCHEXT:
3145 return "AARCH64_ARCHEXT";
3146 default:
3147 break;
3148 }
3149
3150 return NULL;
3151 }
3152
3153 static const char *
3154 get_arm_segment_type (unsigned long type)
3155 {
3156 switch (type)
3157 {
3158 case PT_ARM_EXIDX:
3159 return "EXIDX";
3160 default:
3161 break;
3162 }
3163
3164 return NULL;
3165 }
3166
3167 static const char *
3168 get_mips_segment_type (unsigned long type)
3169 {
3170 switch (type)
3171 {
3172 case PT_MIPS_REGINFO:
3173 return "REGINFO";
3174 case PT_MIPS_RTPROC:
3175 return "RTPROC";
3176 case PT_MIPS_OPTIONS:
3177 return "OPTIONS";
3178 case PT_MIPS_ABIFLAGS:
3179 return "ABIFLAGS";
3180 default:
3181 break;
3182 }
3183
3184 return NULL;
3185 }
3186
3187 static const char *
3188 get_parisc_segment_type (unsigned long type)
3189 {
3190 switch (type)
3191 {
3192 case PT_HP_TLS: return "HP_TLS";
3193 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3194 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3195 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3196 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3197 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3198 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3199 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3200 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3201 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3202 case PT_HP_PARALLEL: return "HP_PARALLEL";
3203 case PT_HP_FASTBIND: return "HP_FASTBIND";
3204 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3205 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3206 case PT_HP_STACK: return "HP_STACK";
3207 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3208 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3209 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3210 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3211 default:
3212 break;
3213 }
3214
3215 return NULL;
3216 }
3217
3218 static const char *
3219 get_ia64_segment_type (unsigned long type)
3220 {
3221 switch (type)
3222 {
3223 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3224 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3225 case PT_HP_TLS: return "HP_TLS";
3226 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3227 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3228 case PT_IA_64_HP_STACK: return "HP_STACK";
3229 default:
3230 break;
3231 }
3232
3233 return NULL;
3234 }
3235
3236 static const char *
3237 get_tic6x_segment_type (unsigned long type)
3238 {
3239 switch (type)
3240 {
3241 case PT_C6000_PHATTR: return "C6000_PHATTR";
3242 default:
3243 break;
3244 }
3245
3246 return NULL;
3247 }
3248
3249 static const char *
3250 get_segment_type (unsigned long p_type)
3251 {
3252 static char buff[32];
3253
3254 switch (p_type)
3255 {
3256 case PT_NULL: return "NULL";
3257 case PT_LOAD: return "LOAD";
3258 case PT_DYNAMIC: return "DYNAMIC";
3259 case PT_INTERP: return "INTERP";
3260 case PT_NOTE: return "NOTE";
3261 case PT_SHLIB: return "SHLIB";
3262 case PT_PHDR: return "PHDR";
3263 case PT_TLS: return "TLS";
3264
3265 case PT_GNU_EH_FRAME:
3266 return "GNU_EH_FRAME";
3267 case PT_GNU_STACK: return "GNU_STACK";
3268 case PT_GNU_RELRO: return "GNU_RELRO";
3269
3270 default:
3271 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3272 {
3273 const char * result;
3274
3275 switch (elf_header.e_machine)
3276 {
3277 case EM_AARCH64:
3278 result = get_aarch64_segment_type (p_type);
3279 break;
3280 case EM_ARM:
3281 result = get_arm_segment_type (p_type);
3282 break;
3283 case EM_MIPS:
3284 case EM_MIPS_RS3_LE:
3285 result = get_mips_segment_type (p_type);
3286 break;
3287 case EM_PARISC:
3288 result = get_parisc_segment_type (p_type);
3289 break;
3290 case EM_IA_64:
3291 result = get_ia64_segment_type (p_type);
3292 break;
3293 case EM_TI_C6000:
3294 result = get_tic6x_segment_type (p_type);
3295 break;
3296 default:
3297 result = NULL;
3298 break;
3299 }
3300
3301 if (result != NULL)
3302 return result;
3303
3304 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3305 }
3306 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3307 {
3308 const char * result;
3309
3310 switch (elf_header.e_machine)
3311 {
3312 case EM_PARISC:
3313 result = get_parisc_segment_type (p_type);
3314 break;
3315 case EM_IA_64:
3316 result = get_ia64_segment_type (p_type);
3317 break;
3318 default:
3319 result = NULL;
3320 break;
3321 }
3322
3323 if (result != NULL)
3324 return result;
3325
3326 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3327 }
3328 else
3329 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3330
3331 return buff;
3332 }
3333 }
3334
3335 static const char *
3336 get_mips_section_type_name (unsigned int sh_type)
3337 {
3338 switch (sh_type)
3339 {
3340 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3341 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3342 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3343 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3344 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3345 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3346 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3347 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3348 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3349 case SHT_MIPS_RELD: return "MIPS_RELD";
3350 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3351 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3352 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3353 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3354 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3355 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3356 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3357 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3358 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3359 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3360 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3361 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3362 case SHT_MIPS_LINE: return "MIPS_LINE";
3363 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3364 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3365 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3366 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3367 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3368 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3369 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3370 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3371 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3372 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3373 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3374 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3375 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3376 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3377 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3378 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3379 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3380 default:
3381 break;
3382 }
3383 return NULL;
3384 }
3385
3386 static const char *
3387 get_parisc_section_type_name (unsigned int sh_type)
3388 {
3389 switch (sh_type)
3390 {
3391 case SHT_PARISC_EXT: return "PARISC_EXT";
3392 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3393 case SHT_PARISC_DOC: return "PARISC_DOC";
3394 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3395 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3396 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3397 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3398 default:
3399 break;
3400 }
3401 return NULL;
3402 }
3403
3404 static const char *
3405 get_ia64_section_type_name (unsigned int sh_type)
3406 {
3407 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3408 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3409 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3410
3411 switch (sh_type)
3412 {
3413 case SHT_IA_64_EXT: return "IA_64_EXT";
3414 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3415 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3416 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3417 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3418 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3419 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3420 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3421 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3422 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3423 default:
3424 break;
3425 }
3426 return NULL;
3427 }
3428
3429 static const char *
3430 get_x86_64_section_type_name (unsigned int sh_type)
3431 {
3432 switch (sh_type)
3433 {
3434 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3435 default:
3436 break;
3437 }
3438 return NULL;
3439 }
3440
3441 static const char *
3442 get_aarch64_section_type_name (unsigned int sh_type)
3443 {
3444 switch (sh_type)
3445 {
3446 case SHT_AARCH64_ATTRIBUTES:
3447 return "AARCH64_ATTRIBUTES";
3448 default:
3449 break;
3450 }
3451 return NULL;
3452 }
3453
3454 static const char *
3455 get_arm_section_type_name (unsigned int sh_type)
3456 {
3457 switch (sh_type)
3458 {
3459 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3460 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3461 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3462 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3463 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3464 default:
3465 break;
3466 }
3467 return NULL;
3468 }
3469
3470 static const char *
3471 get_tic6x_section_type_name (unsigned int sh_type)
3472 {
3473 switch (sh_type)
3474 {
3475 case SHT_C6000_UNWIND:
3476 return "C6000_UNWIND";
3477 case SHT_C6000_PREEMPTMAP:
3478 return "C6000_PREEMPTMAP";
3479 case SHT_C6000_ATTRIBUTES:
3480 return "C6000_ATTRIBUTES";
3481 case SHT_TI_ICODE:
3482 return "TI_ICODE";
3483 case SHT_TI_XREF:
3484 return "TI_XREF";
3485 case SHT_TI_HANDLER:
3486 return "TI_HANDLER";
3487 case SHT_TI_INITINFO:
3488 return "TI_INITINFO";
3489 case SHT_TI_PHATTRS:
3490 return "TI_PHATTRS";
3491 default:
3492 break;
3493 }
3494 return NULL;
3495 }
3496
3497 static const char *
3498 get_msp430x_section_type_name (unsigned int sh_type)
3499 {
3500 switch (sh_type)
3501 {
3502 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3503 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3504 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3505 default: return NULL;
3506 }
3507 }
3508
3509 static const char *
3510 get_section_type_name (unsigned int sh_type)
3511 {
3512 static char buff[32];
3513
3514 switch (sh_type)
3515 {
3516 case SHT_NULL: return "NULL";
3517 case SHT_PROGBITS: return "PROGBITS";
3518 case SHT_SYMTAB: return "SYMTAB";
3519 case SHT_STRTAB: return "STRTAB";
3520 case SHT_RELA: return "RELA";
3521 case SHT_HASH: return "HASH";
3522 case SHT_DYNAMIC: return "DYNAMIC";
3523 case SHT_NOTE: return "NOTE";
3524 case SHT_NOBITS: return "NOBITS";
3525 case SHT_REL: return "REL";
3526 case SHT_SHLIB: return "SHLIB";
3527 case SHT_DYNSYM: return "DYNSYM";
3528 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3529 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3530 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3531 case SHT_GNU_HASH: return "GNU_HASH";
3532 case SHT_GROUP: return "GROUP";
3533 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3534 case SHT_GNU_verdef: return "VERDEF";
3535 case SHT_GNU_verneed: return "VERNEED";
3536 case SHT_GNU_versym: return "VERSYM";
3537 case 0x6ffffff0: return "VERSYM";
3538 case 0x6ffffffc: return "VERDEF";
3539 case 0x7ffffffd: return "AUXILIARY";
3540 case 0x7fffffff: return "FILTER";
3541 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3542
3543 default:
3544 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3545 {
3546 const char * result;
3547
3548 switch (elf_header.e_machine)
3549 {
3550 case EM_MIPS:
3551 case EM_MIPS_RS3_LE:
3552 result = get_mips_section_type_name (sh_type);
3553 break;
3554 case EM_PARISC:
3555 result = get_parisc_section_type_name (sh_type);
3556 break;
3557 case EM_IA_64:
3558 result = get_ia64_section_type_name (sh_type);
3559 break;
3560 case EM_X86_64:
3561 case EM_L1OM:
3562 case EM_K1OM:
3563 result = get_x86_64_section_type_name (sh_type);
3564 break;
3565 case EM_AARCH64:
3566 result = get_aarch64_section_type_name (sh_type);
3567 break;
3568 case EM_ARM:
3569 result = get_arm_section_type_name (sh_type);
3570 break;
3571 case EM_TI_C6000:
3572 result = get_tic6x_section_type_name (sh_type);
3573 break;
3574 case EM_MSP430:
3575 result = get_msp430x_section_type_name (sh_type);
3576 break;
3577 default:
3578 result = NULL;
3579 break;
3580 }
3581
3582 if (result != NULL)
3583 return result;
3584
3585 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3586 }
3587 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3588 {
3589 const char * result;
3590
3591 switch (elf_header.e_machine)
3592 {
3593 case EM_IA_64:
3594 result = get_ia64_section_type_name (sh_type);
3595 break;
3596 default:
3597 result = NULL;
3598 break;
3599 }
3600
3601 if (result != NULL)
3602 return result;
3603
3604 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3605 }
3606 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3607 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3608 else
3609 /* This message is probably going to be displayed in a 15
3610 character wide field, so put the hex value first. */
3611 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3612
3613 return buff;
3614 }
3615 }
3616
3617 #define OPTION_DEBUG_DUMP 512
3618 #define OPTION_DYN_SYMS 513
3619 #define OPTION_DWARF_DEPTH 514
3620 #define OPTION_DWARF_START 515
3621 #define OPTION_DWARF_CHECK 516
3622
3623 static struct option options[] =
3624 {
3625 {"all", no_argument, 0, 'a'},
3626 {"file-header", no_argument, 0, 'h'},
3627 {"program-headers", no_argument, 0, 'l'},
3628 {"headers", no_argument, 0, 'e'},
3629 {"histogram", no_argument, 0, 'I'},
3630 {"segments", no_argument, 0, 'l'},
3631 {"sections", no_argument, 0, 'S'},
3632 {"section-headers", no_argument, 0, 'S'},
3633 {"section-groups", no_argument, 0, 'g'},
3634 {"section-details", no_argument, 0, 't'},
3635 {"full-section-name",no_argument, 0, 'N'},
3636 {"symbols", no_argument, 0, 's'},
3637 {"syms", no_argument, 0, 's'},
3638 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3639 {"relocs", no_argument, 0, 'r'},
3640 {"notes", no_argument, 0, 'n'},
3641 {"dynamic", no_argument, 0, 'd'},
3642 {"arch-specific", no_argument, 0, 'A'},
3643 {"version-info", no_argument, 0, 'V'},
3644 {"use-dynamic", no_argument, 0, 'D'},
3645 {"unwind", no_argument, 0, 'u'},
3646 {"archive-index", no_argument, 0, 'c'},
3647 {"hex-dump", required_argument, 0, 'x'},
3648 {"relocated-dump", required_argument, 0, 'R'},
3649 {"string-dump", required_argument, 0, 'p'},
3650 #ifdef SUPPORT_DISASSEMBLY
3651 {"instruction-dump", required_argument, 0, 'i'},
3652 #endif
3653 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3654
3655 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3656 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3657 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3658
3659 {"version", no_argument, 0, 'v'},
3660 {"wide", no_argument, 0, 'W'},
3661 {"help", no_argument, 0, 'H'},
3662 {0, no_argument, 0, 0}
3663 };
3664
3665 static void
3666 usage (FILE * stream)
3667 {
3668 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3669 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3670 fprintf (stream, _(" Options are:\n\
3671 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3672 -h --file-header Display the ELF file header\n\
3673 -l --program-headers Display the program headers\n\
3674 --segments An alias for --program-headers\n\
3675 -S --section-headers Display the sections' header\n\
3676 --sections An alias for --section-headers\n\
3677 -g --section-groups Display the section groups\n\
3678 -t --section-details Display the section details\n\
3679 -e --headers Equivalent to: -h -l -S\n\
3680 -s --syms Display the symbol table\n\
3681 --symbols An alias for --syms\n\
3682 --dyn-syms Display the dynamic symbol table\n\
3683 -n --notes Display the core notes (if present)\n\
3684 -r --relocs Display the relocations (if present)\n\
3685 -u --unwind Display the unwind info (if present)\n\
3686 -d --dynamic Display the dynamic section (if present)\n\
3687 -V --version-info Display the version sections (if present)\n\
3688 -A --arch-specific Display architecture specific information (if any)\n\
3689 -c --archive-index Display the symbol/file index in an archive\n\
3690 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3691 -x --hex-dump=<number|name>\n\
3692 Dump the contents of section <number|name> as bytes\n\
3693 -p --string-dump=<number|name>\n\
3694 Dump the contents of section <number|name> as strings\n\
3695 -R --relocated-dump=<number|name>\n\
3696 Dump the contents of section <number|name> as relocated bytes\n\
3697 -w[lLiaprmfFsoRt] or\n\
3698 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3699 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3700 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3701 =addr,=cu_index]\n\
3702 Display the contents of DWARF2 debug sections\n"));
3703 fprintf (stream, _("\
3704 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3705 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3706 or deeper\n"));
3707 #ifdef SUPPORT_DISASSEMBLY
3708 fprintf (stream, _("\
3709 -i --instruction-dump=<number|name>\n\
3710 Disassemble the contents of section <number|name>\n"));
3711 #endif
3712 fprintf (stream, _("\
3713 -I --histogram Display histogram of bucket list lengths\n\
3714 -W --wide Allow output width to exceed 80 characters\n\
3715 @<file> Read options from <file>\n\
3716 -H --help Display this information\n\
3717 -v --version Display the version number of readelf\n"));
3718
3719 if (REPORT_BUGS_TO[0] && stream == stdout)
3720 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3721
3722 exit (stream == stdout ? 0 : 1);
3723 }
3724
3725 /* Record the fact that the user wants the contents of section number
3726 SECTION to be displayed using the method(s) encoded as flags bits
3727 in TYPE. Note, TYPE can be zero if we are creating the array for
3728 the first time. */
3729
3730 static void
3731 request_dump_bynumber (unsigned int section, dump_type type)
3732 {
3733 if (section >= num_dump_sects)
3734 {
3735 dump_type * new_dump_sects;
3736
3737 new_dump_sects = (dump_type *) calloc (section + 1,
3738 sizeof (* dump_sects));
3739
3740 if (new_dump_sects == NULL)
3741 error (_("Out of memory allocating dump request table.\n"));
3742 else
3743 {
3744 /* Copy current flag settings. */
3745 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3746
3747 free (dump_sects);
3748
3749 dump_sects = new_dump_sects;
3750 num_dump_sects = section + 1;
3751 }
3752 }
3753
3754 if (dump_sects)
3755 dump_sects[section] |= type;
3756
3757 return;
3758 }
3759
3760 /* Request a dump by section name. */
3761
3762 static void
3763 request_dump_byname (const char * section, dump_type type)
3764 {
3765 struct dump_list_entry * new_request;
3766
3767 new_request = (struct dump_list_entry *)
3768 malloc (sizeof (struct dump_list_entry));
3769 if (!new_request)
3770 error (_("Out of memory allocating dump request table.\n"));
3771
3772 new_request->name = strdup (section);
3773 if (!new_request->name)
3774 error (_("Out of memory allocating dump request table.\n"));
3775
3776 new_request->type = type;
3777
3778 new_request->next = dump_sects_byname;
3779 dump_sects_byname = new_request;
3780 }
3781
3782 static inline void
3783 request_dump (dump_type type)
3784 {
3785 int section;
3786 char * cp;
3787
3788 do_dump++;
3789 section = strtoul (optarg, & cp, 0);
3790
3791 if (! *cp && section >= 0)
3792 request_dump_bynumber (section, type);
3793 else
3794 request_dump_byname (optarg, type);
3795 }
3796
3797
3798 static void
3799 parse_args (int argc, char ** argv)
3800 {
3801 int c;
3802
3803 if (argc < 2)
3804 usage (stderr);
3805
3806 while ((c = getopt_long
3807 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3808 {
3809 switch (c)
3810 {
3811 case 0:
3812 /* Long options. */
3813 break;
3814 case 'H':
3815 usage (stdout);
3816 break;
3817
3818 case 'a':
3819 do_syms++;
3820 do_reloc++;
3821 do_unwind++;
3822 do_dynamic++;
3823 do_header++;
3824 do_sections++;
3825 do_section_groups++;
3826 do_segments++;
3827 do_version++;
3828 do_histogram++;
3829 do_arch++;
3830 do_notes++;
3831 break;
3832 case 'g':
3833 do_section_groups++;
3834 break;
3835 case 't':
3836 case 'N':
3837 do_sections++;
3838 do_section_details++;
3839 break;
3840 case 'e':
3841 do_header++;
3842 do_sections++;
3843 do_segments++;
3844 break;
3845 case 'A':
3846 do_arch++;
3847 break;
3848 case 'D':
3849 do_using_dynamic++;
3850 break;
3851 case 'r':
3852 do_reloc++;
3853 break;
3854 case 'u':
3855 do_unwind++;
3856 break;
3857 case 'h':
3858 do_header++;
3859 break;
3860 case 'l':
3861 do_segments++;
3862 break;
3863 case 's':
3864 do_syms++;
3865 break;
3866 case 'S':
3867 do_sections++;
3868 break;
3869 case 'd':
3870 do_dynamic++;
3871 break;
3872 case 'I':
3873 do_histogram++;
3874 break;
3875 case 'n':
3876 do_notes++;
3877 break;
3878 case 'c':
3879 do_archive_index++;
3880 break;
3881 case 'x':
3882 request_dump (HEX_DUMP);
3883 break;
3884 case 'p':
3885 request_dump (STRING_DUMP);
3886 break;
3887 case 'R':
3888 request_dump (RELOC_DUMP);
3889 break;
3890 case 'w':
3891 do_dump++;
3892 if (optarg == 0)
3893 {
3894 do_debugging = 1;
3895 dwarf_select_sections_all ();
3896 }
3897 else
3898 {
3899 do_debugging = 0;
3900 dwarf_select_sections_by_letters (optarg);
3901 }
3902 break;
3903 case OPTION_DEBUG_DUMP:
3904 do_dump++;
3905 if (optarg == 0)
3906 do_debugging = 1;
3907 else
3908 {
3909 do_debugging = 0;
3910 dwarf_select_sections_by_names (optarg);
3911 }
3912 break;
3913 case OPTION_DWARF_DEPTH:
3914 {
3915 char *cp;
3916
3917 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3918 }
3919 break;
3920 case OPTION_DWARF_START:
3921 {
3922 char *cp;
3923
3924 dwarf_start_die = strtoul (optarg, & cp, 0);
3925 }
3926 break;
3927 case OPTION_DWARF_CHECK:
3928 dwarf_check = 1;
3929 break;
3930 case OPTION_DYN_SYMS:
3931 do_dyn_syms++;
3932 break;
3933 #ifdef SUPPORT_DISASSEMBLY
3934 case 'i':
3935 request_dump (DISASS_DUMP);
3936 break;
3937 #endif
3938 case 'v':
3939 print_version (program_name);
3940 break;
3941 case 'V':
3942 do_version++;
3943 break;
3944 case 'W':
3945 do_wide++;
3946 break;
3947 default:
3948 /* xgettext:c-format */
3949 error (_("Invalid option '-%c'\n"), c);
3950 /* Drop through. */
3951 case '?':
3952 usage (stderr);
3953 }
3954 }
3955
3956 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3957 && !do_segments && !do_header && !do_dump && !do_version
3958 && !do_histogram && !do_debugging && !do_arch && !do_notes
3959 && !do_section_groups && !do_archive_index
3960 && !do_dyn_syms)
3961 usage (stderr);
3962 else if (argc < 3)
3963 {
3964 warn (_("Nothing to do.\n"));
3965 usage (stderr);
3966 }
3967 }
3968
3969 static const char *
3970 get_elf_class (unsigned int elf_class)
3971 {
3972 static char buff[32];
3973
3974 switch (elf_class)
3975 {
3976 case ELFCLASSNONE: return _("none");
3977 case ELFCLASS32: return "ELF32";
3978 case ELFCLASS64: return "ELF64";
3979 default:
3980 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3981 return buff;
3982 }
3983 }
3984
3985 static const char *
3986 get_data_encoding (unsigned int encoding)
3987 {
3988 static char buff[32];
3989
3990 switch (encoding)
3991 {
3992 case ELFDATANONE: return _("none");
3993 case ELFDATA2LSB: return _("2's complement, little endian");
3994 case ELFDATA2MSB: return _("2's complement, big endian");
3995 default:
3996 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3997 return buff;
3998 }
3999 }
4000
4001 /* Decode the data held in 'elf_header'. */
4002
4003 static int
4004 process_file_header (void)
4005 {
4006 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4007 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4008 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4009 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4010 {
4011 error
4012 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4013 return 0;
4014 }
4015
4016 init_dwarf_regnames (elf_header.e_machine);
4017
4018 if (do_header)
4019 {
4020 int i;
4021
4022 printf (_("ELF Header:\n"));
4023 printf (_(" Magic: "));
4024 for (i = 0; i < EI_NIDENT; i++)
4025 printf ("%2.2x ", elf_header.e_ident[i]);
4026 printf ("\n");
4027 printf (_(" Class: %s\n"),
4028 get_elf_class (elf_header.e_ident[EI_CLASS]));
4029 printf (_(" Data: %s\n"),
4030 get_data_encoding (elf_header.e_ident[EI_DATA]));
4031 printf (_(" Version: %d %s\n"),
4032 elf_header.e_ident[EI_VERSION],
4033 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4034 ? "(current)"
4035 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4036 ? _("<unknown: %lx>")
4037 : "")));
4038 printf (_(" OS/ABI: %s\n"),
4039 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4040 printf (_(" ABI Version: %d\n"),
4041 elf_header.e_ident[EI_ABIVERSION]);
4042 printf (_(" Type: %s\n"),
4043 get_file_type (elf_header.e_type));
4044 printf (_(" Machine: %s\n"),
4045 get_machine_name (elf_header.e_machine));
4046 printf (_(" Version: 0x%lx\n"),
4047 (unsigned long) elf_header.e_version);
4048
4049 printf (_(" Entry point address: "));
4050 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4051 printf (_("\n Start of program headers: "));
4052 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4053 printf (_(" (bytes into file)\n Start of section headers: "));
4054 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4055 printf (_(" (bytes into file)\n"));
4056
4057 printf (_(" Flags: 0x%lx%s\n"),
4058 (unsigned long) elf_header.e_flags,
4059 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4060 printf (_(" Size of this header: %ld (bytes)\n"),
4061 (long) elf_header.e_ehsize);
4062 printf (_(" Size of program headers: %ld (bytes)\n"),
4063 (long) elf_header.e_phentsize);
4064 printf (_(" Number of program headers: %ld"),
4065 (long) elf_header.e_phnum);
4066 if (section_headers != NULL
4067 && elf_header.e_phnum == PN_XNUM
4068 && section_headers[0].sh_info != 0)
4069 printf (" (%ld)", (long) section_headers[0].sh_info);
4070 putc ('\n', stdout);
4071 printf (_(" Size of section headers: %ld (bytes)\n"),
4072 (long) elf_header.e_shentsize);
4073 printf (_(" Number of section headers: %ld"),
4074 (long) elf_header.e_shnum);
4075 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4076 printf (" (%ld)", (long) section_headers[0].sh_size);
4077 putc ('\n', stdout);
4078 printf (_(" Section header string table index: %ld"),
4079 (long) elf_header.e_shstrndx);
4080 if (section_headers != NULL
4081 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4082 printf (" (%u)", section_headers[0].sh_link);
4083 else if (elf_header.e_shstrndx != SHN_UNDEF
4084 && elf_header.e_shstrndx >= elf_header.e_shnum)
4085 printf (_(" <corrupt: out of range>"));
4086 putc ('\n', stdout);
4087 }
4088
4089 if (section_headers != NULL)
4090 {
4091 if (elf_header.e_phnum == PN_XNUM
4092 && section_headers[0].sh_info != 0)
4093 elf_header.e_phnum = section_headers[0].sh_info;
4094 if (elf_header.e_shnum == SHN_UNDEF)
4095 elf_header.e_shnum = section_headers[0].sh_size;
4096 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4097 elf_header.e_shstrndx = section_headers[0].sh_link;
4098 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4099 elf_header.e_shstrndx = SHN_UNDEF;
4100 free (section_headers);
4101 section_headers = NULL;
4102 }
4103
4104 return 1;
4105 }
4106
4107 static bfd_boolean
4108 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4109 {
4110 Elf32_External_Phdr * phdrs;
4111 Elf32_External_Phdr * external;
4112 Elf_Internal_Phdr * internal;
4113 unsigned int i;
4114 unsigned int size = elf_header.e_phentsize;
4115 unsigned int num = elf_header.e_phnum;
4116
4117 /* PR binutils/17531: Cope with unexpected section header sizes. */
4118 if (size == 0 || num == 0)
4119 return FALSE;
4120 if (size < sizeof * phdrs)
4121 {
4122 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4123 return FALSE;
4124 }
4125 if (size > sizeof * phdrs)
4126 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4127
4128 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4129 size, num, _("program headers"));
4130 if (phdrs == NULL)
4131 return FALSE;
4132
4133 for (i = 0, internal = pheaders, external = phdrs;
4134 i < elf_header.e_phnum;
4135 i++, internal++, external++)
4136 {
4137 internal->p_type = BYTE_GET (external->p_type);
4138 internal->p_offset = BYTE_GET (external->p_offset);
4139 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4140 internal->p_paddr = BYTE_GET (external->p_paddr);
4141 internal->p_filesz = BYTE_GET (external->p_filesz);
4142 internal->p_memsz = BYTE_GET (external->p_memsz);
4143 internal->p_flags = BYTE_GET (external->p_flags);
4144 internal->p_align = BYTE_GET (external->p_align);
4145 }
4146
4147 free (phdrs);
4148 return TRUE;
4149 }
4150
4151 static bfd_boolean
4152 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4153 {
4154 Elf64_External_Phdr * phdrs;
4155 Elf64_External_Phdr * external;
4156 Elf_Internal_Phdr * internal;
4157 unsigned int i;
4158 unsigned int size = elf_header.e_phentsize;
4159 unsigned int num = elf_header.e_phnum;
4160
4161 /* PR binutils/17531: Cope with unexpected section header sizes. */
4162 if (size == 0 || num == 0)
4163 return FALSE;
4164 if (size < sizeof * phdrs)
4165 {
4166 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4167 return FALSE;
4168 }
4169 if (size > sizeof * phdrs)
4170 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4171
4172 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4173 size, num, _("program headers"));
4174 if (!phdrs)
4175 return FALSE;
4176
4177 for (i = 0, internal = pheaders, external = phdrs;
4178 i < elf_header.e_phnum;
4179 i++, internal++, external++)
4180 {
4181 internal->p_type = BYTE_GET (external->p_type);
4182 internal->p_flags = BYTE_GET (external->p_flags);
4183 internal->p_offset = BYTE_GET (external->p_offset);
4184 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4185 internal->p_paddr = BYTE_GET (external->p_paddr);
4186 internal->p_filesz = BYTE_GET (external->p_filesz);
4187 internal->p_memsz = BYTE_GET (external->p_memsz);
4188 internal->p_align = BYTE_GET (external->p_align);
4189 }
4190
4191 free (phdrs);
4192 return TRUE;
4193 }
4194
4195 /* Returns 1 if the program headers were read into `program_headers'. */
4196
4197 static int
4198 get_program_headers (FILE * file)
4199 {
4200 Elf_Internal_Phdr * phdrs;
4201
4202 /* Check cache of prior read. */
4203 if (program_headers != NULL)
4204 return 1;
4205
4206 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4207 sizeof (Elf_Internal_Phdr));
4208
4209 if (phdrs == NULL)
4210 {
4211 error (_("Out of memory\n"));
4212 return 0;
4213 }
4214
4215 if (is_32bit_elf
4216 ? get_32bit_program_headers (file, phdrs)
4217 : get_64bit_program_headers (file, phdrs))
4218 {
4219 program_headers = phdrs;
4220 return 1;
4221 }
4222
4223 free (phdrs);
4224 return 0;
4225 }
4226
4227 /* Returns 1 if the program headers were loaded. */
4228
4229 static int
4230 process_program_headers (FILE * file)
4231 {
4232 Elf_Internal_Phdr * segment;
4233 unsigned int i;
4234
4235 if (elf_header.e_phnum == 0)
4236 {
4237 /* PR binutils/12467. */
4238 if (elf_header.e_phoff != 0)
4239 warn (_("possibly corrupt ELF header - it has a non-zero program"
4240 " header offset, but no program headers"));
4241 else if (do_segments)
4242 printf (_("\nThere are no program headers in this file.\n"));
4243 return 0;
4244 }
4245
4246 if (do_segments && !do_header)
4247 {
4248 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4249 printf (_("Entry point "));
4250 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4251 printf (_("\nThere are %d program headers, starting at offset "),
4252 elf_header.e_phnum);
4253 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4254 printf ("\n");
4255 }
4256
4257 if (! get_program_headers (file))
4258 return 0;
4259
4260 if (do_segments)
4261 {
4262 if (elf_header.e_phnum > 1)
4263 printf (_("\nProgram Headers:\n"));
4264 else
4265 printf (_("\nProgram Headers:\n"));
4266
4267 if (is_32bit_elf)
4268 printf
4269 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4270 else if (do_wide)
4271 printf
4272 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4273 else
4274 {
4275 printf
4276 (_(" Type Offset VirtAddr PhysAddr\n"));
4277 printf
4278 (_(" FileSiz MemSiz Flags Align\n"));
4279 }
4280 }
4281
4282 dynamic_addr = 0;
4283 dynamic_size = 0;
4284
4285 for (i = 0, segment = program_headers;
4286 i < elf_header.e_phnum;
4287 i++, segment++)
4288 {
4289 if (do_segments)
4290 {
4291 printf (" %-14.14s ", get_segment_type (segment->p_type));
4292
4293 if (is_32bit_elf)
4294 {
4295 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4296 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4297 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4298 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4299 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4300 printf ("%c%c%c ",
4301 (segment->p_flags & PF_R ? 'R' : ' '),
4302 (segment->p_flags & PF_W ? 'W' : ' '),
4303 (segment->p_flags & PF_X ? 'E' : ' '));
4304 printf ("%#lx", (unsigned long) segment->p_align);
4305 }
4306 else if (do_wide)
4307 {
4308 if ((unsigned long) segment->p_offset == segment->p_offset)
4309 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4310 else
4311 {
4312 print_vma (segment->p_offset, FULL_HEX);
4313 putchar (' ');
4314 }
4315
4316 print_vma (segment->p_vaddr, FULL_HEX);
4317 putchar (' ');
4318 print_vma (segment->p_paddr, FULL_HEX);
4319 putchar (' ');
4320
4321 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4322 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4323 else
4324 {
4325 print_vma (segment->p_filesz, FULL_HEX);
4326 putchar (' ');
4327 }
4328
4329 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4330 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4331 else
4332 {
4333 print_vma (segment->p_memsz, FULL_HEX);
4334 }
4335
4336 printf (" %c%c%c ",
4337 (segment->p_flags & PF_R ? 'R' : ' '),
4338 (segment->p_flags & PF_W ? 'W' : ' '),
4339 (segment->p_flags & PF_X ? 'E' : ' '));
4340
4341 if ((unsigned long) segment->p_align == segment->p_align)
4342 printf ("%#lx", (unsigned long) segment->p_align);
4343 else
4344 {
4345 print_vma (segment->p_align, PREFIX_HEX);
4346 }
4347 }
4348 else
4349 {
4350 print_vma (segment->p_offset, FULL_HEX);
4351 putchar (' ');
4352 print_vma (segment->p_vaddr, FULL_HEX);
4353 putchar (' ');
4354 print_vma (segment->p_paddr, FULL_HEX);
4355 printf ("\n ");
4356 print_vma (segment->p_filesz, FULL_HEX);
4357 putchar (' ');
4358 print_vma (segment->p_memsz, FULL_HEX);
4359 printf (" %c%c%c ",
4360 (segment->p_flags & PF_R ? 'R' : ' '),
4361 (segment->p_flags & PF_W ? 'W' : ' '),
4362 (segment->p_flags & PF_X ? 'E' : ' '));
4363 print_vma (segment->p_align, HEX);
4364 }
4365 }
4366
4367 if (do_segments)
4368 putc ('\n', stdout);
4369
4370 switch (segment->p_type)
4371 {
4372 case PT_DYNAMIC:
4373 if (dynamic_addr)
4374 error (_("more than one dynamic segment\n"));
4375
4376 /* By default, assume that the .dynamic section is the first
4377 section in the DYNAMIC segment. */
4378 dynamic_addr = segment->p_offset;
4379 dynamic_size = segment->p_filesz;
4380 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4381 if (dynamic_addr + dynamic_size >= current_file_size)
4382 {
4383 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4384 dynamic_addr = dynamic_size = 0;
4385 }
4386
4387 /* Try to locate the .dynamic section. If there is
4388 a section header table, we can easily locate it. */
4389 if (section_headers != NULL)
4390 {
4391 Elf_Internal_Shdr * sec;
4392
4393 sec = find_section (".dynamic");
4394 if (sec == NULL || sec->sh_size == 0)
4395 {
4396 /* A corresponding .dynamic section is expected, but on
4397 IA-64/OpenVMS it is OK for it to be missing. */
4398 if (!is_ia64_vms ())
4399 error (_("no .dynamic section in the dynamic segment\n"));
4400 break;
4401 }
4402
4403 if (sec->sh_type == SHT_NOBITS)
4404 {
4405 dynamic_size = 0;
4406 break;
4407 }
4408
4409 dynamic_addr = sec->sh_offset;
4410 dynamic_size = sec->sh_size;
4411
4412 if (dynamic_addr < segment->p_offset
4413 || dynamic_addr > segment->p_offset + segment->p_filesz)
4414 warn (_("the .dynamic section is not contained"
4415 " within the dynamic segment\n"));
4416 else if (dynamic_addr > segment->p_offset)
4417 warn (_("the .dynamic section is not the first section"
4418 " in the dynamic segment.\n"));
4419 }
4420 break;
4421
4422 case PT_INTERP:
4423 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4424 SEEK_SET))
4425 error (_("Unable to find program interpreter name\n"));
4426 else
4427 {
4428 char fmt [32];
4429 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4430
4431 if (ret >= (int) sizeof (fmt) || ret < 0)
4432 error (_("Internal error: failed to create format string to display program interpreter\n"));
4433
4434 program_interpreter[0] = 0;
4435 if (fscanf (file, fmt, program_interpreter) <= 0)
4436 error (_("Unable to read program interpreter name\n"));
4437
4438 if (do_segments)
4439 printf (_(" [Requesting program interpreter: %s]\n"),
4440 program_interpreter);
4441 }
4442 break;
4443 }
4444 }
4445
4446 if (do_segments && section_headers != NULL && string_table != NULL)
4447 {
4448 printf (_("\n Section to Segment mapping:\n"));
4449 printf (_(" Segment Sections...\n"));
4450
4451 for (i = 0; i < elf_header.e_phnum; i++)
4452 {
4453 unsigned int j;
4454 Elf_Internal_Shdr * section;
4455
4456 segment = program_headers + i;
4457 section = section_headers + 1;
4458
4459 printf (" %2.2d ", i);
4460
4461 for (j = 1; j < elf_header.e_shnum; j++, section++)
4462 {
4463 if (!ELF_TBSS_SPECIAL (section, segment)
4464 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4465 printf ("%s ", SECTION_NAME (section));
4466 }
4467
4468 putc ('\n',stdout);
4469 }
4470 }
4471
4472 return 1;
4473 }
4474
4475
4476 /* Find the file offset corresponding to VMA by using the program headers. */
4477
4478 static long
4479 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4480 {
4481 Elf_Internal_Phdr * seg;
4482
4483 if (! get_program_headers (file))
4484 {
4485 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4486 return (long) vma;
4487 }
4488
4489 for (seg = program_headers;
4490 seg < program_headers + elf_header.e_phnum;
4491 ++seg)
4492 {
4493 if (seg->p_type != PT_LOAD)
4494 continue;
4495
4496 if (vma >= (seg->p_vaddr & -seg->p_align)
4497 && vma + size <= seg->p_vaddr + seg->p_filesz)
4498 return vma - seg->p_vaddr + seg->p_offset;
4499 }
4500
4501 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4502 (unsigned long) vma);
4503 return (long) vma;
4504 }
4505
4506
4507 /* Allocate memory and load the sections headers into the global pointer
4508 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4509 generate any error messages if the load fails. */
4510
4511 static bfd_boolean
4512 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4513 {
4514 Elf32_External_Shdr * shdrs;
4515 Elf_Internal_Shdr * internal;
4516 unsigned int i;
4517 unsigned int size = elf_header.e_shentsize;
4518 unsigned int num = probe ? 1 : elf_header.e_shnum;
4519
4520 /* PR binutils/17531: Cope with unexpected section header sizes. */
4521 if (size == 0 || num == 0)
4522 return FALSE;
4523 if (size < sizeof * shdrs)
4524 {
4525 if (! probe)
4526 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4527 return FALSE;
4528 }
4529 if (!probe && size > sizeof * shdrs)
4530 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4531
4532 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4533 size, num,
4534 probe ? NULL : _("section headers"));
4535 if (shdrs == NULL)
4536 return FALSE;
4537
4538 if (section_headers != NULL)
4539 free (section_headers);
4540 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4541 sizeof (Elf_Internal_Shdr));
4542 if (section_headers == NULL)
4543 {
4544 if (!probe)
4545 error (_("Out of memory\n"));
4546 return FALSE;
4547 }
4548
4549 for (i = 0, internal = section_headers;
4550 i < num;
4551 i++, internal++)
4552 {
4553 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4554 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4555 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4556 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4557 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4558 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4559 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4560 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4561 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4562 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4563 }
4564
4565 free (shdrs);
4566 return TRUE;
4567 }
4568
4569 static bfd_boolean
4570 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4571 {
4572 Elf64_External_Shdr * shdrs;
4573 Elf_Internal_Shdr * internal;
4574 unsigned int i;
4575 unsigned int size = elf_header.e_shentsize;
4576 unsigned int num = probe ? 1 : elf_header.e_shnum;
4577
4578 /* PR binutils/17531: Cope with unexpected section header sizes. */
4579 if (size == 0 || num == 0)
4580 return FALSE;
4581 if (size < sizeof * shdrs)
4582 {
4583 if (! probe)
4584 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4585 return FALSE;
4586 }
4587 if (! probe && size > sizeof * shdrs)
4588 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4589
4590 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4591 size, num,
4592 probe ? NULL : _("section headers"));
4593 if (shdrs == NULL)
4594 return FALSE;
4595
4596 if (section_headers != NULL)
4597 free (section_headers);
4598 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4599 sizeof (Elf_Internal_Shdr));
4600 if (section_headers == NULL)
4601 {
4602 if (! probe)
4603 error (_("Out of memory\n"));
4604 return FALSE;
4605 }
4606
4607 for (i = 0, internal = section_headers;
4608 i < num;
4609 i++, internal++)
4610 {
4611 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4612 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4613 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4614 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4615 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4616 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4617 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4618 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4619 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4620 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4621 }
4622
4623 free (shdrs);
4624 return TRUE;
4625 }
4626
4627 static Elf_Internal_Sym *
4628 get_32bit_elf_symbols (FILE * file,
4629 Elf_Internal_Shdr * section,
4630 unsigned long * num_syms_return)
4631 {
4632 unsigned long number = 0;
4633 Elf32_External_Sym * esyms = NULL;
4634 Elf_External_Sym_Shndx * shndx = NULL;
4635 Elf_Internal_Sym * isyms = NULL;
4636 Elf_Internal_Sym * psym;
4637 unsigned int j;
4638
4639 /* Run some sanity checks first. */
4640 if (section->sh_entsize == 0)
4641 {
4642 error (_("sh_entsize is zero\n"));
4643 goto exit_point;
4644 }
4645
4646 if (section->sh_size > current_file_size)
4647 {
4648 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4649 SECTION_NAME (section), (unsigned long) section->sh_size);
4650 goto exit_point;
4651 }
4652
4653 number = section->sh_size / section->sh_entsize;
4654
4655 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4656 {
4657 error (_("Invalid sh_entsize\n"));
4658 goto exit_point;
4659 }
4660
4661 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4662 section->sh_size, _("symbols"));
4663 if (esyms == NULL)
4664 goto exit_point;
4665
4666 shndx = NULL;
4667 if (symtab_shndx_hdr != NULL
4668 && (symtab_shndx_hdr->sh_link
4669 == (unsigned long) (section - section_headers)))
4670 {
4671 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4672 symtab_shndx_hdr->sh_offset,
4673 1, symtab_shndx_hdr->sh_size,
4674 _("symbol table section indicies"));
4675 if (shndx == NULL)
4676 goto exit_point;
4677 }
4678
4679 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4680
4681 if (isyms == NULL)
4682 {
4683 error (_("Out of memory\n"));
4684 goto exit_point;
4685 }
4686
4687 for (j = 0, psym = isyms; j < number; j++, psym++)
4688 {
4689 psym->st_name = BYTE_GET (esyms[j].st_name);
4690 psym->st_value = BYTE_GET (esyms[j].st_value);
4691 psym->st_size = BYTE_GET (esyms[j].st_size);
4692 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4693 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4694 psym->st_shndx
4695 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4696 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4697 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4698 psym->st_info = BYTE_GET (esyms[j].st_info);
4699 psym->st_other = BYTE_GET (esyms[j].st_other);
4700 }
4701
4702 exit_point:
4703 if (shndx != NULL)
4704 free (shndx);
4705 if (esyms != NULL)
4706 free (esyms);
4707
4708 if (num_syms_return != NULL)
4709 * num_syms_return = isyms == NULL ? 0 : number;
4710
4711 return isyms;
4712 }
4713
4714 static Elf_Internal_Sym *
4715 get_64bit_elf_symbols (FILE * file,
4716 Elf_Internal_Shdr * section,
4717 unsigned long * num_syms_return)
4718 {
4719 unsigned long number = 0;
4720 Elf64_External_Sym * esyms = NULL;
4721 Elf_External_Sym_Shndx * shndx = NULL;
4722 Elf_Internal_Sym * isyms = NULL;
4723 Elf_Internal_Sym * psym;
4724 unsigned int j;
4725
4726 /* Run some sanity checks first. */
4727 if (section->sh_entsize == 0)
4728 {
4729 error (_("sh_entsize is zero\n"));
4730 goto exit_point;
4731 }
4732
4733 if (section->sh_size > current_file_size)
4734 {
4735 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4736 SECTION_NAME (section), (unsigned long) section->sh_size);
4737 goto exit_point;
4738 }
4739
4740 number = section->sh_size / section->sh_entsize;
4741
4742 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4743 {
4744 error (_("Invalid sh_entsize\n"));
4745 goto exit_point;
4746 }
4747
4748 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4749 section->sh_size, _("symbols"));
4750 if (!esyms)
4751 goto exit_point;
4752
4753 if (symtab_shndx_hdr != NULL
4754 && (symtab_shndx_hdr->sh_link
4755 == (unsigned long) (section - section_headers)))
4756 {
4757 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4758 symtab_shndx_hdr->sh_offset,
4759 1, symtab_shndx_hdr->sh_size,
4760 _("symbol table section indicies"));
4761 if (shndx == NULL)
4762 goto exit_point;
4763 }
4764
4765 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4766
4767 if (isyms == NULL)
4768 {
4769 error (_("Out of memory\n"));
4770 goto exit_point;
4771 }
4772
4773 for (j = 0, psym = isyms; j < number; j++, psym++)
4774 {
4775 psym->st_name = BYTE_GET (esyms[j].st_name);
4776 psym->st_info = BYTE_GET (esyms[j].st_info);
4777 psym->st_other = BYTE_GET (esyms[j].st_other);
4778 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4779
4780 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4781 psym->st_shndx
4782 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4783 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4784 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4785
4786 psym->st_value = BYTE_GET (esyms[j].st_value);
4787 psym->st_size = BYTE_GET (esyms[j].st_size);
4788 }
4789
4790 exit_point:
4791 if (shndx != NULL)
4792 free (shndx);
4793 if (esyms != NULL)
4794 free (esyms);
4795
4796 if (num_syms_return != NULL)
4797 * num_syms_return = isyms == NULL ? 0 : number;
4798
4799 return isyms;
4800 }
4801
4802 static const char *
4803 get_elf_section_flags (bfd_vma sh_flags)
4804 {
4805 static char buff[1024];
4806 char * p = buff;
4807 int field_size = is_32bit_elf ? 8 : 16;
4808 int sindex;
4809 int size = sizeof (buff) - (field_size + 4 + 1);
4810 bfd_vma os_flags = 0;
4811 bfd_vma proc_flags = 0;
4812 bfd_vma unknown_flags = 0;
4813 static const struct
4814 {
4815 const char * str;
4816 int len;
4817 }
4818 flags [] =
4819 {
4820 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4821 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4822 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4823 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4824 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4825 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4826 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4827 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4828 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4829 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4830 /* IA-64 specific. */
4831 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4832 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4833 /* IA-64 OpenVMS specific. */
4834 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4835 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4836 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4837 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4838 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4839 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4840 /* Generic. */
4841 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4842 /* SPARC specific. */
4843 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4844 };
4845
4846 if (do_section_details)
4847 {
4848 sprintf (buff, "[%*.*lx]: ",
4849 field_size, field_size, (unsigned long) sh_flags);
4850 p += field_size + 4;
4851 }
4852
4853 while (sh_flags)
4854 {
4855 bfd_vma flag;
4856
4857 flag = sh_flags & - sh_flags;
4858 sh_flags &= ~ flag;
4859
4860 if (do_section_details)
4861 {
4862 switch (flag)
4863 {
4864 case SHF_WRITE: sindex = 0; break;
4865 case SHF_ALLOC: sindex = 1; break;
4866 case SHF_EXECINSTR: sindex = 2; break;
4867 case SHF_MERGE: sindex = 3; break;
4868 case SHF_STRINGS: sindex = 4; break;
4869 case SHF_INFO_LINK: sindex = 5; break;
4870 case SHF_LINK_ORDER: sindex = 6; break;
4871 case SHF_OS_NONCONFORMING: sindex = 7; break;
4872 case SHF_GROUP: sindex = 8; break;
4873 case SHF_TLS: sindex = 9; break;
4874 case SHF_EXCLUDE: sindex = 18; break;
4875
4876 default:
4877 sindex = -1;
4878 switch (elf_header.e_machine)
4879 {
4880 case EM_IA_64:
4881 if (flag == SHF_IA_64_SHORT)
4882 sindex = 10;
4883 else if (flag == SHF_IA_64_NORECOV)
4884 sindex = 11;
4885 #ifdef BFD64
4886 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4887 switch (flag)
4888 {
4889 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4890 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4891 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4892 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4893 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4894 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4895 default: break;
4896 }
4897 #endif
4898 break;
4899
4900 case EM_386:
4901 case EM_486:
4902 case EM_X86_64:
4903 case EM_L1OM:
4904 case EM_K1OM:
4905 case EM_OLD_SPARCV9:
4906 case EM_SPARC32PLUS:
4907 case EM_SPARCV9:
4908 case EM_SPARC:
4909 if (flag == SHF_ORDERED)
4910 sindex = 19;
4911 break;
4912 default:
4913 break;
4914 }
4915 }
4916
4917 if (sindex != -1)
4918 {
4919 if (p != buff + field_size + 4)
4920 {
4921 if (size < (10 + 2))
4922 abort ();
4923 size -= 2;
4924 *p++ = ',';
4925 *p++ = ' ';
4926 }
4927
4928 size -= flags [sindex].len;
4929 p = stpcpy (p, flags [sindex].str);
4930 }
4931 else if (flag & SHF_MASKOS)
4932 os_flags |= flag;
4933 else if (flag & SHF_MASKPROC)
4934 proc_flags |= flag;
4935 else
4936 unknown_flags |= flag;
4937 }
4938 else
4939 {
4940 switch (flag)
4941 {
4942 case SHF_WRITE: *p = 'W'; break;
4943 case SHF_ALLOC: *p = 'A'; break;
4944 case SHF_EXECINSTR: *p = 'X'; break;
4945 case SHF_MERGE: *p = 'M'; break;
4946 case SHF_STRINGS: *p = 'S'; break;
4947 case SHF_INFO_LINK: *p = 'I'; break;
4948 case SHF_LINK_ORDER: *p = 'L'; break;
4949 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4950 case SHF_GROUP: *p = 'G'; break;
4951 case SHF_TLS: *p = 'T'; break;
4952 case SHF_EXCLUDE: *p = 'E'; break;
4953
4954 default:
4955 if ((elf_header.e_machine == EM_X86_64
4956 || elf_header.e_machine == EM_L1OM
4957 || elf_header.e_machine == EM_K1OM)
4958 && flag == SHF_X86_64_LARGE)
4959 *p = 'l';
4960 else if (flag & SHF_MASKOS)
4961 {
4962 *p = 'o';
4963 sh_flags &= ~ SHF_MASKOS;
4964 }
4965 else if (flag & SHF_MASKPROC)
4966 {
4967 *p = 'p';
4968 sh_flags &= ~ SHF_MASKPROC;
4969 }
4970 else
4971 *p = 'x';
4972 break;
4973 }
4974 p++;
4975 }
4976 }
4977
4978 if (do_section_details)
4979 {
4980 if (os_flags)
4981 {
4982 size -= 5 + field_size;
4983 if (p != buff + field_size + 4)
4984 {
4985 if (size < (2 + 1))
4986 abort ();
4987 size -= 2;
4988 *p++ = ',';
4989 *p++ = ' ';
4990 }
4991 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4992 (unsigned long) os_flags);
4993 p += 5 + field_size;
4994 }
4995 if (proc_flags)
4996 {
4997 size -= 7 + field_size;
4998 if (p != buff + field_size + 4)
4999 {
5000 if (size < (2 + 1))
5001 abort ();
5002 size -= 2;
5003 *p++ = ',';
5004 *p++ = ' ';
5005 }
5006 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5007 (unsigned long) proc_flags);
5008 p += 7 + field_size;
5009 }
5010 if (unknown_flags)
5011 {
5012 size -= 10 + field_size;
5013 if (p != buff + field_size + 4)
5014 {
5015 if (size < (2 + 1))
5016 abort ();
5017 size -= 2;
5018 *p++ = ',';
5019 *p++ = ' ';
5020 }
5021 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5022 (unsigned long) unknown_flags);
5023 p += 10 + field_size;
5024 }
5025 }
5026
5027 *p = '\0';
5028 return buff;
5029 }
5030
5031 static int
5032 process_section_headers (FILE * file)
5033 {
5034 Elf_Internal_Shdr * section;
5035 unsigned int i;
5036
5037 section_headers = NULL;
5038
5039 if (elf_header.e_shnum == 0)
5040 {
5041 /* PR binutils/12467. */
5042 if (elf_header.e_shoff != 0)
5043 warn (_("possibly corrupt ELF file header - it has a non-zero"
5044 " section header offset, but no section headers\n"));
5045 else if (do_sections)
5046 printf (_("\nThere are no sections in this file.\n"));
5047
5048 return 1;
5049 }
5050
5051 if (do_sections && !do_header)
5052 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5053 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5054
5055 if (is_32bit_elf)
5056 {
5057 if (! get_32bit_section_headers (file, FALSE))
5058 return 0;
5059 }
5060 else if (! get_64bit_section_headers (file, FALSE))
5061 return 0;
5062
5063 /* Read in the string table, so that we have names to display. */
5064 if (elf_header.e_shstrndx != SHN_UNDEF
5065 && elf_header.e_shstrndx < elf_header.e_shnum)
5066 {
5067 section = section_headers + elf_header.e_shstrndx;
5068
5069 if (section->sh_size != 0)
5070 {
5071 string_table = (char *) get_data (NULL, file, section->sh_offset,
5072 1, section->sh_size,
5073 _("string table"));
5074
5075 string_table_length = string_table != NULL ? section->sh_size : 0;
5076 }
5077 }
5078
5079 /* Scan the sections for the dynamic symbol table
5080 and dynamic string table and debug sections. */
5081 dynamic_symbols = NULL;
5082 dynamic_strings = NULL;
5083 dynamic_syminfo = NULL;
5084 symtab_shndx_hdr = NULL;
5085
5086 eh_addr_size = is_32bit_elf ? 4 : 8;
5087 switch (elf_header.e_machine)
5088 {
5089 case EM_MIPS:
5090 case EM_MIPS_RS3_LE:
5091 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5092 FDE addresses. However, the ABI also has a semi-official ILP32
5093 variant for which the normal FDE address size rules apply.
5094
5095 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5096 section, where XX is the size of longs in bits. Unfortunately,
5097 earlier compilers provided no way of distinguishing ILP32 objects
5098 from LP64 objects, so if there's any doubt, we should assume that
5099 the official LP64 form is being used. */
5100 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5101 && find_section (".gcc_compiled_long32") == NULL)
5102 eh_addr_size = 8;
5103 break;
5104
5105 case EM_H8_300:
5106 case EM_H8_300H:
5107 switch (elf_header.e_flags & EF_H8_MACH)
5108 {
5109 case E_H8_MACH_H8300:
5110 case E_H8_MACH_H8300HN:
5111 case E_H8_MACH_H8300SN:
5112 case E_H8_MACH_H8300SXN:
5113 eh_addr_size = 2;
5114 break;
5115 case E_H8_MACH_H8300H:
5116 case E_H8_MACH_H8300S:
5117 case E_H8_MACH_H8300SX:
5118 eh_addr_size = 4;
5119 break;
5120 }
5121 break;
5122
5123 case EM_M32C_OLD:
5124 case EM_M32C:
5125 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5126 {
5127 case EF_M32C_CPU_M16C:
5128 eh_addr_size = 2;
5129 break;
5130 }
5131 break;
5132 }
5133
5134 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5135 do \
5136 { \
5137 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5138 if (section->sh_entsize != expected_entsize) \
5139 { \
5140 char buf[40]; \
5141 sprintf_vma (buf, section->sh_entsize); \
5142 /* Note: coded this way so that there is a single string for \
5143 translation. */ \
5144 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5145 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5146 (unsigned) expected_entsize); \
5147 section->sh_entsize = expected_entsize; \
5148 } \
5149 } \
5150 while (0)
5151
5152 #define CHECK_ENTSIZE(section, i, type) \
5153 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5154 sizeof (Elf64_External_##type))
5155
5156 for (i = 0, section = section_headers;
5157 i < elf_header.e_shnum;
5158 i++, section++)
5159 {
5160 char * name = SECTION_NAME (section);
5161
5162 if (section->sh_type == SHT_DYNSYM)
5163 {
5164 if (dynamic_symbols != NULL)
5165 {
5166 error (_("File contains multiple dynamic symbol tables\n"));
5167 continue;
5168 }
5169
5170 CHECK_ENTSIZE (section, i, Sym);
5171 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5172 }
5173 else if (section->sh_type == SHT_STRTAB
5174 && streq (name, ".dynstr"))
5175 {
5176 if (dynamic_strings != NULL)
5177 {
5178 error (_("File contains multiple dynamic string tables\n"));
5179 continue;
5180 }
5181
5182 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5183 1, section->sh_size,
5184 _("dynamic strings"));
5185 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5186 }
5187 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5188 {
5189 if (symtab_shndx_hdr != NULL)
5190 {
5191 error (_("File contains multiple symtab shndx tables\n"));
5192 continue;
5193 }
5194 symtab_shndx_hdr = section;
5195 }
5196 else if (section->sh_type == SHT_SYMTAB)
5197 CHECK_ENTSIZE (section, i, Sym);
5198 else if (section->sh_type == SHT_GROUP)
5199 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5200 else if (section->sh_type == SHT_REL)
5201 CHECK_ENTSIZE (section, i, Rel);
5202 else if (section->sh_type == SHT_RELA)
5203 CHECK_ENTSIZE (section, i, Rela);
5204 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5205 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5206 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5207 || do_debug_str || do_debug_loc || do_debug_ranges
5208 || do_debug_addr || do_debug_cu_index)
5209 && (const_strneq (name, ".debug_")
5210 || const_strneq (name, ".zdebug_")))
5211 {
5212 if (name[1] == 'z')
5213 name += sizeof (".zdebug_") - 1;
5214 else
5215 name += sizeof (".debug_") - 1;
5216
5217 if (do_debugging
5218 || (do_debug_info && const_strneq (name, "info"))
5219 || (do_debug_info && const_strneq (name, "types"))
5220 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5221 || (do_debug_lines && strcmp (name, "line") == 0)
5222 || (do_debug_lines && const_strneq (name, "line."))
5223 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5224 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5225 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5226 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5227 || (do_debug_aranges && const_strneq (name, "aranges"))
5228 || (do_debug_ranges && const_strneq (name, "ranges"))
5229 || (do_debug_frames && const_strneq (name, "frame"))
5230 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5231 || (do_debug_macinfo && const_strneq (name, "macro"))
5232 || (do_debug_str && const_strneq (name, "str"))
5233 || (do_debug_loc && const_strneq (name, "loc"))
5234 || (do_debug_addr && const_strneq (name, "addr"))
5235 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5236 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5237 )
5238 request_dump_bynumber (i, DEBUG_DUMP);
5239 }
5240 /* Linkonce section to be combined with .debug_info at link time. */
5241 else if ((do_debugging || do_debug_info)
5242 && const_strneq (name, ".gnu.linkonce.wi."))
5243 request_dump_bynumber (i, DEBUG_DUMP);
5244 else if (do_debug_frames && streq (name, ".eh_frame"))
5245 request_dump_bynumber (i, DEBUG_DUMP);
5246 else if (do_gdb_index && streq (name, ".gdb_index"))
5247 request_dump_bynumber (i, DEBUG_DUMP);
5248 /* Trace sections for Itanium VMS. */
5249 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5250 || do_trace_aranges)
5251 && const_strneq (name, ".trace_"))
5252 {
5253 name += sizeof (".trace_") - 1;
5254
5255 if (do_debugging
5256 || (do_trace_info && streq (name, "info"))
5257 || (do_trace_abbrevs && streq (name, "abbrev"))
5258 || (do_trace_aranges && streq (name, "aranges"))
5259 )
5260 request_dump_bynumber (i, DEBUG_DUMP);
5261 }
5262
5263 }
5264
5265 if (! do_sections)
5266 return 1;
5267
5268 if (elf_header.e_shnum > 1)
5269 printf (_("\nSection Headers:\n"));
5270 else
5271 printf (_("\nSection Header:\n"));
5272
5273 if (is_32bit_elf)
5274 {
5275 if (do_section_details)
5276 {
5277 printf (_(" [Nr] Name\n"));
5278 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5279 }
5280 else
5281 printf
5282 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5283 }
5284 else if (do_wide)
5285 {
5286 if (do_section_details)
5287 {
5288 printf (_(" [Nr] Name\n"));
5289 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5290 }
5291 else
5292 printf
5293 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5294 }
5295 else
5296 {
5297 if (do_section_details)
5298 {
5299 printf (_(" [Nr] Name\n"));
5300 printf (_(" Type Address Offset Link\n"));
5301 printf (_(" Size EntSize Info Align\n"));
5302 }
5303 else
5304 {
5305 printf (_(" [Nr] Name Type Address Offset\n"));
5306 printf (_(" Size EntSize Flags Link Info Align\n"));
5307 }
5308 }
5309
5310 if (do_section_details)
5311 printf (_(" Flags\n"));
5312
5313 for (i = 0, section = section_headers;
5314 i < elf_header.e_shnum;
5315 i++, section++)
5316 {
5317 printf (" [%2u] ", i);
5318 if (do_section_details)
5319 {
5320 print_symbol (INT_MAX, SECTION_NAME (section));
5321 printf ("\n ");
5322 }
5323 else
5324 {
5325 print_symbol (-17, SECTION_NAME (section));
5326 }
5327
5328 printf (do_wide ? " %-15s " : " %-15.15s ",
5329 get_section_type_name (section->sh_type));
5330
5331 if (is_32bit_elf)
5332 {
5333 const char * link_too_big = NULL;
5334
5335 print_vma (section->sh_addr, LONG_HEX);
5336
5337 printf ( " %6.6lx %6.6lx %2.2lx",
5338 (unsigned long) section->sh_offset,
5339 (unsigned long) section->sh_size,
5340 (unsigned long) section->sh_entsize);
5341
5342 if (do_section_details)
5343 fputs (" ", stdout);
5344 else
5345 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5346
5347 if (section->sh_link >= elf_header.e_shnum)
5348 {
5349 link_too_big = "";
5350 /* The sh_link value is out of range. Normally this indicates
5351 an error but it can have special values in Solaris binaries. */
5352 switch (elf_header.e_machine)
5353 {
5354 case EM_386:
5355 case EM_486:
5356 case EM_X86_64:
5357 case EM_L1OM:
5358 case EM_K1OM:
5359 case EM_OLD_SPARCV9:
5360 case EM_SPARC32PLUS:
5361 case EM_SPARCV9:
5362 case EM_SPARC:
5363 if (section->sh_link == (SHN_BEFORE & 0xffff))
5364 link_too_big = "BEFORE";
5365 else if (section->sh_link == (SHN_AFTER & 0xffff))
5366 link_too_big = "AFTER";
5367 break;
5368 default:
5369 break;
5370 }
5371 }
5372
5373 if (do_section_details)
5374 {
5375 if (link_too_big != NULL && * link_too_big)
5376 printf ("<%s> ", link_too_big);
5377 else
5378 printf ("%2u ", section->sh_link);
5379 printf ("%3u %2lu\n", section->sh_info,
5380 (unsigned long) section->sh_addralign);
5381 }
5382 else
5383 printf ("%2u %3u %2lu\n",
5384 section->sh_link,
5385 section->sh_info,
5386 (unsigned long) section->sh_addralign);
5387
5388 if (link_too_big && ! * link_too_big)
5389 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5390 i, section->sh_link);
5391 }
5392 else if (do_wide)
5393 {
5394 print_vma (section->sh_addr, LONG_HEX);
5395
5396 if ((long) section->sh_offset == section->sh_offset)
5397 printf (" %6.6lx", (unsigned long) section->sh_offset);
5398 else
5399 {
5400 putchar (' ');
5401 print_vma (section->sh_offset, LONG_HEX);
5402 }
5403
5404 if ((unsigned long) section->sh_size == section->sh_size)
5405 printf (" %6.6lx", (unsigned long) section->sh_size);
5406 else
5407 {
5408 putchar (' ');
5409 print_vma (section->sh_size, LONG_HEX);
5410 }
5411
5412 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5413 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5414 else
5415 {
5416 putchar (' ');
5417 print_vma (section->sh_entsize, LONG_HEX);
5418 }
5419
5420 if (do_section_details)
5421 fputs (" ", stdout);
5422 else
5423 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5424
5425 printf ("%2u %3u ", section->sh_link, section->sh_info);
5426
5427 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5428 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5429 else
5430 {
5431 print_vma (section->sh_addralign, DEC);
5432 putchar ('\n');
5433 }
5434 }
5435 else if (do_section_details)
5436 {
5437 printf (" %-15.15s ",
5438 get_section_type_name (section->sh_type));
5439 print_vma (section->sh_addr, LONG_HEX);
5440 if ((long) section->sh_offset == section->sh_offset)
5441 printf (" %16.16lx", (unsigned long) section->sh_offset);
5442 else
5443 {
5444 printf (" ");
5445 print_vma (section->sh_offset, LONG_HEX);
5446 }
5447 printf (" %u\n ", section->sh_link);
5448 print_vma (section->sh_size, LONG_HEX);
5449 putchar (' ');
5450 print_vma (section->sh_entsize, LONG_HEX);
5451
5452 printf (" %-16u %lu\n",
5453 section->sh_info,
5454 (unsigned long) section->sh_addralign);
5455 }
5456 else
5457 {
5458 putchar (' ');
5459 print_vma (section->sh_addr, LONG_HEX);
5460 if ((long) section->sh_offset == section->sh_offset)
5461 printf (" %8.8lx", (unsigned long) section->sh_offset);
5462 else
5463 {
5464 printf (" ");
5465 print_vma (section->sh_offset, LONG_HEX);
5466 }
5467 printf ("\n ");
5468 print_vma (section->sh_size, LONG_HEX);
5469 printf (" ");
5470 print_vma (section->sh_entsize, LONG_HEX);
5471
5472 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5473
5474 printf (" %2u %3u %lu\n",
5475 section->sh_link,
5476 section->sh_info,
5477 (unsigned long) section->sh_addralign);
5478 }
5479
5480 if (do_section_details)
5481 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5482 }
5483
5484 if (!do_section_details)
5485 {
5486 if (elf_header.e_machine == EM_X86_64
5487 || elf_header.e_machine == EM_L1OM
5488 || elf_header.e_machine == EM_K1OM)
5489 printf (_("Key to Flags:\n\
5490 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5491 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5492 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5493 else
5494 printf (_("Key to Flags:\n\
5495 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5496 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5497 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5498 }
5499
5500 return 1;
5501 }
5502
5503 static const char *
5504 get_group_flags (unsigned int flags)
5505 {
5506 static char buff[32];
5507 switch (flags)
5508 {
5509 case 0:
5510 return "";
5511
5512 case GRP_COMDAT:
5513 return "COMDAT ";
5514
5515 default:
5516 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5517 break;
5518 }
5519 return buff;
5520 }
5521
5522 static int
5523 process_section_groups (FILE * file)
5524 {
5525 Elf_Internal_Shdr * section;
5526 unsigned int i;
5527 struct group * group;
5528 Elf_Internal_Shdr * symtab_sec;
5529 Elf_Internal_Shdr * strtab_sec;
5530 Elf_Internal_Sym * symtab;
5531 unsigned long num_syms;
5532 char * strtab;
5533 size_t strtab_size;
5534
5535 /* Don't process section groups unless needed. */
5536 if (!do_unwind && !do_section_groups)
5537 return 1;
5538
5539 if (elf_header.e_shnum == 0)
5540 {
5541 if (do_section_groups)
5542 printf (_("\nThere are no sections to group in this file.\n"));
5543
5544 return 1;
5545 }
5546
5547 if (section_headers == NULL)
5548 {
5549 error (_("Section headers are not available!\n"));
5550 /* PR 13622: This can happen with a corrupt ELF header. */
5551 return 0;
5552 }
5553
5554 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5555 sizeof (struct group *));
5556
5557 if (section_headers_groups == NULL)
5558 {
5559 error (_("Out of memory\n"));
5560 return 0;
5561 }
5562
5563 /* Scan the sections for the group section. */
5564 group_count = 0;
5565 for (i = 0, section = section_headers;
5566 i < elf_header.e_shnum;
5567 i++, section++)
5568 if (section->sh_type == SHT_GROUP)
5569 group_count++;
5570
5571 if (group_count == 0)
5572 {
5573 if (do_section_groups)
5574 printf (_("\nThere are no section groups in this file.\n"));
5575
5576 return 1;
5577 }
5578
5579 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5580
5581 if (section_groups == NULL)
5582 {
5583 error (_("Out of memory\n"));
5584 return 0;
5585 }
5586
5587 symtab_sec = NULL;
5588 strtab_sec = NULL;
5589 symtab = NULL;
5590 num_syms = 0;
5591 strtab = NULL;
5592 strtab_size = 0;
5593 for (i = 0, section = section_headers, group = section_groups;
5594 i < elf_header.e_shnum;
5595 i++, section++)
5596 {
5597 if (section->sh_type == SHT_GROUP)
5598 {
5599 char * name = SECTION_NAME (section);
5600 char * group_name;
5601 unsigned char * start;
5602 unsigned char * indices;
5603 unsigned int entry, j, size;
5604 Elf_Internal_Shdr * sec;
5605 Elf_Internal_Sym * sym;
5606
5607 /* Get the symbol table. */
5608 if (section->sh_link >= elf_header.e_shnum
5609 || ((sec = section_headers + section->sh_link)->sh_type
5610 != SHT_SYMTAB))
5611 {
5612 error (_("Bad sh_link in group section `%s'\n"), name);
5613 continue;
5614 }
5615
5616 if (symtab_sec != sec)
5617 {
5618 symtab_sec = sec;
5619 if (symtab)
5620 free (symtab);
5621 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5622 }
5623
5624 if (symtab == NULL)
5625 {
5626 error (_("Corrupt header in group section `%s'\n"), name);
5627 continue;
5628 }
5629
5630 if (section->sh_info >= num_syms)
5631 {
5632 error (_("Bad sh_info in group section `%s'\n"), name);
5633 continue;
5634 }
5635
5636 sym = symtab + section->sh_info;
5637
5638 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5639 {
5640 if (sym->st_shndx == 0
5641 || sym->st_shndx >= elf_header.e_shnum)
5642 {
5643 error (_("Bad sh_info in group section `%s'\n"), name);
5644 continue;
5645 }
5646
5647 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5648 strtab_sec = NULL;
5649 if (strtab)
5650 free (strtab);
5651 strtab = NULL;
5652 strtab_size = 0;
5653 }
5654 else
5655 {
5656 /* Get the string table. */
5657 if (symtab_sec->sh_link >= elf_header.e_shnum)
5658 {
5659 strtab_sec = NULL;
5660 if (strtab)
5661 free (strtab);
5662 strtab = NULL;
5663 strtab_size = 0;
5664 }
5665 else if (strtab_sec
5666 != (sec = section_headers + symtab_sec->sh_link))
5667 {
5668 strtab_sec = sec;
5669 if (strtab)
5670 free (strtab);
5671 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5672 1, strtab_sec->sh_size,
5673 _("string table"));
5674 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5675 }
5676 group_name = sym->st_name < strtab_size
5677 ? strtab + sym->st_name : _("<corrupt>");
5678 }
5679
5680 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5681 1, section->sh_size,
5682 _("section data"));
5683 if (start == NULL)
5684 continue;
5685
5686 indices = start;
5687 size = (section->sh_size / section->sh_entsize) - 1;
5688 entry = byte_get (indices, 4);
5689 indices += 4;
5690
5691 if (do_section_groups)
5692 {
5693 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5694 get_group_flags (entry), i, name, group_name, size);
5695
5696 printf (_(" [Index] Name\n"));
5697 }
5698
5699 group->group_index = i;
5700
5701 for (j = 0; j < size; j++)
5702 {
5703 struct group_list * g;
5704
5705 entry = byte_get (indices, 4);
5706 indices += 4;
5707
5708 if (entry >= elf_header.e_shnum)
5709 {
5710 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5711 entry, i, elf_header.e_shnum - 1);
5712 continue;
5713 }
5714
5715 if (section_headers_groups [entry] != NULL)
5716 {
5717 if (entry)
5718 {
5719 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5720 entry, i,
5721 section_headers_groups [entry]->group_index);
5722 continue;
5723 }
5724 else
5725 {
5726 /* Intel C/C++ compiler may put section 0 in a
5727 section group. We just warn it the first time
5728 and ignore it afterwards. */
5729 static int warned = 0;
5730 if (!warned)
5731 {
5732 error (_("section 0 in group section [%5u]\n"),
5733 section_headers_groups [entry]->group_index);
5734 warned++;
5735 }
5736 }
5737 }
5738
5739 section_headers_groups [entry] = group;
5740
5741 if (do_section_groups)
5742 {
5743 sec = section_headers + entry;
5744 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5745 }
5746
5747 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5748 g->section_index = entry;
5749 g->next = group->root;
5750 group->root = g;
5751 }
5752
5753 if (start)
5754 free (start);
5755
5756 group++;
5757 }
5758 }
5759
5760 if (symtab)
5761 free (symtab);
5762 if (strtab)
5763 free (strtab);
5764 return 1;
5765 }
5766
5767 /* Data used to display dynamic fixups. */
5768
5769 struct ia64_vms_dynfixup
5770 {
5771 bfd_vma needed_ident; /* Library ident number. */
5772 bfd_vma needed; /* Index in the dstrtab of the library name. */
5773 bfd_vma fixup_needed; /* Index of the library. */
5774 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5775 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5776 };
5777
5778 /* Data used to display dynamic relocations. */
5779
5780 struct ia64_vms_dynimgrela
5781 {
5782 bfd_vma img_rela_cnt; /* Number of relocations. */
5783 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5784 };
5785
5786 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5787 library). */
5788
5789 static void
5790 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5791 const char *strtab, unsigned int strtab_sz)
5792 {
5793 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5794 long i;
5795 const char *lib_name;
5796
5797 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5798 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5799 _("dynamic section image fixups"));
5800 if (!imfs)
5801 return;
5802
5803 if (fixup->needed < strtab_sz)
5804 lib_name = strtab + fixup->needed;
5805 else
5806 {
5807 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5808 (unsigned long) fixup->needed);
5809 lib_name = "???";
5810 }
5811 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5812 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5813 printf
5814 (_("Seg Offset Type SymVec DataType\n"));
5815
5816 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5817 {
5818 unsigned int type;
5819 const char *rtype;
5820
5821 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5822 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5823 type = BYTE_GET (imfs [i].type);
5824 rtype = elf_ia64_reloc_type (type);
5825 if (rtype == NULL)
5826 printf (" 0x%08x ", type);
5827 else
5828 printf (" %-32s ", rtype);
5829 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5830 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5831 }
5832
5833 free (imfs);
5834 }
5835
5836 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5837
5838 static void
5839 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5840 {
5841 Elf64_External_VMS_IMAGE_RELA *imrs;
5842 long i;
5843
5844 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5845 1, imgrela->img_rela_cnt * sizeof (*imrs),
5846 _("dynamic section image relocations"));
5847 if (!imrs)
5848 return;
5849
5850 printf (_("\nImage relocs\n"));
5851 printf
5852 (_("Seg Offset Type Addend Seg Sym Off\n"));
5853
5854 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5855 {
5856 unsigned int type;
5857 const char *rtype;
5858
5859 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5860 printf ("%08" BFD_VMA_FMT "x ",
5861 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5862 type = BYTE_GET (imrs [i].type);
5863 rtype = elf_ia64_reloc_type (type);
5864 if (rtype == NULL)
5865 printf ("0x%08x ", type);
5866 else
5867 printf ("%-31s ", rtype);
5868 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5869 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5870 printf ("%08" BFD_VMA_FMT "x\n",
5871 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5872 }
5873
5874 free (imrs);
5875 }
5876
5877 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5878
5879 static int
5880 process_ia64_vms_dynamic_relocs (FILE *file)
5881 {
5882 struct ia64_vms_dynfixup fixup;
5883 struct ia64_vms_dynimgrela imgrela;
5884 Elf_Internal_Dyn *entry;
5885 int res = 0;
5886 bfd_vma strtab_off = 0;
5887 bfd_vma strtab_sz = 0;
5888 char *strtab = NULL;
5889
5890 memset (&fixup, 0, sizeof (fixup));
5891 memset (&imgrela, 0, sizeof (imgrela));
5892
5893 /* Note: the order of the entries is specified by the OpenVMS specs. */
5894 for (entry = dynamic_section;
5895 entry < dynamic_section + dynamic_nent;
5896 entry++)
5897 {
5898 switch (entry->d_tag)
5899 {
5900 case DT_IA_64_VMS_STRTAB_OFFSET:
5901 strtab_off = entry->d_un.d_val;
5902 break;
5903 case DT_STRSZ:
5904 strtab_sz = entry->d_un.d_val;
5905 if (strtab == NULL)
5906 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5907 1, strtab_sz, _("dynamic string section"));
5908 break;
5909
5910 case DT_IA_64_VMS_NEEDED_IDENT:
5911 fixup.needed_ident = entry->d_un.d_val;
5912 break;
5913 case DT_NEEDED:
5914 fixup.needed = entry->d_un.d_val;
5915 break;
5916 case DT_IA_64_VMS_FIXUP_NEEDED:
5917 fixup.fixup_needed = entry->d_un.d_val;
5918 break;
5919 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5920 fixup.fixup_rela_cnt = entry->d_un.d_val;
5921 break;
5922 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5923 fixup.fixup_rela_off = entry->d_un.d_val;
5924 res++;
5925 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5926 break;
5927
5928 case DT_IA_64_VMS_IMG_RELA_CNT:
5929 imgrela.img_rela_cnt = entry->d_un.d_val;
5930 break;
5931 case DT_IA_64_VMS_IMG_RELA_OFF:
5932 imgrela.img_rela_off = entry->d_un.d_val;
5933 res++;
5934 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5935 break;
5936
5937 default:
5938 break;
5939 }
5940 }
5941
5942 if (strtab != NULL)
5943 free (strtab);
5944
5945 return res;
5946 }
5947
5948 static struct
5949 {
5950 const char * name;
5951 int reloc;
5952 int size;
5953 int rela;
5954 } dynamic_relocations [] =
5955 {
5956 { "REL", DT_REL, DT_RELSZ, FALSE },
5957 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5958 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5959 };
5960
5961 /* Process the reloc section. */
5962
5963 static int
5964 process_relocs (FILE * file)
5965 {
5966 unsigned long rel_size;
5967 unsigned long rel_offset;
5968
5969
5970 if (!do_reloc)
5971 return 1;
5972
5973 if (do_using_dynamic)
5974 {
5975 int is_rela;
5976 const char * name;
5977 int has_dynamic_reloc;
5978 unsigned int i;
5979
5980 has_dynamic_reloc = 0;
5981
5982 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5983 {
5984 is_rela = dynamic_relocations [i].rela;
5985 name = dynamic_relocations [i].name;
5986 rel_size = dynamic_info [dynamic_relocations [i].size];
5987 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5988
5989 has_dynamic_reloc |= rel_size;
5990
5991 if (is_rela == UNKNOWN)
5992 {
5993 if (dynamic_relocations [i].reloc == DT_JMPREL)
5994 switch (dynamic_info[DT_PLTREL])
5995 {
5996 case DT_REL:
5997 is_rela = FALSE;
5998 break;
5999 case DT_RELA:
6000 is_rela = TRUE;
6001 break;
6002 }
6003 }
6004
6005 if (rel_size)
6006 {
6007 printf
6008 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6009 name, rel_offset, rel_size);
6010
6011 dump_relocations (file,
6012 offset_from_vma (file, rel_offset, rel_size),
6013 rel_size,
6014 dynamic_symbols, num_dynamic_syms,
6015 dynamic_strings, dynamic_strings_length, is_rela);
6016 }
6017 }
6018
6019 if (is_ia64_vms ())
6020 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6021
6022 if (! has_dynamic_reloc)
6023 printf (_("\nThere are no dynamic relocations in this file.\n"));
6024 }
6025 else
6026 {
6027 Elf_Internal_Shdr * section;
6028 unsigned long i;
6029 int found = 0;
6030
6031 for (i = 0, section = section_headers;
6032 i < elf_header.e_shnum;
6033 i++, section++)
6034 {
6035 if ( section->sh_type != SHT_RELA
6036 && section->sh_type != SHT_REL)
6037 continue;
6038
6039 rel_offset = section->sh_offset;
6040 rel_size = section->sh_size;
6041
6042 if (rel_size)
6043 {
6044 Elf_Internal_Shdr * strsec;
6045 int is_rela;
6046
6047 printf (_("\nRelocation section "));
6048
6049 if (string_table == NULL)
6050 printf ("%d", section->sh_name);
6051 else
6052 printf ("'%s'", SECTION_NAME (section));
6053
6054 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6055 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6056
6057 is_rela = section->sh_type == SHT_RELA;
6058
6059 if (section->sh_link != 0
6060 && section->sh_link < elf_header.e_shnum)
6061 {
6062 Elf_Internal_Shdr * symsec;
6063 Elf_Internal_Sym * symtab;
6064 unsigned long nsyms;
6065 unsigned long strtablen = 0;
6066 char * strtab = NULL;
6067
6068 symsec = section_headers + section->sh_link;
6069 if (symsec->sh_type != SHT_SYMTAB
6070 && symsec->sh_type != SHT_DYNSYM)
6071 continue;
6072
6073 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6074
6075 if (symtab == NULL)
6076 continue;
6077
6078 if (symsec->sh_link != 0
6079 && symsec->sh_link < elf_header.e_shnum)
6080 {
6081 strsec = section_headers + symsec->sh_link;
6082
6083 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6084 1, strsec->sh_size,
6085 _("string table"));
6086 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6087 }
6088
6089 dump_relocations (file, rel_offset, rel_size,
6090 symtab, nsyms, strtab, strtablen, is_rela);
6091 if (strtab)
6092 free (strtab);
6093 free (symtab);
6094 }
6095 else
6096 dump_relocations (file, rel_offset, rel_size,
6097 NULL, 0, NULL, 0, is_rela);
6098
6099 found = 1;
6100 }
6101 }
6102
6103 if (! found)
6104 printf (_("\nThere are no relocations in this file.\n"));
6105 }
6106
6107 return 1;
6108 }
6109
6110 /* Process the unwind section. */
6111
6112 #include "unwind-ia64.h"
6113
6114 /* An absolute address consists of a section and an offset. If the
6115 section is NULL, the offset itself is the address, otherwise, the
6116 address equals to LOAD_ADDRESS(section) + offset. */
6117
6118 struct absaddr
6119 {
6120 unsigned short section;
6121 bfd_vma offset;
6122 };
6123
6124 #define ABSADDR(a) \
6125 ((a).section \
6126 ? section_headers [(a).section].sh_addr + (a).offset \
6127 : (a).offset)
6128
6129 struct ia64_unw_table_entry
6130 {
6131 struct absaddr start;
6132 struct absaddr end;
6133 struct absaddr info;
6134 };
6135
6136 struct ia64_unw_aux_info
6137 {
6138
6139 struct ia64_unw_table_entry *table; /* Unwind table. */
6140 unsigned long table_len; /* Length of unwind table. */
6141 unsigned char * info; /* Unwind info. */
6142 unsigned long info_size; /* Size of unwind info. */
6143 bfd_vma info_addr; /* starting address of unwind info. */
6144 bfd_vma seg_base; /* Starting address of segment. */
6145 Elf_Internal_Sym * symtab; /* The symbol table. */
6146 unsigned long nsyms; /* Number of symbols. */
6147 char * strtab; /* The string table. */
6148 unsigned long strtab_size; /* Size of string table. */
6149 };
6150
6151 static void
6152 find_symbol_for_address (Elf_Internal_Sym * symtab,
6153 unsigned long nsyms,
6154 const char * strtab,
6155 unsigned long strtab_size,
6156 struct absaddr addr,
6157 const char ** symname,
6158 bfd_vma * offset)
6159 {
6160 bfd_vma dist = 0x100000;
6161 Elf_Internal_Sym * sym;
6162 Elf_Internal_Sym * best = NULL;
6163 unsigned long i;
6164
6165 REMOVE_ARCH_BITS (addr.offset);
6166
6167 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6168 {
6169 bfd_vma value = sym->st_value;
6170
6171 REMOVE_ARCH_BITS (value);
6172
6173 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6174 && sym->st_name != 0
6175 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6176 && addr.offset >= value
6177 && addr.offset - value < dist)
6178 {
6179 best = sym;
6180 dist = addr.offset - value;
6181 if (!dist)
6182 break;
6183 }
6184 }
6185
6186 if (best)
6187 {
6188 *symname = (best->st_name >= strtab_size
6189 ? _("<corrupt>") : strtab + best->st_name);
6190 *offset = dist;
6191 return;
6192 }
6193
6194 *symname = NULL;
6195 *offset = addr.offset;
6196 }
6197
6198 static void
6199 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6200 {
6201 struct ia64_unw_table_entry * tp;
6202 int in_body;
6203
6204 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6205 {
6206 bfd_vma stamp;
6207 bfd_vma offset;
6208 const unsigned char * dp;
6209 const unsigned char * head;
6210 const char * procname;
6211
6212 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6213 aux->strtab_size, tp->start, &procname, &offset);
6214
6215 fputs ("\n<", stdout);
6216
6217 if (procname)
6218 {
6219 fputs (procname, stdout);
6220
6221 if (offset)
6222 printf ("+%lx", (unsigned long) offset);
6223 }
6224
6225 fputs (">: [", stdout);
6226 print_vma (tp->start.offset, PREFIX_HEX);
6227 fputc ('-', stdout);
6228 print_vma (tp->end.offset, PREFIX_HEX);
6229 printf ("], info at +0x%lx\n",
6230 (unsigned long) (tp->info.offset - aux->seg_base));
6231
6232 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6233 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6234
6235 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6236 (unsigned) UNW_VER (stamp),
6237 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6238 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6239 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6240 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6241
6242 if (UNW_VER (stamp) != 1)
6243 {
6244 printf (_("\tUnknown version.\n"));
6245 continue;
6246 }
6247
6248 in_body = 0;
6249 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6250 dp = unw_decode (dp, in_body, & in_body);
6251 }
6252 }
6253
6254 static int
6255 slurp_ia64_unwind_table (FILE * file,
6256 struct ia64_unw_aux_info * aux,
6257 Elf_Internal_Shdr * sec)
6258 {
6259 unsigned long size, nrelas, i;
6260 Elf_Internal_Phdr * seg;
6261 struct ia64_unw_table_entry * tep;
6262 Elf_Internal_Shdr * relsec;
6263 Elf_Internal_Rela * rela;
6264 Elf_Internal_Rela * rp;
6265 unsigned char * table;
6266 unsigned char * tp;
6267 Elf_Internal_Sym * sym;
6268 const char * relname;
6269
6270 /* First, find the starting address of the segment that includes
6271 this section: */
6272
6273 if (elf_header.e_phnum)
6274 {
6275 if (! get_program_headers (file))
6276 return 0;
6277
6278 for (seg = program_headers;
6279 seg < program_headers + elf_header.e_phnum;
6280 ++seg)
6281 {
6282 if (seg->p_type != PT_LOAD)
6283 continue;
6284
6285 if (sec->sh_addr >= seg->p_vaddr
6286 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6287 {
6288 aux->seg_base = seg->p_vaddr;
6289 break;
6290 }
6291 }
6292 }
6293
6294 /* Second, build the unwind table from the contents of the unwind section: */
6295 size = sec->sh_size;
6296 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6297 _("unwind table"));
6298 if (!table)
6299 return 0;
6300
6301 aux->table = (struct ia64_unw_table_entry *)
6302 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6303 tep = aux->table;
6304 for (tp = table; tp < table + size; ++tep)
6305 {
6306 tep->start.section = SHN_UNDEF;
6307 tep->end.section = SHN_UNDEF;
6308 tep->info.section = SHN_UNDEF;
6309 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6310 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6311 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6312 tep->start.offset += aux->seg_base;
6313 tep->end.offset += aux->seg_base;
6314 tep->info.offset += aux->seg_base;
6315 }
6316 free (table);
6317
6318 /* Third, apply any relocations to the unwind table: */
6319 for (relsec = section_headers;
6320 relsec < section_headers + elf_header.e_shnum;
6321 ++relsec)
6322 {
6323 if (relsec->sh_type != SHT_RELA
6324 || relsec->sh_info >= elf_header.e_shnum
6325 || section_headers + relsec->sh_info != sec)
6326 continue;
6327
6328 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6329 & rela, & nrelas))
6330 return 0;
6331
6332 for (rp = rela; rp < rela + nrelas; ++rp)
6333 {
6334 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6335 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6336
6337 if (! const_strneq (relname, "R_IA64_SEGREL"))
6338 {
6339 warn (_("Skipping unexpected relocation type %s\n"), relname);
6340 continue;
6341 }
6342
6343 i = rp->r_offset / (3 * eh_addr_size);
6344
6345 switch (rp->r_offset/eh_addr_size % 3)
6346 {
6347 case 0:
6348 aux->table[i].start.section = sym->st_shndx;
6349 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6350 break;
6351 case 1:
6352 aux->table[i].end.section = sym->st_shndx;
6353 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6354 break;
6355 case 2:
6356 aux->table[i].info.section = sym->st_shndx;
6357 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6358 break;
6359 default:
6360 break;
6361 }
6362 }
6363
6364 free (rela);
6365 }
6366
6367 aux->table_len = size / (3 * eh_addr_size);
6368 return 1;
6369 }
6370
6371 static void
6372 ia64_process_unwind (FILE * file)
6373 {
6374 Elf_Internal_Shdr * sec;
6375 Elf_Internal_Shdr * unwsec = NULL;
6376 Elf_Internal_Shdr * strsec;
6377 unsigned long i, unwcount = 0, unwstart = 0;
6378 struct ia64_unw_aux_info aux;
6379
6380 memset (& aux, 0, sizeof (aux));
6381
6382 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6383 {
6384 if (sec->sh_type == SHT_SYMTAB
6385 && sec->sh_link < elf_header.e_shnum)
6386 {
6387 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6388
6389 strsec = section_headers + sec->sh_link;
6390 assert (aux.strtab == NULL);
6391 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6392 1, strsec->sh_size,
6393 _("string table"));
6394 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6395 }
6396 else if (sec->sh_type == SHT_IA_64_UNWIND)
6397 unwcount++;
6398 }
6399
6400 if (!unwcount)
6401 printf (_("\nThere are no unwind sections in this file.\n"));
6402
6403 while (unwcount-- > 0)
6404 {
6405 char * suffix;
6406 size_t len, len2;
6407
6408 for (i = unwstart, sec = section_headers + unwstart;
6409 i < elf_header.e_shnum; ++i, ++sec)
6410 if (sec->sh_type == SHT_IA_64_UNWIND)
6411 {
6412 unwsec = sec;
6413 break;
6414 }
6415
6416 unwstart = i + 1;
6417 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6418
6419 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6420 {
6421 /* We need to find which section group it is in. */
6422 struct group_list * g = section_headers_groups [i]->root;
6423
6424 for (; g != NULL; g = g->next)
6425 {
6426 sec = section_headers + g->section_index;
6427
6428 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6429 break;
6430 }
6431
6432 if (g == NULL)
6433 i = elf_header.e_shnum;
6434 }
6435 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6436 {
6437 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6438 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6439 suffix = SECTION_NAME (unwsec) + len;
6440 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6441 ++i, ++sec)
6442 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6443 && streq (SECTION_NAME (sec) + len2, suffix))
6444 break;
6445 }
6446 else
6447 {
6448 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6449 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6450 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6451 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6452 suffix = "";
6453 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6454 suffix = SECTION_NAME (unwsec) + len;
6455 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6456 ++i, ++sec)
6457 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6458 && streq (SECTION_NAME (sec) + len2, suffix))
6459 break;
6460 }
6461
6462 if (i == elf_header.e_shnum)
6463 {
6464 printf (_("\nCould not find unwind info section for "));
6465
6466 if (string_table == NULL)
6467 printf ("%d", unwsec->sh_name);
6468 else
6469 printf (_("'%s'"), SECTION_NAME (unwsec));
6470 }
6471 else
6472 {
6473 aux.info_addr = sec->sh_addr;
6474 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6475 sec->sh_size,
6476 _("unwind info"));
6477 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6478
6479 printf (_("\nUnwind section "));
6480
6481 if (string_table == NULL)
6482 printf ("%d", unwsec->sh_name);
6483 else
6484 printf (_("'%s'"), SECTION_NAME (unwsec));
6485
6486 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6487 (unsigned long) unwsec->sh_offset,
6488 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6489
6490 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6491
6492 if (aux.table_len > 0)
6493 dump_ia64_unwind (& aux);
6494
6495 if (aux.table)
6496 free ((char *) aux.table);
6497 if (aux.info)
6498 free ((char *) aux.info);
6499 aux.table = NULL;
6500 aux.info = NULL;
6501 }
6502 }
6503
6504 if (aux.symtab)
6505 free (aux.symtab);
6506 if (aux.strtab)
6507 free ((char *) aux.strtab);
6508 }
6509
6510 struct hppa_unw_table_entry
6511 {
6512 struct absaddr start;
6513 struct absaddr end;
6514 unsigned int Cannot_unwind:1; /* 0 */
6515 unsigned int Millicode:1; /* 1 */
6516 unsigned int Millicode_save_sr0:1; /* 2 */
6517 unsigned int Region_description:2; /* 3..4 */
6518 unsigned int reserved1:1; /* 5 */
6519 unsigned int Entry_SR:1; /* 6 */
6520 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6521 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6522 unsigned int Args_stored:1; /* 16 */
6523 unsigned int Variable_Frame:1; /* 17 */
6524 unsigned int Separate_Package_Body:1; /* 18 */
6525 unsigned int Frame_Extension_Millicode:1; /* 19 */
6526 unsigned int Stack_Overflow_Check:1; /* 20 */
6527 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
6528 unsigned int Ada_Region:1; /* 22 */
6529 unsigned int cxx_info:1; /* 23 */
6530 unsigned int cxx_try_catch:1; /* 24 */
6531 unsigned int sched_entry_seq:1; /* 25 */
6532 unsigned int reserved2:1; /* 26 */
6533 unsigned int Save_SP:1; /* 27 */
6534 unsigned int Save_RP:1; /* 28 */
6535 unsigned int Save_MRP_in_frame:1; /* 29 */
6536 unsigned int extn_ptr_defined:1; /* 30 */
6537 unsigned int Cleanup_defined:1; /* 31 */
6538
6539 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6540 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6541 unsigned int Large_frame:1; /* 2 */
6542 unsigned int Pseudo_SP_Set:1; /* 3 */
6543 unsigned int reserved4:1; /* 4 */
6544 unsigned int Total_frame_size:27; /* 5..31 */
6545 };
6546
6547 struct hppa_unw_aux_info
6548 {
6549 struct hppa_unw_table_entry *table; /* Unwind table. */
6550 unsigned long table_len; /* Length of unwind table. */
6551 bfd_vma seg_base; /* Starting address of segment. */
6552 Elf_Internal_Sym * symtab; /* The symbol table. */
6553 unsigned long nsyms; /* Number of symbols. */
6554 char * strtab; /* The string table. */
6555 unsigned long strtab_size; /* Size of string table. */
6556 };
6557
6558 static void
6559 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6560 {
6561 struct hppa_unw_table_entry * tp;
6562
6563 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6564 {
6565 bfd_vma offset;
6566 const char * procname;
6567
6568 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6569 aux->strtab_size, tp->start, &procname,
6570 &offset);
6571
6572 fputs ("\n<", stdout);
6573
6574 if (procname)
6575 {
6576 fputs (procname, stdout);
6577
6578 if (offset)
6579 printf ("+%lx", (unsigned long) offset);
6580 }
6581
6582 fputs (">: [", stdout);
6583 print_vma (tp->start.offset, PREFIX_HEX);
6584 fputc ('-', stdout);
6585 print_vma (tp->end.offset, PREFIX_HEX);
6586 printf ("]\n\t");
6587
6588 #define PF(_m) if (tp->_m) printf (#_m " ");
6589 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6590 PF(Cannot_unwind);
6591 PF(Millicode);
6592 PF(Millicode_save_sr0);
6593 /* PV(Region_description); */
6594 PF(Entry_SR);
6595 PV(Entry_FR);
6596 PV(Entry_GR);
6597 PF(Args_stored);
6598 PF(Variable_Frame);
6599 PF(Separate_Package_Body);
6600 PF(Frame_Extension_Millicode);
6601 PF(Stack_Overflow_Check);
6602 PF(Two_Instruction_SP_Increment);
6603 PF(Ada_Region);
6604 PF(cxx_info);
6605 PF(cxx_try_catch);
6606 PF(sched_entry_seq);
6607 PF(Save_SP);
6608 PF(Save_RP);
6609 PF(Save_MRP_in_frame);
6610 PF(extn_ptr_defined);
6611 PF(Cleanup_defined);
6612 PF(MPE_XL_interrupt_marker);
6613 PF(HP_UX_interrupt_marker);
6614 PF(Large_frame);
6615 PF(Pseudo_SP_Set);
6616 PV(Total_frame_size);
6617 #undef PF
6618 #undef PV
6619 }
6620
6621 printf ("\n");
6622 }
6623
6624 static int
6625 slurp_hppa_unwind_table (FILE * file,
6626 struct hppa_unw_aux_info * aux,
6627 Elf_Internal_Shdr * sec)
6628 {
6629 unsigned long size, unw_ent_size, nentries, nrelas, i;
6630 Elf_Internal_Phdr * seg;
6631 struct hppa_unw_table_entry * tep;
6632 Elf_Internal_Shdr * relsec;
6633 Elf_Internal_Rela * rela;
6634 Elf_Internal_Rela * rp;
6635 unsigned char * table;
6636 unsigned char * tp;
6637 Elf_Internal_Sym * sym;
6638 const char * relname;
6639
6640 /* First, find the starting address of the segment that includes
6641 this section. */
6642
6643 if (elf_header.e_phnum)
6644 {
6645 if (! get_program_headers (file))
6646 return 0;
6647
6648 for (seg = program_headers;
6649 seg < program_headers + elf_header.e_phnum;
6650 ++seg)
6651 {
6652 if (seg->p_type != PT_LOAD)
6653 continue;
6654
6655 if (sec->sh_addr >= seg->p_vaddr
6656 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6657 {
6658 aux->seg_base = seg->p_vaddr;
6659 break;
6660 }
6661 }
6662 }
6663
6664 /* Second, build the unwind table from the contents of the unwind
6665 section. */
6666 size = sec->sh_size;
6667 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6668 _("unwind table"));
6669 if (!table)
6670 return 0;
6671
6672 unw_ent_size = 16;
6673 nentries = size / unw_ent_size;
6674 size = unw_ent_size * nentries;
6675
6676 tep = aux->table = (struct hppa_unw_table_entry *)
6677 xcmalloc (nentries, sizeof (aux->table[0]));
6678
6679 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6680 {
6681 unsigned int tmp1, tmp2;
6682
6683 tep->start.section = SHN_UNDEF;
6684 tep->end.section = SHN_UNDEF;
6685
6686 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6687 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6688 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6689 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6690
6691 tep->start.offset += aux->seg_base;
6692 tep->end.offset += aux->seg_base;
6693
6694 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6695 tep->Millicode = (tmp1 >> 30) & 0x1;
6696 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6697 tep->Region_description = (tmp1 >> 27) & 0x3;
6698 tep->reserved1 = (tmp1 >> 26) & 0x1;
6699 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6700 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6701 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6702 tep->Args_stored = (tmp1 >> 15) & 0x1;
6703 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6704 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6705 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6706 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6707 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6708 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6709 tep->cxx_info = (tmp1 >> 8) & 0x1;
6710 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6711 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6712 tep->reserved2 = (tmp1 >> 5) & 0x1;
6713 tep->Save_SP = (tmp1 >> 4) & 0x1;
6714 tep->Save_RP = (tmp1 >> 3) & 0x1;
6715 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6716 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6717 tep->Cleanup_defined = tmp1 & 0x1;
6718
6719 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6720 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6721 tep->Large_frame = (tmp2 >> 29) & 0x1;
6722 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6723 tep->reserved4 = (tmp2 >> 27) & 0x1;
6724 tep->Total_frame_size = tmp2 & 0x7ffffff;
6725 }
6726 free (table);
6727
6728 /* Third, apply any relocations to the unwind table. */
6729 for (relsec = section_headers;
6730 relsec < section_headers + elf_header.e_shnum;
6731 ++relsec)
6732 {
6733 if (relsec->sh_type != SHT_RELA
6734 || relsec->sh_info >= elf_header.e_shnum
6735 || section_headers + relsec->sh_info != sec)
6736 continue;
6737
6738 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6739 & rela, & nrelas))
6740 return 0;
6741
6742 for (rp = rela; rp < rela + nrelas; ++rp)
6743 {
6744 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6745 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6746
6747 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6748 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6749 {
6750 warn (_("Skipping unexpected relocation type %s\n"), relname);
6751 continue;
6752 }
6753
6754 i = rp->r_offset / unw_ent_size;
6755
6756 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6757 {
6758 case 0:
6759 aux->table[i].start.section = sym->st_shndx;
6760 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6761 break;
6762 case 1:
6763 aux->table[i].end.section = sym->st_shndx;
6764 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6765 break;
6766 default:
6767 break;
6768 }
6769 }
6770
6771 free (rela);
6772 }
6773
6774 aux->table_len = nentries;
6775
6776 return 1;
6777 }
6778
6779 static void
6780 hppa_process_unwind (FILE * file)
6781 {
6782 struct hppa_unw_aux_info aux;
6783 Elf_Internal_Shdr * unwsec = NULL;
6784 Elf_Internal_Shdr * strsec;
6785 Elf_Internal_Shdr * sec;
6786 unsigned long i;
6787
6788 if (string_table == NULL)
6789 return;
6790
6791 memset (& aux, 0, sizeof (aux));
6792
6793 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6794 {
6795 if (sec->sh_type == SHT_SYMTAB
6796 && sec->sh_link < elf_header.e_shnum)
6797 {
6798 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6799
6800 strsec = section_headers + sec->sh_link;
6801 assert (aux.strtab == NULL);
6802 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6803 1, strsec->sh_size,
6804 _("string table"));
6805 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6806 }
6807 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6808 unwsec = sec;
6809 }
6810
6811 if (!unwsec)
6812 printf (_("\nThere are no unwind sections in this file.\n"));
6813
6814 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6815 {
6816 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6817 {
6818 printf (_("\nUnwind section "));
6819 printf (_("'%s'"), SECTION_NAME (sec));
6820
6821 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6822 (unsigned long) sec->sh_offset,
6823 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6824
6825 slurp_hppa_unwind_table (file, &aux, sec);
6826 if (aux.table_len > 0)
6827 dump_hppa_unwind (&aux);
6828
6829 if (aux.table)
6830 free ((char *) aux.table);
6831 aux.table = NULL;
6832 }
6833 }
6834
6835 if (aux.symtab)
6836 free (aux.symtab);
6837 if (aux.strtab)
6838 free ((char *) aux.strtab);
6839 }
6840
6841 struct arm_section
6842 {
6843 unsigned char * data; /* The unwind data. */
6844 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
6845 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
6846 unsigned long nrelas; /* The number of relocations. */
6847 unsigned int rel_type; /* REL or RELA ? */
6848 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
6849 };
6850
6851 struct arm_unw_aux_info
6852 {
6853 FILE * file; /* The file containing the unwind sections. */
6854 Elf_Internal_Sym * symtab; /* The file's symbol table. */
6855 unsigned long nsyms; /* Number of symbols. */
6856 char * strtab; /* The file's string table. */
6857 unsigned long strtab_size; /* Size of string table. */
6858 };
6859
6860 static const char *
6861 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6862 bfd_vma fn, struct absaddr addr)
6863 {
6864 const char *procname;
6865 bfd_vma sym_offset;
6866
6867 if (addr.section == SHN_UNDEF)
6868 addr.offset = fn;
6869
6870 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6871 aux->strtab_size, addr, &procname,
6872 &sym_offset);
6873
6874 print_vma (fn, PREFIX_HEX);
6875
6876 if (procname)
6877 {
6878 fputs (" <", stdout);
6879 fputs (procname, stdout);
6880
6881 if (sym_offset)
6882 printf ("+0x%lx", (unsigned long) sym_offset);
6883 fputc ('>', stdout);
6884 }
6885
6886 return procname;
6887 }
6888
6889 static void
6890 arm_free_section (struct arm_section *arm_sec)
6891 {
6892 if (arm_sec->data != NULL)
6893 free (arm_sec->data);
6894
6895 if (arm_sec->rela != NULL)
6896 free (arm_sec->rela);
6897 }
6898
6899 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6900 cached section and install SEC instead.
6901 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6902 and return its valued in * WORDP, relocating if necessary.
6903 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6904 relocation's offset in ADDR.
6905 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6906 into the string table of the symbol associated with the reloc. If no
6907 reloc was applied store -1 there.
6908 5) Return TRUE upon success, FALSE otherwise. */
6909
6910 static bfd_boolean
6911 get_unwind_section_word (struct arm_unw_aux_info * aux,
6912 struct arm_section * arm_sec,
6913 Elf_Internal_Shdr * sec,
6914 bfd_vma word_offset,
6915 unsigned int * wordp,
6916 struct absaddr * addr,
6917 bfd_vma * sym_name)
6918 {
6919 Elf_Internal_Rela *rp;
6920 Elf_Internal_Sym *sym;
6921 const char * relname;
6922 unsigned int word;
6923 bfd_boolean wrapped;
6924
6925 if (sec == NULL || arm_sec == NULL)
6926 return FALSE;
6927
6928 addr->section = SHN_UNDEF;
6929 addr->offset = 0;
6930
6931 if (sym_name != NULL)
6932 *sym_name = (bfd_vma) -1;
6933
6934 /* If necessary, update the section cache. */
6935 if (sec != arm_sec->sec)
6936 {
6937 Elf_Internal_Shdr *relsec;
6938
6939 arm_free_section (arm_sec);
6940
6941 arm_sec->sec = sec;
6942 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6943 sec->sh_size, _("unwind data"));
6944 arm_sec->rela = NULL;
6945 arm_sec->nrelas = 0;
6946
6947 for (relsec = section_headers;
6948 relsec < section_headers + elf_header.e_shnum;
6949 ++relsec)
6950 {
6951 if (relsec->sh_info >= elf_header.e_shnum
6952 || section_headers + relsec->sh_info != sec
6953 /* PR 15745: Check the section type as well. */
6954 || (relsec->sh_type != SHT_REL
6955 && relsec->sh_type != SHT_RELA))
6956 continue;
6957
6958 arm_sec->rel_type = relsec->sh_type;
6959 if (relsec->sh_type == SHT_REL)
6960 {
6961 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6962 relsec->sh_size,
6963 & arm_sec->rela, & arm_sec->nrelas))
6964 return FALSE;
6965 }
6966 else /* relsec->sh_type == SHT_RELA */
6967 {
6968 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6969 relsec->sh_size,
6970 & arm_sec->rela, & arm_sec->nrelas))
6971 return FALSE;
6972 }
6973 break;
6974 }
6975
6976 arm_sec->next_rela = arm_sec->rela;
6977 }
6978
6979 /* If there is no unwind data we can do nothing. */
6980 if (arm_sec->data == NULL)
6981 return FALSE;
6982
6983 /* If the offset is invalid then fail. */
6984 if (word_offset > sec->sh_size - 4)
6985 return FALSE;
6986
6987 /* Get the word at the required offset. */
6988 word = byte_get (arm_sec->data + word_offset, 4);
6989
6990 /* Look through the relocs to find the one that applies to the provided offset. */
6991 wrapped = FALSE;
6992 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6993 {
6994 bfd_vma prelval, offset;
6995
6996 if (rp->r_offset > word_offset && !wrapped)
6997 {
6998 rp = arm_sec->rela;
6999 wrapped = TRUE;
7000 }
7001 if (rp->r_offset > word_offset)
7002 break;
7003
7004 if (rp->r_offset & 3)
7005 {
7006 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7007 (unsigned long) rp->r_offset);
7008 continue;
7009 }
7010
7011 if (rp->r_offset < word_offset)
7012 continue;
7013
7014 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7015
7016 if (arm_sec->rel_type == SHT_REL)
7017 {
7018 offset = word & 0x7fffffff;
7019 if (offset & 0x40000000)
7020 offset |= ~ (bfd_vma) 0x7fffffff;
7021 }
7022 else if (arm_sec->rel_type == SHT_RELA)
7023 offset = rp->r_addend;
7024 else
7025 abort ();
7026
7027 offset += sym->st_value;
7028 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7029
7030 /* Check that we are processing the expected reloc type. */
7031 if (elf_header.e_machine == EM_ARM)
7032 {
7033 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7034
7035 if (streq (relname, "R_ARM_NONE"))
7036 continue;
7037
7038 if (! streq (relname, "R_ARM_PREL31"))
7039 {
7040 warn (_("Skipping unexpected relocation type %s\n"), relname);
7041 continue;
7042 }
7043 }
7044 else if (elf_header.e_machine == EM_TI_C6000)
7045 {
7046 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7047
7048 if (streq (relname, "R_C6000_NONE"))
7049 continue;
7050
7051 if (! streq (relname, "R_C6000_PREL31"))
7052 {
7053 warn (_("Skipping unexpected relocation type %s\n"), relname);
7054 continue;
7055 }
7056
7057 prelval >>= 1;
7058 }
7059 else
7060 /* This function currently only supports ARM and TI unwinders. */
7061 abort ();
7062
7063 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7064 addr->section = sym->st_shndx;
7065 addr->offset = offset;
7066 if (sym_name)
7067 * sym_name = sym->st_name;
7068 break;
7069 }
7070
7071 *wordp = word;
7072 arm_sec->next_rela = rp;
7073
7074 return TRUE;
7075 }
7076
7077 static const char *tic6x_unwind_regnames[16] =
7078 {
7079 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7080 "A14", "A13", "A12", "A11", "A10",
7081 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7082 };
7083
7084 static void
7085 decode_tic6x_unwind_regmask (unsigned int mask)
7086 {
7087 int i;
7088
7089 for (i = 12; mask; mask >>= 1, i--)
7090 {
7091 if (mask & 1)
7092 {
7093 fputs (tic6x_unwind_regnames[i], stdout);
7094 if (mask > 1)
7095 fputs (", ", stdout);
7096 }
7097 }
7098 }
7099
7100 #define ADVANCE \
7101 if (remaining == 0 && more_words) \
7102 { \
7103 data_offset += 4; \
7104 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7105 data_offset, & word, & addr, NULL)) \
7106 return; \
7107 remaining = 4; \
7108 more_words--; \
7109 } \
7110
7111 #define GET_OP(OP) \
7112 ADVANCE; \
7113 if (remaining) \
7114 { \
7115 remaining--; \
7116 (OP) = word >> 24; \
7117 word <<= 8; \
7118 } \
7119 else \
7120 { \
7121 printf (_("[Truncated opcode]\n")); \
7122 return; \
7123 } \
7124 printf ("0x%02x ", OP)
7125
7126 static void
7127 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7128 unsigned int word, unsigned int remaining,
7129 unsigned int more_words,
7130 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7131 struct arm_section *data_arm_sec)
7132 {
7133 struct absaddr addr;
7134
7135 /* Decode the unwinding instructions. */
7136 while (1)
7137 {
7138 unsigned int op, op2;
7139
7140 ADVANCE;
7141 if (remaining == 0)
7142 break;
7143 remaining--;
7144 op = word >> 24;
7145 word <<= 8;
7146
7147 printf (" 0x%02x ", op);
7148
7149 if ((op & 0xc0) == 0x00)
7150 {
7151 int offset = ((op & 0x3f) << 2) + 4;
7152
7153 printf (" vsp = vsp + %d", offset);
7154 }
7155 else if ((op & 0xc0) == 0x40)
7156 {
7157 int offset = ((op & 0x3f) << 2) + 4;
7158
7159 printf (" vsp = vsp - %d", offset);
7160 }
7161 else if ((op & 0xf0) == 0x80)
7162 {
7163 GET_OP (op2);
7164 if (op == 0x80 && op2 == 0)
7165 printf (_("Refuse to unwind"));
7166 else
7167 {
7168 unsigned int mask = ((op & 0x0f) << 8) | op2;
7169 int first = 1;
7170 int i;
7171
7172 printf ("pop {");
7173 for (i = 0; i < 12; i++)
7174 if (mask & (1 << i))
7175 {
7176 if (first)
7177 first = 0;
7178 else
7179 printf (", ");
7180 printf ("r%d", 4 + i);
7181 }
7182 printf ("}");
7183 }
7184 }
7185 else if ((op & 0xf0) == 0x90)
7186 {
7187 if (op == 0x9d || op == 0x9f)
7188 printf (_(" [Reserved]"));
7189 else
7190 printf (" vsp = r%d", op & 0x0f);
7191 }
7192 else if ((op & 0xf0) == 0xa0)
7193 {
7194 int end = 4 + (op & 0x07);
7195 int first = 1;
7196 int i;
7197
7198 printf (" pop {");
7199 for (i = 4; i <= end; i++)
7200 {
7201 if (first)
7202 first = 0;
7203 else
7204 printf (", ");
7205 printf ("r%d", i);
7206 }
7207 if (op & 0x08)
7208 {
7209 if (!first)
7210 printf (", ");
7211 printf ("r14");
7212 }
7213 printf ("}");
7214 }
7215 else if (op == 0xb0)
7216 printf (_(" finish"));
7217 else if (op == 0xb1)
7218 {
7219 GET_OP (op2);
7220 if (op2 == 0 || (op2 & 0xf0) != 0)
7221 printf (_("[Spare]"));
7222 else
7223 {
7224 unsigned int mask = op2 & 0x0f;
7225 int first = 1;
7226 int i;
7227
7228 printf ("pop {");
7229 for (i = 0; i < 12; i++)
7230 if (mask & (1 << i))
7231 {
7232 if (first)
7233 first = 0;
7234 else
7235 printf (", ");
7236 printf ("r%d", i);
7237 }
7238 printf ("}");
7239 }
7240 }
7241 else if (op == 0xb2)
7242 {
7243 unsigned char buf[9];
7244 unsigned int i, len;
7245 unsigned long offset;
7246
7247 for (i = 0; i < sizeof (buf); i++)
7248 {
7249 GET_OP (buf[i]);
7250 if ((buf[i] & 0x80) == 0)
7251 break;
7252 }
7253 assert (i < sizeof (buf));
7254 offset = read_uleb128 (buf, &len, buf + i + 1);
7255 assert (len == i + 1);
7256 offset = offset * 4 + 0x204;
7257 printf ("vsp = vsp + %ld", offset);
7258 }
7259 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7260 {
7261 unsigned int first, last;
7262
7263 GET_OP (op2);
7264 first = op2 >> 4;
7265 last = op2 & 0x0f;
7266 if (op == 0xc8)
7267 first = first + 16;
7268 printf ("pop {D%d", first);
7269 if (last)
7270 printf ("-D%d", first + last);
7271 printf ("}");
7272 }
7273 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7274 {
7275 unsigned int count = op & 0x07;
7276
7277 printf ("pop {D8");
7278 if (count)
7279 printf ("-D%d", 8 + count);
7280 printf ("}");
7281 }
7282 else if (op >= 0xc0 && op <= 0xc5)
7283 {
7284 unsigned int count = op & 0x07;
7285
7286 printf (" pop {wR10");
7287 if (count)
7288 printf ("-wR%d", 10 + count);
7289 printf ("}");
7290 }
7291 else if (op == 0xc6)
7292 {
7293 unsigned int first, last;
7294
7295 GET_OP (op2);
7296 first = op2 >> 4;
7297 last = op2 & 0x0f;
7298 printf ("pop {wR%d", first);
7299 if (last)
7300 printf ("-wR%d", first + last);
7301 printf ("}");
7302 }
7303 else if (op == 0xc7)
7304 {
7305 GET_OP (op2);
7306 if (op2 == 0 || (op2 & 0xf0) != 0)
7307 printf (_("[Spare]"));
7308 else
7309 {
7310 unsigned int mask = op2 & 0x0f;
7311 int first = 1;
7312 int i;
7313
7314 printf ("pop {");
7315 for (i = 0; i < 4; i++)
7316 if (mask & (1 << i))
7317 {
7318 if (first)
7319 first = 0;
7320 else
7321 printf (", ");
7322 printf ("wCGR%d", i);
7323 }
7324 printf ("}");
7325 }
7326 }
7327 else
7328 printf (_(" [unsupported opcode]"));
7329 printf ("\n");
7330 }
7331 }
7332
7333 static void
7334 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7335 unsigned int word, unsigned int remaining,
7336 unsigned int more_words,
7337 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7338 struct arm_section *data_arm_sec)
7339 {
7340 struct absaddr addr;
7341
7342 /* Decode the unwinding instructions. */
7343 while (1)
7344 {
7345 unsigned int op, op2;
7346
7347 ADVANCE;
7348 if (remaining == 0)
7349 break;
7350 remaining--;
7351 op = word >> 24;
7352 word <<= 8;
7353
7354 printf (" 0x%02x ", op);
7355
7356 if ((op & 0xc0) == 0x00)
7357 {
7358 int offset = ((op & 0x3f) << 3) + 8;
7359 printf (" sp = sp + %d", offset);
7360 }
7361 else if ((op & 0xc0) == 0x80)
7362 {
7363 GET_OP (op2);
7364 if (op == 0x80 && op2 == 0)
7365 printf (_("Refuse to unwind"));
7366 else
7367 {
7368 unsigned int mask = ((op & 0x1f) << 8) | op2;
7369 if (op & 0x20)
7370 printf ("pop compact {");
7371 else
7372 printf ("pop {");
7373
7374 decode_tic6x_unwind_regmask (mask);
7375 printf("}");
7376 }
7377 }
7378 else if ((op & 0xf0) == 0xc0)
7379 {
7380 unsigned int reg;
7381 unsigned int nregs;
7382 unsigned int i;
7383 const char *name;
7384 struct
7385 {
7386 unsigned int offset;
7387 unsigned int reg;
7388 } regpos[16];
7389
7390 /* Scan entire instruction first so that GET_OP output is not
7391 interleaved with disassembly. */
7392 nregs = 0;
7393 for (i = 0; nregs < (op & 0xf); i++)
7394 {
7395 GET_OP (op2);
7396 reg = op2 >> 4;
7397 if (reg != 0xf)
7398 {
7399 regpos[nregs].offset = i * 2;
7400 regpos[nregs].reg = reg;
7401 nregs++;
7402 }
7403
7404 reg = op2 & 0xf;
7405 if (reg != 0xf)
7406 {
7407 regpos[nregs].offset = i * 2 + 1;
7408 regpos[nregs].reg = reg;
7409 nregs++;
7410 }
7411 }
7412
7413 printf (_("pop frame {"));
7414 reg = nregs - 1;
7415 for (i = i * 2; i > 0; i--)
7416 {
7417 if (regpos[reg].offset == i - 1)
7418 {
7419 name = tic6x_unwind_regnames[regpos[reg].reg];
7420 if (reg > 0)
7421 reg--;
7422 }
7423 else
7424 name = _("[pad]");
7425
7426 fputs (name, stdout);
7427 if (i > 1)
7428 printf (", ");
7429 }
7430
7431 printf ("}");
7432 }
7433 else if (op == 0xd0)
7434 printf (" MOV FP, SP");
7435 else if (op == 0xd1)
7436 printf (" __c6xabi_pop_rts");
7437 else if (op == 0xd2)
7438 {
7439 unsigned char buf[9];
7440 unsigned int i, len;
7441 unsigned long offset;
7442
7443 for (i = 0; i < sizeof (buf); i++)
7444 {
7445 GET_OP (buf[i]);
7446 if ((buf[i] & 0x80) == 0)
7447 break;
7448 }
7449 assert (i < sizeof (buf));
7450 offset = read_uleb128 (buf, &len, buf + i + 1);
7451 assert (len == i + 1);
7452 offset = offset * 8 + 0x408;
7453 printf (_("sp = sp + %ld"), offset);
7454 }
7455 else if ((op & 0xf0) == 0xe0)
7456 {
7457 if ((op & 0x0f) == 7)
7458 printf (" RETURN");
7459 else
7460 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7461 }
7462 else
7463 {
7464 printf (_(" [unsupported opcode]"));
7465 }
7466 putchar ('\n');
7467 }
7468 }
7469
7470 static bfd_vma
7471 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7472 {
7473 bfd_vma offset;
7474
7475 offset = word & 0x7fffffff;
7476 if (offset & 0x40000000)
7477 offset |= ~ (bfd_vma) 0x7fffffff;
7478
7479 if (elf_header.e_machine == EM_TI_C6000)
7480 offset <<= 1;
7481
7482 return offset + where;
7483 }
7484
7485 static void
7486 decode_arm_unwind (struct arm_unw_aux_info * aux,
7487 unsigned int word,
7488 unsigned int remaining,
7489 bfd_vma data_offset,
7490 Elf_Internal_Shdr * data_sec,
7491 struct arm_section * data_arm_sec)
7492 {
7493 int per_index;
7494 unsigned int more_words = 0;
7495 struct absaddr addr;
7496 bfd_vma sym_name = (bfd_vma) -1;
7497
7498 if (remaining == 0)
7499 {
7500 /* Fetch the first word.
7501 Note - when decoding an object file the address extracted
7502 here will always be 0. So we also pass in the sym_name
7503 parameter so that we can find the symbol associated with
7504 the personality routine. */
7505 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7506 & word, & addr, & sym_name))
7507 return;
7508
7509 remaining = 4;
7510 }
7511
7512 if ((word & 0x80000000) == 0)
7513 {
7514 /* Expand prel31 for personality routine. */
7515 bfd_vma fn;
7516 const char *procname;
7517
7518 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7519 printf (_(" Personality routine: "));
7520 if (fn == 0
7521 && addr.section == SHN_UNDEF && addr.offset == 0
7522 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7523 {
7524 procname = aux->strtab + sym_name;
7525 print_vma (fn, PREFIX_HEX);
7526 if (procname)
7527 {
7528 fputs (" <", stdout);
7529 fputs (procname, stdout);
7530 fputc ('>', stdout);
7531 }
7532 }
7533 else
7534 procname = arm_print_vma_and_name (aux, fn, addr);
7535 fputc ('\n', stdout);
7536
7537 /* The GCC personality routines use the standard compact
7538 encoding, starting with one byte giving the number of
7539 words. */
7540 if (procname != NULL
7541 && (const_strneq (procname, "__gcc_personality_v0")
7542 || const_strneq (procname, "__gxx_personality_v0")
7543 || const_strneq (procname, "__gcj_personality_v0")
7544 || const_strneq (procname, "__gnu_objc_personality_v0")))
7545 {
7546 remaining = 0;
7547 more_words = 1;
7548 ADVANCE;
7549 if (!remaining)
7550 {
7551 printf (_(" [Truncated data]\n"));
7552 return;
7553 }
7554 more_words = word >> 24;
7555 word <<= 8;
7556 remaining--;
7557 per_index = -1;
7558 }
7559 else
7560 return;
7561 }
7562 else
7563 {
7564 /* ARM EHABI Section 6.3:
7565
7566 An exception-handling table entry for the compact model looks like:
7567
7568 31 30-28 27-24 23-0
7569 -- ----- ----- ----
7570 1 0 index Data for personalityRoutine[index] */
7571
7572 if (elf_header.e_machine == EM_ARM
7573 && (word & 0x70000000))
7574 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7575
7576 per_index = (word >> 24) & 0x7f;
7577 printf (_(" Compact model index: %d\n"), per_index);
7578 if (per_index == 0)
7579 {
7580 more_words = 0;
7581 word <<= 8;
7582 remaining--;
7583 }
7584 else if (per_index < 3)
7585 {
7586 more_words = (word >> 16) & 0xff;
7587 word <<= 16;
7588 remaining -= 2;
7589 }
7590 }
7591
7592 switch (elf_header.e_machine)
7593 {
7594 case EM_ARM:
7595 if (per_index < 3)
7596 {
7597 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7598 data_offset, data_sec, data_arm_sec);
7599 }
7600 else
7601 {
7602 warn (_("Unknown ARM compact model index encountered\n"));
7603 printf (_(" [reserved]\n"));
7604 }
7605 break;
7606
7607 case EM_TI_C6000:
7608 if (per_index < 3)
7609 {
7610 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7611 data_offset, data_sec, data_arm_sec);
7612 }
7613 else if (per_index < 5)
7614 {
7615 if (((word >> 17) & 0x7f) == 0x7f)
7616 printf (_(" Restore stack from frame pointer\n"));
7617 else
7618 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
7619 printf (_(" Registers restored: "));
7620 if (per_index == 4)
7621 printf (" (compact) ");
7622 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7623 putchar ('\n');
7624 printf (_(" Return register: %s\n"),
7625 tic6x_unwind_regnames[word & 0xf]);
7626 }
7627 else
7628 printf (_(" [reserved (%d)]\n"), per_index);
7629 break;
7630
7631 default:
7632 error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7633 elf_header.e_machine);
7634 }
7635
7636 /* Decode the descriptors. Not implemented. */
7637 }
7638
7639 static void
7640 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7641 {
7642 struct arm_section exidx_arm_sec, extab_arm_sec;
7643 unsigned int i, exidx_len;
7644
7645 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7646 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7647 exidx_len = exidx_sec->sh_size / 8;
7648
7649 for (i = 0; i < exidx_len; i++)
7650 {
7651 unsigned int exidx_fn, exidx_entry;
7652 struct absaddr fn_addr, entry_addr;
7653 bfd_vma fn;
7654
7655 fputc ('\n', stdout);
7656
7657 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7658 8 * i, & exidx_fn, & fn_addr, NULL)
7659 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7660 8 * i + 4, & exidx_entry, & entry_addr, NULL))
7661 {
7662 arm_free_section (& exidx_arm_sec);
7663 arm_free_section (& extab_arm_sec);
7664 return;
7665 }
7666
7667 /* ARM EHABI, Section 5:
7668 An index table entry consists of 2 words.
7669 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
7670 if (exidx_fn & 0x80000000)
7671 warn (_("corrupt index table entry: %x\n"), exidx_fn);
7672
7673 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7674
7675 arm_print_vma_and_name (aux, fn, fn_addr);
7676 fputs (": ", stdout);
7677
7678 if (exidx_entry == 1)
7679 {
7680 print_vma (exidx_entry, PREFIX_HEX);
7681 fputs (" [cantunwind]\n", stdout);
7682 }
7683 else if (exidx_entry & 0x80000000)
7684 {
7685 print_vma (exidx_entry, PREFIX_HEX);
7686 fputc ('\n', stdout);
7687 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7688 }
7689 else
7690 {
7691 bfd_vma table, table_offset = 0;
7692 Elf_Internal_Shdr *table_sec;
7693
7694 fputs ("@", stdout);
7695 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7696 print_vma (table, PREFIX_HEX);
7697 printf ("\n");
7698
7699 /* Locate the matching .ARM.extab. */
7700 if (entry_addr.section != SHN_UNDEF
7701 && entry_addr.section < elf_header.e_shnum)
7702 {
7703 table_sec = section_headers + entry_addr.section;
7704 table_offset = entry_addr.offset;
7705 }
7706 else
7707 {
7708 table_sec = find_section_by_address (table);
7709 if (table_sec != NULL)
7710 table_offset = table - table_sec->sh_addr;
7711 }
7712 if (table_sec == NULL)
7713 {
7714 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7715 (unsigned long) table);
7716 continue;
7717 }
7718 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7719 &extab_arm_sec);
7720 }
7721 }
7722
7723 printf ("\n");
7724
7725 arm_free_section (&exidx_arm_sec);
7726 arm_free_section (&extab_arm_sec);
7727 }
7728
7729 /* Used for both ARM and C6X unwinding tables. */
7730
7731 static void
7732 arm_process_unwind (FILE *file)
7733 {
7734 struct arm_unw_aux_info aux;
7735 Elf_Internal_Shdr *unwsec = NULL;
7736 Elf_Internal_Shdr *strsec;
7737 Elf_Internal_Shdr *sec;
7738 unsigned long i;
7739 unsigned int sec_type;
7740
7741 switch (elf_header.e_machine)
7742 {
7743 case EM_ARM:
7744 sec_type = SHT_ARM_EXIDX;
7745 break;
7746
7747 case EM_TI_C6000:
7748 sec_type = SHT_C6000_UNWIND;
7749 break;
7750
7751 default:
7752 error (_("Unsupported architecture type %d encountered when processing unwind table"),
7753 elf_header.e_machine);
7754 return;
7755 }
7756
7757 if (string_table == NULL)
7758 return;
7759
7760 memset (& aux, 0, sizeof (aux));
7761 aux.file = file;
7762
7763 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7764 {
7765 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7766 {
7767 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7768
7769 strsec = section_headers + sec->sh_link;
7770 assert (aux.strtab == NULL);
7771 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7772 1, strsec->sh_size, _("string table"));
7773 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7774 }
7775 else if (sec->sh_type == sec_type)
7776 unwsec = sec;
7777 }
7778
7779 if (unwsec == NULL)
7780 printf (_("\nThere are no unwind sections in this file.\n"));
7781 else
7782 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7783 {
7784 if (sec->sh_type == sec_type)
7785 {
7786 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7787 SECTION_NAME (sec),
7788 (unsigned long) sec->sh_offset,
7789 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7790
7791 dump_arm_unwind (&aux, sec);
7792 }
7793 }
7794
7795 if (aux.symtab)
7796 free (aux.symtab);
7797 if (aux.strtab)
7798 free ((char *) aux.strtab);
7799 }
7800
7801 static void
7802 process_unwind (FILE * file)
7803 {
7804 struct unwind_handler
7805 {
7806 int machtype;
7807 void (* handler)(FILE *);
7808 } handlers[] =
7809 {
7810 { EM_ARM, arm_process_unwind },
7811 { EM_IA_64, ia64_process_unwind },
7812 { EM_PARISC, hppa_process_unwind },
7813 { EM_TI_C6000, arm_process_unwind },
7814 { 0, 0 }
7815 };
7816 int i;
7817
7818 if (!do_unwind)
7819 return;
7820
7821 for (i = 0; handlers[i].handler != NULL; i++)
7822 if (elf_header.e_machine == handlers[i].machtype)
7823 {
7824 handlers[i].handler (file);
7825 return;
7826 }
7827
7828 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7829 get_machine_name (elf_header.e_machine));
7830 }
7831
7832 static void
7833 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7834 {
7835 switch (entry->d_tag)
7836 {
7837 case DT_MIPS_FLAGS:
7838 if (entry->d_un.d_val == 0)
7839 printf (_("NONE"));
7840 else
7841 {
7842 static const char * opts[] =
7843 {
7844 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7845 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7846 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7847 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7848 "RLD_ORDER_SAFE"
7849 };
7850 unsigned int cnt;
7851 int first = 1;
7852
7853 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7854 if (entry->d_un.d_val & (1 << cnt))
7855 {
7856 printf ("%s%s", first ? "" : " ", opts[cnt]);
7857 first = 0;
7858 }
7859 }
7860 break;
7861
7862 case DT_MIPS_IVERSION:
7863 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7864 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7865 else
7866 {
7867 char buf[40];
7868 sprintf_vma (buf, entry->d_un.d_ptr);
7869 /* Note: coded this way so that there is a single string for translation. */
7870 printf (_("<corrupt: %s>"), buf);
7871 }
7872 break;
7873
7874 case DT_MIPS_TIME_STAMP:
7875 {
7876 char timebuf[20];
7877 struct tm * tmp;
7878
7879 time_t atime = entry->d_un.d_val;
7880 tmp = gmtime (&atime);
7881 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7882 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7883 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7884 printf (_("Time Stamp: %s"), timebuf);
7885 }
7886 break;
7887
7888 case DT_MIPS_RLD_VERSION:
7889 case DT_MIPS_LOCAL_GOTNO:
7890 case DT_MIPS_CONFLICTNO:
7891 case DT_MIPS_LIBLISTNO:
7892 case DT_MIPS_SYMTABNO:
7893 case DT_MIPS_UNREFEXTNO:
7894 case DT_MIPS_HIPAGENO:
7895 case DT_MIPS_DELTA_CLASS_NO:
7896 case DT_MIPS_DELTA_INSTANCE_NO:
7897 case DT_MIPS_DELTA_RELOC_NO:
7898 case DT_MIPS_DELTA_SYM_NO:
7899 case DT_MIPS_DELTA_CLASSSYM_NO:
7900 case DT_MIPS_COMPACT_SIZE:
7901 print_vma (entry->d_un.d_ptr, DEC);
7902 break;
7903
7904 default:
7905 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7906 }
7907 putchar ('\n');
7908 }
7909
7910 static void
7911 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7912 {
7913 switch (entry->d_tag)
7914 {
7915 case DT_HP_DLD_FLAGS:
7916 {
7917 static struct
7918 {
7919 long int bit;
7920 const char * str;
7921 }
7922 flags[] =
7923 {
7924 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7925 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7926 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7927 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7928 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7929 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7930 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7931 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7932 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7933 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7934 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7935 { DT_HP_GST, "HP_GST" },
7936 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7937 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7938 { DT_HP_NODELETE, "HP_NODELETE" },
7939 { DT_HP_GROUP, "HP_GROUP" },
7940 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7941 };
7942 int first = 1;
7943 size_t cnt;
7944 bfd_vma val = entry->d_un.d_val;
7945
7946 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7947 if (val & flags[cnt].bit)
7948 {
7949 if (! first)
7950 putchar (' ');
7951 fputs (flags[cnt].str, stdout);
7952 first = 0;
7953 val ^= flags[cnt].bit;
7954 }
7955
7956 if (val != 0 || first)
7957 {
7958 if (! first)
7959 putchar (' ');
7960 print_vma (val, HEX);
7961 }
7962 }
7963 break;
7964
7965 default:
7966 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7967 break;
7968 }
7969 putchar ('\n');
7970 }
7971
7972 #ifdef BFD64
7973
7974 /* VMS vs Unix time offset and factor. */
7975
7976 #define VMS_EPOCH_OFFSET 35067168000000000LL
7977 #define VMS_GRANULARITY_FACTOR 10000000
7978
7979 /* Display a VMS time in a human readable format. */
7980
7981 static void
7982 print_vms_time (bfd_int64_t vmstime)
7983 {
7984 struct tm *tm;
7985 time_t unxtime;
7986
7987 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7988 tm = gmtime (&unxtime);
7989 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7990 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7991 tm->tm_hour, tm->tm_min, tm->tm_sec);
7992 }
7993 #endif /* BFD64 */
7994
7995 static void
7996 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7997 {
7998 switch (entry->d_tag)
7999 {
8000 case DT_IA_64_PLT_RESERVE:
8001 /* First 3 slots reserved. */
8002 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8003 printf (" -- ");
8004 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8005 break;
8006
8007 case DT_IA_64_VMS_LINKTIME:
8008 #ifdef BFD64
8009 print_vms_time (entry->d_un.d_val);
8010 #endif
8011 break;
8012
8013 case DT_IA_64_VMS_LNKFLAGS:
8014 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8015 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8016 printf (" CALL_DEBUG");
8017 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8018 printf (" NOP0BUFS");
8019 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8020 printf (" P0IMAGE");
8021 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8022 printf (" MKTHREADS");
8023 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8024 printf (" UPCALLS");
8025 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8026 printf (" IMGSTA");
8027 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8028 printf (" INITIALIZE");
8029 if (entry->d_un.d_val & VMS_LF_MAIN)
8030 printf (" MAIN");
8031 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8032 printf (" EXE_INIT");
8033 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8034 printf (" TBK_IN_IMG");
8035 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8036 printf (" DBG_IN_IMG");
8037 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8038 printf (" TBK_IN_DSF");
8039 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8040 printf (" DBG_IN_DSF");
8041 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8042 printf (" SIGNATURES");
8043 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8044 printf (" REL_SEG_OFF");
8045 break;
8046
8047 default:
8048 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8049 break;
8050 }
8051 putchar ('\n');
8052 }
8053
8054 static int
8055 get_32bit_dynamic_section (FILE * file)
8056 {
8057 Elf32_External_Dyn * edyn;
8058 Elf32_External_Dyn * ext;
8059 Elf_Internal_Dyn * entry;
8060
8061 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8062 dynamic_size, _("dynamic section"));
8063 if (!edyn)
8064 return 0;
8065
8066 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8067 might not have the luxury of section headers. Look for the DT_NULL
8068 terminator to determine the number of entries. */
8069 for (ext = edyn, dynamic_nent = 0;
8070 (char *) ext < (char *) edyn + dynamic_size;
8071 ext++)
8072 {
8073 dynamic_nent++;
8074 if (BYTE_GET (ext->d_tag) == DT_NULL)
8075 break;
8076 }
8077
8078 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8079 sizeof (* entry));
8080 if (dynamic_section == NULL)
8081 {
8082 error (_("Out of memory\n"));
8083 free (edyn);
8084 return 0;
8085 }
8086
8087 for (ext = edyn, entry = dynamic_section;
8088 entry < dynamic_section + dynamic_nent;
8089 ext++, entry++)
8090 {
8091 entry->d_tag = BYTE_GET (ext->d_tag);
8092 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8093 }
8094
8095 free (edyn);
8096
8097 return 1;
8098 }
8099
8100 static int
8101 get_64bit_dynamic_section (FILE * file)
8102 {
8103 Elf64_External_Dyn * edyn;
8104 Elf64_External_Dyn * ext;
8105 Elf_Internal_Dyn * entry;
8106
8107 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8108 dynamic_size, _("dynamic section"));
8109 if (!edyn)
8110 return 0;
8111
8112 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8113 might not have the luxury of section headers. Look for the DT_NULL
8114 terminator to determine the number of entries. */
8115 for (ext = edyn, dynamic_nent = 0;
8116 (char *) ext < (char *) edyn + dynamic_size;
8117 ext++)
8118 {
8119 dynamic_nent++;
8120 if (BYTE_GET (ext->d_tag) == DT_NULL)
8121 break;
8122 }
8123
8124 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8125 sizeof (* entry));
8126 if (dynamic_section == NULL)
8127 {
8128 error (_("Out of memory\n"));
8129 free (edyn);
8130 return 0;
8131 }
8132
8133 for (ext = edyn, entry = dynamic_section;
8134 entry < dynamic_section + dynamic_nent;
8135 ext++, entry++)
8136 {
8137 entry->d_tag = BYTE_GET (ext->d_tag);
8138 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8139 }
8140
8141 free (edyn);
8142
8143 return 1;
8144 }
8145
8146 static void
8147 print_dynamic_flags (bfd_vma flags)
8148 {
8149 int first = 1;
8150
8151 while (flags)
8152 {
8153 bfd_vma flag;
8154
8155 flag = flags & - flags;
8156 flags &= ~ flag;
8157
8158 if (first)
8159 first = 0;
8160 else
8161 putc (' ', stdout);
8162
8163 switch (flag)
8164 {
8165 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8166 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8167 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8168 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8169 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8170 default: fputs (_("unknown"), stdout); break;
8171 }
8172 }
8173 puts ("");
8174 }
8175
8176 /* Parse and display the contents of the dynamic section. */
8177
8178 static int
8179 process_dynamic_section (FILE * file)
8180 {
8181 Elf_Internal_Dyn * entry;
8182
8183 if (dynamic_size == 0)
8184 {
8185 if (do_dynamic)
8186 printf (_("\nThere is no dynamic section in this file.\n"));
8187
8188 return 1;
8189 }
8190
8191 if (is_32bit_elf)
8192 {
8193 if (! get_32bit_dynamic_section (file))
8194 return 0;
8195 }
8196 else if (! get_64bit_dynamic_section (file))
8197 return 0;
8198
8199 /* Find the appropriate symbol table. */
8200 if (dynamic_symbols == NULL)
8201 {
8202 for (entry = dynamic_section;
8203 entry < dynamic_section + dynamic_nent;
8204 ++entry)
8205 {
8206 Elf_Internal_Shdr section;
8207
8208 if (entry->d_tag != DT_SYMTAB)
8209 continue;
8210
8211 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8212
8213 /* Since we do not know how big the symbol table is,
8214 we default to reading in the entire file (!) and
8215 processing that. This is overkill, I know, but it
8216 should work. */
8217 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8218
8219 if (archive_file_offset != 0)
8220 section.sh_size = archive_file_size - section.sh_offset;
8221 else
8222 {
8223 if (fseek (file, 0, SEEK_END))
8224 error (_("Unable to seek to end of file!\n"));
8225
8226 section.sh_size = ftell (file) - section.sh_offset;
8227 }
8228
8229 if (is_32bit_elf)
8230 section.sh_entsize = sizeof (Elf32_External_Sym);
8231 else
8232 section.sh_entsize = sizeof (Elf64_External_Sym);
8233
8234 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8235 if (num_dynamic_syms < 1)
8236 {
8237 error (_("Unable to determine the number of symbols to load\n"));
8238 continue;
8239 }
8240 }
8241 }
8242
8243 /* Similarly find a string table. */
8244 if (dynamic_strings == NULL)
8245 {
8246 for (entry = dynamic_section;
8247 entry < dynamic_section + dynamic_nent;
8248 ++entry)
8249 {
8250 unsigned long offset;
8251 long str_tab_len;
8252
8253 if (entry->d_tag != DT_STRTAB)
8254 continue;
8255
8256 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8257
8258 /* Since we do not know how big the string table is,
8259 we default to reading in the entire file (!) and
8260 processing that. This is overkill, I know, but it
8261 should work. */
8262
8263 offset = offset_from_vma (file, entry->d_un.d_val, 0);
8264
8265 if (archive_file_offset != 0)
8266 str_tab_len = archive_file_size - offset;
8267 else
8268 {
8269 if (fseek (file, 0, SEEK_END))
8270 error (_("Unable to seek to end of file\n"));
8271 str_tab_len = ftell (file) - offset;
8272 }
8273
8274 if (str_tab_len < 1)
8275 {
8276 error
8277 (_("Unable to determine the length of the dynamic string table\n"));
8278 continue;
8279 }
8280
8281 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8282 str_tab_len,
8283 _("dynamic string table"));
8284 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8285 break;
8286 }
8287 }
8288
8289 /* And find the syminfo section if available. */
8290 if (dynamic_syminfo == NULL)
8291 {
8292 unsigned long syminsz = 0;
8293
8294 for (entry = dynamic_section;
8295 entry < dynamic_section + dynamic_nent;
8296 ++entry)
8297 {
8298 if (entry->d_tag == DT_SYMINENT)
8299 {
8300 /* Note: these braces are necessary to avoid a syntax
8301 error from the SunOS4 C compiler. */
8302 /* PR binutils/17531: A corrupt file can trigger this test.
8303 So do not use an assert, instead generate an error message. */
8304 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8305 error (_("Bad value (%d) for SYMINENT entry"),
8306 (int) entry->d_un.d_val);
8307 }
8308 else if (entry->d_tag == DT_SYMINSZ)
8309 syminsz = entry->d_un.d_val;
8310 else if (entry->d_tag == DT_SYMINFO)
8311 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8312 syminsz);
8313 }
8314
8315 if (dynamic_syminfo_offset != 0 && syminsz != 0)
8316 {
8317 Elf_External_Syminfo * extsyminfo;
8318 Elf_External_Syminfo * extsym;
8319 Elf_Internal_Syminfo * syminfo;
8320
8321 /* There is a syminfo section. Read the data. */
8322 extsyminfo = (Elf_External_Syminfo *)
8323 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8324 _("symbol information"));
8325 if (!extsyminfo)
8326 return 0;
8327
8328 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8329 if (dynamic_syminfo == NULL)
8330 {
8331 error (_("Out of memory\n"));
8332 return 0;
8333 }
8334
8335 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8336 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8337 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8338 ++syminfo, ++extsym)
8339 {
8340 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8341 syminfo->si_flags = BYTE_GET (extsym->si_flags);
8342 }
8343
8344 free (extsyminfo);
8345 }
8346 }
8347
8348 if (do_dynamic && dynamic_addr)
8349 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
8350 dynamic_addr, dynamic_nent);
8351 if (do_dynamic)
8352 printf (_(" Tag Type Name/Value\n"));
8353
8354 for (entry = dynamic_section;
8355 entry < dynamic_section + dynamic_nent;
8356 entry++)
8357 {
8358 if (do_dynamic)
8359 {
8360 const char * dtype;
8361
8362 putchar (' ');
8363 print_vma (entry->d_tag, FULL_HEX);
8364 dtype = get_dynamic_type (entry->d_tag);
8365 printf (" (%s)%*s", dtype,
8366 ((is_32bit_elf ? 27 : 19)
8367 - (int) strlen (dtype)),
8368 " ");
8369 }
8370
8371 switch (entry->d_tag)
8372 {
8373 case DT_FLAGS:
8374 if (do_dynamic)
8375 print_dynamic_flags (entry->d_un.d_val);
8376 break;
8377
8378 case DT_AUXILIARY:
8379 case DT_FILTER:
8380 case DT_CONFIG:
8381 case DT_DEPAUDIT:
8382 case DT_AUDIT:
8383 if (do_dynamic)
8384 {
8385 switch (entry->d_tag)
8386 {
8387 case DT_AUXILIARY:
8388 printf (_("Auxiliary library"));
8389 break;
8390
8391 case DT_FILTER:
8392 printf (_("Filter library"));
8393 break;
8394
8395 case DT_CONFIG:
8396 printf (_("Configuration file"));
8397 break;
8398
8399 case DT_DEPAUDIT:
8400 printf (_("Dependency audit library"));
8401 break;
8402
8403 case DT_AUDIT:
8404 printf (_("Audit library"));
8405 break;
8406 }
8407
8408 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8409 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8410 else
8411 {
8412 printf (": ");
8413 print_vma (entry->d_un.d_val, PREFIX_HEX);
8414 putchar ('\n');
8415 }
8416 }
8417 break;
8418
8419 case DT_FEATURE:
8420 if (do_dynamic)
8421 {
8422 printf (_("Flags:"));
8423
8424 if (entry->d_un.d_val == 0)
8425 printf (_(" None\n"));
8426 else
8427 {
8428 unsigned long int val = entry->d_un.d_val;
8429
8430 if (val & DTF_1_PARINIT)
8431 {
8432 printf (" PARINIT");
8433 val ^= DTF_1_PARINIT;
8434 }
8435 if (val & DTF_1_CONFEXP)
8436 {
8437 printf (" CONFEXP");
8438 val ^= DTF_1_CONFEXP;
8439 }
8440 if (val != 0)
8441 printf (" %lx", val);
8442 puts ("");
8443 }
8444 }
8445 break;
8446
8447 case DT_POSFLAG_1:
8448 if (do_dynamic)
8449 {
8450 printf (_("Flags:"));
8451
8452 if (entry->d_un.d_val == 0)
8453 printf (_(" None\n"));
8454 else
8455 {
8456 unsigned long int val = entry->d_un.d_val;
8457
8458 if (val & DF_P1_LAZYLOAD)
8459 {
8460 printf (" LAZYLOAD");
8461 val ^= DF_P1_LAZYLOAD;
8462 }
8463 if (val & DF_P1_GROUPPERM)
8464 {
8465 printf (" GROUPPERM");
8466 val ^= DF_P1_GROUPPERM;
8467 }
8468 if (val != 0)
8469 printf (" %lx", val);
8470 puts ("");
8471 }
8472 }
8473 break;
8474
8475 case DT_FLAGS_1:
8476 if (do_dynamic)
8477 {
8478 printf (_("Flags:"));
8479 if (entry->d_un.d_val == 0)
8480 printf (_(" None\n"));
8481 else
8482 {
8483 unsigned long int val = entry->d_un.d_val;
8484
8485 if (val & DF_1_NOW)
8486 {
8487 printf (" NOW");
8488 val ^= DF_1_NOW;
8489 }
8490 if (val & DF_1_GLOBAL)
8491 {
8492 printf (" GLOBAL");
8493 val ^= DF_1_GLOBAL;
8494 }
8495 if (val & DF_1_GROUP)
8496 {
8497 printf (" GROUP");
8498 val ^= DF_1_GROUP;
8499 }
8500 if (val & DF_1_NODELETE)
8501 {
8502 printf (" NODELETE");
8503 val ^= DF_1_NODELETE;
8504 }
8505 if (val & DF_1_LOADFLTR)
8506 {
8507 printf (" LOADFLTR");
8508 val ^= DF_1_LOADFLTR;
8509 }
8510 if (val & DF_1_INITFIRST)
8511 {
8512 printf (" INITFIRST");
8513 val ^= DF_1_INITFIRST;
8514 }
8515 if (val & DF_1_NOOPEN)
8516 {
8517 printf (" NOOPEN");
8518 val ^= DF_1_NOOPEN;
8519 }
8520 if (val & DF_1_ORIGIN)
8521 {
8522 printf (" ORIGIN");
8523 val ^= DF_1_ORIGIN;
8524 }
8525 if (val & DF_1_DIRECT)
8526 {
8527 printf (" DIRECT");
8528 val ^= DF_1_DIRECT;
8529 }
8530 if (val & DF_1_TRANS)
8531 {
8532 printf (" TRANS");
8533 val ^= DF_1_TRANS;
8534 }
8535 if (val & DF_1_INTERPOSE)
8536 {
8537 printf (" INTERPOSE");
8538 val ^= DF_1_INTERPOSE;
8539 }
8540 if (val & DF_1_NODEFLIB)
8541 {
8542 printf (" NODEFLIB");
8543 val ^= DF_1_NODEFLIB;
8544 }
8545 if (val & DF_1_NODUMP)
8546 {
8547 printf (" NODUMP");
8548 val ^= DF_1_NODUMP;
8549 }
8550 if (val & DF_1_CONFALT)
8551 {
8552 printf (" CONFALT");
8553 val ^= DF_1_CONFALT;
8554 }
8555 if (val & DF_1_ENDFILTEE)
8556 {
8557 printf (" ENDFILTEE");
8558 val ^= DF_1_ENDFILTEE;
8559 }
8560 if (val & DF_1_DISPRELDNE)
8561 {
8562 printf (" DISPRELDNE");
8563 val ^= DF_1_DISPRELDNE;
8564 }
8565 if (val & DF_1_DISPRELPND)
8566 {
8567 printf (" DISPRELPND");
8568 val ^= DF_1_DISPRELPND;
8569 }
8570 if (val & DF_1_NODIRECT)
8571 {
8572 printf (" NODIRECT");
8573 val ^= DF_1_NODIRECT;
8574 }
8575 if (val & DF_1_IGNMULDEF)
8576 {
8577 printf (" IGNMULDEF");
8578 val ^= DF_1_IGNMULDEF;
8579 }
8580 if (val & DF_1_NOKSYMS)
8581 {
8582 printf (" NOKSYMS");
8583 val ^= DF_1_NOKSYMS;
8584 }
8585 if (val & DF_1_NOHDR)
8586 {
8587 printf (" NOHDR");
8588 val ^= DF_1_NOHDR;
8589 }
8590 if (val & DF_1_EDITED)
8591 {
8592 printf (" EDITED");
8593 val ^= DF_1_EDITED;
8594 }
8595 if (val & DF_1_NORELOC)
8596 {
8597 printf (" NORELOC");
8598 val ^= DF_1_NORELOC;
8599 }
8600 if (val & DF_1_SYMINTPOSE)
8601 {
8602 printf (" SYMINTPOSE");
8603 val ^= DF_1_SYMINTPOSE;
8604 }
8605 if (val & DF_1_GLOBAUDIT)
8606 {
8607 printf (" GLOBAUDIT");
8608 val ^= DF_1_GLOBAUDIT;
8609 }
8610 if (val & DF_1_SINGLETON)
8611 {
8612 printf (" SINGLETON");
8613 val ^= DF_1_SINGLETON;
8614 }
8615 if (val != 0)
8616 printf (" %lx", val);
8617 puts ("");
8618 }
8619 }
8620 break;
8621
8622 case DT_PLTREL:
8623 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8624 if (do_dynamic)
8625 puts (get_dynamic_type (entry->d_un.d_val));
8626 break;
8627
8628 case DT_NULL :
8629 case DT_NEEDED :
8630 case DT_PLTGOT :
8631 case DT_HASH :
8632 case DT_STRTAB :
8633 case DT_SYMTAB :
8634 case DT_RELA :
8635 case DT_INIT :
8636 case DT_FINI :
8637 case DT_SONAME :
8638 case DT_RPATH :
8639 case DT_SYMBOLIC:
8640 case DT_REL :
8641 case DT_DEBUG :
8642 case DT_TEXTREL :
8643 case DT_JMPREL :
8644 case DT_RUNPATH :
8645 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8646
8647 if (do_dynamic)
8648 {
8649 char * name;
8650
8651 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8652 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8653 else
8654 name = NULL;
8655
8656 if (name)
8657 {
8658 switch (entry->d_tag)
8659 {
8660 case DT_NEEDED:
8661 printf (_("Shared library: [%s]"), name);
8662
8663 if (streq (name, program_interpreter))
8664 printf (_(" program interpreter"));
8665 break;
8666
8667 case DT_SONAME:
8668 printf (_("Library soname: [%s]"), name);
8669 break;
8670
8671 case DT_RPATH:
8672 printf (_("Library rpath: [%s]"), name);
8673 break;
8674
8675 case DT_RUNPATH:
8676 printf (_("Library runpath: [%s]"), name);
8677 break;
8678
8679 default:
8680 print_vma (entry->d_un.d_val, PREFIX_HEX);
8681 break;
8682 }
8683 }
8684 else
8685 print_vma (entry->d_un.d_val, PREFIX_HEX);
8686
8687 putchar ('\n');
8688 }
8689 break;
8690
8691 case DT_PLTRELSZ:
8692 case DT_RELASZ :
8693 case DT_STRSZ :
8694 case DT_RELSZ :
8695 case DT_RELAENT :
8696 case DT_SYMENT :
8697 case DT_RELENT :
8698 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8699 case DT_PLTPADSZ:
8700 case DT_MOVEENT :
8701 case DT_MOVESZ :
8702 case DT_INIT_ARRAYSZ:
8703 case DT_FINI_ARRAYSZ:
8704 case DT_GNU_CONFLICTSZ:
8705 case DT_GNU_LIBLISTSZ:
8706 if (do_dynamic)
8707 {
8708 print_vma (entry->d_un.d_val, UNSIGNED);
8709 printf (_(" (bytes)\n"));
8710 }
8711 break;
8712
8713 case DT_VERDEFNUM:
8714 case DT_VERNEEDNUM:
8715 case DT_RELACOUNT:
8716 case DT_RELCOUNT:
8717 if (do_dynamic)
8718 {
8719 print_vma (entry->d_un.d_val, UNSIGNED);
8720 putchar ('\n');
8721 }
8722 break;
8723
8724 case DT_SYMINSZ:
8725 case DT_SYMINENT:
8726 case DT_SYMINFO:
8727 case DT_USED:
8728 case DT_INIT_ARRAY:
8729 case DT_FINI_ARRAY:
8730 if (do_dynamic)
8731 {
8732 if (entry->d_tag == DT_USED
8733 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8734 {
8735 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8736
8737 if (*name)
8738 {
8739 printf (_("Not needed object: [%s]\n"), name);
8740 break;
8741 }
8742 }
8743
8744 print_vma (entry->d_un.d_val, PREFIX_HEX);
8745 putchar ('\n');
8746 }
8747 break;
8748
8749 case DT_BIND_NOW:
8750 /* The value of this entry is ignored. */
8751 if (do_dynamic)
8752 putchar ('\n');
8753 break;
8754
8755 case DT_GNU_PRELINKED:
8756 if (do_dynamic)
8757 {
8758 struct tm * tmp;
8759 time_t atime = entry->d_un.d_val;
8760
8761 tmp = gmtime (&atime);
8762 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8763 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8764 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8765
8766 }
8767 break;
8768
8769 case DT_GNU_HASH:
8770 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8771 if (do_dynamic)
8772 {
8773 print_vma (entry->d_un.d_val, PREFIX_HEX);
8774 putchar ('\n');
8775 }
8776 break;
8777
8778 default:
8779 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8780 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8781 entry->d_un.d_val;
8782
8783 if (do_dynamic)
8784 {
8785 switch (elf_header.e_machine)
8786 {
8787 case EM_MIPS:
8788 case EM_MIPS_RS3_LE:
8789 dynamic_section_mips_val (entry);
8790 break;
8791 case EM_PARISC:
8792 dynamic_section_parisc_val (entry);
8793 break;
8794 case EM_IA_64:
8795 dynamic_section_ia64_val (entry);
8796 break;
8797 default:
8798 print_vma (entry->d_un.d_val, PREFIX_HEX);
8799 putchar ('\n');
8800 }
8801 }
8802 break;
8803 }
8804 }
8805
8806 return 1;
8807 }
8808
8809 static char *
8810 get_ver_flags (unsigned int flags)
8811 {
8812 static char buff[32];
8813
8814 buff[0] = 0;
8815
8816 if (flags == 0)
8817 return _("none");
8818
8819 if (flags & VER_FLG_BASE)
8820 strcat (buff, "BASE ");
8821
8822 if (flags & VER_FLG_WEAK)
8823 {
8824 if (flags & VER_FLG_BASE)
8825 strcat (buff, "| ");
8826
8827 strcat (buff, "WEAK ");
8828 }
8829
8830 if (flags & VER_FLG_INFO)
8831 {
8832 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8833 strcat (buff, "| ");
8834
8835 strcat (buff, "INFO ");
8836 }
8837
8838 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8839 strcat (buff, _("| <unknown>"));
8840
8841 return buff;
8842 }
8843
8844 /* Display the contents of the version sections. */
8845
8846 static int
8847 process_version_sections (FILE * file)
8848 {
8849 Elf_Internal_Shdr * section;
8850 unsigned i;
8851 int found = 0;
8852
8853 if (! do_version)
8854 return 1;
8855
8856 for (i = 0, section = section_headers;
8857 i < elf_header.e_shnum;
8858 i++, section++)
8859 {
8860 switch (section->sh_type)
8861 {
8862 case SHT_GNU_verdef:
8863 {
8864 Elf_External_Verdef * edefs;
8865 unsigned int idx;
8866 unsigned int cnt;
8867 char * endbuf;
8868
8869 found = 1;
8870
8871 printf
8872 (_("\nVersion definition section '%s' contains %u entries:\n"),
8873 SECTION_NAME (section), section->sh_info);
8874
8875 printf (_(" Addr: 0x"));
8876 printf_vma (section->sh_addr);
8877 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8878 (unsigned long) section->sh_offset, section->sh_link,
8879 section->sh_link < elf_header.e_shnum
8880 ? SECTION_NAME (section_headers + section->sh_link)
8881 : _("<corrupt>"));
8882
8883 edefs = (Elf_External_Verdef *)
8884 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8885 _("version definition section"));
8886 if (!edefs)
8887 break;
8888 endbuf = (char *) edefs + section->sh_size;
8889
8890 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8891 {
8892 char * vstart;
8893 Elf_External_Verdef * edef;
8894 Elf_Internal_Verdef ent;
8895 Elf_External_Verdaux * eaux;
8896 Elf_Internal_Verdaux aux;
8897 int j;
8898 int isum;
8899
8900 /* Check for very large indicies. */
8901 if (idx > (size_t) (endbuf - (char *) edefs))
8902 break;
8903
8904 vstart = ((char *) edefs) + idx;
8905 if (vstart + sizeof (*edef) > endbuf)
8906 break;
8907
8908 edef = (Elf_External_Verdef *) vstart;
8909
8910 ent.vd_version = BYTE_GET (edef->vd_version);
8911 ent.vd_flags = BYTE_GET (edef->vd_flags);
8912 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
8913 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
8914 ent.vd_hash = BYTE_GET (edef->vd_hash);
8915 ent.vd_aux = BYTE_GET (edef->vd_aux);
8916 ent.vd_next = BYTE_GET (edef->vd_next);
8917
8918 printf (_(" %#06x: Rev: %d Flags: %s"),
8919 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8920
8921 printf (_(" Index: %d Cnt: %d "),
8922 ent.vd_ndx, ent.vd_cnt);
8923
8924 /* Check for overflow. */
8925 if (ent.vd_aux > (size_t) (endbuf - vstart))
8926 break;
8927
8928 vstart += ent.vd_aux;
8929
8930 eaux = (Elf_External_Verdaux *) vstart;
8931
8932 aux.vda_name = BYTE_GET (eaux->vda_name);
8933 aux.vda_next = BYTE_GET (eaux->vda_next);
8934
8935 if (VALID_DYNAMIC_NAME (aux.vda_name))
8936 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8937 else
8938 printf (_("Name index: %ld\n"), aux.vda_name);
8939
8940 isum = idx + ent.vd_aux;
8941
8942 for (j = 1; j < ent.vd_cnt; j++)
8943 {
8944 /* Check for overflow. */
8945 if (aux.vda_next > (size_t) (endbuf - vstart))
8946 break;
8947
8948 isum += aux.vda_next;
8949 vstart += aux.vda_next;
8950
8951 eaux = (Elf_External_Verdaux *) vstart;
8952 if (vstart + sizeof (*eaux) > endbuf)
8953 break;
8954
8955 aux.vda_name = BYTE_GET (eaux->vda_name);
8956 aux.vda_next = BYTE_GET (eaux->vda_next);
8957
8958 if (VALID_DYNAMIC_NAME (aux.vda_name))
8959 printf (_(" %#06x: Parent %d: %s\n"),
8960 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8961 else
8962 printf (_(" %#06x: Parent %d, name index: %ld\n"),
8963 isum, j, aux.vda_name);
8964 }
8965
8966 if (j < ent.vd_cnt)
8967 printf (_(" Version def aux past end of section\n"));
8968
8969 idx += ent.vd_next;
8970 }
8971
8972 if (cnt < section->sh_info)
8973 printf (_(" Version definition past end of section\n"));
8974
8975 free (edefs);
8976 }
8977 break;
8978
8979 case SHT_GNU_verneed:
8980 {
8981 Elf_External_Verneed * eneed;
8982 unsigned int idx;
8983 unsigned int cnt;
8984 char * endbuf;
8985
8986 found = 1;
8987
8988 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8989 SECTION_NAME (section), section->sh_info);
8990
8991 printf (_(" Addr: 0x"));
8992 printf_vma (section->sh_addr);
8993 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8994 (unsigned long) section->sh_offset, section->sh_link,
8995 section->sh_link < elf_header.e_shnum
8996 ? SECTION_NAME (section_headers + section->sh_link)
8997 : _("<corrupt>"));
8998
8999 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9000 section->sh_offset, 1,
9001 section->sh_size,
9002 _("Version Needs section"));
9003 if (!eneed)
9004 break;
9005 endbuf = (char *) eneed + section->sh_size;
9006
9007 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9008 {
9009 Elf_External_Verneed * entry;
9010 Elf_Internal_Verneed ent;
9011 int j;
9012 int isum;
9013 char * vstart;
9014
9015 if (idx > (size_t) (endbuf - (char *) eneed))
9016 break;
9017
9018 vstart = ((char *) eneed) + idx;
9019 if (vstart + sizeof (*entry) > endbuf)
9020 break;
9021
9022 entry = (Elf_External_Verneed *) vstart;
9023
9024 ent.vn_version = BYTE_GET (entry->vn_version);
9025 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9026 ent.vn_file = BYTE_GET (entry->vn_file);
9027 ent.vn_aux = BYTE_GET (entry->vn_aux);
9028 ent.vn_next = BYTE_GET (entry->vn_next);
9029
9030 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9031
9032 if (VALID_DYNAMIC_NAME (ent.vn_file))
9033 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9034 else
9035 printf (_(" File: %lx"), ent.vn_file);
9036
9037 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9038
9039 /* Check for overflow. */
9040 if (ent.vn_aux > (size_t) (endbuf - vstart))
9041 break;
9042
9043 vstart += ent.vn_aux;
9044
9045 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9046 {
9047 Elf_External_Vernaux * eaux;
9048 Elf_Internal_Vernaux aux;
9049
9050 if (vstart + sizeof (*eaux) > endbuf)
9051 break;
9052 eaux = (Elf_External_Vernaux *) vstart;
9053
9054 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9055 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9056 aux.vna_other = BYTE_GET (eaux->vna_other);
9057 aux.vna_name = BYTE_GET (eaux->vna_name);
9058 aux.vna_next = BYTE_GET (eaux->vna_next);
9059
9060 if (VALID_DYNAMIC_NAME (aux.vna_name))
9061 printf (_(" %#06x: Name: %s"),
9062 isum, GET_DYNAMIC_NAME (aux.vna_name));
9063 else
9064 printf (_(" %#06x: Name index: %lx"),
9065 isum, aux.vna_name);
9066
9067 printf (_(" Flags: %s Version: %d\n"),
9068 get_ver_flags (aux.vna_flags), aux.vna_other);
9069
9070 /* Check for overflow. */
9071 if (aux.vna_next > (size_t) (endbuf - vstart))
9072 break;
9073
9074 isum += aux.vna_next;
9075 vstart += aux.vna_next;
9076 }
9077
9078 if (j < ent.vn_cnt)
9079 warn (_("Missing Version Needs auxillary information\n"));
9080
9081 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9082 {
9083 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9084 cnt = section->sh_info;
9085 break;
9086 }
9087 idx += ent.vn_next;
9088 }
9089
9090 if (cnt < section->sh_info)
9091 warn (_("Missing Version Needs information\n"));
9092
9093 free (eneed);
9094 }
9095 break;
9096
9097 case SHT_GNU_versym:
9098 {
9099 Elf_Internal_Shdr * link_section;
9100 int total;
9101 int cnt;
9102 unsigned char * edata;
9103 unsigned short * data;
9104 char * strtab;
9105 Elf_Internal_Sym * symbols;
9106 Elf_Internal_Shdr * string_sec;
9107 unsigned long num_syms;
9108 long off;
9109
9110 if (section->sh_link >= elf_header.e_shnum)
9111 break;
9112
9113 link_section = section_headers + section->sh_link;
9114 total = section->sh_size / sizeof (Elf_External_Versym);
9115
9116 if (link_section->sh_link >= elf_header.e_shnum)
9117 break;
9118
9119 found = 1;
9120
9121 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9122 if (symbols == NULL)
9123 break;
9124
9125 string_sec = section_headers + link_section->sh_link;
9126
9127 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9128 string_sec->sh_size,
9129 _("version string table"));
9130 if (!strtab)
9131 {
9132 free (symbols);
9133 break;
9134 }
9135
9136 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
9137 SECTION_NAME (section), total);
9138
9139 printf (_(" Addr: "));
9140 printf_vma (section->sh_addr);
9141 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9142 (unsigned long) section->sh_offset, section->sh_link,
9143 SECTION_NAME (link_section));
9144
9145 off = offset_from_vma (file,
9146 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9147 total * sizeof (short));
9148 edata = (unsigned char *) get_data (NULL, file, off, total,
9149 sizeof (short),
9150 _("version symbol data"));
9151 if (!edata)
9152 {
9153 free (strtab);
9154 free (symbols);
9155 break;
9156 }
9157
9158 data = (short unsigned int *) cmalloc (total, sizeof (short));
9159
9160 for (cnt = total; cnt --;)
9161 data[cnt] = byte_get (edata + cnt * sizeof (short),
9162 sizeof (short));
9163
9164 free (edata);
9165
9166 for (cnt = 0; cnt < total; cnt += 4)
9167 {
9168 int j, nn;
9169 int check_def, check_need;
9170 char * name;
9171
9172 printf (" %03x:", cnt);
9173
9174 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9175 switch (data[cnt + j])
9176 {
9177 case 0:
9178 fputs (_(" 0 (*local*) "), stdout);
9179 break;
9180
9181 case 1:
9182 fputs (_(" 1 (*global*) "), stdout);
9183 break;
9184
9185 default:
9186 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9187 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9188
9189 /* If this index value is greater than the size of the symbols
9190 array, break to avoid an out-of-bounds read. */
9191 if ((unsigned long)(cnt + j) >= num_syms)
9192 {
9193 warn (_("invalid index into symbol array\n"));
9194 break;
9195 }
9196
9197 check_def = 1;
9198 check_need = 1;
9199 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9200 || section_headers[symbols[cnt + j].st_shndx].sh_type
9201 != SHT_NOBITS)
9202 {
9203 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9204 check_def = 0;
9205 else
9206 check_need = 0;
9207 }
9208
9209 if (check_need
9210 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9211 {
9212 Elf_Internal_Verneed ivn;
9213 unsigned long offset;
9214
9215 offset = offset_from_vma
9216 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9217 sizeof (Elf_External_Verneed));
9218
9219 do
9220 {
9221 Elf_Internal_Vernaux ivna;
9222 Elf_External_Verneed evn;
9223 Elf_External_Vernaux evna;
9224 unsigned long a_off;
9225
9226 if (get_data (&evn, file, offset, sizeof (evn), 1,
9227 _("version need")) == NULL)
9228 break;
9229
9230 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9231 ivn.vn_next = BYTE_GET (evn.vn_next);
9232
9233 a_off = offset + ivn.vn_aux;
9234
9235 do
9236 {
9237 if (get_data (&evna, file, a_off, sizeof (evna),
9238 1, _("version need aux (2)")) == NULL)
9239 {
9240 ivna.vna_next = 0;
9241 ivna.vna_other = 0;
9242 }
9243 else
9244 {
9245 ivna.vna_next = BYTE_GET (evna.vna_next);
9246 ivna.vna_other = BYTE_GET (evna.vna_other);
9247 }
9248
9249 a_off += ivna.vna_next;
9250 }
9251 while (ivna.vna_other != data[cnt + j]
9252 && ivna.vna_next != 0);
9253
9254 if (ivna.vna_other == data[cnt + j])
9255 {
9256 ivna.vna_name = BYTE_GET (evna.vna_name);
9257
9258 if (ivna.vna_name >= string_sec->sh_size)
9259 name = _("*invalid*");
9260 else
9261 name = strtab + ivna.vna_name;
9262 nn += printf ("(%s%-*s",
9263 name,
9264 12 - (int) strlen (name),
9265 ")");
9266 check_def = 0;
9267 break;
9268 }
9269
9270 offset += ivn.vn_next;
9271 }
9272 while (ivn.vn_next);
9273 }
9274
9275 if (check_def && data[cnt + j] != 0x8001
9276 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9277 {
9278 Elf_Internal_Verdef ivd;
9279 Elf_External_Verdef evd;
9280 unsigned long offset;
9281
9282 offset = offset_from_vma
9283 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9284 sizeof evd);
9285
9286 do
9287 {
9288 if (get_data (&evd, file, offset, sizeof (evd), 1,
9289 _("version def")) == NULL)
9290 {
9291 ivd.vd_next = 0;
9292 ivd.vd_ndx = 0;
9293 }
9294 else
9295 {
9296 ivd.vd_next = BYTE_GET (evd.vd_next);
9297 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9298 }
9299
9300 offset += ivd.vd_next;
9301 }
9302 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9303 && ivd.vd_next != 0);
9304
9305 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9306 {
9307 Elf_External_Verdaux evda;
9308 Elf_Internal_Verdaux ivda;
9309
9310 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9311
9312 if (get_data (&evda, file,
9313 offset - ivd.vd_next + ivd.vd_aux,
9314 sizeof (evda), 1,
9315 _("version def aux")) == NULL)
9316 break;
9317
9318 ivda.vda_name = BYTE_GET (evda.vda_name);
9319
9320 if (ivda.vda_name >= string_sec->sh_size)
9321 name = _("*invalid*");
9322 else
9323 name = strtab + ivda.vda_name;
9324 nn += printf ("(%s%-*s",
9325 name,
9326 12 - (int) strlen (name),
9327 ")");
9328 }
9329 }
9330
9331 if (nn < 18)
9332 printf ("%*c", 18 - nn, ' ');
9333 }
9334
9335 putchar ('\n');
9336 }
9337
9338 free (data);
9339 free (strtab);
9340 free (symbols);
9341 }
9342 break;
9343
9344 default:
9345 break;
9346 }
9347 }
9348
9349 if (! found)
9350 printf (_("\nNo version information found in this file.\n"));
9351
9352 return 1;
9353 }
9354
9355 static const char *
9356 get_symbol_binding (unsigned int binding)
9357 {
9358 static char buff[32];
9359
9360 switch (binding)
9361 {
9362 case STB_LOCAL: return "LOCAL";
9363 case STB_GLOBAL: return "GLOBAL";
9364 case STB_WEAK: return "WEAK";
9365 default:
9366 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9367 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9368 binding);
9369 else if (binding >= STB_LOOS && binding <= STB_HIOS)
9370 {
9371 if (binding == STB_GNU_UNIQUE
9372 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9373 /* GNU is still using the default value 0. */
9374 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9375 return "UNIQUE";
9376 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9377 }
9378 else
9379 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9380 return buff;
9381 }
9382 }
9383
9384 static const char *
9385 get_symbol_type (unsigned int type)
9386 {
9387 static char buff[32];
9388
9389 switch (type)
9390 {
9391 case STT_NOTYPE: return "NOTYPE";
9392 case STT_OBJECT: return "OBJECT";
9393 case STT_FUNC: return "FUNC";
9394 case STT_SECTION: return "SECTION";
9395 case STT_FILE: return "FILE";
9396 case STT_COMMON: return "COMMON";
9397 case STT_TLS: return "TLS";
9398 case STT_RELC: return "RELC";
9399 case STT_SRELC: return "SRELC";
9400 default:
9401 if (type >= STT_LOPROC && type <= STT_HIPROC)
9402 {
9403 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9404 return "THUMB_FUNC";
9405
9406 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9407 return "REGISTER";
9408
9409 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9410 return "PARISC_MILLI";
9411
9412 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9413 }
9414 else if (type >= STT_LOOS && type <= STT_HIOS)
9415 {
9416 if (elf_header.e_machine == EM_PARISC)
9417 {
9418 if (type == STT_HP_OPAQUE)
9419 return "HP_OPAQUE";
9420 if (type == STT_HP_STUB)
9421 return "HP_STUB";
9422 }
9423
9424 if (type == STT_GNU_IFUNC
9425 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9426 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9427 /* GNU is still using the default value 0. */
9428 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9429 return "IFUNC";
9430
9431 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9432 }
9433 else
9434 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9435 return buff;
9436 }
9437 }
9438
9439 static const char *
9440 get_symbol_visibility (unsigned int visibility)
9441 {
9442 switch (visibility)
9443 {
9444 case STV_DEFAULT: return "DEFAULT";
9445 case STV_INTERNAL: return "INTERNAL";
9446 case STV_HIDDEN: return "HIDDEN";
9447 case STV_PROTECTED: return "PROTECTED";
9448 default: abort ();
9449 }
9450 }
9451
9452 static const char *
9453 get_mips_symbol_other (unsigned int other)
9454 {
9455 switch (other)
9456 {
9457 case STO_OPTIONAL:
9458 return "OPTIONAL";
9459 case STO_MIPS_PLT:
9460 return "MIPS PLT";
9461 case STO_MIPS_PIC:
9462 return "MIPS PIC";
9463 case STO_MICROMIPS:
9464 return "MICROMIPS";
9465 case STO_MICROMIPS | STO_MIPS_PIC:
9466 return "MICROMIPS, MIPS PIC";
9467 case STO_MIPS16:
9468 return "MIPS16";
9469 default:
9470 return NULL;
9471 }
9472 }
9473
9474 static const char *
9475 get_ia64_symbol_other (unsigned int other)
9476 {
9477 if (is_ia64_vms ())
9478 {
9479 static char res[32];
9480
9481 res[0] = 0;
9482
9483 /* Function types is for images and .STB files only. */
9484 switch (elf_header.e_type)
9485 {
9486 case ET_DYN:
9487 case ET_EXEC:
9488 switch (VMS_ST_FUNC_TYPE (other))
9489 {
9490 case VMS_SFT_CODE_ADDR:
9491 strcat (res, " CA");
9492 break;
9493 case VMS_SFT_SYMV_IDX:
9494 strcat (res, " VEC");
9495 break;
9496 case VMS_SFT_FD:
9497 strcat (res, " FD");
9498 break;
9499 case VMS_SFT_RESERVE:
9500 strcat (res, " RSV");
9501 break;
9502 default:
9503 abort ();
9504 }
9505 break;
9506 default:
9507 break;
9508 }
9509 switch (VMS_ST_LINKAGE (other))
9510 {
9511 case VMS_STL_IGNORE:
9512 strcat (res, " IGN");
9513 break;
9514 case VMS_STL_RESERVE:
9515 strcat (res, " RSV");
9516 break;
9517 case VMS_STL_STD:
9518 strcat (res, " STD");
9519 break;
9520 case VMS_STL_LNK:
9521 strcat (res, " LNK");
9522 break;
9523 default:
9524 abort ();
9525 }
9526
9527 if (res[0] != 0)
9528 return res + 1;
9529 else
9530 return res;
9531 }
9532 return NULL;
9533 }
9534
9535 static const char *
9536 get_ppc64_symbol_other (unsigned int other)
9537 {
9538 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9539 {
9540 static char buf[32];
9541 snprintf (buf, sizeof buf, _("<localentry>: %d"),
9542 PPC64_LOCAL_ENTRY_OFFSET (other));
9543 return buf;
9544 }
9545 return NULL;
9546 }
9547
9548 static const char *
9549 get_symbol_other (unsigned int other)
9550 {
9551 const char * result = NULL;
9552 static char buff [32];
9553
9554 if (other == 0)
9555 return "";
9556
9557 switch (elf_header.e_machine)
9558 {
9559 case EM_MIPS:
9560 result = get_mips_symbol_other (other);
9561 break;
9562 case EM_IA_64:
9563 result = get_ia64_symbol_other (other);
9564 break;
9565 case EM_PPC64:
9566 result = get_ppc64_symbol_other (other);
9567 break;
9568 default:
9569 break;
9570 }
9571
9572 if (result)
9573 return result;
9574
9575 snprintf (buff, sizeof buff, _("<other>: %x"), other);
9576 return buff;
9577 }
9578
9579 static const char *
9580 get_symbol_index_type (unsigned int type)
9581 {
9582 static char buff[32];
9583
9584 switch (type)
9585 {
9586 case SHN_UNDEF: return "UND";
9587 case SHN_ABS: return "ABS";
9588 case SHN_COMMON: return "COM";
9589 default:
9590 if (type == SHN_IA_64_ANSI_COMMON
9591 && elf_header.e_machine == EM_IA_64
9592 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9593 return "ANSI_COM";
9594 else if ((elf_header.e_machine == EM_X86_64
9595 || elf_header.e_machine == EM_L1OM
9596 || elf_header.e_machine == EM_K1OM)
9597 && type == SHN_X86_64_LCOMMON)
9598 return "LARGE_COM";
9599 else if ((type == SHN_MIPS_SCOMMON
9600 && elf_header.e_machine == EM_MIPS)
9601 || (type == SHN_TIC6X_SCOMMON
9602 && elf_header.e_machine == EM_TI_C6000))
9603 return "SCOM";
9604 else if (type == SHN_MIPS_SUNDEFINED
9605 && elf_header.e_machine == EM_MIPS)
9606 return "SUND";
9607 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9608 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9609 else if (type >= SHN_LOOS && type <= SHN_HIOS)
9610 sprintf (buff, "OS [0x%04x]", type & 0xffff);
9611 else if (type >= SHN_LORESERVE)
9612 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9613 else if (type >= elf_header.e_shnum)
9614 sprintf (buff, _("bad section index[%3d]"), type);
9615 else
9616 sprintf (buff, "%3d", type);
9617 break;
9618 }
9619
9620 return buff;
9621 }
9622
9623 static bfd_vma *
9624 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9625 {
9626 unsigned char * e_data;
9627 bfd_vma * i_data;
9628
9629 e_data = (unsigned char *) cmalloc (number, ent_size);
9630
9631 if (e_data == NULL)
9632 {
9633 error (_("Out of memory\n"));
9634 return NULL;
9635 }
9636
9637 if (fread (e_data, ent_size, number, file) != number)
9638 {
9639 error (_("Unable to read in dynamic data\n"));
9640 return NULL;
9641 }
9642
9643 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9644
9645 if (i_data == NULL)
9646 {
9647 error (_("Out of memory\n"));
9648 free (e_data);
9649 return NULL;
9650 }
9651
9652 while (number--)
9653 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9654
9655 free (e_data);
9656
9657 return i_data;
9658 }
9659
9660 static void
9661 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9662 {
9663 Elf_Internal_Sym * psym;
9664 int n;
9665
9666 n = print_vma (si, DEC_5);
9667 if (n < 5)
9668 fputs (&" "[n], stdout);
9669 printf (" %3lu: ", hn);
9670
9671 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
9672 {
9673 printf (_("<No info available>\n"));
9674 return;
9675 }
9676
9677 psym = dynamic_symbols + si;
9678 print_vma (psym->st_value, LONG_HEX);
9679 putchar (' ');
9680 print_vma (psym->st_size, DEC_5);
9681
9682 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9683 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9684 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9685 /* Check to see if any other bits in the st_other field are set.
9686 Note - displaying this information disrupts the layout of the
9687 table being generated, but for the moment this case is very
9688 rare. */
9689 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9690 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9691 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9692 if (VALID_DYNAMIC_NAME (psym->st_name))
9693 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9694 else
9695 printf (_(" <corrupt: %14ld>"), psym->st_name);
9696 putchar ('\n');
9697 }
9698
9699 /* Dump the symbol table. */
9700 static int
9701 process_symbol_table (FILE * file)
9702 {
9703 Elf_Internal_Shdr * section;
9704 bfd_vma nbuckets = 0;
9705 bfd_vma nchains = 0;
9706 bfd_vma * buckets = NULL;
9707 bfd_vma * chains = NULL;
9708 bfd_vma ngnubuckets = 0;
9709 bfd_vma * gnubuckets = NULL;
9710 bfd_vma * gnuchains = NULL;
9711 bfd_vma gnusymidx = 0;
9712
9713 if (!do_syms && !do_dyn_syms && !do_histogram)
9714 return 1;
9715
9716 if (dynamic_info[DT_HASH]
9717 && (do_histogram
9718 || (do_using_dynamic
9719 && !do_dyn_syms
9720 && dynamic_strings != NULL)))
9721 {
9722 unsigned char nb[8];
9723 unsigned char nc[8];
9724 int hash_ent_size = 4;
9725
9726 if ((elf_header.e_machine == EM_ALPHA
9727 || elf_header.e_machine == EM_S390
9728 || elf_header.e_machine == EM_S390_OLD)
9729 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9730 hash_ent_size = 8;
9731
9732 if (fseek (file,
9733 (archive_file_offset
9734 + offset_from_vma (file, dynamic_info[DT_HASH],
9735 sizeof nb + sizeof nc)),
9736 SEEK_SET))
9737 {
9738 error (_("Unable to seek to start of dynamic information\n"));
9739 goto no_hash;
9740 }
9741
9742 if (fread (nb, hash_ent_size, 1, file) != 1)
9743 {
9744 error (_("Failed to read in number of buckets\n"));
9745 goto no_hash;
9746 }
9747
9748 if (fread (nc, hash_ent_size, 1, file) != 1)
9749 {
9750 error (_("Failed to read in number of chains\n"));
9751 goto no_hash;
9752 }
9753
9754 nbuckets = byte_get (nb, hash_ent_size);
9755 nchains = byte_get (nc, hash_ent_size);
9756
9757 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9758 chains = get_dynamic_data (file, nchains, hash_ent_size);
9759
9760 no_hash:
9761 if (buckets == NULL || chains == NULL)
9762 {
9763 if (do_using_dynamic)
9764 return 0;
9765 free (buckets);
9766 free (chains);
9767 buckets = NULL;
9768 chains = NULL;
9769 nbuckets = 0;
9770 nchains = 0;
9771 }
9772 }
9773
9774 if (dynamic_info_DT_GNU_HASH
9775 && (do_histogram
9776 || (do_using_dynamic
9777 && !do_dyn_syms
9778 && dynamic_strings != NULL)))
9779 {
9780 unsigned char nb[16];
9781 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9782 bfd_vma buckets_vma;
9783
9784 if (fseek (file,
9785 (archive_file_offset
9786 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9787 sizeof nb)),
9788 SEEK_SET))
9789 {
9790 error (_("Unable to seek to start of dynamic information\n"));
9791 goto no_gnu_hash;
9792 }
9793
9794 if (fread (nb, 16, 1, file) != 1)
9795 {
9796 error (_("Failed to read in number of buckets\n"));
9797 goto no_gnu_hash;
9798 }
9799
9800 ngnubuckets = byte_get (nb, 4);
9801 gnusymidx = byte_get (nb + 4, 4);
9802 bitmaskwords = byte_get (nb + 8, 4);
9803 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9804 if (is_32bit_elf)
9805 buckets_vma += bitmaskwords * 4;
9806 else
9807 buckets_vma += bitmaskwords * 8;
9808
9809 if (fseek (file,
9810 (archive_file_offset
9811 + offset_from_vma (file, buckets_vma, 4)),
9812 SEEK_SET))
9813 {
9814 error (_("Unable to seek to start of dynamic information\n"));
9815 goto no_gnu_hash;
9816 }
9817
9818 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9819
9820 if (gnubuckets == NULL)
9821 goto no_gnu_hash;
9822
9823 for (i = 0; i < ngnubuckets; i++)
9824 if (gnubuckets[i] != 0)
9825 {
9826 if (gnubuckets[i] < gnusymidx)
9827 return 0;
9828
9829 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9830 maxchain = gnubuckets[i];
9831 }
9832
9833 if (maxchain == 0xffffffff)
9834 goto no_gnu_hash;
9835
9836 maxchain -= gnusymidx;
9837
9838 if (fseek (file,
9839 (archive_file_offset
9840 + offset_from_vma (file, buckets_vma
9841 + 4 * (ngnubuckets + maxchain), 4)),
9842 SEEK_SET))
9843 {
9844 error (_("Unable to seek to start of dynamic information\n"));
9845 goto no_gnu_hash;
9846 }
9847
9848 do
9849 {
9850 if (fread (nb, 4, 1, file) != 1)
9851 {
9852 error (_("Failed to determine last chain length\n"));
9853 goto no_gnu_hash;
9854 }
9855
9856 if (maxchain + 1 == 0)
9857 goto no_gnu_hash;
9858
9859 ++maxchain;
9860 }
9861 while ((byte_get (nb, 4) & 1) == 0);
9862
9863 if (fseek (file,
9864 (archive_file_offset
9865 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9866 SEEK_SET))
9867 {
9868 error (_("Unable to seek to start of dynamic information\n"));
9869 goto no_gnu_hash;
9870 }
9871
9872 gnuchains = get_dynamic_data (file, maxchain, 4);
9873
9874 no_gnu_hash:
9875 if (gnuchains == NULL)
9876 {
9877 free (gnubuckets);
9878 gnubuckets = NULL;
9879 ngnubuckets = 0;
9880 if (do_using_dynamic)
9881 return 0;
9882 }
9883 }
9884
9885 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9886 && do_syms
9887 && do_using_dynamic
9888 && dynamic_strings != NULL)
9889 {
9890 unsigned long hn;
9891
9892 if (dynamic_info[DT_HASH])
9893 {
9894 bfd_vma si;
9895
9896 printf (_("\nSymbol table for image:\n"));
9897 if (is_32bit_elf)
9898 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9899 else
9900 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9901
9902 for (hn = 0; hn < nbuckets; hn++)
9903 {
9904 if (! buckets[hn])
9905 continue;
9906
9907 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9908 print_dynamic_symbol (si, hn);
9909 }
9910 }
9911
9912 if (dynamic_info_DT_GNU_HASH)
9913 {
9914 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9915 if (is_32bit_elf)
9916 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9917 else
9918 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9919
9920 for (hn = 0; hn < ngnubuckets; ++hn)
9921 if (gnubuckets[hn] != 0)
9922 {
9923 bfd_vma si = gnubuckets[hn];
9924 bfd_vma off = si - gnusymidx;
9925
9926 do
9927 {
9928 print_dynamic_symbol (si, hn);
9929 si++;
9930 }
9931 while ((gnuchains[off++] & 1) == 0);
9932 }
9933 }
9934 }
9935 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9936 {
9937 unsigned int i;
9938
9939 for (i = 0, section = section_headers;
9940 i < elf_header.e_shnum;
9941 i++, section++)
9942 {
9943 unsigned int si;
9944 char * strtab = NULL;
9945 unsigned long int strtab_size = 0;
9946 Elf_Internal_Sym * symtab;
9947 Elf_Internal_Sym * psym;
9948 unsigned long num_syms;
9949
9950 if ((section->sh_type != SHT_SYMTAB
9951 && section->sh_type != SHT_DYNSYM)
9952 || (!do_syms
9953 && section->sh_type == SHT_SYMTAB))
9954 continue;
9955
9956 if (section->sh_entsize == 0)
9957 {
9958 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9959 SECTION_NAME (section));
9960 continue;
9961 }
9962
9963 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9964 SECTION_NAME (section),
9965 (unsigned long) (section->sh_size / section->sh_entsize));
9966
9967 if (is_32bit_elf)
9968 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9969 else
9970 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9971
9972 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9973 if (symtab == NULL)
9974 continue;
9975
9976 if (section->sh_link == elf_header.e_shstrndx)
9977 {
9978 strtab = string_table;
9979 strtab_size = string_table_length;
9980 }
9981 else if (section->sh_link < elf_header.e_shnum)
9982 {
9983 Elf_Internal_Shdr * string_sec;
9984
9985 string_sec = section_headers + section->sh_link;
9986
9987 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9988 1, string_sec->sh_size,
9989 _("string table"));
9990 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9991 }
9992
9993 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9994 {
9995 printf ("%6d: ", si);
9996 print_vma (psym->st_value, LONG_HEX);
9997 putchar (' ');
9998 print_vma (psym->st_size, DEC_5);
9999 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10000 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10001 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10002 /* Check to see if any other bits in the st_other field are set.
10003 Note - displaying this information disrupts the layout of the
10004 table being generated, but for the moment this case is very rare. */
10005 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10006 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10007 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10008 print_symbol (25, psym->st_name < strtab_size
10009 ? strtab + psym->st_name : _("<corrupt>"));
10010
10011 if (section->sh_type == SHT_DYNSYM
10012 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10013 {
10014 unsigned char data[2];
10015 unsigned short vers_data;
10016 unsigned long offset;
10017 int is_nobits;
10018 int check_def;
10019
10020 offset = offset_from_vma
10021 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10022 sizeof data + si * sizeof (vers_data));
10023
10024 if (get_data (&data, file, offset + si * sizeof (vers_data),
10025 sizeof (data), 1, _("version data")) == NULL)
10026 break;
10027
10028 vers_data = byte_get (data, 2);
10029
10030 is_nobits = (psym->st_shndx < elf_header.e_shnum
10031 && section_headers[psym->st_shndx].sh_type
10032 == SHT_NOBITS);
10033
10034 check_def = (psym->st_shndx != SHN_UNDEF);
10035
10036 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10037 {
10038 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10039 && (is_nobits || ! check_def))
10040 {
10041 Elf_External_Verneed evn;
10042 Elf_Internal_Verneed ivn;
10043 Elf_Internal_Vernaux ivna;
10044
10045 /* We must test both. */
10046 offset = offset_from_vma
10047 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10048 sizeof evn);
10049
10050 do
10051 {
10052 unsigned long vna_off;
10053
10054 if (get_data (&evn, file, offset, sizeof (evn), 1,
10055 _("version need")) == NULL)
10056 {
10057 ivna.vna_next = 0;
10058 ivna.vna_other = 0;
10059 ivna.vna_name = 0;
10060 break;
10061 }
10062
10063 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10064 ivn.vn_next = BYTE_GET (evn.vn_next);
10065
10066 vna_off = offset + ivn.vn_aux;
10067
10068 do
10069 {
10070 Elf_External_Vernaux evna;
10071
10072 if (get_data (&evna, file, vna_off,
10073 sizeof (evna), 1,
10074 _("version need aux (3)")) == NULL)
10075 {
10076 ivna.vna_next = 0;
10077 ivna.vna_other = 0;
10078 ivna.vna_name = 0;
10079 }
10080 else
10081 {
10082 ivna.vna_other = BYTE_GET (evna.vna_other);
10083 ivna.vna_next = BYTE_GET (evna.vna_next);
10084 ivna.vna_name = BYTE_GET (evna.vna_name);
10085 }
10086
10087 vna_off += ivna.vna_next;
10088 }
10089 while (ivna.vna_other != vers_data
10090 && ivna.vna_next != 0);
10091
10092 if (ivna.vna_other == vers_data)
10093 break;
10094
10095 offset += ivn.vn_next;
10096 }
10097 while (ivn.vn_next != 0);
10098
10099 if (ivna.vna_other == vers_data)
10100 {
10101 printf ("@%s (%d)",
10102 ivna.vna_name < strtab_size
10103 ? strtab + ivna.vna_name : _("<corrupt>"),
10104 ivna.vna_other);
10105 check_def = 0;
10106 }
10107 else if (! is_nobits)
10108 error (_("bad dynamic symbol\n"));
10109 else
10110 check_def = 1;
10111 }
10112
10113 if (check_def)
10114 {
10115 if (vers_data != 0x8001
10116 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10117 {
10118 Elf_Internal_Verdef ivd;
10119 Elf_Internal_Verdaux ivda;
10120 Elf_External_Verdaux evda;
10121 unsigned long off;
10122
10123 off = offset_from_vma
10124 (file,
10125 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10126 sizeof (Elf_External_Verdef));
10127
10128 do
10129 {
10130 Elf_External_Verdef evd;
10131
10132 if (get_data (&evd, file, off, sizeof (evd),
10133 1, _("version def")) == NULL)
10134 {
10135 ivd.vd_ndx = 0;
10136 ivd.vd_aux = 0;
10137 ivd.vd_next = 0;
10138 }
10139 else
10140 {
10141 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10142 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10143 ivd.vd_next = BYTE_GET (evd.vd_next);
10144 }
10145
10146 off += ivd.vd_next;
10147 }
10148 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10149 && ivd.vd_next != 0);
10150
10151 off -= ivd.vd_next;
10152 off += ivd.vd_aux;
10153
10154 if (get_data (&evda, file, off, sizeof (evda),
10155 1, _("version def aux")) == NULL)
10156 break;
10157
10158 ivda.vda_name = BYTE_GET (evda.vda_name);
10159
10160 if (psym->st_name != ivda.vda_name)
10161 printf ((vers_data & VERSYM_HIDDEN)
10162 ? "@%s" : "@@%s",
10163 ivda.vda_name < strtab_size
10164 ? strtab + ivda.vda_name : _("<corrupt>"));
10165 }
10166 }
10167 }
10168 }
10169
10170 putchar ('\n');
10171 }
10172
10173 free (symtab);
10174 if (strtab != string_table)
10175 free (strtab);
10176 }
10177 }
10178 else if (do_syms)
10179 printf
10180 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10181
10182 if (do_histogram && buckets != NULL)
10183 {
10184 unsigned long * lengths;
10185 unsigned long * counts;
10186 unsigned long hn;
10187 bfd_vma si;
10188 unsigned long maxlength = 0;
10189 unsigned long nzero_counts = 0;
10190 unsigned long nsyms = 0;
10191
10192 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10193 (unsigned long) nbuckets);
10194 printf (_(" Length Number %% of total Coverage\n"));
10195
10196 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10197 if (lengths == NULL)
10198 {
10199 error (_("Out of memory\n"));
10200 return 0;
10201 }
10202 for (hn = 0; hn < nbuckets; ++hn)
10203 {
10204 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10205 {
10206 ++nsyms;
10207 if (maxlength < ++lengths[hn])
10208 ++maxlength;
10209
10210 /* PR binutils/17531: A corrupt binary could contain broken
10211 histogram data. Do not go into an infinite loop trying
10212 to process it. */
10213 if (chains[si] == si)
10214 {
10215 error (_("histogram chain links to itself\n"));
10216 break;
10217 }
10218 }
10219 }
10220
10221 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10222 if (counts == NULL)
10223 {
10224 free (lengths);
10225 error (_("Out of memory\n"));
10226 return 0;
10227 }
10228
10229 for (hn = 0; hn < nbuckets; ++hn)
10230 ++counts[lengths[hn]];
10231
10232 if (nbuckets > 0)
10233 {
10234 unsigned long i;
10235 printf (" 0 %-10lu (%5.1f%%)\n",
10236 counts[0], (counts[0] * 100.0) / nbuckets);
10237 for (i = 1; i <= maxlength; ++i)
10238 {
10239 nzero_counts += counts[i] * i;
10240 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10241 i, counts[i], (counts[i] * 100.0) / nbuckets,
10242 (nzero_counts * 100.0) / nsyms);
10243 }
10244 }
10245
10246 free (counts);
10247 free (lengths);
10248 }
10249
10250 if (buckets != NULL)
10251 {
10252 free (buckets);
10253 free (chains);
10254 }
10255
10256 if (do_histogram && gnubuckets != NULL)
10257 {
10258 unsigned long * lengths;
10259 unsigned long * counts;
10260 unsigned long hn;
10261 unsigned long maxlength = 0;
10262 unsigned long nzero_counts = 0;
10263 unsigned long nsyms = 0;
10264
10265 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10266 if (lengths == NULL)
10267 {
10268 error (_("Out of memory\n"));
10269 return 0;
10270 }
10271
10272 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10273 (unsigned long) ngnubuckets);
10274 printf (_(" Length Number %% of total Coverage\n"));
10275
10276 for (hn = 0; hn < ngnubuckets; ++hn)
10277 if (gnubuckets[hn] != 0)
10278 {
10279 bfd_vma off, length = 1;
10280
10281 for (off = gnubuckets[hn] - gnusymidx;
10282 (gnuchains[off] & 1) == 0; ++off)
10283 ++length;
10284 lengths[hn] = length;
10285 if (length > maxlength)
10286 maxlength = length;
10287 nsyms += length;
10288 }
10289
10290 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10291 if (counts == NULL)
10292 {
10293 free (lengths);
10294 error (_("Out of memory\n"));
10295 return 0;
10296 }
10297
10298 for (hn = 0; hn < ngnubuckets; ++hn)
10299 ++counts[lengths[hn]];
10300
10301 if (ngnubuckets > 0)
10302 {
10303 unsigned long j;
10304 printf (" 0 %-10lu (%5.1f%%)\n",
10305 counts[0], (counts[0] * 100.0) / ngnubuckets);
10306 for (j = 1; j <= maxlength; ++j)
10307 {
10308 nzero_counts += counts[j] * j;
10309 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10310 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10311 (nzero_counts * 100.0) / nsyms);
10312 }
10313 }
10314
10315 free (counts);
10316 free (lengths);
10317 free (gnubuckets);
10318 free (gnuchains);
10319 }
10320
10321 return 1;
10322 }
10323
10324 static int
10325 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10326 {
10327 unsigned int i;
10328
10329 if (dynamic_syminfo == NULL
10330 || !do_dynamic)
10331 /* No syminfo, this is ok. */
10332 return 1;
10333
10334 /* There better should be a dynamic symbol section. */
10335 if (dynamic_symbols == NULL || dynamic_strings == NULL)
10336 return 0;
10337
10338 if (dynamic_addr)
10339 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10340 dynamic_syminfo_offset, dynamic_syminfo_nent);
10341
10342 printf (_(" Num: Name BoundTo Flags\n"));
10343 for (i = 0; i < dynamic_syminfo_nent; ++i)
10344 {
10345 unsigned short int flags = dynamic_syminfo[i].si_flags;
10346
10347 printf ("%4d: ", i);
10348 assert (i < num_dynamic_syms);
10349 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10350 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10351 else
10352 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10353 putchar (' ');
10354
10355 switch (dynamic_syminfo[i].si_boundto)
10356 {
10357 case SYMINFO_BT_SELF:
10358 fputs ("SELF ", stdout);
10359 break;
10360 case SYMINFO_BT_PARENT:
10361 fputs ("PARENT ", stdout);
10362 break;
10363 default:
10364 if (dynamic_syminfo[i].si_boundto > 0
10365 && dynamic_syminfo[i].si_boundto < dynamic_nent
10366 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10367 {
10368 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10369 putchar (' ' );
10370 }
10371 else
10372 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10373 break;
10374 }
10375
10376 if (flags & SYMINFO_FLG_DIRECT)
10377 printf (" DIRECT");
10378 if (flags & SYMINFO_FLG_PASSTHRU)
10379 printf (" PASSTHRU");
10380 if (flags & SYMINFO_FLG_COPY)
10381 printf (" COPY");
10382 if (flags & SYMINFO_FLG_LAZYLOAD)
10383 printf (" LAZYLOAD");
10384
10385 puts ("");
10386 }
10387
10388 return 1;
10389 }
10390
10391 /* Check to see if the given reloc needs to be handled in a target specific
10392 manner. If so then process the reloc and return TRUE otherwise return
10393 FALSE. */
10394
10395 static bfd_boolean
10396 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10397 unsigned char * start,
10398 Elf_Internal_Sym * symtab)
10399 {
10400 unsigned int reloc_type = get_reloc_type (reloc->r_info);
10401
10402 switch (elf_header.e_machine)
10403 {
10404 case EM_MSP430:
10405 case EM_MSP430_OLD:
10406 {
10407 static Elf_Internal_Sym * saved_sym = NULL;
10408
10409 switch (reloc_type)
10410 {
10411 case 10: /* R_MSP430_SYM_DIFF */
10412 if (uses_msp430x_relocs ())
10413 break;
10414 case 21: /* R_MSP430X_SYM_DIFF */
10415 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10416 return TRUE;
10417
10418 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10419 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10420 goto handle_sym_diff;
10421
10422 case 5: /* R_MSP430_16_BYTE */
10423 case 9: /* R_MSP430_8 */
10424 if (uses_msp430x_relocs ())
10425 break;
10426 goto handle_sym_diff;
10427
10428 case 2: /* R_MSP430_ABS16 */
10429 case 15: /* R_MSP430X_ABS16 */
10430 if (! uses_msp430x_relocs ())
10431 break;
10432 goto handle_sym_diff;
10433
10434 handle_sym_diff:
10435 if (saved_sym != NULL)
10436 {
10437 bfd_vma value;
10438
10439 value = reloc->r_addend
10440 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10441 - saved_sym->st_value);
10442
10443 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10444
10445 saved_sym = NULL;
10446 return TRUE;
10447 }
10448 break;
10449
10450 default:
10451 if (saved_sym != NULL)
10452 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc"));
10453 break;
10454 }
10455 break;
10456 }
10457
10458 case EM_MN10300:
10459 case EM_CYGNUS_MN10300:
10460 {
10461 static Elf_Internal_Sym * saved_sym = NULL;
10462
10463 switch (reloc_type)
10464 {
10465 case 34: /* R_MN10300_ALIGN */
10466 return TRUE;
10467 case 33: /* R_MN10300_SYM_DIFF */
10468 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10469 return TRUE;
10470 case 1: /* R_MN10300_32 */
10471 case 2: /* R_MN10300_16 */
10472 if (saved_sym != NULL)
10473 {
10474 bfd_vma value;
10475
10476 value = reloc->r_addend
10477 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10478 - saved_sym->st_value);
10479
10480 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10481
10482 saved_sym = NULL;
10483 return TRUE;
10484 }
10485 break;
10486 default:
10487 if (saved_sym != NULL)
10488 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
10489 break;
10490 }
10491 break;
10492 }
10493 }
10494
10495 return FALSE;
10496 }
10497
10498 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10499 DWARF debug sections. This is a target specific test. Note - we do not
10500 go through the whole including-target-headers-multiple-times route, (as
10501 we have already done with <elf/h8.h>) because this would become very
10502 messy and even then this function would have to contain target specific
10503 information (the names of the relocs instead of their numeric values).
10504 FIXME: This is not the correct way to solve this problem. The proper way
10505 is to have target specific reloc sizing and typing functions created by
10506 the reloc-macros.h header, in the same way that it already creates the
10507 reloc naming functions. */
10508
10509 static bfd_boolean
10510 is_32bit_abs_reloc (unsigned int reloc_type)
10511 {
10512 switch (elf_header.e_machine)
10513 {
10514 case EM_386:
10515 case EM_486:
10516 return reloc_type == 1; /* R_386_32. */
10517 case EM_68K:
10518 return reloc_type == 1; /* R_68K_32. */
10519 case EM_860:
10520 return reloc_type == 1; /* R_860_32. */
10521 case EM_960:
10522 return reloc_type == 2; /* R_960_32. */
10523 case EM_AARCH64:
10524 return reloc_type == 258; /* R_AARCH64_ABS32 */
10525 case EM_ALPHA:
10526 return reloc_type == 1; /* R_ALPHA_REFLONG. */
10527 case EM_ARC:
10528 return reloc_type == 1; /* R_ARC_32. */
10529 case EM_ARM:
10530 return reloc_type == 2; /* R_ARM_ABS32 */
10531 case EM_AVR_OLD:
10532 case EM_AVR:
10533 return reloc_type == 1;
10534 case EM_ADAPTEVA_EPIPHANY:
10535 return reloc_type == 3;
10536 case EM_BLACKFIN:
10537 return reloc_type == 0x12; /* R_byte4_data. */
10538 case EM_CRIS:
10539 return reloc_type == 3; /* R_CRIS_32. */
10540 case EM_CR16:
10541 return reloc_type == 3; /* R_CR16_NUM32. */
10542 case EM_CRX:
10543 return reloc_type == 15; /* R_CRX_NUM32. */
10544 case EM_CYGNUS_FRV:
10545 return reloc_type == 1;
10546 case EM_CYGNUS_D10V:
10547 case EM_D10V:
10548 return reloc_type == 6; /* R_D10V_32. */
10549 case EM_CYGNUS_D30V:
10550 case EM_D30V:
10551 return reloc_type == 12; /* R_D30V_32_NORMAL. */
10552 case EM_DLX:
10553 return reloc_type == 3; /* R_DLX_RELOC_32. */
10554 case EM_CYGNUS_FR30:
10555 case EM_FR30:
10556 return reloc_type == 3; /* R_FR30_32. */
10557 case EM_H8S:
10558 case EM_H8_300:
10559 case EM_H8_300H:
10560 return reloc_type == 1; /* R_H8_DIR32. */
10561 case EM_IA_64:
10562 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
10563 case EM_IP2K_OLD:
10564 case EM_IP2K:
10565 return reloc_type == 2; /* R_IP2K_32. */
10566 case EM_IQ2000:
10567 return reloc_type == 2; /* R_IQ2000_32. */
10568 case EM_LATTICEMICO32:
10569 return reloc_type == 3; /* R_LM32_32. */
10570 case EM_M32C_OLD:
10571 case EM_M32C:
10572 return reloc_type == 3; /* R_M32C_32. */
10573 case EM_M32R:
10574 return reloc_type == 34; /* R_M32R_32_RELA. */
10575 case EM_MCORE:
10576 return reloc_type == 1; /* R_MCORE_ADDR32. */
10577 case EM_CYGNUS_MEP:
10578 return reloc_type == 4; /* R_MEP_32. */
10579 case EM_METAG:
10580 return reloc_type == 2; /* R_METAG_ADDR32. */
10581 case EM_MICROBLAZE:
10582 return reloc_type == 1; /* R_MICROBLAZE_32. */
10583 case EM_MIPS:
10584 return reloc_type == 2; /* R_MIPS_32. */
10585 case EM_MMIX:
10586 return reloc_type == 4; /* R_MMIX_32. */
10587 case EM_CYGNUS_MN10200:
10588 case EM_MN10200:
10589 return reloc_type == 1; /* R_MN10200_32. */
10590 case EM_CYGNUS_MN10300:
10591 case EM_MN10300:
10592 return reloc_type == 1; /* R_MN10300_32. */
10593 case EM_MOXIE:
10594 return reloc_type == 1; /* R_MOXIE_32. */
10595 case EM_MSP430_OLD:
10596 case EM_MSP430:
10597 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
10598 case EM_MT:
10599 return reloc_type == 2; /* R_MT_32. */
10600 case EM_NDS32:
10601 return reloc_type == 20; /* R_NDS32_RELA. */
10602 case EM_ALTERA_NIOS2:
10603 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
10604 case EM_NIOS32:
10605 return reloc_type == 1; /* R_NIOS_32. */
10606 case EM_OR1K:
10607 return reloc_type == 1; /* R_OR1K_32. */
10608 case EM_PARISC:
10609 return (reloc_type == 1 /* R_PARISC_DIR32. */
10610 || reloc_type == 41); /* R_PARISC_SECREL32. */
10611 case EM_PJ:
10612 case EM_PJ_OLD:
10613 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
10614 case EM_PPC64:
10615 return reloc_type == 1; /* R_PPC64_ADDR32. */
10616 case EM_PPC:
10617 return reloc_type == 1; /* R_PPC_ADDR32. */
10618 case EM_RL78:
10619 return reloc_type == 1; /* R_RL78_DIR32. */
10620 case EM_RX:
10621 return reloc_type == 1; /* R_RX_DIR32. */
10622 case EM_S370:
10623 return reloc_type == 1; /* R_I370_ADDR31. */
10624 case EM_S390_OLD:
10625 case EM_S390:
10626 return reloc_type == 4; /* R_S390_32. */
10627 case EM_SCORE:
10628 return reloc_type == 8; /* R_SCORE_ABS32. */
10629 case EM_SH:
10630 return reloc_type == 1; /* R_SH_DIR32. */
10631 case EM_SPARC32PLUS:
10632 case EM_SPARCV9:
10633 case EM_SPARC:
10634 return reloc_type == 3 /* R_SPARC_32. */
10635 || reloc_type == 23; /* R_SPARC_UA32. */
10636 case EM_SPU:
10637 return reloc_type == 6; /* R_SPU_ADDR32 */
10638 case EM_TI_C6000:
10639 return reloc_type == 1; /* R_C6000_ABS32. */
10640 case EM_TILEGX:
10641 return reloc_type == 2; /* R_TILEGX_32. */
10642 case EM_TILEPRO:
10643 return reloc_type == 1; /* R_TILEPRO_32. */
10644 case EM_CYGNUS_V850:
10645 case EM_V850:
10646 return reloc_type == 6; /* R_V850_ABS32. */
10647 case EM_V800:
10648 return reloc_type == 0x33; /* R_V810_WORD. */
10649 case EM_VAX:
10650 return reloc_type == 1; /* R_VAX_32. */
10651 case EM_X86_64:
10652 case EM_L1OM:
10653 case EM_K1OM:
10654 return reloc_type == 10; /* R_X86_64_32. */
10655 case EM_XC16X:
10656 case EM_C166:
10657 return reloc_type == 3; /* R_XC16C_ABS_32. */
10658 case EM_XGATE:
10659 return reloc_type == 4; /* R_XGATE_32. */
10660 case EM_XSTORMY16:
10661 return reloc_type == 1; /* R_XSTROMY16_32. */
10662 case EM_XTENSA_OLD:
10663 case EM_XTENSA:
10664 return reloc_type == 1; /* R_XTENSA_32. */
10665 default:
10666 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10667 elf_header.e_machine);
10668 abort ();
10669 }
10670 }
10671
10672 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10673 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
10674
10675 static bfd_boolean
10676 is_32bit_pcrel_reloc (unsigned int reloc_type)
10677 {
10678 switch (elf_header.e_machine)
10679 {
10680 case EM_386:
10681 case EM_486:
10682 return reloc_type == 2; /* R_386_PC32. */
10683 case EM_68K:
10684 return reloc_type == 4; /* R_68K_PC32. */
10685 case EM_AARCH64:
10686 return reloc_type == 261; /* R_AARCH64_PREL32 */
10687 case EM_ADAPTEVA_EPIPHANY:
10688 return reloc_type == 6;
10689 case EM_ALPHA:
10690 return reloc_type == 10; /* R_ALPHA_SREL32. */
10691 case EM_ARM:
10692 return reloc_type == 3; /* R_ARM_REL32 */
10693 case EM_MICROBLAZE:
10694 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
10695 case EM_OR1K:
10696 return reloc_type == 9; /* R_OR1K_32_PCREL. */
10697 case EM_PARISC:
10698 return reloc_type == 9; /* R_PARISC_PCREL32. */
10699 case EM_PPC:
10700 return reloc_type == 26; /* R_PPC_REL32. */
10701 case EM_PPC64:
10702 return reloc_type == 26; /* R_PPC64_REL32. */
10703 case EM_S390_OLD:
10704 case EM_S390:
10705 return reloc_type == 5; /* R_390_PC32. */
10706 case EM_SH:
10707 return reloc_type == 2; /* R_SH_REL32. */
10708 case EM_SPARC32PLUS:
10709 case EM_SPARCV9:
10710 case EM_SPARC:
10711 return reloc_type == 6; /* R_SPARC_DISP32. */
10712 case EM_SPU:
10713 return reloc_type == 13; /* R_SPU_REL32. */
10714 case EM_TILEGX:
10715 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
10716 case EM_TILEPRO:
10717 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
10718 case EM_X86_64:
10719 case EM_L1OM:
10720 case EM_K1OM:
10721 return reloc_type == 2; /* R_X86_64_PC32. */
10722 case EM_XTENSA_OLD:
10723 case EM_XTENSA:
10724 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
10725 default:
10726 /* Do not abort or issue an error message here. Not all targets use
10727 pc-relative 32-bit relocs in their DWARF debug information and we
10728 have already tested for target coverage in is_32bit_abs_reloc. A
10729 more helpful warning message will be generated by apply_relocations
10730 anyway, so just return. */
10731 return FALSE;
10732 }
10733 }
10734
10735 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10736 a 64-bit absolute RELA relocation used in DWARF debug sections. */
10737
10738 static bfd_boolean
10739 is_64bit_abs_reloc (unsigned int reloc_type)
10740 {
10741 switch (elf_header.e_machine)
10742 {
10743 case EM_AARCH64:
10744 return reloc_type == 257; /* R_AARCH64_ABS64. */
10745 case EM_ALPHA:
10746 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
10747 case EM_IA_64:
10748 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
10749 case EM_PARISC:
10750 return reloc_type == 80; /* R_PARISC_DIR64. */
10751 case EM_PPC64:
10752 return reloc_type == 38; /* R_PPC64_ADDR64. */
10753 case EM_SPARC32PLUS:
10754 case EM_SPARCV9:
10755 case EM_SPARC:
10756 return reloc_type == 54; /* R_SPARC_UA64. */
10757 case EM_X86_64:
10758 case EM_L1OM:
10759 case EM_K1OM:
10760 return reloc_type == 1; /* R_X86_64_64. */
10761 case EM_S390_OLD:
10762 case EM_S390:
10763 return reloc_type == 22; /* R_S390_64. */
10764 case EM_TILEGX:
10765 return reloc_type == 1; /* R_TILEGX_64. */
10766 case EM_MIPS:
10767 return reloc_type == 18; /* R_MIPS_64. */
10768 default:
10769 return FALSE;
10770 }
10771 }
10772
10773 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10774 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
10775
10776 static bfd_boolean
10777 is_64bit_pcrel_reloc (unsigned int reloc_type)
10778 {
10779 switch (elf_header.e_machine)
10780 {
10781 case EM_AARCH64:
10782 return reloc_type == 260; /* R_AARCH64_PREL64. */
10783 case EM_ALPHA:
10784 return reloc_type == 11; /* R_ALPHA_SREL64. */
10785 case EM_IA_64:
10786 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
10787 case EM_PARISC:
10788 return reloc_type == 72; /* R_PARISC_PCREL64. */
10789 case EM_PPC64:
10790 return reloc_type == 44; /* R_PPC64_REL64. */
10791 case EM_SPARC32PLUS:
10792 case EM_SPARCV9:
10793 case EM_SPARC:
10794 return reloc_type == 46; /* R_SPARC_DISP64. */
10795 case EM_X86_64:
10796 case EM_L1OM:
10797 case EM_K1OM:
10798 return reloc_type == 24; /* R_X86_64_PC64. */
10799 case EM_S390_OLD:
10800 case EM_S390:
10801 return reloc_type == 23; /* R_S390_PC64. */
10802 case EM_TILEGX:
10803 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
10804 default:
10805 return FALSE;
10806 }
10807 }
10808
10809 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10810 a 24-bit absolute RELA relocation used in DWARF debug sections. */
10811
10812 static bfd_boolean
10813 is_24bit_abs_reloc (unsigned int reloc_type)
10814 {
10815 switch (elf_header.e_machine)
10816 {
10817 case EM_CYGNUS_MN10200:
10818 case EM_MN10200:
10819 return reloc_type == 4; /* R_MN10200_24. */
10820 default:
10821 return FALSE;
10822 }
10823 }
10824
10825 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10826 a 16-bit absolute RELA relocation used in DWARF debug sections. */
10827
10828 static bfd_boolean
10829 is_16bit_abs_reloc (unsigned int reloc_type)
10830 {
10831 switch (elf_header.e_machine)
10832 {
10833 case EM_AVR_OLD:
10834 case EM_AVR:
10835 return reloc_type == 4; /* R_AVR_16. */
10836 case EM_ADAPTEVA_EPIPHANY:
10837 return reloc_type == 5;
10838 case EM_CYGNUS_D10V:
10839 case EM_D10V:
10840 return reloc_type == 3; /* R_D10V_16. */
10841 case EM_H8S:
10842 case EM_H8_300:
10843 case EM_H8_300H:
10844 return reloc_type == R_H8_DIR16;
10845 case EM_IP2K_OLD:
10846 case EM_IP2K:
10847 return reloc_type == 1; /* R_IP2K_16. */
10848 case EM_M32C_OLD:
10849 case EM_M32C:
10850 return reloc_type == 1; /* R_M32C_16 */
10851 case EM_MSP430:
10852 if (uses_msp430x_relocs ())
10853 return reloc_type == 2; /* R_MSP430_ABS16. */
10854 case EM_MSP430_OLD:
10855 return reloc_type == 5; /* R_MSP430_16_BYTE. */
10856 case EM_NDS32:
10857 return reloc_type == 19; /* R_NDS32_RELA. */
10858 case EM_ALTERA_NIOS2:
10859 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
10860 case EM_NIOS32:
10861 return reloc_type == 9; /* R_NIOS_16. */
10862 case EM_OR1K:
10863 return reloc_type == 2; /* R_OR1K_16. */
10864 case EM_TI_C6000:
10865 return reloc_type == 2; /* R_C6000_ABS16. */
10866 case EM_XC16X:
10867 case EM_C166:
10868 return reloc_type == 2; /* R_XC16C_ABS_16. */
10869 case EM_CYGNUS_MN10200:
10870 case EM_MN10200:
10871 return reloc_type == 2; /* R_MN10200_16. */
10872 case EM_CYGNUS_MN10300:
10873 case EM_MN10300:
10874 return reloc_type == 2; /* R_MN10300_16. */
10875 case EM_XGATE:
10876 return reloc_type == 3; /* R_XGATE_16. */
10877 default:
10878 return FALSE;
10879 }
10880 }
10881
10882 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10883 relocation entries (possibly formerly used for SHT_GROUP sections). */
10884
10885 static bfd_boolean
10886 is_none_reloc (unsigned int reloc_type)
10887 {
10888 switch (elf_header.e_machine)
10889 {
10890 case EM_68K: /* R_68K_NONE. */
10891 case EM_386: /* R_386_NONE. */
10892 case EM_SPARC32PLUS:
10893 case EM_SPARCV9:
10894 case EM_SPARC: /* R_SPARC_NONE. */
10895 case EM_MIPS: /* R_MIPS_NONE. */
10896 case EM_PARISC: /* R_PARISC_NONE. */
10897 case EM_ALPHA: /* R_ALPHA_NONE. */
10898 case EM_ADAPTEVA_EPIPHANY:
10899 case EM_PPC: /* R_PPC_NONE. */
10900 case EM_PPC64: /* R_PPC64_NONE. */
10901 case EM_ARM: /* R_ARM_NONE. */
10902 case EM_IA_64: /* R_IA64_NONE. */
10903 case EM_SH: /* R_SH_NONE. */
10904 case EM_S390_OLD:
10905 case EM_S390: /* R_390_NONE. */
10906 case EM_CRIS: /* R_CRIS_NONE. */
10907 case EM_X86_64: /* R_X86_64_NONE. */
10908 case EM_L1OM: /* R_X86_64_NONE. */
10909 case EM_K1OM: /* R_X86_64_NONE. */
10910 case EM_MN10300: /* R_MN10300_NONE. */
10911 case EM_MOXIE: /* R_MOXIE_NONE. */
10912 case EM_M32R: /* R_M32R_NONE. */
10913 case EM_TI_C6000:/* R_C6000_NONE. */
10914 case EM_TILEGX: /* R_TILEGX_NONE. */
10915 case EM_TILEPRO: /* R_TILEPRO_NONE. */
10916 case EM_XC16X:
10917 case EM_C166: /* R_XC16X_NONE. */
10918 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
10919 case EM_NIOS32: /* R_NIOS_NONE. */
10920 case EM_OR1K: /* R_OR1K_NONE. */
10921 return reloc_type == 0;
10922 case EM_AARCH64:
10923 return reloc_type == 0 || reloc_type == 256;
10924 case EM_NDS32:
10925 return (reloc_type == 0 /* R_XTENSA_NONE. */
10926 || reloc_type == 204 /* R_NDS32_DIFF8. */
10927 || reloc_type == 205 /* R_NDS32_DIFF16. */
10928 || reloc_type == 206 /* R_NDS32_DIFF32. */
10929 || reloc_type == 207 /* R_NDS32_ULEB128. */);
10930 case EM_XTENSA_OLD:
10931 case EM_XTENSA:
10932 return (reloc_type == 0 /* R_XTENSA_NONE. */
10933 || reloc_type == 17 /* R_XTENSA_DIFF8. */
10934 || reloc_type == 18 /* R_XTENSA_DIFF16. */
10935 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
10936 case EM_METAG:
10937 return reloc_type == 3; /* R_METAG_NONE. */
10938 }
10939 return FALSE;
10940 }
10941
10942 /* Apply relocations to a section.
10943 Note: So far support has been added only for those relocations
10944 which can be found in debug sections.
10945 FIXME: Add support for more relocations ? */
10946
10947 static void
10948 apply_relocations (void * file,
10949 Elf_Internal_Shdr * section,
10950 unsigned char * start)
10951 {
10952 Elf_Internal_Shdr * relsec;
10953 unsigned char * end = start + section->sh_size;
10954
10955 if (elf_header.e_type != ET_REL)
10956 return;
10957
10958 /* Find the reloc section associated with the section. */
10959 for (relsec = section_headers;
10960 relsec < section_headers + elf_header.e_shnum;
10961 ++relsec)
10962 {
10963 bfd_boolean is_rela;
10964 unsigned long num_relocs;
10965 Elf_Internal_Rela * relocs;
10966 Elf_Internal_Rela * rp;
10967 Elf_Internal_Shdr * symsec;
10968 Elf_Internal_Sym * symtab;
10969 unsigned long num_syms;
10970 Elf_Internal_Sym * sym;
10971
10972 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10973 || relsec->sh_info >= elf_header.e_shnum
10974 || section_headers + relsec->sh_info != section
10975 || relsec->sh_size == 0
10976 || relsec->sh_link >= elf_header.e_shnum)
10977 continue;
10978
10979 is_rela = relsec->sh_type == SHT_RELA;
10980
10981 if (is_rela)
10982 {
10983 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10984 relsec->sh_size, & relocs, & num_relocs))
10985 return;
10986 }
10987 else
10988 {
10989 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10990 relsec->sh_size, & relocs, & num_relocs))
10991 return;
10992 }
10993
10994 /* SH uses RELA but uses in place value instead of the addend field. */
10995 if (elf_header.e_machine == EM_SH)
10996 is_rela = FALSE;
10997
10998 symsec = section_headers + relsec->sh_link;
10999 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11000
11001 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11002 {
11003 bfd_vma addend;
11004 unsigned int reloc_type;
11005 unsigned int reloc_size;
11006 unsigned char * rloc;
11007 unsigned long sym_index;
11008
11009 reloc_type = get_reloc_type (rp->r_info);
11010
11011 if (target_specific_reloc_handling (rp, start, symtab))
11012 continue;
11013 else if (is_none_reloc (reloc_type))
11014 continue;
11015 else if (is_32bit_abs_reloc (reloc_type)
11016 || is_32bit_pcrel_reloc (reloc_type))
11017 reloc_size = 4;
11018 else if (is_64bit_abs_reloc (reloc_type)
11019 || is_64bit_pcrel_reloc (reloc_type))
11020 reloc_size = 8;
11021 else if (is_24bit_abs_reloc (reloc_type))
11022 reloc_size = 3;
11023 else if (is_16bit_abs_reloc (reloc_type))
11024 reloc_size = 2;
11025 else
11026 {
11027 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11028 reloc_type, SECTION_NAME (section));
11029 continue;
11030 }
11031
11032 rloc = start + rp->r_offset;
11033 if ((rloc + reloc_size) > end || (rloc < start))
11034 {
11035 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11036 (unsigned long) rp->r_offset,
11037 SECTION_NAME (section));
11038 continue;
11039 }
11040
11041 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11042 if (sym_index >= num_syms)
11043 {
11044 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11045 sym_index, SECTION_NAME (section));
11046 continue;
11047 }
11048 sym = symtab + sym_index;
11049
11050 /* If the reloc has a symbol associated with it,
11051 make sure that it is of an appropriate type.
11052
11053 Relocations against symbols without type can happen.
11054 Gcc -feliminate-dwarf2-dups may generate symbols
11055 without type for debug info.
11056
11057 Icc generates relocations against function symbols
11058 instead of local labels.
11059
11060 Relocations against object symbols can happen, eg when
11061 referencing a global array. For an example of this see
11062 the _clz.o binary in libgcc.a. */
11063 if (sym != symtab
11064 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11065 {
11066 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11067 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11068 (long int)(rp - relocs),
11069 SECTION_NAME (relsec));
11070 continue;
11071 }
11072
11073 addend = 0;
11074 if (is_rela)
11075 addend += rp->r_addend;
11076 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11077 partial_inplace. */
11078 if (!is_rela
11079 || (elf_header.e_machine == EM_XTENSA
11080 && reloc_type == 1)
11081 || ((elf_header.e_machine == EM_PJ
11082 || elf_header.e_machine == EM_PJ_OLD)
11083 && reloc_type == 1)
11084 || ((elf_header.e_machine == EM_D30V
11085 || elf_header.e_machine == EM_CYGNUS_D30V)
11086 && reloc_type == 12))
11087 addend += byte_get (rloc, reloc_size);
11088
11089 if (is_32bit_pcrel_reloc (reloc_type)
11090 || is_64bit_pcrel_reloc (reloc_type))
11091 {
11092 /* On HPPA, all pc-relative relocations are biased by 8. */
11093 if (elf_header.e_machine == EM_PARISC)
11094 addend -= 8;
11095 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11096 reloc_size);
11097 }
11098 else
11099 byte_put (rloc, addend + sym->st_value, reloc_size);
11100 }
11101
11102 free (symtab);
11103 free (relocs);
11104 break;
11105 }
11106 }
11107
11108 #ifdef SUPPORT_DISASSEMBLY
11109 static int
11110 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11111 {
11112 printf (_("\nAssembly dump of section %s\n"),
11113 SECTION_NAME (section));
11114
11115 /* XXX -- to be done --- XXX */
11116
11117 return 1;
11118 }
11119 #endif
11120
11121 /* Reads in the contents of SECTION from FILE, returning a pointer
11122 to a malloc'ed buffer or NULL if something went wrong. */
11123
11124 static char *
11125 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11126 {
11127 bfd_size_type num_bytes;
11128
11129 num_bytes = section->sh_size;
11130
11131 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11132 {
11133 printf (_("\nSection '%s' has no data to dump.\n"),
11134 SECTION_NAME (section));
11135 return NULL;
11136 }
11137
11138 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11139 _("section contents"));
11140 }
11141
11142
11143 static void
11144 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11145 {
11146 Elf_Internal_Shdr * relsec;
11147 bfd_size_type num_bytes;
11148 char * data;
11149 char * end;
11150 char * start;
11151 char * name = SECTION_NAME (section);
11152 bfd_boolean some_strings_shown;
11153
11154 start = get_section_contents (section, file);
11155 if (start == NULL)
11156 return;
11157
11158 printf (_("\nString dump of section '%s':\n"), name);
11159
11160 /* If the section being dumped has relocations against it the user might
11161 be expecting these relocations to have been applied. Check for this
11162 case and issue a warning message in order to avoid confusion.
11163 FIXME: Maybe we ought to have an option that dumps a section with
11164 relocs applied ? */
11165 for (relsec = section_headers;
11166 relsec < section_headers + elf_header.e_shnum;
11167 ++relsec)
11168 {
11169 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11170 || relsec->sh_info >= elf_header.e_shnum
11171 || section_headers + relsec->sh_info != section
11172 || relsec->sh_size == 0
11173 || relsec->sh_link >= elf_header.e_shnum)
11174 continue;
11175
11176 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11177 break;
11178 }
11179
11180 num_bytes = section->sh_size;
11181 data = start;
11182 end = start + num_bytes;
11183 some_strings_shown = FALSE;
11184
11185 while (data < end)
11186 {
11187 while (!ISPRINT (* data))
11188 if (++ data >= end)
11189 break;
11190
11191 if (data < end)
11192 {
11193 #ifndef __MSVCRT__
11194 /* PR 11128: Use two separate invocations in order to work
11195 around bugs in the Solaris 8 implementation of printf. */
11196 printf (" [%6tx] ", data - start);
11197 printf ("%s\n", data);
11198 #else
11199 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
11200 #endif
11201 data += strlen (data);
11202 some_strings_shown = TRUE;
11203 }
11204 }
11205
11206 if (! some_strings_shown)
11207 printf (_(" No strings found in this section."));
11208
11209 free (start);
11210
11211 putchar ('\n');
11212 }
11213
11214 static void
11215 dump_section_as_bytes (Elf_Internal_Shdr * section,
11216 FILE * file,
11217 bfd_boolean relocate)
11218 {
11219 Elf_Internal_Shdr * relsec;
11220 bfd_size_type bytes;
11221 bfd_vma addr;
11222 unsigned char * data;
11223 unsigned char * start;
11224
11225 start = (unsigned char *) get_section_contents (section, file);
11226 if (start == NULL)
11227 return;
11228
11229 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
11230
11231 if (relocate)
11232 {
11233 apply_relocations (file, section, start);
11234 }
11235 else
11236 {
11237 /* If the section being dumped has relocations against it the user might
11238 be expecting these relocations to have been applied. Check for this
11239 case and issue a warning message in order to avoid confusion.
11240 FIXME: Maybe we ought to have an option that dumps a section with
11241 relocs applied ? */
11242 for (relsec = section_headers;
11243 relsec < section_headers + elf_header.e_shnum;
11244 ++relsec)
11245 {
11246 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11247 || relsec->sh_info >= elf_header.e_shnum
11248 || section_headers + relsec->sh_info != section
11249 || relsec->sh_size == 0
11250 || relsec->sh_link >= elf_header.e_shnum)
11251 continue;
11252
11253 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11254 break;
11255 }
11256 }
11257
11258 addr = section->sh_addr;
11259 bytes = section->sh_size;
11260 data = start;
11261
11262 while (bytes)
11263 {
11264 int j;
11265 int k;
11266 int lbytes;
11267
11268 lbytes = (bytes > 16 ? 16 : bytes);
11269
11270 printf (" 0x%8.8lx ", (unsigned long) addr);
11271
11272 for (j = 0; j < 16; j++)
11273 {
11274 if (j < lbytes)
11275 printf ("%2.2x", data[j]);
11276 else
11277 printf (" ");
11278
11279 if ((j & 3) == 3)
11280 printf (" ");
11281 }
11282
11283 for (j = 0; j < lbytes; j++)
11284 {
11285 k = data[j];
11286 if (k >= ' ' && k < 0x7f)
11287 printf ("%c", k);
11288 else
11289 printf (".");
11290 }
11291
11292 putchar ('\n');
11293
11294 data += lbytes;
11295 addr += lbytes;
11296 bytes -= lbytes;
11297 }
11298
11299 free (start);
11300
11301 putchar ('\n');
11302 }
11303
11304 /* Uncompresses a section that was compressed using zlib, in place. */
11305
11306 static int
11307 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11308 dwarf_size_type *size ATTRIBUTE_UNUSED)
11309 {
11310 #ifndef HAVE_ZLIB_H
11311 return FALSE;
11312 #else
11313 dwarf_size_type compressed_size = *size;
11314 unsigned char * compressed_buffer = *buffer;
11315 dwarf_size_type uncompressed_size;
11316 unsigned char * uncompressed_buffer;
11317 z_stream strm;
11318 int rc;
11319 dwarf_size_type header_size = 12;
11320
11321 /* Read the zlib header. In this case, it should be "ZLIB" followed
11322 by the uncompressed section size, 8 bytes in big-endian order. */
11323 if (compressed_size < header_size
11324 || ! streq ((char *) compressed_buffer, "ZLIB"))
11325 return 0;
11326
11327 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11328 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11329 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11330 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11331 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11332 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11333 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11334 uncompressed_size += compressed_buffer[11];
11335
11336 /* It is possible the section consists of several compressed
11337 buffers concatenated together, so we uncompress in a loop. */
11338 strm.zalloc = NULL;
11339 strm.zfree = NULL;
11340 strm.opaque = NULL;
11341 strm.avail_in = compressed_size - header_size;
11342 strm.next_in = (Bytef *) compressed_buffer + header_size;
11343 strm.avail_out = uncompressed_size;
11344 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11345
11346 rc = inflateInit (& strm);
11347 while (strm.avail_in > 0)
11348 {
11349 if (rc != Z_OK)
11350 goto fail;
11351 strm.next_out = ((Bytef *) uncompressed_buffer
11352 + (uncompressed_size - strm.avail_out));
11353 rc = inflate (&strm, Z_FINISH);
11354 if (rc != Z_STREAM_END)
11355 goto fail;
11356 rc = inflateReset (& strm);
11357 }
11358 rc = inflateEnd (& strm);
11359 if (rc != Z_OK
11360 || strm.avail_out != 0)
11361 goto fail;
11362
11363 free (compressed_buffer);
11364 *buffer = uncompressed_buffer;
11365 *size = uncompressed_size;
11366 return 1;
11367
11368 fail:
11369 free (uncompressed_buffer);
11370 /* Indicate decompression failure. */
11371 *buffer = NULL;
11372 return 0;
11373 #endif /* HAVE_ZLIB_H */
11374 }
11375
11376 static int
11377 load_specific_debug_section (enum dwarf_section_display_enum debug,
11378 Elf_Internal_Shdr * sec, void * file)
11379 {
11380 struct dwarf_section * section = &debug_displays [debug].section;
11381 char buf [64];
11382
11383 /* If it is already loaded, do nothing. */
11384 if (section->start != NULL)
11385 return 1;
11386
11387 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11388 section->address = sec->sh_addr;
11389 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11390 sec->sh_offset, 1,
11391 sec->sh_size, buf);
11392 if (section->start == NULL)
11393 section->size = 0;
11394 else
11395 {
11396 section->size = sec->sh_size;
11397 if (uncompress_section_contents (&section->start, &section->size))
11398 sec->sh_size = section->size;
11399 }
11400
11401 if (section->start == NULL)
11402 return 0;
11403
11404 if (debug_displays [debug].relocate)
11405 apply_relocations ((FILE *) file, sec, section->start);
11406
11407 return 1;
11408 }
11409
11410 /* If this is not NULL, load_debug_section will only look for sections
11411 within the list of sections given here. */
11412 unsigned int *section_subset = NULL;
11413
11414 int
11415 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11416 {
11417 struct dwarf_section * section = &debug_displays [debug].section;
11418 Elf_Internal_Shdr * sec;
11419
11420 /* Locate the debug section. */
11421 sec = find_section_in_set (section->uncompressed_name, section_subset);
11422 if (sec != NULL)
11423 section->name = section->uncompressed_name;
11424 else
11425 {
11426 sec = find_section_in_set (section->compressed_name, section_subset);
11427 if (sec != NULL)
11428 section->name = section->compressed_name;
11429 }
11430 if (sec == NULL)
11431 return 0;
11432
11433 /* If we're loading from a subset of sections, and we've loaded
11434 a section matching this name before, it's likely that it's a
11435 different one. */
11436 if (section_subset != NULL)
11437 free_debug_section (debug);
11438
11439 return load_specific_debug_section (debug, sec, (FILE *) file);
11440 }
11441
11442 void
11443 free_debug_section (enum dwarf_section_display_enum debug)
11444 {
11445 struct dwarf_section * section = &debug_displays [debug].section;
11446
11447 if (section->start == NULL)
11448 return;
11449
11450 free ((char *) section->start);
11451 section->start = NULL;
11452 section->address = 0;
11453 section->size = 0;
11454 }
11455
11456 static int
11457 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11458 {
11459 char * name = SECTION_NAME (section);
11460 bfd_size_type length;
11461 int result = 1;
11462 int i;
11463
11464 length = section->sh_size;
11465 if (length == 0)
11466 {
11467 printf (_("\nSection '%s' has no debugging data.\n"), name);
11468 return 0;
11469 }
11470 if (section->sh_type == SHT_NOBITS)
11471 {
11472 /* There is no point in dumping the contents of a debugging section
11473 which has the NOBITS type - the bits in the file will be random.
11474 This can happen when a file containing a .eh_frame section is
11475 stripped with the --only-keep-debug command line option. */
11476 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
11477 return 0;
11478 }
11479
11480 if (const_strneq (name, ".gnu.linkonce.wi."))
11481 name = ".debug_info";
11482
11483 /* See if we know how to display the contents of this section. */
11484 for (i = 0; i < max; i++)
11485 if (streq (debug_displays[i].section.uncompressed_name, name)
11486 || (i == line && const_strneq (name, ".debug_line."))
11487 || streq (debug_displays[i].section.compressed_name, name))
11488 {
11489 struct dwarf_section * sec = &debug_displays [i].section;
11490 int secondary = (section != find_section (name));
11491
11492 if (secondary)
11493 free_debug_section ((enum dwarf_section_display_enum) i);
11494
11495 if (i == line && const_strneq (name, ".debug_line."))
11496 sec->name = name;
11497 else if (streq (sec->uncompressed_name, name))
11498 sec->name = sec->uncompressed_name;
11499 else
11500 sec->name = sec->compressed_name;
11501 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11502 section, file))
11503 {
11504 /* If this debug section is part of a CU/TU set in a .dwp file,
11505 restrict load_debug_section to the sections in that set. */
11506 section_subset = find_cu_tu_set (file, shndx);
11507
11508 result &= debug_displays[i].display (sec, file);
11509
11510 section_subset = NULL;
11511
11512 if (secondary || (i != info && i != abbrev))
11513 free_debug_section ((enum dwarf_section_display_enum) i);
11514 }
11515
11516 break;
11517 }
11518
11519 if (i == max)
11520 {
11521 printf (_("Unrecognized debug section: %s\n"), name);
11522 result = 0;
11523 }
11524
11525 return result;
11526 }
11527
11528 /* Set DUMP_SECTS for all sections where dumps were requested
11529 based on section name. */
11530
11531 static void
11532 initialise_dumps_byname (void)
11533 {
11534 struct dump_list_entry * cur;
11535
11536 for (cur = dump_sects_byname; cur; cur = cur->next)
11537 {
11538 unsigned int i;
11539 int any;
11540
11541 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11542 if (streq (SECTION_NAME (section_headers + i), cur->name))
11543 {
11544 request_dump_bynumber (i, cur->type);
11545 any = 1;
11546 }
11547
11548 if (!any)
11549 warn (_("Section '%s' was not dumped because it does not exist!\n"),
11550 cur->name);
11551 }
11552 }
11553
11554 static void
11555 process_section_contents (FILE * file)
11556 {
11557 Elf_Internal_Shdr * section;
11558 unsigned int i;
11559
11560 if (! do_dump)
11561 return;
11562
11563 initialise_dumps_byname ();
11564
11565 for (i = 0, section = section_headers;
11566 i < elf_header.e_shnum && i < num_dump_sects;
11567 i++, section++)
11568 {
11569 #ifdef SUPPORT_DISASSEMBLY
11570 if (dump_sects[i] & DISASS_DUMP)
11571 disassemble_section (section, file);
11572 #endif
11573 if (dump_sects[i] & HEX_DUMP)
11574 dump_section_as_bytes (section, file, FALSE);
11575
11576 if (dump_sects[i] & RELOC_DUMP)
11577 dump_section_as_bytes (section, file, TRUE);
11578
11579 if (dump_sects[i] & STRING_DUMP)
11580 dump_section_as_strings (section, file);
11581
11582 if (dump_sects[i] & DEBUG_DUMP)
11583 display_debug_section (i, section, file);
11584 }
11585
11586 /* Check to see if the user requested a
11587 dump of a section that does not exist. */
11588 while (i++ < num_dump_sects)
11589 if (dump_sects[i])
11590 warn (_("Section %d was not dumped because it does not exist!\n"), i);
11591 }
11592
11593 static void
11594 process_mips_fpe_exception (int mask)
11595 {
11596 if (mask)
11597 {
11598 int first = 1;
11599 if (mask & OEX_FPU_INEX)
11600 fputs ("INEX", stdout), first = 0;
11601 if (mask & OEX_FPU_UFLO)
11602 printf ("%sUFLO", first ? "" : "|"), first = 0;
11603 if (mask & OEX_FPU_OFLO)
11604 printf ("%sOFLO", first ? "" : "|"), first = 0;
11605 if (mask & OEX_FPU_DIV0)
11606 printf ("%sDIV0", first ? "" : "|"), first = 0;
11607 if (mask & OEX_FPU_INVAL)
11608 printf ("%sINVAL", first ? "" : "|");
11609 }
11610 else
11611 fputs ("0", stdout);
11612 }
11613
11614 /* Display's the value of TAG at location P. If TAG is
11615 greater than 0 it is assumed to be an unknown tag, and
11616 a message is printed to this effect. Otherwise it is
11617 assumed that a message has already been printed.
11618
11619 If the bottom bit of TAG is set it assumed to have a
11620 string value, otherwise it is assumed to have an integer
11621 value.
11622
11623 Returns an updated P pointing to the first unread byte
11624 beyond the end of TAG's value.
11625
11626 Reads at or beyond END will not be made. */
11627
11628 static unsigned char *
11629 display_tag_value (int tag,
11630 unsigned char * p,
11631 const unsigned char * const end)
11632 {
11633 unsigned long val;
11634
11635 if (tag > 0)
11636 printf (" Tag_unknown_%d: ", tag);
11637
11638 if (p >= end)
11639 {
11640 warn (_("corrupt tag\n"));
11641 }
11642 else if (tag & 1)
11643 {
11644 /* FIXME: we could read beyond END here. */
11645 printf ("\"%s\"\n", p);
11646 p += strlen ((char *) p) + 1;
11647 }
11648 else
11649 {
11650 unsigned int len;
11651
11652 val = read_uleb128 (p, &len, end);
11653 p += len;
11654 printf ("%ld (0x%lx)\n", val, val);
11655 }
11656
11657 return p;
11658 }
11659
11660 /* ARM EABI attributes section. */
11661 typedef struct
11662 {
11663 unsigned int tag;
11664 const char * name;
11665 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
11666 unsigned int type;
11667 const char ** table;
11668 } arm_attr_public_tag;
11669
11670 static const char * arm_attr_tag_CPU_arch[] =
11671 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11672 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11673 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11674 static const char * arm_attr_tag_THUMB_ISA_use[] =
11675 {"No", "Thumb-1", "Thumb-2"};
11676 static const char * arm_attr_tag_FP_arch[] =
11677 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11678 "FP for ARMv8"};
11679 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11680 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11681 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11682 static const char * arm_attr_tag_PCS_config[] =
11683 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11684 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11685 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11686 {"V6", "SB", "TLS", "Unused"};
11687 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11688 {"Absolute", "PC-relative", "SB-relative", "None"};
11689 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11690 {"Absolute", "PC-relative", "None"};
11691 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11692 {"None", "direct", "GOT-indirect"};
11693 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11694 {"None", "??? 1", "2", "??? 3", "4"};
11695 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11696 static const char * arm_attr_tag_ABI_FP_denormal[] =
11697 {"Unused", "Needed", "Sign only"};
11698 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11699 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11700 static const char * arm_attr_tag_ABI_FP_number_model[] =
11701 {"Unused", "Finite", "RTABI", "IEEE 754"};
11702 static const char * arm_attr_tag_ABI_enum_size[] =
11703 {"Unused", "small", "int", "forced to int"};
11704 static const char * arm_attr_tag_ABI_HardFP_use[] =
11705 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11706 static const char * arm_attr_tag_ABI_VFP_args[] =
11707 {"AAPCS", "VFP registers", "custom"};
11708 static const char * arm_attr_tag_ABI_WMMX_args[] =
11709 {"AAPCS", "WMMX registers", "custom"};
11710 static const char * arm_attr_tag_ABI_optimization_goals[] =
11711 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11712 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11713 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11714 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11715 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11716 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11717 static const char * arm_attr_tag_FP_HP_extension[] =
11718 {"Not Allowed", "Allowed"};
11719 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11720 {"None", "IEEE 754", "Alternative Format"};
11721 static const char * arm_attr_tag_MPextension_use[] =
11722 {"Not Allowed", "Allowed"};
11723 static const char * arm_attr_tag_DIV_use[] =
11724 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11725 "Allowed in v7-A with integer division extension"};
11726 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11727 static const char * arm_attr_tag_Virtualization_use[] =
11728 {"Not Allowed", "TrustZone", "Virtualization Extensions",
11729 "TrustZone and Virtualization Extensions"};
11730 static const char * arm_attr_tag_MPextension_use_legacy[] =
11731 {"Not Allowed", "Allowed"};
11732
11733 #define LOOKUP(id, name) \
11734 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11735 static arm_attr_public_tag arm_attr_public_tags[] =
11736 {
11737 {4, "CPU_raw_name", 1, NULL},
11738 {5, "CPU_name", 1, NULL},
11739 LOOKUP(6, CPU_arch),
11740 {7, "CPU_arch_profile", 0, NULL},
11741 LOOKUP(8, ARM_ISA_use),
11742 LOOKUP(9, THUMB_ISA_use),
11743 LOOKUP(10, FP_arch),
11744 LOOKUP(11, WMMX_arch),
11745 LOOKUP(12, Advanced_SIMD_arch),
11746 LOOKUP(13, PCS_config),
11747 LOOKUP(14, ABI_PCS_R9_use),
11748 LOOKUP(15, ABI_PCS_RW_data),
11749 LOOKUP(16, ABI_PCS_RO_data),
11750 LOOKUP(17, ABI_PCS_GOT_use),
11751 LOOKUP(18, ABI_PCS_wchar_t),
11752 LOOKUP(19, ABI_FP_rounding),
11753 LOOKUP(20, ABI_FP_denormal),
11754 LOOKUP(21, ABI_FP_exceptions),
11755 LOOKUP(22, ABI_FP_user_exceptions),
11756 LOOKUP(23, ABI_FP_number_model),
11757 {24, "ABI_align_needed", 0, NULL},
11758 {25, "ABI_align_preserved", 0, NULL},
11759 LOOKUP(26, ABI_enum_size),
11760 LOOKUP(27, ABI_HardFP_use),
11761 LOOKUP(28, ABI_VFP_args),
11762 LOOKUP(29, ABI_WMMX_args),
11763 LOOKUP(30, ABI_optimization_goals),
11764 LOOKUP(31, ABI_FP_optimization_goals),
11765 {32, "compatibility", 0, NULL},
11766 LOOKUP(34, CPU_unaligned_access),
11767 LOOKUP(36, FP_HP_extension),
11768 LOOKUP(38, ABI_FP_16bit_format),
11769 LOOKUP(42, MPextension_use),
11770 LOOKUP(44, DIV_use),
11771 {64, "nodefaults", 0, NULL},
11772 {65, "also_compatible_with", 0, NULL},
11773 LOOKUP(66, T2EE_use),
11774 {67, "conformance", 1, NULL},
11775 LOOKUP(68, Virtualization_use),
11776 LOOKUP(70, MPextension_use_legacy)
11777 };
11778 #undef LOOKUP
11779
11780 static unsigned char *
11781 display_arm_attribute (unsigned char * p,
11782 const unsigned char * const end)
11783 {
11784 unsigned int tag;
11785 unsigned int len;
11786 unsigned int val;
11787 arm_attr_public_tag * attr;
11788 unsigned i;
11789 unsigned int type;
11790
11791 tag = read_uleb128 (p, &len, end);
11792 p += len;
11793 attr = NULL;
11794 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11795 {
11796 if (arm_attr_public_tags[i].tag == tag)
11797 {
11798 attr = &arm_attr_public_tags[i];
11799 break;
11800 }
11801 }
11802
11803 if (attr)
11804 {
11805 printf (" Tag_%s: ", attr->name);
11806 switch (attr->type)
11807 {
11808 case 0:
11809 switch (tag)
11810 {
11811 case 7: /* Tag_CPU_arch_profile. */
11812 val = read_uleb128 (p, &len, end);
11813 p += len;
11814 switch (val)
11815 {
11816 case 0: printf (_("None\n")); break;
11817 case 'A': printf (_("Application\n")); break;
11818 case 'R': printf (_("Realtime\n")); break;
11819 case 'M': printf (_("Microcontroller\n")); break;
11820 case 'S': printf (_("Application or Realtime\n")); break;
11821 default: printf ("??? (%d)\n", val); break;
11822 }
11823 break;
11824
11825 case 24: /* Tag_align_needed. */
11826 val = read_uleb128 (p, &len, end);
11827 p += len;
11828 switch (val)
11829 {
11830 case 0: printf (_("None\n")); break;
11831 case 1: printf (_("8-byte\n")); break;
11832 case 2: printf (_("4-byte\n")); break;
11833 case 3: printf ("??? 3\n"); break;
11834 default:
11835 if (val <= 12)
11836 printf (_("8-byte and up to %d-byte extended\n"),
11837 1 << val);
11838 else
11839 printf ("??? (%d)\n", val);
11840 break;
11841 }
11842 break;
11843
11844 case 25: /* Tag_align_preserved. */
11845 val = read_uleb128 (p, &len, end);
11846 p += len;
11847 switch (val)
11848 {
11849 case 0: printf (_("None\n")); break;
11850 case 1: printf (_("8-byte, except leaf SP\n")); break;
11851 case 2: printf (_("8-byte\n")); break;
11852 case 3: printf ("??? 3\n"); break;
11853 default:
11854 if (val <= 12)
11855 printf (_("8-byte and up to %d-byte extended\n"),
11856 1 << val);
11857 else
11858 printf ("??? (%d)\n", val);
11859 break;
11860 }
11861 break;
11862
11863 case 32: /* Tag_compatibility. */
11864 val = read_uleb128 (p, &len, end);
11865 p += len;
11866 printf (_("flag = %d, vendor = %s\n"), val, p);
11867 p += strlen ((char *) p) + 1;
11868 break;
11869
11870 case 64: /* Tag_nodefaults. */
11871 p++;
11872 printf (_("True\n"));
11873 break;
11874
11875 case 65: /* Tag_also_compatible_with. */
11876 val = read_uleb128 (p, &len, end);
11877 p += len;
11878 if (val == 6 /* Tag_CPU_arch. */)
11879 {
11880 val = read_uleb128 (p, &len, end);
11881 p += len;
11882 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11883 printf ("??? (%d)\n", val);
11884 else
11885 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11886 }
11887 else
11888 printf ("???\n");
11889 while (*(p++) != '\0' /* NUL terminator. */);
11890 break;
11891
11892 default:
11893 abort ();
11894 }
11895 return p;
11896
11897 case 1:
11898 return display_tag_value (-1, p, end);
11899 case 2:
11900 return display_tag_value (0, p, end);
11901
11902 default:
11903 assert (attr->type & 0x80);
11904 val = read_uleb128 (p, &len, end);
11905 p += len;
11906 type = attr->type & 0x7f;
11907 if (val >= type)
11908 printf ("??? (%d)\n", val);
11909 else
11910 printf ("%s\n", attr->table[val]);
11911 return p;
11912 }
11913 }
11914
11915 return display_tag_value (tag, p, end);
11916 }
11917
11918 static unsigned char *
11919 display_gnu_attribute (unsigned char * p,
11920 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
11921 const unsigned char * const end)
11922 {
11923 int tag;
11924 unsigned int len;
11925 int val;
11926
11927 tag = read_uleb128 (p, &len, end);
11928 p += len;
11929
11930 /* Tag_compatibility is the only generic GNU attribute defined at
11931 present. */
11932 if (tag == 32)
11933 {
11934 val = read_uleb128 (p, &len, end);
11935 p += len;
11936 if (p == end)
11937 {
11938 printf (_("flag = %d, vendor = <corrupt>\n"), val);
11939 warn (_("corrupt vendor attribute\n"));
11940 }
11941 else
11942 {
11943 printf (_("flag = %d, vendor = %s\n"), val, p);
11944 p += strlen ((char *) p) + 1;
11945 }
11946 return p;
11947 }
11948
11949 if ((tag & 2) == 0 && display_proc_gnu_attribute)
11950 return display_proc_gnu_attribute (p, tag, end);
11951
11952 return display_tag_value (tag, p, end);
11953 }
11954
11955 static unsigned char *
11956 display_power_gnu_attribute (unsigned char * p,
11957 int tag,
11958 const unsigned char * const end)
11959 {
11960 unsigned int len;
11961 int val;
11962
11963 if (tag == Tag_GNU_Power_ABI_FP)
11964 {
11965 val = read_uleb128 (p, &len, end);
11966 p += len;
11967 printf (" Tag_GNU_Power_ABI_FP: ");
11968
11969 switch (val)
11970 {
11971 case 0:
11972 printf (_("Hard or soft float\n"));
11973 break;
11974 case 1:
11975 printf (_("Hard float\n"));
11976 break;
11977 case 2:
11978 printf (_("Soft float\n"));
11979 break;
11980 case 3:
11981 printf (_("Single-precision hard float\n"));
11982 break;
11983 default:
11984 printf ("??? (%d)\n", val);
11985 break;
11986 }
11987 return p;
11988 }
11989
11990 if (tag == Tag_GNU_Power_ABI_Vector)
11991 {
11992 val = read_uleb128 (p, &len, end);
11993 p += len;
11994 printf (" Tag_GNU_Power_ABI_Vector: ");
11995 switch (val)
11996 {
11997 case 0:
11998 printf (_("Any\n"));
11999 break;
12000 case 1:
12001 printf (_("Generic\n"));
12002 break;
12003 case 2:
12004 printf ("AltiVec\n");
12005 break;
12006 case 3:
12007 printf ("SPE\n");
12008 break;
12009 default:
12010 printf ("??? (%d)\n", val);
12011 break;
12012 }
12013 return p;
12014 }
12015
12016 if (tag == Tag_GNU_Power_ABI_Struct_Return)
12017 {
12018 if (p == end)
12019 {
12020 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return"));
12021 return p;
12022 }
12023
12024 val = read_uleb128 (p, &len, end);
12025 p += len;
12026 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
12027 switch (val)
12028 {
12029 case 0:
12030 printf (_("Any\n"));
12031 break;
12032 case 1:
12033 printf ("r3/r4\n");
12034 break;
12035 case 2:
12036 printf (_("Memory\n"));
12037 break;
12038 default:
12039 printf ("??? (%d)\n", val);
12040 break;
12041 }
12042 return p;
12043 }
12044
12045 return display_tag_value (tag & 1, p, end);
12046 }
12047
12048 static void
12049 display_sparc_hwcaps (int mask)
12050 {
12051 if (mask)
12052 {
12053 int first = 1;
12054 if (mask & ELF_SPARC_HWCAP_MUL32)
12055 fputs ("mul32", stdout), first = 0;
12056 if (mask & ELF_SPARC_HWCAP_DIV32)
12057 printf ("%sdiv32", first ? "" : "|"), first = 0;
12058 if (mask & ELF_SPARC_HWCAP_FSMULD)
12059 printf ("%sfsmuld", first ? "" : "|"), first = 0;
12060 if (mask & ELF_SPARC_HWCAP_V8PLUS)
12061 printf ("%sv8plus", first ? "" : "|"), first = 0;
12062 if (mask & ELF_SPARC_HWCAP_POPC)
12063 printf ("%spopc", first ? "" : "|"), first = 0;
12064 if (mask & ELF_SPARC_HWCAP_VIS)
12065 printf ("%svis", first ? "" : "|"), first = 0;
12066 if (mask & ELF_SPARC_HWCAP_VIS2)
12067 printf ("%svis2", first ? "" : "|"), first = 0;
12068 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12069 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12070 if (mask & ELF_SPARC_HWCAP_FMAF)
12071 printf ("%sfmaf", first ? "" : "|"), first = 0;
12072 if (mask & ELF_SPARC_HWCAP_VIS3)
12073 printf ("%svis3", first ? "" : "|"), first = 0;
12074 if (mask & ELF_SPARC_HWCAP_HPC)
12075 printf ("%shpc", first ? "" : "|"), first = 0;
12076 if (mask & ELF_SPARC_HWCAP_RANDOM)
12077 printf ("%srandom", first ? "" : "|"), first = 0;
12078 if (mask & ELF_SPARC_HWCAP_TRANS)
12079 printf ("%strans", first ? "" : "|"), first = 0;
12080 if (mask & ELF_SPARC_HWCAP_FJFMAU)
12081 printf ("%sfjfmau", first ? "" : "|"), first = 0;
12082 if (mask & ELF_SPARC_HWCAP_IMA)
12083 printf ("%sima", first ? "" : "|"), first = 0;
12084 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12085 printf ("%scspare", first ? "" : "|"), first = 0;
12086 }
12087 else
12088 fputc('0', stdout);
12089 fputc('\n', stdout);
12090 }
12091
12092 static void
12093 display_sparc_hwcaps2 (int mask)
12094 {
12095 if (mask)
12096 {
12097 int first = 1;
12098 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12099 fputs ("fjathplus", stdout), first = 0;
12100 if (mask & ELF_SPARC_HWCAP2_VIS3B)
12101 printf ("%svis3b", first ? "" : "|"), first = 0;
12102 if (mask & ELF_SPARC_HWCAP2_ADP)
12103 printf ("%sadp", first ? "" : "|"), first = 0;
12104 if (mask & ELF_SPARC_HWCAP2_SPARC5)
12105 printf ("%ssparc5", first ? "" : "|"), first = 0;
12106 if (mask & ELF_SPARC_HWCAP2_MWAIT)
12107 printf ("%smwait", first ? "" : "|"), first = 0;
12108 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12109 printf ("%sxmpmul", first ? "" : "|"), first = 0;
12110 if (mask & ELF_SPARC_HWCAP2_XMONT)
12111 printf ("%sxmont2", first ? "" : "|"), first = 0;
12112 if (mask & ELF_SPARC_HWCAP2_NSEC)
12113 printf ("%snsec", first ? "" : "|"), first = 0;
12114 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12115 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12116 if (mask & ELF_SPARC_HWCAP2_FJDES)
12117 printf ("%sfjdes", first ? "" : "|"), first = 0;
12118 if (mask & ELF_SPARC_HWCAP2_FJAES)
12119 printf ("%sfjaes", first ? "" : "|"), first = 0;
12120 }
12121 else
12122 fputc('0', stdout);
12123 fputc('\n', stdout);
12124 }
12125
12126 static unsigned char *
12127 display_sparc_gnu_attribute (unsigned char * p,
12128 int tag,
12129 const unsigned char * const end)
12130 {
12131 unsigned int len;
12132 int val;
12133
12134 if (tag == Tag_GNU_Sparc_HWCAPS)
12135 {
12136 val = read_uleb128 (p, &len, end);
12137 p += len;
12138 printf (" Tag_GNU_Sparc_HWCAPS: ");
12139 display_sparc_hwcaps (val);
12140 return p;
12141 }
12142 if (tag == Tag_GNU_Sparc_HWCAPS2)
12143 {
12144 val = read_uleb128 (p, &len, end);
12145 p += len;
12146 printf (" Tag_GNU_Sparc_HWCAPS2: ");
12147 display_sparc_hwcaps2 (val);
12148 return p;
12149 }
12150
12151 return display_tag_value (tag, p, end);
12152 }
12153
12154 static void
12155 print_mips_fp_abi_value (int val)
12156 {
12157 switch (val)
12158 {
12159 case Val_GNU_MIPS_ABI_FP_ANY:
12160 printf (_("Hard or soft float\n"));
12161 break;
12162 case Val_GNU_MIPS_ABI_FP_DOUBLE:
12163 printf (_("Hard float (double precision)\n"));
12164 break;
12165 case Val_GNU_MIPS_ABI_FP_SINGLE:
12166 printf (_("Hard float (single precision)\n"));
12167 break;
12168 case Val_GNU_MIPS_ABI_FP_SOFT:
12169 printf (_("Soft float\n"));
12170 break;
12171 case Val_GNU_MIPS_ABI_FP_OLD_64:
12172 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12173 break;
12174 case Val_GNU_MIPS_ABI_FP_XX:
12175 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12176 break;
12177 case Val_GNU_MIPS_ABI_FP_64:
12178 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12179 break;
12180 case Val_GNU_MIPS_ABI_FP_64A:
12181 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12182 break;
12183 default:
12184 printf ("??? (%d)\n", val);
12185 break;
12186 }
12187 }
12188
12189 static unsigned char *
12190 display_mips_gnu_attribute (unsigned char * p,
12191 int tag,
12192 const unsigned char * const end)
12193 {
12194 if (tag == Tag_GNU_MIPS_ABI_FP)
12195 {
12196 unsigned int len;
12197 int val;
12198
12199 val = read_uleb128 (p, &len, end);
12200 p += len;
12201 printf (" Tag_GNU_MIPS_ABI_FP: ");
12202
12203 print_mips_fp_abi_value (val);
12204
12205 return p;
12206 }
12207
12208 if (tag == Tag_GNU_MIPS_ABI_MSA)
12209 {
12210 unsigned int len;
12211 int val;
12212
12213 val = read_uleb128 (p, &len, end);
12214 p += len;
12215 printf (" Tag_GNU_MIPS_ABI_MSA: ");
12216
12217 switch (val)
12218 {
12219 case Val_GNU_MIPS_ABI_MSA_ANY:
12220 printf (_("Any MSA or not\n"));
12221 break;
12222 case Val_GNU_MIPS_ABI_MSA_128:
12223 printf (_("128-bit MSA\n"));
12224 break;
12225 default:
12226 printf ("??? (%d)\n", val);
12227 break;
12228 }
12229 return p;
12230 }
12231
12232 return display_tag_value (tag & 1, p, end);
12233 }
12234
12235 static unsigned char *
12236 display_tic6x_attribute (unsigned char * p,
12237 const unsigned char * const end)
12238 {
12239 int tag;
12240 unsigned int len;
12241 int val;
12242
12243 tag = read_uleb128 (p, &len, end);
12244 p += len;
12245
12246 switch (tag)
12247 {
12248 case Tag_ISA:
12249 val = read_uleb128 (p, &len, end);
12250 p += len;
12251 printf (" Tag_ISA: ");
12252
12253 switch (val)
12254 {
12255 case C6XABI_Tag_ISA_none:
12256 printf (_("None\n"));
12257 break;
12258 case C6XABI_Tag_ISA_C62X:
12259 printf ("C62x\n");
12260 break;
12261 case C6XABI_Tag_ISA_C67X:
12262 printf ("C67x\n");
12263 break;
12264 case C6XABI_Tag_ISA_C67XP:
12265 printf ("C67x+\n");
12266 break;
12267 case C6XABI_Tag_ISA_C64X:
12268 printf ("C64x\n");
12269 break;
12270 case C6XABI_Tag_ISA_C64XP:
12271 printf ("C64x+\n");
12272 break;
12273 case C6XABI_Tag_ISA_C674X:
12274 printf ("C674x\n");
12275 break;
12276 default:
12277 printf ("??? (%d)\n", val);
12278 break;
12279 }
12280 return p;
12281
12282 case Tag_ABI_wchar_t:
12283 val = read_uleb128 (p, &len, end);
12284 p += len;
12285 printf (" Tag_ABI_wchar_t: ");
12286 switch (val)
12287 {
12288 case 0:
12289 printf (_("Not used\n"));
12290 break;
12291 case 1:
12292 printf (_("2 bytes\n"));
12293 break;
12294 case 2:
12295 printf (_("4 bytes\n"));
12296 break;
12297 default:
12298 printf ("??? (%d)\n", val);
12299 break;
12300 }
12301 return p;
12302
12303 case Tag_ABI_stack_align_needed:
12304 val = read_uleb128 (p, &len, end);
12305 p += len;
12306 printf (" Tag_ABI_stack_align_needed: ");
12307 switch (val)
12308 {
12309 case 0:
12310 printf (_("8-byte\n"));
12311 break;
12312 case 1:
12313 printf (_("16-byte\n"));
12314 break;
12315 default:
12316 printf ("??? (%d)\n", val);
12317 break;
12318 }
12319 return p;
12320
12321 case Tag_ABI_stack_align_preserved:
12322 val = read_uleb128 (p, &len, end);
12323 p += len;
12324 printf (" Tag_ABI_stack_align_preserved: ");
12325 switch (val)
12326 {
12327 case 0:
12328 printf (_("8-byte\n"));
12329 break;
12330 case 1:
12331 printf (_("16-byte\n"));
12332 break;
12333 default:
12334 printf ("??? (%d)\n", val);
12335 break;
12336 }
12337 return p;
12338
12339 case Tag_ABI_DSBT:
12340 val = read_uleb128 (p, &len, end);
12341 p += len;
12342 printf (" Tag_ABI_DSBT: ");
12343 switch (val)
12344 {
12345 case 0:
12346 printf (_("DSBT addressing not used\n"));
12347 break;
12348 case 1:
12349 printf (_("DSBT addressing used\n"));
12350 break;
12351 default:
12352 printf ("??? (%d)\n", val);
12353 break;
12354 }
12355 return p;
12356
12357 case Tag_ABI_PID:
12358 val = read_uleb128 (p, &len, end);
12359 p += len;
12360 printf (" Tag_ABI_PID: ");
12361 switch (val)
12362 {
12363 case 0:
12364 printf (_("Data addressing position-dependent\n"));
12365 break;
12366 case 1:
12367 printf (_("Data addressing position-independent, GOT near DP\n"));
12368 break;
12369 case 2:
12370 printf (_("Data addressing position-independent, GOT far from DP\n"));
12371 break;
12372 default:
12373 printf ("??? (%d)\n", val);
12374 break;
12375 }
12376 return p;
12377
12378 case Tag_ABI_PIC:
12379 val = read_uleb128 (p, &len, end);
12380 p += len;
12381 printf (" Tag_ABI_PIC: ");
12382 switch (val)
12383 {
12384 case 0:
12385 printf (_("Code addressing position-dependent\n"));
12386 break;
12387 case 1:
12388 printf (_("Code addressing position-independent\n"));
12389 break;
12390 default:
12391 printf ("??? (%d)\n", val);
12392 break;
12393 }
12394 return p;
12395
12396 case Tag_ABI_array_object_alignment:
12397 val = read_uleb128 (p, &len, end);
12398 p += len;
12399 printf (" Tag_ABI_array_object_alignment: ");
12400 switch (val)
12401 {
12402 case 0:
12403 printf (_("8-byte\n"));
12404 break;
12405 case 1:
12406 printf (_("4-byte\n"));
12407 break;
12408 case 2:
12409 printf (_("16-byte\n"));
12410 break;
12411 default:
12412 printf ("??? (%d)\n", val);
12413 break;
12414 }
12415 return p;
12416
12417 case Tag_ABI_array_object_align_expected:
12418 val = read_uleb128 (p, &len, end);
12419 p += len;
12420 printf (" Tag_ABI_array_object_align_expected: ");
12421 switch (val)
12422 {
12423 case 0:
12424 printf (_("8-byte\n"));
12425 break;
12426 case 1:
12427 printf (_("4-byte\n"));
12428 break;
12429 case 2:
12430 printf (_("16-byte\n"));
12431 break;
12432 default:
12433 printf ("??? (%d)\n", val);
12434 break;
12435 }
12436 return p;
12437
12438 case Tag_ABI_compatibility:
12439 val = read_uleb128 (p, &len, end);
12440 p += len;
12441 printf (" Tag_ABI_compatibility: ");
12442 printf (_("flag = %d, vendor = %s\n"), val, p);
12443 p += strlen ((char *) p) + 1;
12444 return p;
12445
12446 case Tag_ABI_conformance:
12447 printf (" Tag_ABI_conformance: ");
12448 printf ("\"%s\"\n", p);
12449 p += strlen ((char *) p) + 1;
12450 return p;
12451 }
12452
12453 return display_tag_value (tag, p, end);
12454 }
12455
12456 static void
12457 display_raw_attribute (unsigned char * p, unsigned char * end)
12458 {
12459 unsigned long addr = 0;
12460 size_t bytes = end - p;
12461
12462 assert (end > p);
12463 while (bytes)
12464 {
12465 int j;
12466 int k;
12467 int lbytes = (bytes > 16 ? 16 : bytes);
12468
12469 printf (" 0x%8.8lx ", addr);
12470
12471 for (j = 0; j < 16; j++)
12472 {
12473 if (j < lbytes)
12474 printf ("%2.2x", p[j]);
12475 else
12476 printf (" ");
12477
12478 if ((j & 3) == 3)
12479 printf (" ");
12480 }
12481
12482 for (j = 0; j < lbytes; j++)
12483 {
12484 k = p[j];
12485 if (k >= ' ' && k < 0x7f)
12486 printf ("%c", k);
12487 else
12488 printf (".");
12489 }
12490
12491 putchar ('\n');
12492
12493 p += lbytes;
12494 bytes -= lbytes;
12495 addr += lbytes;
12496 }
12497
12498 putchar ('\n');
12499 }
12500
12501 static unsigned char *
12502 display_msp430x_attribute (unsigned char * p,
12503 const unsigned char * const end)
12504 {
12505 unsigned int len;
12506 int val;
12507 int tag;
12508
12509 tag = read_uleb128 (p, & len, end);
12510 p += len;
12511
12512 switch (tag)
12513 {
12514 case OFBA_MSPABI_Tag_ISA:
12515 val = read_uleb128 (p, &len, end);
12516 p += len;
12517 printf (" Tag_ISA: ");
12518 switch (val)
12519 {
12520 case 0: printf (_("None\n")); break;
12521 case 1: printf (_("MSP430\n")); break;
12522 case 2: printf (_("MSP430X\n")); break;
12523 default: printf ("??? (%d)\n", val); break;
12524 }
12525 break;
12526
12527 case OFBA_MSPABI_Tag_Code_Model:
12528 val = read_uleb128 (p, &len, end);
12529 p += len;
12530 printf (" Tag_Code_Model: ");
12531 switch (val)
12532 {
12533 case 0: printf (_("None\n")); break;
12534 case 1: printf (_("Small\n")); break;
12535 case 2: printf (_("Large\n")); break;
12536 default: printf ("??? (%d)\n", val); break;
12537 }
12538 break;
12539
12540 case OFBA_MSPABI_Tag_Data_Model:
12541 val = read_uleb128 (p, &len, end);
12542 p += len;
12543 printf (" Tag_Data_Model: ");
12544 switch (val)
12545 {
12546 case 0: printf (_("None\n")); break;
12547 case 1: printf (_("Small\n")); break;
12548 case 2: printf (_("Large\n")); break;
12549 case 3: printf (_("Restricted Large\n")); break;
12550 default: printf ("??? (%d)\n", val); break;
12551 }
12552 break;
12553
12554 default:
12555 printf (_(" <unknown tag %d>: "), tag);
12556
12557 if (tag & 1)
12558 {
12559 printf ("\"%s\"\n", p);
12560 p += strlen ((char *) p) + 1;
12561 }
12562 else
12563 {
12564 val = read_uleb128 (p, &len, end);
12565 p += len;
12566 printf ("%d (0x%x)\n", val, val);
12567 }
12568 break;
12569 }
12570
12571 return p;
12572 }
12573
12574 static int
12575 process_attributes (FILE * file,
12576 const char * public_name,
12577 unsigned int proc_type,
12578 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12579 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12580 {
12581 Elf_Internal_Shdr * sect;
12582 unsigned char * contents;
12583 unsigned char * p;
12584 unsigned char * end;
12585 bfd_vma section_len;
12586 bfd_vma len;
12587 unsigned i;
12588
12589 /* Find the section header so that we get the size. */
12590 for (i = 0, sect = section_headers;
12591 i < elf_header.e_shnum;
12592 i++, sect++)
12593 {
12594 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12595 continue;
12596
12597 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12598 sect->sh_size, _("attributes"));
12599 if (contents == NULL)
12600 continue;
12601
12602 p = contents;
12603 if (*p == 'A')
12604 {
12605 len = sect->sh_size - 1;
12606 p++;
12607
12608 while (len > 0)
12609 {
12610 unsigned int namelen;
12611 bfd_boolean public_section;
12612 bfd_boolean gnu_section;
12613
12614 if (len <= 4)
12615 {
12616 error (_("Tag section ends prematurely\n"));
12617 break;
12618 }
12619 section_len = byte_get (p, 4);
12620 p += 4;
12621
12622 if (section_len > len)
12623 {
12624 error (_("Length of attribute (%u) greater than length of section (%u)\n"),
12625 (unsigned) section_len, (unsigned) len);
12626 section_len = len;
12627 }
12628
12629 len -= section_len;
12630 section_len -= 4;
12631
12632 namelen = strnlen ((char *) p, section_len) + 1;
12633 if (namelen == 0 || namelen >= section_len)
12634 {
12635 error (_("Corrupt attribute section name\n"));
12636 break;
12637 }
12638
12639 printf (_("Attribute Section: %s\n"), p);
12640
12641 if (public_name && streq ((char *) p, public_name))
12642 public_section = TRUE;
12643 else
12644 public_section = FALSE;
12645
12646 if (streq ((char *) p, "gnu"))
12647 gnu_section = TRUE;
12648 else
12649 gnu_section = FALSE;
12650
12651 p += namelen;
12652 section_len -= namelen;
12653
12654 while (section_len > 0)
12655 {
12656 int tag;
12657 int val;
12658 bfd_vma size;
12659
12660 /* PR binutils/17531: Safe handling of corrupt files. */
12661 if (section_len < 6)
12662 {
12663 error (_("Unused bytes at end of section\n"));
12664 section_len = 0;
12665 break;
12666 }
12667
12668 tag = *(p++);
12669 size = byte_get (p, 4);
12670 if (size > section_len)
12671 {
12672 error (_("Bad subsection length (%u > %u)\n"),
12673 (unsigned) size, (unsigned) section_len);
12674 size = section_len;
12675 }
12676 /* PR binutils/17531: Safe handling of corrupt files. */
12677 if (size < 6)
12678 {
12679 error (_("Bad subsection length (%u < 6)\n"),
12680 (unsigned) size);
12681 section_len = 0;
12682 break;
12683 }
12684
12685 section_len -= size;
12686 end = p + size - 1;
12687 p += 4;
12688
12689 switch (tag)
12690 {
12691 case 1:
12692 printf (_("File Attributes\n"));
12693 break;
12694 case 2:
12695 printf (_("Section Attributes:"));
12696 goto do_numlist;
12697 case 3:
12698 printf (_("Symbol Attributes:"));
12699 do_numlist:
12700 for (;;)
12701 {
12702 unsigned int j;
12703
12704 val = read_uleb128 (p, &j, end);
12705 p += j;
12706 if (val == 0)
12707 break;
12708 printf (" %d", val);
12709 }
12710 printf ("\n");
12711 break;
12712 default:
12713 printf (_("Unknown tag: %d\n"), tag);
12714 public_section = FALSE;
12715 break;
12716 }
12717
12718 if (public_section)
12719 {
12720 while (p < end)
12721 p = display_pub_attribute (p, end);
12722 }
12723 else if (gnu_section)
12724 {
12725 while (p < end)
12726 p = display_gnu_attribute (p,
12727 display_proc_gnu_attribute,
12728 end);
12729 }
12730 else
12731 {
12732 printf (_(" Unknown section contexts\n"));
12733 display_raw_attribute (p, end);
12734 p = end;
12735 }
12736 }
12737 }
12738 }
12739 else
12740 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
12741
12742 free (contents);
12743 }
12744 return 1;
12745 }
12746
12747 static int
12748 process_arm_specific (FILE * file)
12749 {
12750 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12751 display_arm_attribute, NULL);
12752 }
12753
12754 static int
12755 process_power_specific (FILE * file)
12756 {
12757 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12758 display_power_gnu_attribute);
12759 }
12760
12761 static int
12762 process_sparc_specific (FILE * file)
12763 {
12764 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12765 display_sparc_gnu_attribute);
12766 }
12767
12768 static int
12769 process_tic6x_specific (FILE * file)
12770 {
12771 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12772 display_tic6x_attribute, NULL);
12773 }
12774
12775 static int
12776 process_msp430x_specific (FILE * file)
12777 {
12778 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12779 display_msp430x_attribute, NULL);
12780 }
12781
12782 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12783 Print the Address, Access and Initial fields of an entry at VMA ADDR
12784 and return the VMA of the next entry. */
12785
12786 static bfd_vma
12787 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12788 {
12789 printf (" ");
12790 print_vma (addr, LONG_HEX);
12791 printf (" ");
12792 if (addr < pltgot + 0xfff0)
12793 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12794 else
12795 printf ("%10s", "");
12796 printf (" ");
12797 if (data == NULL)
12798 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12799 else
12800 {
12801 bfd_vma entry;
12802
12803 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12804 print_vma (entry, LONG_HEX);
12805 }
12806 return addr + (is_32bit_elf ? 4 : 8);
12807 }
12808
12809 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12810 PLTGOT. Print the Address and Initial fields of an entry at VMA
12811 ADDR and return the VMA of the next entry. */
12812
12813 static bfd_vma
12814 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12815 {
12816 printf (" ");
12817 print_vma (addr, LONG_HEX);
12818 printf (" ");
12819 if (data == NULL)
12820 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12821 else
12822 {
12823 bfd_vma entry;
12824
12825 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12826 print_vma (entry, LONG_HEX);
12827 }
12828 return addr + (is_32bit_elf ? 4 : 8);
12829 }
12830
12831 static void
12832 print_mips_ases (unsigned int mask)
12833 {
12834 if (mask & AFL_ASE_DSP)
12835 fputs ("\n\tDSP ASE", stdout);
12836 if (mask & AFL_ASE_DSPR2)
12837 fputs ("\n\tDSP R2 ASE", stdout);
12838 if (mask & AFL_ASE_EVA)
12839 fputs ("\n\tEnhanced VA Scheme", stdout);
12840 if (mask & AFL_ASE_MCU)
12841 fputs ("\n\tMCU (MicroController) ASE", stdout);
12842 if (mask & AFL_ASE_MDMX)
12843 fputs ("\n\tMDMX ASE", stdout);
12844 if (mask & AFL_ASE_MIPS3D)
12845 fputs ("\n\tMIPS-3D ASE", stdout);
12846 if (mask & AFL_ASE_MT)
12847 fputs ("\n\tMT ASE", stdout);
12848 if (mask & AFL_ASE_SMARTMIPS)
12849 fputs ("\n\tSmartMIPS ASE", stdout);
12850 if (mask & AFL_ASE_VIRT)
12851 fputs ("\n\tVZ ASE", stdout);
12852 if (mask & AFL_ASE_MSA)
12853 fputs ("\n\tMSA ASE", stdout);
12854 if (mask & AFL_ASE_MIPS16)
12855 fputs ("\n\tMIPS16 ASE", stdout);
12856 if (mask & AFL_ASE_MICROMIPS)
12857 fputs ("\n\tMICROMIPS ASE", stdout);
12858 if (mask & AFL_ASE_XPA)
12859 fputs ("\n\tXPA ASE", stdout);
12860 if (mask == 0)
12861 fprintf (stdout, "\n\t%s", _("None"));
12862 else if ((mask & ~AFL_ASE_MASK) != 0)
12863 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
12864 }
12865
12866 static void
12867 print_mips_isa_ext (unsigned int isa_ext)
12868 {
12869 switch (isa_ext)
12870 {
12871 case 0:
12872 fputs (_("None"), stdout);
12873 break;
12874 case AFL_EXT_XLR:
12875 fputs ("RMI XLR", stdout);
12876 break;
12877 case AFL_EXT_OCTEON3:
12878 fputs ("Cavium Networks Octeon3", stdout);
12879 break;
12880 case AFL_EXT_OCTEON2:
12881 fputs ("Cavium Networks Octeon2", stdout);
12882 break;
12883 case AFL_EXT_OCTEONP:
12884 fputs ("Cavium Networks OcteonP", stdout);
12885 break;
12886 case AFL_EXT_LOONGSON_3A:
12887 fputs ("Loongson 3A", stdout);
12888 break;
12889 case AFL_EXT_OCTEON:
12890 fputs ("Cavium Networks Octeon", stdout);
12891 break;
12892 case AFL_EXT_5900:
12893 fputs ("Toshiba R5900", stdout);
12894 break;
12895 case AFL_EXT_4650:
12896 fputs ("MIPS R4650", stdout);
12897 break;
12898 case AFL_EXT_4010:
12899 fputs ("LSI R4010", stdout);
12900 break;
12901 case AFL_EXT_4100:
12902 fputs ("NEC VR4100", stdout);
12903 break;
12904 case AFL_EXT_3900:
12905 fputs ("Toshiba R3900", stdout);
12906 break;
12907 case AFL_EXT_10000:
12908 fputs ("MIPS R10000", stdout);
12909 break;
12910 case AFL_EXT_SB1:
12911 fputs ("Broadcom SB-1", stdout);
12912 break;
12913 case AFL_EXT_4111:
12914 fputs ("NEC VR4111/VR4181", stdout);
12915 break;
12916 case AFL_EXT_4120:
12917 fputs ("NEC VR4120", stdout);
12918 break;
12919 case AFL_EXT_5400:
12920 fputs ("NEC VR5400", stdout);
12921 break;
12922 case AFL_EXT_5500:
12923 fputs ("NEC VR5500", stdout);
12924 break;
12925 case AFL_EXT_LOONGSON_2E:
12926 fputs ("ST Microelectronics Loongson 2E", stdout);
12927 break;
12928 case AFL_EXT_LOONGSON_2F:
12929 fputs ("ST Microelectronics Loongson 2F", stdout);
12930 break;
12931 default:
12932 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
12933 }
12934 }
12935
12936 static int
12937 get_mips_reg_size (int reg_size)
12938 {
12939 return (reg_size == AFL_REG_NONE) ? 0
12940 : (reg_size == AFL_REG_32) ? 32
12941 : (reg_size == AFL_REG_64) ? 64
12942 : (reg_size == AFL_REG_128) ? 128
12943 : -1;
12944 }
12945
12946 static int
12947 process_mips_specific (FILE * file)
12948 {
12949 Elf_Internal_Dyn * entry;
12950 Elf_Internal_Shdr *sect = NULL;
12951 size_t liblist_offset = 0;
12952 size_t liblistno = 0;
12953 size_t conflictsno = 0;
12954 size_t options_offset = 0;
12955 size_t conflicts_offset = 0;
12956 size_t pltrelsz = 0;
12957 size_t pltrel = 0;
12958 bfd_vma pltgot = 0;
12959 bfd_vma mips_pltgot = 0;
12960 bfd_vma jmprel = 0;
12961 bfd_vma local_gotno = 0;
12962 bfd_vma gotsym = 0;
12963 bfd_vma symtabno = 0;
12964
12965 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12966 display_mips_gnu_attribute);
12967
12968 sect = find_section (".MIPS.abiflags");
12969
12970 if (sect != NULL)
12971 {
12972 Elf_External_ABIFlags_v0 *abiflags_ext;
12973 Elf_Internal_ABIFlags_v0 abiflags_in;
12974
12975 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
12976 fputs ("\nCorrupt ABI Flags section.\n", stdout);
12977 else
12978 {
12979 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
12980 sect->sh_size, _("MIPS ABI Flags section"));
12981 if (abiflags_ext)
12982 {
12983 abiflags_in.version = BYTE_GET (abiflags_ext->version);
12984 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
12985 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
12986 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
12987 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
12988 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
12989 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
12990 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
12991 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
12992 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
12993 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
12994
12995 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
12996 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
12997 if (abiflags_in.isa_rev > 1)
12998 printf ("r%d", abiflags_in.isa_rev);
12999 printf ("\nGPR size: %d",
13000 get_mips_reg_size (abiflags_in.gpr_size));
13001 printf ("\nCPR1 size: %d",
13002 get_mips_reg_size (abiflags_in.cpr1_size));
13003 printf ("\nCPR2 size: %d",
13004 get_mips_reg_size (abiflags_in.cpr2_size));
13005 fputs ("\nFP ABI: ", stdout);
13006 print_mips_fp_abi_value (abiflags_in.fp_abi);
13007 fputs ("ISA Extension: ", stdout);
13008 print_mips_isa_ext (abiflags_in.isa_ext);
13009 fputs ("\nASEs:", stdout);
13010 print_mips_ases (abiflags_in.ases);
13011 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13012 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13013 fputc ('\n', stdout);
13014 free (abiflags_ext);
13015 }
13016 }
13017 }
13018
13019 /* We have a lot of special sections. Thanks SGI! */
13020 if (dynamic_section == NULL)
13021 /* No information available. */
13022 return 0;
13023
13024 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
13025 switch (entry->d_tag)
13026 {
13027 case DT_MIPS_LIBLIST:
13028 liblist_offset
13029 = offset_from_vma (file, entry->d_un.d_val,
13030 liblistno * sizeof (Elf32_External_Lib));
13031 break;
13032 case DT_MIPS_LIBLISTNO:
13033 liblistno = entry->d_un.d_val;
13034 break;
13035 case DT_MIPS_OPTIONS:
13036 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13037 break;
13038 case DT_MIPS_CONFLICT:
13039 conflicts_offset
13040 = offset_from_vma (file, entry->d_un.d_val,
13041 conflictsno * sizeof (Elf32_External_Conflict));
13042 break;
13043 case DT_MIPS_CONFLICTNO:
13044 conflictsno = entry->d_un.d_val;
13045 break;
13046 case DT_PLTGOT:
13047 pltgot = entry->d_un.d_ptr;
13048 break;
13049 case DT_MIPS_LOCAL_GOTNO:
13050 local_gotno = entry->d_un.d_val;
13051 break;
13052 case DT_MIPS_GOTSYM:
13053 gotsym = entry->d_un.d_val;
13054 break;
13055 case DT_MIPS_SYMTABNO:
13056 symtabno = entry->d_un.d_val;
13057 break;
13058 case DT_MIPS_PLTGOT:
13059 mips_pltgot = entry->d_un.d_ptr;
13060 break;
13061 case DT_PLTREL:
13062 pltrel = entry->d_un.d_val;
13063 break;
13064 case DT_PLTRELSZ:
13065 pltrelsz = entry->d_un.d_val;
13066 break;
13067 case DT_JMPREL:
13068 jmprel = entry->d_un.d_ptr;
13069 break;
13070 default:
13071 break;
13072 }
13073
13074 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13075 {
13076 Elf32_External_Lib * elib;
13077 size_t cnt;
13078
13079 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13080 liblistno,
13081 sizeof (Elf32_External_Lib),
13082 _("liblist section data"));
13083 if (elib)
13084 {
13085 printf (_("\nSection '.liblist' contains %lu entries:\n"),
13086 (unsigned long) liblistno);
13087 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
13088 stdout);
13089
13090 for (cnt = 0; cnt < liblistno; ++cnt)
13091 {
13092 Elf32_Lib liblist;
13093 time_t atime;
13094 char timebuf[20];
13095 struct tm * tmp;
13096
13097 liblist.l_name = BYTE_GET (elib[cnt].l_name);
13098 atime = BYTE_GET (elib[cnt].l_time_stamp);
13099 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13100 liblist.l_version = BYTE_GET (elib[cnt].l_version);
13101 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13102
13103 tmp = gmtime (&atime);
13104 snprintf (timebuf, sizeof (timebuf),
13105 "%04u-%02u-%02uT%02u:%02u:%02u",
13106 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13107 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13108
13109 printf ("%3lu: ", (unsigned long) cnt);
13110 if (VALID_DYNAMIC_NAME (liblist.l_name))
13111 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13112 else
13113 printf (_("<corrupt: %9ld>"), liblist.l_name);
13114 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13115 liblist.l_version);
13116
13117 if (liblist.l_flags == 0)
13118 puts (_(" NONE"));
13119 else
13120 {
13121 static const struct
13122 {
13123 const char * name;
13124 int bit;
13125 }
13126 l_flags_vals[] =
13127 {
13128 { " EXACT_MATCH", LL_EXACT_MATCH },
13129 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13130 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13131 { " EXPORTS", LL_EXPORTS },
13132 { " DELAY_LOAD", LL_DELAY_LOAD },
13133 { " DELTA", LL_DELTA }
13134 };
13135 int flags = liblist.l_flags;
13136 size_t fcnt;
13137
13138 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13139 if ((flags & l_flags_vals[fcnt].bit) != 0)
13140 {
13141 fputs (l_flags_vals[fcnt].name, stdout);
13142 flags ^= l_flags_vals[fcnt].bit;
13143 }
13144 if (flags != 0)
13145 printf (" %#x", (unsigned int) flags);
13146
13147 puts ("");
13148 }
13149 }
13150
13151 free (elib);
13152 }
13153 }
13154
13155 if (options_offset != 0)
13156 {
13157 Elf_External_Options * eopt;
13158 Elf_Internal_Options * iopt;
13159 Elf_Internal_Options * option;
13160 size_t offset;
13161 int cnt;
13162 sect = section_headers;
13163
13164 /* Find the section header so that we get the size. */
13165 while (sect->sh_type != SHT_MIPS_OPTIONS)
13166 ++sect;
13167
13168 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13169 sect->sh_size, _("options"));
13170 if (eopt)
13171 {
13172 iopt = (Elf_Internal_Options *)
13173 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13174 if (iopt == NULL)
13175 {
13176 error (_("Out of memory\n"));
13177 return 0;
13178 }
13179
13180 offset = cnt = 0;
13181 option = iopt;
13182
13183 while (offset < sect->sh_size)
13184 {
13185 Elf_External_Options * eoption;
13186
13187 eoption = (Elf_External_Options *) ((char *) eopt + offset);
13188
13189 option->kind = BYTE_GET (eoption->kind);
13190 option->size = BYTE_GET (eoption->size);
13191 option->section = BYTE_GET (eoption->section);
13192 option->info = BYTE_GET (eoption->info);
13193
13194 offset += option->size;
13195
13196 ++option;
13197 ++cnt;
13198 }
13199
13200 printf (_("\nSection '%s' contains %d entries:\n"),
13201 SECTION_NAME (sect), cnt);
13202
13203 option = iopt;
13204
13205 while (cnt-- > 0)
13206 {
13207 size_t len;
13208
13209 switch (option->kind)
13210 {
13211 case ODK_NULL:
13212 /* This shouldn't happen. */
13213 printf (" NULL %d %lx", option->section, option->info);
13214 break;
13215 case ODK_REGINFO:
13216 printf (" REGINFO ");
13217 if (elf_header.e_machine == EM_MIPS)
13218 {
13219 /* 32bit form. */
13220 Elf32_External_RegInfo * ereg;
13221 Elf32_RegInfo reginfo;
13222
13223 ereg = (Elf32_External_RegInfo *) (option + 1);
13224 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13225 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13226 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13227 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13228 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13229 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13230
13231 printf ("GPR %08lx GP 0x%lx\n",
13232 reginfo.ri_gprmask,
13233 (unsigned long) reginfo.ri_gp_value);
13234 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
13235 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13236 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13237 }
13238 else
13239 {
13240 /* 64 bit form. */
13241 Elf64_External_RegInfo * ereg;
13242 Elf64_Internal_RegInfo reginfo;
13243
13244 ereg = (Elf64_External_RegInfo *) (option + 1);
13245 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13246 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13247 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13248 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13249 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13250 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13251
13252 printf ("GPR %08lx GP 0x",
13253 reginfo.ri_gprmask);
13254 printf_vma (reginfo.ri_gp_value);
13255 printf ("\n");
13256
13257 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
13258 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13259 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13260 }
13261 ++option;
13262 continue;
13263 case ODK_EXCEPTIONS:
13264 fputs (" EXCEPTIONS fpe_min(", stdout);
13265 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13266 fputs (") fpe_max(", stdout);
13267 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13268 fputs (")", stdout);
13269
13270 if (option->info & OEX_PAGE0)
13271 fputs (" PAGE0", stdout);
13272 if (option->info & OEX_SMM)
13273 fputs (" SMM", stdout);
13274 if (option->info & OEX_FPDBUG)
13275 fputs (" FPDBUG", stdout);
13276 if (option->info & OEX_DISMISS)
13277 fputs (" DISMISS", stdout);
13278 break;
13279 case ODK_PAD:
13280 fputs (" PAD ", stdout);
13281 if (option->info & OPAD_PREFIX)
13282 fputs (" PREFIX", stdout);
13283 if (option->info & OPAD_POSTFIX)
13284 fputs (" POSTFIX", stdout);
13285 if (option->info & OPAD_SYMBOL)
13286 fputs (" SYMBOL", stdout);
13287 break;
13288 case ODK_HWPATCH:
13289 fputs (" HWPATCH ", stdout);
13290 if (option->info & OHW_R4KEOP)
13291 fputs (" R4KEOP", stdout);
13292 if (option->info & OHW_R8KPFETCH)
13293 fputs (" R8KPFETCH", stdout);
13294 if (option->info & OHW_R5KEOP)
13295 fputs (" R5KEOP", stdout);
13296 if (option->info & OHW_R5KCVTL)
13297 fputs (" R5KCVTL", stdout);
13298 break;
13299 case ODK_FILL:
13300 fputs (" FILL ", stdout);
13301 /* XXX Print content of info word? */
13302 break;
13303 case ODK_TAGS:
13304 fputs (" TAGS ", stdout);
13305 /* XXX Print content of info word? */
13306 break;
13307 case ODK_HWAND:
13308 fputs (" HWAND ", stdout);
13309 if (option->info & OHWA0_R4KEOP_CHECKED)
13310 fputs (" R4KEOP_CHECKED", stdout);
13311 if (option->info & OHWA0_R4KEOP_CLEAN)
13312 fputs (" R4KEOP_CLEAN", stdout);
13313 break;
13314 case ODK_HWOR:
13315 fputs (" HWOR ", stdout);
13316 if (option->info & OHWA0_R4KEOP_CHECKED)
13317 fputs (" R4KEOP_CHECKED", stdout);
13318 if (option->info & OHWA0_R4KEOP_CLEAN)
13319 fputs (" R4KEOP_CLEAN", stdout);
13320 break;
13321 case ODK_GP_GROUP:
13322 printf (" GP_GROUP %#06lx self-contained %#06lx",
13323 option->info & OGP_GROUP,
13324 (option->info & OGP_SELF) >> 16);
13325 break;
13326 case ODK_IDENT:
13327 printf (" IDENT %#06lx self-contained %#06lx",
13328 option->info & OGP_GROUP,
13329 (option->info & OGP_SELF) >> 16);
13330 break;
13331 default:
13332 /* This shouldn't happen. */
13333 printf (" %3d ??? %d %lx",
13334 option->kind, option->section, option->info);
13335 break;
13336 }
13337
13338 len = sizeof (* eopt);
13339 while (len < option->size)
13340 if (((char *) option)[len] >= ' '
13341 && ((char *) option)[len] < 0x7f)
13342 printf ("%c", ((char *) option)[len++]);
13343 else
13344 printf ("\\%03o", ((char *) option)[len++]);
13345
13346 fputs ("\n", stdout);
13347 ++option;
13348 }
13349
13350 free (eopt);
13351 }
13352 }
13353
13354 if (conflicts_offset != 0 && conflictsno != 0)
13355 {
13356 Elf32_Conflict * iconf;
13357 size_t cnt;
13358
13359 if (dynamic_symbols == NULL)
13360 {
13361 error (_("conflict list found without a dynamic symbol table\n"));
13362 return 0;
13363 }
13364
13365 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13366 if (iconf == NULL)
13367 {
13368 error (_("Out of memory\n"));
13369 return 0;
13370 }
13371
13372 if (is_32bit_elf)
13373 {
13374 Elf32_External_Conflict * econf32;
13375
13376 econf32 = (Elf32_External_Conflict *)
13377 get_data (NULL, file, conflicts_offset, conflictsno,
13378 sizeof (* econf32), _("conflict"));
13379 if (!econf32)
13380 return 0;
13381
13382 for (cnt = 0; cnt < conflictsno; ++cnt)
13383 iconf[cnt] = BYTE_GET (econf32[cnt]);
13384
13385 free (econf32);
13386 }
13387 else
13388 {
13389 Elf64_External_Conflict * econf64;
13390
13391 econf64 = (Elf64_External_Conflict *)
13392 get_data (NULL, file, conflicts_offset, conflictsno,
13393 sizeof (* econf64), _("conflict"));
13394 if (!econf64)
13395 return 0;
13396
13397 for (cnt = 0; cnt < conflictsno; ++cnt)
13398 iconf[cnt] = BYTE_GET (econf64[cnt]);
13399
13400 free (econf64);
13401 }
13402
13403 printf (_("\nSection '.conflict' contains %lu entries:\n"),
13404 (unsigned long) conflictsno);
13405 puts (_(" Num: Index Value Name"));
13406
13407 for (cnt = 0; cnt < conflictsno; ++cnt)
13408 {
13409 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
13410
13411 if (iconf[cnt] >= num_dynamic_syms)
13412 printf (_("<corrupt symbol index>"));
13413 else
13414 {
13415 Elf_Internal_Sym * psym;
13416
13417 psym = & dynamic_symbols[iconf[cnt]];
13418 print_vma (psym->st_value, FULL_HEX);
13419 putchar (' ');
13420 if (VALID_DYNAMIC_NAME (psym->st_name))
13421 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13422 else
13423 printf (_("<corrupt: %14ld>"), psym->st_name);
13424 }
13425 putchar ('\n');
13426 }
13427
13428 free (iconf);
13429 }
13430
13431 if (pltgot != 0 && local_gotno != 0)
13432 {
13433 bfd_vma ent, local_end, global_end;
13434 size_t i, offset;
13435 unsigned char * data;
13436 int addr_size;
13437
13438 ent = pltgot;
13439 addr_size = (is_32bit_elf ? 4 : 8);
13440 local_end = pltgot + local_gotno * addr_size;
13441 global_end = local_end + (symtabno - gotsym) * addr_size;
13442
13443 offset = offset_from_vma (file, pltgot, global_end - pltgot);
13444 data = (unsigned char *) get_data (NULL, file, offset,
13445 global_end - pltgot, 1,
13446 _("Global Offset Table data"));
13447 if (data == NULL)
13448 return 0;
13449
13450 printf (_("\nPrimary GOT:\n"));
13451 printf (_(" Canonical gp value: "));
13452 print_vma (pltgot + 0x7ff0, LONG_HEX);
13453 printf ("\n\n");
13454
13455 printf (_(" Reserved entries:\n"));
13456 printf (_(" %*s %10s %*s Purpose\n"),
13457 addr_size * 2, _("Address"), _("Access"),
13458 addr_size * 2, _("Initial"));
13459 ent = print_mips_got_entry (data, pltgot, ent);
13460 printf (_(" Lazy resolver\n"));
13461 if (data
13462 && (byte_get (data + ent - pltgot, addr_size)
13463 >> (addr_size * 8 - 1)) != 0)
13464 {
13465 ent = print_mips_got_entry (data, pltgot, ent);
13466 printf (_(" Module pointer (GNU extension)\n"));
13467 }
13468 printf ("\n");
13469
13470 if (ent < local_end)
13471 {
13472 printf (_(" Local entries:\n"));
13473 printf (" %*s %10s %*s\n",
13474 addr_size * 2, _("Address"), _("Access"),
13475 addr_size * 2, _("Initial"));
13476 while (ent < local_end)
13477 {
13478 ent = print_mips_got_entry (data, pltgot, ent);
13479 printf ("\n");
13480 }
13481 printf ("\n");
13482 }
13483
13484 if (gotsym < symtabno)
13485 {
13486 int sym_width;
13487
13488 printf (_(" Global entries:\n"));
13489 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
13490 addr_size * 2, _("Address"),
13491 _("Access"),
13492 addr_size * 2, _("Initial"),
13493 addr_size * 2, _("Sym.Val."),
13494 _("Type"),
13495 /* Note for translators: "Ndx" = abbreviated form of "Index". */
13496 _("Ndx"), _("Name"));
13497
13498 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13499
13500 for (i = gotsym; i < symtabno; i++)
13501 {
13502 ent = print_mips_got_entry (data, pltgot, ent);
13503 printf (" ");
13504
13505 if (dynamic_symbols == NULL)
13506 printf (_("<no dynamic symbols>"));
13507 else if (i < num_dynamic_syms)
13508 {
13509 Elf_Internal_Sym * psym = dynamic_symbols + i;
13510
13511 print_vma (psym->st_value, LONG_HEX);
13512 printf (" %-7s %3s ",
13513 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13514 get_symbol_index_type (psym->st_shndx));
13515
13516 if (VALID_DYNAMIC_NAME (psym->st_name))
13517 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13518 else
13519 printf (_("<corrupt: %14ld>"), psym->st_name);
13520 }
13521 else
13522 printf (_("<symbol index %lu exceeds number of dynamic symbols>"), i);
13523
13524 printf ("\n");
13525 }
13526 printf ("\n");
13527 }
13528
13529 if (data)
13530 free (data);
13531 }
13532
13533 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13534 {
13535 bfd_vma ent, end;
13536 size_t offset, rel_offset;
13537 unsigned long count, i;
13538 unsigned char * data;
13539 int addr_size, sym_width;
13540 Elf_Internal_Rela * rels;
13541
13542 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13543 if (pltrel == DT_RELA)
13544 {
13545 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13546 return 0;
13547 }
13548 else
13549 {
13550 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13551 return 0;
13552 }
13553
13554 ent = mips_pltgot;
13555 addr_size = (is_32bit_elf ? 4 : 8);
13556 end = mips_pltgot + (2 + count) * addr_size;
13557
13558 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13559 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13560 1, _("Procedure Linkage Table data"));
13561 if (data == NULL)
13562 return 0;
13563
13564 printf ("\nPLT GOT:\n\n");
13565 printf (_(" Reserved entries:\n"));
13566 printf (_(" %*s %*s Purpose\n"),
13567 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13568 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13569 printf (_(" PLT lazy resolver\n"));
13570 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13571 printf (_(" Module pointer\n"));
13572 printf ("\n");
13573
13574 printf (_(" Entries:\n"));
13575 printf (" %*s %*s %*s %-7s %3s %s\n",
13576 addr_size * 2, _("Address"),
13577 addr_size * 2, _("Initial"),
13578 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13579 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13580 for (i = 0; i < count; i++)
13581 {
13582 unsigned long index = get_reloc_symindex (rels[i].r_info);
13583
13584 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13585 printf (" ");
13586
13587 if (index >= num_dynamic_syms)
13588 printf (_("<corrupt symbol index: %lu>"), index);
13589 else
13590 {
13591 Elf_Internal_Sym * psym = dynamic_symbols + index;
13592
13593 print_vma (psym->st_value, LONG_HEX);
13594 printf (" %-7s %3s ",
13595 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13596 get_symbol_index_type (psym->st_shndx));
13597 if (VALID_DYNAMIC_NAME (psym->st_name))
13598 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13599 else
13600 printf (_("<corrupt: %14ld>"), psym->st_name);
13601 }
13602 printf ("\n");
13603 }
13604 printf ("\n");
13605
13606 if (data)
13607 free (data);
13608 free (rels);
13609 }
13610
13611 return 1;
13612 }
13613
13614 static int
13615 process_nds32_specific (FILE * file)
13616 {
13617 Elf_Internal_Shdr *sect = NULL;
13618
13619 sect = find_section (".nds32_e_flags");
13620 if (sect != NULL)
13621 {
13622 unsigned int *flag;
13623
13624 printf ("\nNDS32 elf flags section:\n");
13625 flag = get_data (NULL, file, sect->sh_offset, 1,
13626 sect->sh_size, _("NDS32 elf flags section"));
13627
13628 switch ((*flag) & 0x3)
13629 {
13630 case 0:
13631 printf ("(VEC_SIZE):\tNo entry.\n");
13632 break;
13633 case 1:
13634 printf ("(VEC_SIZE):\t4 bytes\n");
13635 break;
13636 case 2:
13637 printf ("(VEC_SIZE):\t16 bytes\n");
13638 break;
13639 case 3:
13640 printf ("(VEC_SIZE):\treserved\n");
13641 break;
13642 }
13643 }
13644
13645 return TRUE;
13646 }
13647
13648 static int
13649 process_gnu_liblist (FILE * file)
13650 {
13651 Elf_Internal_Shdr * section;
13652 Elf_Internal_Shdr * string_sec;
13653 Elf32_External_Lib * elib;
13654 char * strtab;
13655 size_t strtab_size;
13656 size_t cnt;
13657 unsigned i;
13658
13659 if (! do_arch)
13660 return 0;
13661
13662 for (i = 0, section = section_headers;
13663 i < elf_header.e_shnum;
13664 i++, section++)
13665 {
13666 switch (section->sh_type)
13667 {
13668 case SHT_GNU_LIBLIST:
13669 if (section->sh_link >= elf_header.e_shnum)
13670 break;
13671
13672 elib = (Elf32_External_Lib *)
13673 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
13674 _("liblist section data"));
13675
13676 if (elib == NULL)
13677 break;
13678 string_sec = section_headers + section->sh_link;
13679
13680 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
13681 string_sec->sh_size,
13682 _("liblist string table"));
13683 if (strtab == NULL
13684 || section->sh_entsize != sizeof (Elf32_External_Lib))
13685 {
13686 free (elib);
13687 free (strtab);
13688 break;
13689 }
13690 strtab_size = string_sec->sh_size;
13691
13692 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
13693 SECTION_NAME (section),
13694 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
13695
13696 puts (_(" Library Time Stamp Checksum Version Flags"));
13697
13698 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
13699 ++cnt)
13700 {
13701 Elf32_Lib liblist;
13702 time_t atime;
13703 char timebuf[20];
13704 struct tm * tmp;
13705
13706 liblist.l_name = BYTE_GET (elib[cnt].l_name);
13707 atime = BYTE_GET (elib[cnt].l_time_stamp);
13708 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13709 liblist.l_version = BYTE_GET (elib[cnt].l_version);
13710 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13711
13712 tmp = gmtime (&atime);
13713 snprintf (timebuf, sizeof (timebuf),
13714 "%04u-%02u-%02uT%02u:%02u:%02u",
13715 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13716 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13717
13718 printf ("%3lu: ", (unsigned long) cnt);
13719 if (do_wide)
13720 printf ("%-20s", liblist.l_name < strtab_size
13721 ? strtab + liblist.l_name : _("<corrupt>"));
13722 else
13723 printf ("%-20.20s", liblist.l_name < strtab_size
13724 ? strtab + liblist.l_name : _("<corrupt>"));
13725 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13726 liblist.l_version, liblist.l_flags);
13727 }
13728
13729 free (elib);
13730 free (strtab);
13731 }
13732 }
13733
13734 return 1;
13735 }
13736
13737 static const char *
13738 get_note_type (unsigned e_type)
13739 {
13740 static char buff[64];
13741
13742 if (elf_header.e_type == ET_CORE)
13743 switch (e_type)
13744 {
13745 case NT_AUXV:
13746 return _("NT_AUXV (auxiliary vector)");
13747 case NT_PRSTATUS:
13748 return _("NT_PRSTATUS (prstatus structure)");
13749 case NT_FPREGSET:
13750 return _("NT_FPREGSET (floating point registers)");
13751 case NT_PRPSINFO:
13752 return _("NT_PRPSINFO (prpsinfo structure)");
13753 case NT_TASKSTRUCT:
13754 return _("NT_TASKSTRUCT (task structure)");
13755 case NT_PRXFPREG:
13756 return _("NT_PRXFPREG (user_xfpregs structure)");
13757 case NT_PPC_VMX:
13758 return _("NT_PPC_VMX (ppc Altivec registers)");
13759 case NT_PPC_VSX:
13760 return _("NT_PPC_VSX (ppc VSX registers)");
13761 case NT_386_TLS:
13762 return _("NT_386_TLS (x86 TLS information)");
13763 case NT_386_IOPERM:
13764 return _("NT_386_IOPERM (x86 I/O permissions)");
13765 case NT_X86_XSTATE:
13766 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13767 case NT_S390_HIGH_GPRS:
13768 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13769 case NT_S390_TIMER:
13770 return _("NT_S390_TIMER (s390 timer register)");
13771 case NT_S390_TODCMP:
13772 return _("NT_S390_TODCMP (s390 TOD comparator register)");
13773 case NT_S390_TODPREG:
13774 return _("NT_S390_TODPREG (s390 TOD programmable register)");
13775 case NT_S390_CTRS:
13776 return _("NT_S390_CTRS (s390 control registers)");
13777 case NT_S390_PREFIX:
13778 return _("NT_S390_PREFIX (s390 prefix register)");
13779 case NT_S390_LAST_BREAK:
13780 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13781 case NT_S390_SYSTEM_CALL:
13782 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13783 case NT_S390_TDB:
13784 return _("NT_S390_TDB (s390 transaction diagnostic block)");
13785 case NT_ARM_VFP:
13786 return _("NT_ARM_VFP (arm VFP registers)");
13787 case NT_ARM_TLS:
13788 return _("NT_ARM_TLS (AArch TLS registers)");
13789 case NT_ARM_HW_BREAK:
13790 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13791 case NT_ARM_HW_WATCH:
13792 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13793 case NT_PSTATUS:
13794 return _("NT_PSTATUS (pstatus structure)");
13795 case NT_FPREGS:
13796 return _("NT_FPREGS (floating point registers)");
13797 case NT_PSINFO:
13798 return _("NT_PSINFO (psinfo structure)");
13799 case NT_LWPSTATUS:
13800 return _("NT_LWPSTATUS (lwpstatus_t structure)");
13801 case NT_LWPSINFO:
13802 return _("NT_LWPSINFO (lwpsinfo_t structure)");
13803 case NT_WIN32PSTATUS:
13804 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
13805 case NT_SIGINFO:
13806 return _("NT_SIGINFO (siginfo_t data)");
13807 case NT_FILE:
13808 return _("NT_FILE (mapped files)");
13809 default:
13810 break;
13811 }
13812 else
13813 switch (e_type)
13814 {
13815 case NT_VERSION:
13816 return _("NT_VERSION (version)");
13817 case NT_ARCH:
13818 return _("NT_ARCH (architecture)");
13819 default:
13820 break;
13821 }
13822
13823 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13824 return buff;
13825 }
13826
13827 static int
13828 print_core_note (Elf_Internal_Note *pnote)
13829 {
13830 unsigned int addr_size = is_32bit_elf ? 4 : 8;
13831 bfd_vma count, page_size;
13832 unsigned char *descdata, *filenames, *descend;
13833
13834 if (pnote->type != NT_FILE)
13835 return 1;
13836
13837 #ifndef BFD64
13838 if (!is_32bit_elf)
13839 {
13840 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
13841 /* Still "successful". */
13842 return 1;
13843 }
13844 #endif
13845
13846 if (pnote->descsz < 2 * addr_size)
13847 {
13848 printf (_(" Malformed note - too short for header\n"));
13849 return 0;
13850 }
13851
13852 descdata = (unsigned char *) pnote->descdata;
13853 descend = descdata + pnote->descsz;
13854
13855 if (descdata[pnote->descsz - 1] != '\0')
13856 {
13857 printf (_(" Malformed note - does not end with \\0\n"));
13858 return 0;
13859 }
13860
13861 count = byte_get (descdata, addr_size);
13862 descdata += addr_size;
13863
13864 page_size = byte_get (descdata, addr_size);
13865 descdata += addr_size;
13866
13867 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
13868 {
13869 printf (_(" Malformed note - too short for supplied file count\n"));
13870 return 0;
13871 }
13872
13873 printf (_(" Page size: "));
13874 print_vma (page_size, DEC);
13875 printf ("\n");
13876
13877 printf (_(" %*s%*s%*s\n"),
13878 (int) (2 + 2 * addr_size), _("Start"),
13879 (int) (4 + 2 * addr_size), _("End"),
13880 (int) (4 + 2 * addr_size), _("Page Offset"));
13881 filenames = descdata + count * 3 * addr_size;
13882 while (--count > 0)
13883 {
13884 bfd_vma start, end, file_ofs;
13885
13886 if (filenames == descend)
13887 {
13888 printf (_(" Malformed note - filenames end too early\n"));
13889 return 0;
13890 }
13891
13892 start = byte_get (descdata, addr_size);
13893 descdata += addr_size;
13894 end = byte_get (descdata, addr_size);
13895 descdata += addr_size;
13896 file_ofs = byte_get (descdata, addr_size);
13897 descdata += addr_size;
13898
13899 printf (" ");
13900 print_vma (start, FULL_HEX);
13901 printf (" ");
13902 print_vma (end, FULL_HEX);
13903 printf (" ");
13904 print_vma (file_ofs, FULL_HEX);
13905 printf ("\n %s\n", filenames);
13906
13907 filenames += 1 + strlen ((char *) filenames);
13908 }
13909
13910 return 1;
13911 }
13912
13913 static const char *
13914 get_gnu_elf_note_type (unsigned e_type)
13915 {
13916 static char buff[64];
13917
13918 switch (e_type)
13919 {
13920 case NT_GNU_ABI_TAG:
13921 return _("NT_GNU_ABI_TAG (ABI version tag)");
13922 case NT_GNU_HWCAP:
13923 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
13924 case NT_GNU_BUILD_ID:
13925 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
13926 case NT_GNU_GOLD_VERSION:
13927 return _("NT_GNU_GOLD_VERSION (gold version)");
13928 default:
13929 break;
13930 }
13931
13932 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13933 return buff;
13934 }
13935
13936 static int
13937 print_gnu_note (Elf_Internal_Note *pnote)
13938 {
13939 switch (pnote->type)
13940 {
13941 case NT_GNU_BUILD_ID:
13942 {
13943 unsigned long i;
13944
13945 printf (_(" Build ID: "));
13946 for (i = 0; i < pnote->descsz; ++i)
13947 printf ("%02x", pnote->descdata[i] & 0xff);
13948 printf ("\n");
13949 }
13950 break;
13951
13952 case NT_GNU_ABI_TAG:
13953 {
13954 unsigned long os, major, minor, subminor;
13955 const char *osname;
13956
13957 os = byte_get ((unsigned char *) pnote->descdata, 4);
13958 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13959 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13960 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13961
13962 switch (os)
13963 {
13964 case GNU_ABI_TAG_LINUX:
13965 osname = "Linux";
13966 break;
13967 case GNU_ABI_TAG_HURD:
13968 osname = "Hurd";
13969 break;
13970 case GNU_ABI_TAG_SOLARIS:
13971 osname = "Solaris";
13972 break;
13973 case GNU_ABI_TAG_FREEBSD:
13974 osname = "FreeBSD";
13975 break;
13976 case GNU_ABI_TAG_NETBSD:
13977 osname = "NetBSD";
13978 break;
13979 default:
13980 osname = "Unknown";
13981 break;
13982 }
13983
13984 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13985 major, minor, subminor);
13986 }
13987 break;
13988
13989 case NT_GNU_GOLD_VERSION:
13990 {
13991 unsigned long i;
13992
13993 printf (_(" Version: "));
13994 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
13995 printf ("%c", pnote->descdata[i]);
13996 printf ("\n");
13997 }
13998 break;
13999 }
14000
14001 return 1;
14002 }
14003
14004 static const char *
14005 get_netbsd_elfcore_note_type (unsigned e_type)
14006 {
14007 static char buff[64];
14008
14009 if (e_type == NT_NETBSDCORE_PROCINFO)
14010 {
14011 /* NetBSD core "procinfo" structure. */
14012 return _("NetBSD procinfo structure");
14013 }
14014
14015 /* As of Jan 2002 there are no other machine-independent notes
14016 defined for NetBSD core files. If the note type is less
14017 than the start of the machine-dependent note types, we don't
14018 understand it. */
14019
14020 if (e_type < NT_NETBSDCORE_FIRSTMACH)
14021 {
14022 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14023 return buff;
14024 }
14025
14026 switch (elf_header.e_machine)
14027 {
14028 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14029 and PT_GETFPREGS == mach+2. */
14030
14031 case EM_OLD_ALPHA:
14032 case EM_ALPHA:
14033 case EM_SPARC:
14034 case EM_SPARC32PLUS:
14035 case EM_SPARCV9:
14036 switch (e_type)
14037 {
14038 case NT_NETBSDCORE_FIRSTMACH + 0:
14039 return _("PT_GETREGS (reg structure)");
14040 case NT_NETBSDCORE_FIRSTMACH + 2:
14041 return _("PT_GETFPREGS (fpreg structure)");
14042 default:
14043 break;
14044 }
14045 break;
14046
14047 /* On all other arch's, PT_GETREGS == mach+1 and
14048 PT_GETFPREGS == mach+3. */
14049 default:
14050 switch (e_type)
14051 {
14052 case NT_NETBSDCORE_FIRSTMACH + 1:
14053 return _("PT_GETREGS (reg structure)");
14054 case NT_NETBSDCORE_FIRSTMACH + 3:
14055 return _("PT_GETFPREGS (fpreg structure)");
14056 default:
14057 break;
14058 }
14059 }
14060
14061 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14062 e_type - NT_NETBSDCORE_FIRSTMACH);
14063 return buff;
14064 }
14065
14066 static const char *
14067 get_stapsdt_note_type (unsigned e_type)
14068 {
14069 static char buff[64];
14070
14071 switch (e_type)
14072 {
14073 case NT_STAPSDT:
14074 return _("NT_STAPSDT (SystemTap probe descriptors)");
14075
14076 default:
14077 break;
14078 }
14079
14080 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14081 return buff;
14082 }
14083
14084 static int
14085 print_stapsdt_note (Elf_Internal_Note *pnote)
14086 {
14087 int addr_size = is_32bit_elf ? 4 : 8;
14088 char *data = pnote->descdata;
14089 char *data_end = pnote->descdata + pnote->descsz;
14090 bfd_vma pc, base_addr, semaphore;
14091 char *provider, *probe, *arg_fmt;
14092
14093 pc = byte_get ((unsigned char *) data, addr_size);
14094 data += addr_size;
14095 base_addr = byte_get ((unsigned char *) data, addr_size);
14096 data += addr_size;
14097 semaphore = byte_get ((unsigned char *) data, addr_size);
14098 data += addr_size;
14099
14100 provider = data;
14101 data += strlen (data) + 1;
14102 probe = data;
14103 data += strlen (data) + 1;
14104 arg_fmt = data;
14105 data += strlen (data) + 1;
14106
14107 printf (_(" Provider: %s\n"), provider);
14108 printf (_(" Name: %s\n"), probe);
14109 printf (_(" Location: "));
14110 print_vma (pc, FULL_HEX);
14111 printf (_(", Base: "));
14112 print_vma (base_addr, FULL_HEX);
14113 printf (_(", Semaphore: "));
14114 print_vma (semaphore, FULL_HEX);
14115 printf ("\n");
14116 printf (_(" Arguments: %s\n"), arg_fmt);
14117
14118 return data == data_end;
14119 }
14120
14121 static const char *
14122 get_ia64_vms_note_type (unsigned e_type)
14123 {
14124 static char buff[64];
14125
14126 switch (e_type)
14127 {
14128 case NT_VMS_MHD:
14129 return _("NT_VMS_MHD (module header)");
14130 case NT_VMS_LNM:
14131 return _("NT_VMS_LNM (language name)");
14132 case NT_VMS_SRC:
14133 return _("NT_VMS_SRC (source files)");
14134 case NT_VMS_TITLE:
14135 return "NT_VMS_TITLE";
14136 case NT_VMS_EIDC:
14137 return _("NT_VMS_EIDC (consistency check)");
14138 case NT_VMS_FPMODE:
14139 return _("NT_VMS_FPMODE (FP mode)");
14140 case NT_VMS_LINKTIME:
14141 return "NT_VMS_LINKTIME";
14142 case NT_VMS_IMGNAM:
14143 return _("NT_VMS_IMGNAM (image name)");
14144 case NT_VMS_IMGID:
14145 return _("NT_VMS_IMGID (image id)");
14146 case NT_VMS_LINKID:
14147 return _("NT_VMS_LINKID (link id)");
14148 case NT_VMS_IMGBID:
14149 return _("NT_VMS_IMGBID (build id)");
14150 case NT_VMS_GSTNAM:
14151 return _("NT_VMS_GSTNAM (sym table name)");
14152 case NT_VMS_ORIG_DYN:
14153 return "NT_VMS_ORIG_DYN";
14154 case NT_VMS_PATCHTIME:
14155 return "NT_VMS_PATCHTIME";
14156 default:
14157 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14158 return buff;
14159 }
14160 }
14161
14162 static int
14163 print_ia64_vms_note (Elf_Internal_Note * pnote)
14164 {
14165 switch (pnote->type)
14166 {
14167 case NT_VMS_MHD:
14168 if (pnote->descsz > 36)
14169 {
14170 size_t l = strlen (pnote->descdata + 34);
14171 printf (_(" Creation date : %.17s\n"), pnote->descdata);
14172 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
14173 printf (_(" Module name : %s\n"), pnote->descdata + 34);
14174 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
14175 }
14176 else
14177 printf (_(" Invalid size\n"));
14178 break;
14179 case NT_VMS_LNM:
14180 printf (_(" Language: %s\n"), pnote->descdata);
14181 break;
14182 #ifdef BFD64
14183 case NT_VMS_FPMODE:
14184 printf (_(" Floating Point mode: "));
14185 printf ("0x%016" BFD_VMA_FMT "x\n",
14186 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14187 break;
14188 case NT_VMS_LINKTIME:
14189 printf (_(" Link time: "));
14190 print_vms_time
14191 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14192 printf ("\n");
14193 break;
14194 case NT_VMS_PATCHTIME:
14195 printf (_(" Patch time: "));
14196 print_vms_time
14197 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14198 printf ("\n");
14199 break;
14200 case NT_VMS_ORIG_DYN:
14201 printf (_(" Major id: %u, minor id: %u\n"),
14202 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14203 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14204 printf (_(" Last modified : "));
14205 print_vms_time
14206 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14207 printf (_("\n Link flags : "));
14208 printf ("0x%016" BFD_VMA_FMT "x\n",
14209 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14210 printf (_(" Header flags: 0x%08x\n"),
14211 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14212 printf (_(" Image id : %s\n"), pnote->descdata + 32);
14213 break;
14214 #endif
14215 case NT_VMS_IMGNAM:
14216 printf (_(" Image name: %s\n"), pnote->descdata);
14217 break;
14218 case NT_VMS_GSTNAM:
14219 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
14220 break;
14221 case NT_VMS_IMGID:
14222 printf (_(" Image id: %s\n"), pnote->descdata);
14223 break;
14224 case NT_VMS_LINKID:
14225 printf (_(" Linker id: %s\n"), pnote->descdata);
14226 break;
14227 default:
14228 break;
14229 }
14230 return 1;
14231 }
14232
14233 /* Note that by the ELF standard, the name field is already null byte
14234 terminated, and namesz includes the terminating null byte.
14235 I.E. the value of namesz for the name "FSF" is 4.
14236
14237 If the value of namesz is zero, there is no name present. */
14238 static int
14239 process_note (Elf_Internal_Note * pnote)
14240 {
14241 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14242 const char * nt;
14243
14244 if (pnote->namesz == 0)
14245 /* If there is no note name, then use the default set of
14246 note type strings. */
14247 nt = get_note_type (pnote->type);
14248
14249 else if (const_strneq (pnote->namedata, "GNU"))
14250 /* GNU-specific object file notes. */
14251 nt = get_gnu_elf_note_type (pnote->type);
14252
14253 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14254 /* NetBSD-specific core file notes. */
14255 nt = get_netbsd_elfcore_note_type (pnote->type);
14256
14257 else if (strneq (pnote->namedata, "SPU/", 4))
14258 {
14259 /* SPU-specific core file notes. */
14260 nt = pnote->namedata + 4;
14261 name = "SPU";
14262 }
14263
14264 else if (const_strneq (pnote->namedata, "IPF/VMS"))
14265 /* VMS/ia64-specific file notes. */
14266 nt = get_ia64_vms_note_type (pnote->type);
14267
14268 else if (const_strneq (pnote->namedata, "stapsdt"))
14269 nt = get_stapsdt_note_type (pnote->type);
14270
14271 else
14272 /* Don't recognize this note name; just use the default set of
14273 note type strings. */
14274 nt = get_note_type (pnote->type);
14275
14276 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14277
14278 if (const_strneq (pnote->namedata, "IPF/VMS"))
14279 return print_ia64_vms_note (pnote);
14280 else if (const_strneq (pnote->namedata, "GNU"))
14281 return print_gnu_note (pnote);
14282 else if (const_strneq (pnote->namedata, "stapsdt"))
14283 return print_stapsdt_note (pnote);
14284 else if (const_strneq (pnote->namedata, "CORE"))
14285 return print_core_note (pnote);
14286 else
14287 return 1;
14288 }
14289
14290
14291 static int
14292 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14293 {
14294 Elf_External_Note * pnotes;
14295 Elf_External_Note * external;
14296 int res = 1;
14297
14298 if (length <= 0)
14299 return 0;
14300
14301 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14302 _("notes"));
14303 if (pnotes == NULL)
14304 return 0;
14305
14306 external = pnotes;
14307
14308 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14309 (unsigned long) offset, (unsigned long) length);
14310 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14311
14312 while ((char *) external < (char *) pnotes + length)
14313 {
14314 Elf_Internal_Note inote;
14315 size_t min_notesz;
14316 char *next;
14317 char * temp = NULL;
14318 size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14319
14320 if (!is_ia64_vms ())
14321 {
14322 /* PR binutils/15191
14323 Make sure that there is enough data to read. */
14324 min_notesz = offsetof (Elf_External_Note, name);
14325 if (data_remaining < min_notesz)
14326 {
14327 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14328 (int) data_remaining);
14329 break;
14330 }
14331 inote.type = BYTE_GET (external->type);
14332 inote.namesz = BYTE_GET (external->namesz);
14333 inote.namedata = external->name;
14334 inote.descsz = BYTE_GET (external->descsz);
14335 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14336 inote.descpos = offset + (inote.descdata - (char *) pnotes);
14337 next = inote.descdata + align_power (inote.descsz, 2);
14338 }
14339 else
14340 {
14341 Elf64_External_VMS_Note *vms_external;
14342
14343 /* PR binutils/15191
14344 Make sure that there is enough data to read. */
14345 min_notesz = offsetof (Elf64_External_VMS_Note, name);
14346 if (data_remaining < min_notesz)
14347 {
14348 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14349 (int) data_remaining);
14350 break;
14351 }
14352
14353 vms_external = (Elf64_External_VMS_Note *) external;
14354 inote.type = BYTE_GET (vms_external->type);
14355 inote.namesz = BYTE_GET (vms_external->namesz);
14356 inote.namedata = vms_external->name;
14357 inote.descsz = BYTE_GET (vms_external->descsz);
14358 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14359 inote.descpos = offset + (inote.descdata - (char *) pnotes);
14360 next = inote.descdata + align_power (inote.descsz, 3);
14361 }
14362
14363 if (inote.descdata < (char *) external + min_notesz
14364 || next < (char *) external + min_notesz
14365 || data_remaining < (size_t)(next - (char *) external))
14366 {
14367 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14368 (unsigned long) ((char *) external - (char *) pnotes));
14369 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14370 inote.type, inote.namesz, inote.descsz);
14371 break;
14372 }
14373
14374 external = (Elf_External_Note *) next;
14375
14376 /* Verify that name is null terminated. It appears that at least
14377 one version of Linux (RedHat 6.0) generates corefiles that don't
14378 comply with the ELF spec by failing to include the null byte in
14379 namesz. */
14380 if (inote.namedata[inote.namesz - 1] != '\0')
14381 {
14382 temp = (char *) malloc (inote.namesz + 1);
14383
14384 if (temp == NULL)
14385 {
14386 error (_("Out of memory\n"));
14387 res = 0;
14388 break;
14389 }
14390
14391 strncpy (temp, inote.namedata, inote.namesz);
14392 temp[inote.namesz] = 0;
14393
14394 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
14395 inote.namedata = temp;
14396 }
14397
14398 res &= process_note (& inote);
14399
14400 if (temp != NULL)
14401 {
14402 free (temp);
14403 temp = NULL;
14404 }
14405 }
14406
14407 free (pnotes);
14408
14409 return res;
14410 }
14411
14412 static int
14413 process_corefile_note_segments (FILE * file)
14414 {
14415 Elf_Internal_Phdr * segment;
14416 unsigned int i;
14417 int res = 1;
14418
14419 if (! get_program_headers (file))
14420 return 0;
14421
14422 for (i = 0, segment = program_headers;
14423 i < elf_header.e_phnum;
14424 i++, segment++)
14425 {
14426 if (segment->p_type == PT_NOTE)
14427 res &= process_corefile_note_segment (file,
14428 (bfd_vma) segment->p_offset,
14429 (bfd_vma) segment->p_filesz);
14430 }
14431
14432 return res;
14433 }
14434
14435 static int
14436 process_note_sections (FILE * file)
14437 {
14438 Elf_Internal_Shdr * section;
14439 unsigned long i;
14440 int n = 0;
14441 int res = 1;
14442
14443 for (i = 0, section = section_headers;
14444 i < elf_header.e_shnum && section != NULL;
14445 i++, section++)
14446 if (section->sh_type == SHT_NOTE)
14447 {
14448 res &= process_corefile_note_segment (file,
14449 (bfd_vma) section->sh_offset,
14450 (bfd_vma) section->sh_size);
14451 n++;
14452 }
14453
14454 if (n == 0)
14455 /* Try processing NOTE segments instead. */
14456 return process_corefile_note_segments (file);
14457
14458 return res;
14459 }
14460
14461 static int
14462 process_notes (FILE * file)
14463 {
14464 /* If we have not been asked to display the notes then do nothing. */
14465 if (! do_notes)
14466 return 1;
14467
14468 if (elf_header.e_type != ET_CORE)
14469 return process_note_sections (file);
14470
14471 /* No program headers means no NOTE segment. */
14472 if (elf_header.e_phnum > 0)
14473 return process_corefile_note_segments (file);
14474
14475 printf (_("No note segments present in the core file.\n"));
14476 return 1;
14477 }
14478
14479 static int
14480 process_arch_specific (FILE * file)
14481 {
14482 if (! do_arch)
14483 return 1;
14484
14485 switch (elf_header.e_machine)
14486 {
14487 case EM_ARM:
14488 return process_arm_specific (file);
14489 case EM_MIPS:
14490 case EM_MIPS_RS3_LE:
14491 return process_mips_specific (file);
14492 break;
14493 case EM_NDS32:
14494 return process_nds32_specific (file);
14495 break;
14496 case EM_PPC:
14497 return process_power_specific (file);
14498 break;
14499 case EM_SPARC:
14500 case EM_SPARC32PLUS:
14501 case EM_SPARCV9:
14502 return process_sparc_specific (file);
14503 break;
14504 case EM_TI_C6000:
14505 return process_tic6x_specific (file);
14506 break;
14507 case EM_MSP430:
14508 return process_msp430x_specific (file);
14509 default:
14510 break;
14511 }
14512 return 1;
14513 }
14514
14515 static int
14516 get_file_header (FILE * file)
14517 {
14518 /* Read in the identity array. */
14519 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14520 return 0;
14521
14522 /* Determine how to read the rest of the header. */
14523 switch (elf_header.e_ident[EI_DATA])
14524 {
14525 default: /* fall through */
14526 case ELFDATANONE: /* fall through */
14527 case ELFDATA2LSB:
14528 byte_get = byte_get_little_endian;
14529 byte_put = byte_put_little_endian;
14530 break;
14531 case ELFDATA2MSB:
14532 byte_get = byte_get_big_endian;
14533 byte_put = byte_put_big_endian;
14534 break;
14535 }
14536
14537 /* For now we only support 32 bit and 64 bit ELF files. */
14538 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14539
14540 /* Read in the rest of the header. */
14541 if (is_32bit_elf)
14542 {
14543 Elf32_External_Ehdr ehdr32;
14544
14545 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14546 return 0;
14547
14548 elf_header.e_type = BYTE_GET (ehdr32.e_type);
14549 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
14550 elf_header.e_version = BYTE_GET (ehdr32.e_version);
14551 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
14552 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
14553 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
14554 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
14555 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
14556 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14557 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
14558 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14559 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
14560 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
14561 }
14562 else
14563 {
14564 Elf64_External_Ehdr ehdr64;
14565
14566 /* If we have been compiled with sizeof (bfd_vma) == 4, then
14567 we will not be able to cope with the 64bit data found in
14568 64 ELF files. Detect this now and abort before we start
14569 overwriting things. */
14570 if (sizeof (bfd_vma) < 8)
14571 {
14572 error (_("This instance of readelf has been built without support for a\n\
14573 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14574 return 0;
14575 }
14576
14577 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14578 return 0;
14579
14580 elf_header.e_type = BYTE_GET (ehdr64.e_type);
14581 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
14582 elf_header.e_version = BYTE_GET (ehdr64.e_version);
14583 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
14584 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
14585 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
14586 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
14587 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
14588 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14589 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
14590 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14591 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
14592 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
14593 }
14594
14595 if (elf_header.e_shoff)
14596 {
14597 /* There may be some extensions in the first section header. Don't
14598 bomb if we can't read it. */
14599 if (is_32bit_elf)
14600 get_32bit_section_headers (file, TRUE);
14601 else
14602 get_64bit_section_headers (file, TRUE);
14603 }
14604
14605 return 1;
14606 }
14607
14608 /* Process one ELF object file according to the command line options.
14609 This file may actually be stored in an archive. The file is
14610 positioned at the start of the ELF object. */
14611
14612 static int
14613 process_object (char * file_name, FILE * file)
14614 {
14615 unsigned int i;
14616
14617 if (! get_file_header (file))
14618 {
14619 error (_("%s: Failed to read file header\n"), file_name);
14620 return 1;
14621 }
14622
14623 /* Initialise per file variables. */
14624 for (i = ARRAY_SIZE (version_info); i--;)
14625 version_info[i] = 0;
14626
14627 for (i = ARRAY_SIZE (dynamic_info); i--;)
14628 dynamic_info[i] = 0;
14629 dynamic_info_DT_GNU_HASH = 0;
14630
14631 /* Process the file. */
14632 if (show_name)
14633 printf (_("\nFile: %s\n"), file_name);
14634
14635 /* Initialise the dump_sects array from the cmdline_dump_sects array.
14636 Note we do this even if cmdline_dump_sects is empty because we
14637 must make sure that the dump_sets array is zeroed out before each
14638 object file is processed. */
14639 if (num_dump_sects > num_cmdline_dump_sects)
14640 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
14641
14642 if (num_cmdline_dump_sects > 0)
14643 {
14644 if (num_dump_sects == 0)
14645 /* A sneaky way of allocating the dump_sects array. */
14646 request_dump_bynumber (num_cmdline_dump_sects, 0);
14647
14648 assert (num_dump_sects >= num_cmdline_dump_sects);
14649 memcpy (dump_sects, cmdline_dump_sects,
14650 num_cmdline_dump_sects * sizeof (* dump_sects));
14651 }
14652
14653 if (! process_file_header ())
14654 return 1;
14655
14656 if (! process_section_headers (file))
14657 {
14658 /* Without loaded section headers we cannot process lots of
14659 things. */
14660 do_unwind = do_version = do_dump = do_arch = 0;
14661
14662 if (! do_using_dynamic)
14663 do_syms = do_dyn_syms = do_reloc = 0;
14664 }
14665
14666 if (! process_section_groups (file))
14667 {
14668 /* Without loaded section groups we cannot process unwind. */
14669 do_unwind = 0;
14670 }
14671
14672 if (process_program_headers (file))
14673 process_dynamic_section (file);
14674
14675 process_relocs (file);
14676
14677 process_unwind (file);
14678
14679 process_symbol_table (file);
14680
14681 process_syminfo (file);
14682
14683 process_version_sections (file);
14684
14685 process_section_contents (file);
14686
14687 process_notes (file);
14688
14689 process_gnu_liblist (file);
14690
14691 process_arch_specific (file);
14692
14693 if (program_headers)
14694 {
14695 free (program_headers);
14696 program_headers = NULL;
14697 }
14698
14699 if (section_headers)
14700 {
14701 free (section_headers);
14702 section_headers = NULL;
14703 }
14704
14705 if (string_table)
14706 {
14707 free (string_table);
14708 string_table = NULL;
14709 string_table_length = 0;
14710 }
14711
14712 if (dynamic_strings)
14713 {
14714 free (dynamic_strings);
14715 dynamic_strings = NULL;
14716 dynamic_strings_length = 0;
14717 }
14718
14719 if (dynamic_symbols)
14720 {
14721 free (dynamic_symbols);
14722 dynamic_symbols = NULL;
14723 num_dynamic_syms = 0;
14724 }
14725
14726 if (dynamic_syminfo)
14727 {
14728 free (dynamic_syminfo);
14729 dynamic_syminfo = NULL;
14730 }
14731
14732 if (dynamic_section)
14733 {
14734 free (dynamic_section);
14735 dynamic_section = NULL;
14736 }
14737
14738 if (section_headers_groups)
14739 {
14740 free (section_headers_groups);
14741 section_headers_groups = NULL;
14742 }
14743
14744 if (section_groups)
14745 {
14746 struct group_list * g;
14747 struct group_list * next;
14748
14749 for (i = 0; i < group_count; i++)
14750 {
14751 for (g = section_groups [i].root; g != NULL; g = next)
14752 {
14753 next = g->next;
14754 free (g);
14755 }
14756 }
14757
14758 free (section_groups);
14759 section_groups = NULL;
14760 }
14761
14762 free_debug_memory ();
14763
14764 return 0;
14765 }
14766
14767 /* Process an ELF archive.
14768 On entry the file is positioned just after the ARMAG string. */
14769
14770 static int
14771 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14772 {
14773 struct archive_info arch;
14774 struct archive_info nested_arch;
14775 size_t got;
14776 int ret;
14777
14778 show_name = 1;
14779
14780 /* The ARCH structure is used to hold information about this archive. */
14781 arch.file_name = NULL;
14782 arch.file = NULL;
14783 arch.index_array = NULL;
14784 arch.sym_table = NULL;
14785 arch.longnames = NULL;
14786
14787 /* The NESTED_ARCH structure is used as a single-item cache of information
14788 about a nested archive (when members of a thin archive reside within
14789 another regular archive file). */
14790 nested_arch.file_name = NULL;
14791 nested_arch.file = NULL;
14792 nested_arch.index_array = NULL;
14793 nested_arch.sym_table = NULL;
14794 nested_arch.longnames = NULL;
14795
14796 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14797 {
14798 ret = 1;
14799 goto out;
14800 }
14801
14802 if (do_archive_index)
14803 {
14804 if (arch.sym_table == NULL)
14805 error (_("%s: unable to dump the index as none was found\n"), file_name);
14806 else
14807 {
14808 unsigned int i, l;
14809 unsigned long current_pos;
14810
14811 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
14812 file_name, (long) arch.index_num, arch.sym_size);
14813 current_pos = ftell (file);
14814
14815 for (i = l = 0; i < arch.index_num; i++)
14816 {
14817 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
14818 {
14819 char * member_name;
14820
14821 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
14822
14823 if (member_name != NULL)
14824 {
14825 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
14826
14827 if (qualified_name != NULL)
14828 {
14829 printf (_("Contents of binary %s at offset "), qualified_name);
14830 (void) print_vma (arch.index_array[i], PREFIX_HEX);
14831 putchar ('\n');
14832 free (qualified_name);
14833 }
14834 }
14835 }
14836
14837 if (l >= arch.sym_size)
14838 {
14839 error (_("%s: end of the symbol table reached before the end of the index\n"),
14840 file_name);
14841 break;
14842 }
14843 printf ("\t%s\n", arch.sym_table + l);
14844 l += strlen (arch.sym_table + l) + 1;
14845 }
14846
14847 if (arch.uses_64bit_indicies)
14848 l = (l + 7) & ~ 7;
14849 else
14850 l += l & 1;
14851
14852 if (l < arch.sym_size)
14853 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
14854 file_name, arch.sym_size - l);
14855
14856 if (fseek (file, current_pos, SEEK_SET) != 0)
14857 {
14858 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
14859 ret = 1;
14860 goto out;
14861 }
14862 }
14863
14864 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
14865 && !do_segments && !do_header && !do_dump && !do_version
14866 && !do_histogram && !do_debugging && !do_arch && !do_notes
14867 && !do_section_groups && !do_dyn_syms)
14868 {
14869 ret = 0; /* Archive index only. */
14870 goto out;
14871 }
14872 }
14873
14874 ret = 0;
14875
14876 while (1)
14877 {
14878 char * name;
14879 size_t namelen;
14880 char * qualified_name;
14881
14882 /* Read the next archive header. */
14883 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
14884 {
14885 error (_("%s: failed to seek to next archive header\n"), file_name);
14886 return 1;
14887 }
14888 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
14889 if (got != sizeof arch.arhdr)
14890 {
14891 if (got == 0)
14892 break;
14893 error (_("%s: failed to read archive header\n"), file_name);
14894 ret = 1;
14895 break;
14896 }
14897 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
14898 {
14899 error (_("%s: did not find a valid archive header\n"), arch.file_name);
14900 ret = 1;
14901 break;
14902 }
14903
14904 arch.next_arhdr_offset += sizeof arch.arhdr;
14905
14906 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
14907 if (archive_file_size & 01)
14908 ++archive_file_size;
14909
14910 name = get_archive_member_name (&arch, &nested_arch);
14911 if (name == NULL)
14912 {
14913 error (_("%s: bad archive file name\n"), file_name);
14914 ret = 1;
14915 break;
14916 }
14917 namelen = strlen (name);
14918
14919 qualified_name = make_qualified_name (&arch, &nested_arch, name);
14920 if (qualified_name == NULL)
14921 {
14922 error (_("%s: bad archive file name\n"), file_name);
14923 ret = 1;
14924 break;
14925 }
14926
14927 if (is_thin_archive && arch.nested_member_origin == 0)
14928 {
14929 /* This is a proxy for an external member of a thin archive. */
14930 FILE * member_file;
14931 char * member_file_name = adjust_relative_path (file_name, name, namelen);
14932 if (member_file_name == NULL)
14933 {
14934 ret = 1;
14935 break;
14936 }
14937
14938 member_file = fopen (member_file_name, "rb");
14939 if (member_file == NULL)
14940 {
14941 error (_("Input file '%s' is not readable.\n"), member_file_name);
14942 free (member_file_name);
14943 ret = 1;
14944 break;
14945 }
14946
14947 archive_file_offset = arch.nested_member_origin;
14948
14949 ret |= process_object (qualified_name, member_file);
14950
14951 fclose (member_file);
14952 free (member_file_name);
14953 }
14954 else if (is_thin_archive)
14955 {
14956 /* PR 15140: Allow for corrupt thin archives. */
14957 if (nested_arch.file == NULL)
14958 {
14959 error (_("%s: contains corrupt thin archive: %s\n"),
14960 file_name, name);
14961 ret = 1;
14962 break;
14963 }
14964
14965 /* This is a proxy for a member of a nested archive. */
14966 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14967
14968 /* The nested archive file will have been opened and setup by
14969 get_archive_member_name. */
14970 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14971 {
14972 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14973 ret = 1;
14974 break;
14975 }
14976
14977 ret |= process_object (qualified_name, nested_arch.file);
14978 }
14979 else
14980 {
14981 archive_file_offset = arch.next_arhdr_offset;
14982 arch.next_arhdr_offset += archive_file_size;
14983
14984 ret |= process_object (qualified_name, file);
14985 }
14986
14987 if (dump_sects != NULL)
14988 {
14989 free (dump_sects);
14990 dump_sects = NULL;
14991 num_dump_sects = 0;
14992 }
14993
14994 free (qualified_name);
14995 }
14996
14997 out:
14998 if (nested_arch.file != NULL)
14999 fclose (nested_arch.file);
15000 release_archive (&nested_arch);
15001 release_archive (&arch);
15002
15003 return ret;
15004 }
15005
15006 static int
15007 process_file (char * file_name)
15008 {
15009 FILE * file;
15010 struct stat statbuf;
15011 char armag[SARMAG];
15012 int ret;
15013
15014 if (stat (file_name, &statbuf) < 0)
15015 {
15016 if (errno == ENOENT)
15017 error (_("'%s': No such file\n"), file_name);
15018 else
15019 error (_("Could not locate '%s'. System error message: %s\n"),
15020 file_name, strerror (errno));
15021 return 1;
15022 }
15023
15024 if (! S_ISREG (statbuf.st_mode))
15025 {
15026 error (_("'%s' is not an ordinary file\n"), file_name);
15027 return 1;
15028 }
15029
15030 file = fopen (file_name, "rb");
15031 if (file == NULL)
15032 {
15033 error (_("Input file '%s' is not readable.\n"), file_name);
15034 return 1;
15035 }
15036
15037 if (fread (armag, SARMAG, 1, file) != 1)
15038 {
15039 error (_("%s: Failed to read file's magic number\n"), file_name);
15040 fclose (file);
15041 return 1;
15042 }
15043
15044 current_file_size = (bfd_size_type) statbuf.st_size;
15045
15046 if (memcmp (armag, ARMAG, SARMAG) == 0)
15047 ret = process_archive (file_name, file, FALSE);
15048 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15049 ret = process_archive (file_name, file, TRUE);
15050 else
15051 {
15052 if (do_archive_index)
15053 error (_("File %s is not an archive so its index cannot be displayed.\n"),
15054 file_name);
15055
15056 rewind (file);
15057 archive_file_size = archive_file_offset = 0;
15058 ret = process_object (file_name, file);
15059 }
15060
15061 fclose (file);
15062
15063 current_file_size = 0;
15064 return ret;
15065 }
15066
15067 #ifdef SUPPORT_DISASSEMBLY
15068 /* Needed by the i386 disassembler. For extra credit, someone could
15069 fix this so that we insert symbolic addresses here, esp for GOT/PLT
15070 symbols. */
15071
15072 void
15073 print_address (unsigned int addr, FILE * outfile)
15074 {
15075 fprintf (outfile,"0x%8.8x", addr);
15076 }
15077
15078 /* Needed by the i386 disassembler. */
15079 void
15080 db_task_printsym (unsigned int addr)
15081 {
15082 print_address (addr, stderr);
15083 }
15084 #endif
15085
15086 int
15087 main (int argc, char ** argv)
15088 {
15089 int err;
15090
15091 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15092 setlocale (LC_MESSAGES, "");
15093 #endif
15094 #if defined (HAVE_SETLOCALE)
15095 setlocale (LC_CTYPE, "");
15096 #endif
15097 bindtextdomain (PACKAGE, LOCALEDIR);
15098 textdomain (PACKAGE);
15099
15100 expandargv (&argc, &argv);
15101
15102 parse_args (argc, argv);
15103
15104 if (num_dump_sects > 0)
15105 {
15106 /* Make a copy of the dump_sects array. */
15107 cmdline_dump_sects = (dump_type *)
15108 malloc (num_dump_sects * sizeof (* dump_sects));
15109 if (cmdline_dump_sects == NULL)
15110 error (_("Out of memory allocating dump request table.\n"));
15111 else
15112 {
15113 memcpy (cmdline_dump_sects, dump_sects,
15114 num_dump_sects * sizeof (* dump_sects));
15115 num_cmdline_dump_sects = num_dump_sects;
15116 }
15117 }
15118
15119 if (optind < (argc - 1))
15120 show_name = 1;
15121
15122 err = 0;
15123 while (optind < argc)
15124 err |= process_file (argv[optind++]);
15125
15126 if (dump_sects != NULL)
15127 free (dump_sects);
15128 if (cmdline_dump_sects != NULL)
15129 free (cmdline_dump_sects);
15130
15131 return err;
15132 }
This page took 0.370936 seconds and 5 git commands to generate.