Display symbol version when dumping dynrelocs
[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 size_t 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 /* Versioned symbol info. */
276 enum versioned_symbol_info
277 {
278 symbol_undefined,
279 symbol_hidden,
280 symbol_public
281 };
282
283 static const char *get_symbol_version_string
284 (FILE *file, int is_dynsym, const char *strtab,
285 unsigned long int strtab_size, unsigned int si,
286 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
287 unsigned short *vna_other);
288
289 #define UNKNOWN -1
290
291 #define SECTION_NAME(X) \
292 ((X) == NULL ? _("<none>") \
293 : string_table == NULL ? _("<no-name>") \
294 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
295 : string_table + (X)->sh_name))
296
297 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
298
299 #define GET_ELF_SYMBOLS(file, section, sym_count) \
300 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
301 : get_64bit_elf_symbols (file, section, sym_count))
302
303 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
304 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
305 already been called and verified that the string exists. */
306 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
307
308 #define REMOVE_ARCH_BITS(ADDR) \
309 do \
310 { \
311 if (elf_header.e_machine == EM_ARM) \
312 (ADDR) &= ~1; \
313 } \
314 while (0)
315 \f
316 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
317 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
318 using malloc and fill that. In either case return the pointer to the start of
319 the retrieved data or NULL if something went wrong. If something does go wrong
320 emit an error message using REASON as part of the context. */
321
322 static void *
323 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
324 const char * reason)
325 {
326 void * mvar;
327
328 if (size == 0 || nmemb == 0)
329 return NULL;
330
331 if (fseek (file, archive_file_offset + offset, SEEK_SET))
332 {
333 if (reason)
334 error (_("Unable to seek to 0x%lx for %s\n"),
335 (unsigned long) archive_file_offset + offset, reason);
336 return NULL;
337 }
338
339 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
340 attempting to allocate memory when the read is bound to fail. */
341 if (offset + archive_file_offset + size * nmemb > current_file_size)
342 {
343 if (reason)
344 error (_("Reading 0x%lx bytes extends past end of file for %s\n"),
345 (unsigned long) (size * nmemb), reason);
346 return NULL;
347 }
348
349 mvar = var;
350 if (mvar == NULL)
351 {
352 /* Check for overflow. */
353 if (nmemb < (~(size_t) 0 - 1) / size)
354 /* + 1 so that we can '\0' terminate invalid string table sections. */
355 mvar = malloc (size * nmemb + 1);
356
357 if (mvar == NULL)
358 {
359 if (reason)
360 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
361 (unsigned long)(size * nmemb), reason);
362 return NULL;
363 }
364
365 ((char *) mvar)[size * nmemb] = '\0';
366 }
367
368 if (fread (mvar, size, nmemb, file) != nmemb)
369 {
370 if (reason)
371 error (_("Unable to read in 0x%lx bytes of %s\n"),
372 (unsigned long)(size * nmemb), reason);
373 if (mvar != var)
374 free (mvar);
375 return NULL;
376 }
377
378 return mvar;
379 }
380
381 /* Print a VMA value. */
382
383 static int
384 print_vma (bfd_vma vma, print_mode mode)
385 {
386 int nc = 0;
387
388 switch (mode)
389 {
390 case FULL_HEX:
391 nc = printf ("0x");
392 /* Drop through. */
393
394 case LONG_HEX:
395 #ifdef BFD64
396 if (is_32bit_elf)
397 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
398 #endif
399 printf_vma (vma);
400 return nc + 16;
401
402 case DEC_5:
403 if (vma <= 99999)
404 return printf ("%5" BFD_VMA_FMT "d", vma);
405 /* Drop through. */
406
407 case PREFIX_HEX:
408 nc = printf ("0x");
409 /* Drop through. */
410
411 case HEX:
412 return nc + printf ("%" BFD_VMA_FMT "x", vma);
413
414 case DEC:
415 return printf ("%" BFD_VMA_FMT "d", vma);
416
417 case UNSIGNED:
418 return printf ("%" BFD_VMA_FMT "u", vma);
419 }
420 return 0;
421 }
422
423 /* Display a symbol on stdout. Handles the display of control characters and
424 multibye characters (assuming the host environment supports them).
425
426 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
427
428 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
429 padding as necessary.
430
431 Returns the number of emitted characters. */
432
433 static unsigned int
434 print_symbol (int width, const char *symbol)
435 {
436 bfd_boolean extra_padding = FALSE;
437 int num_printed = 0;
438 #ifdef HAVE_MBSTATE_T
439 mbstate_t state;
440 #endif
441 int width_remaining;
442
443 if (width < 0)
444 {
445 /* Keep the width positive. This also helps. */
446 width = - width;
447 extra_padding = TRUE;
448 }
449 assert (width != 0);
450
451 if (do_wide)
452 /* Set the remaining width to a very large value.
453 This simplifies the code below. */
454 width_remaining = INT_MAX;
455 else
456 width_remaining = width;
457
458 #ifdef HAVE_MBSTATE_T
459 /* Initialise the multibyte conversion state. */
460 memset (& state, 0, sizeof (state));
461 #endif
462
463 while (width_remaining)
464 {
465 size_t n;
466 const char c = *symbol++;
467
468 if (c == 0)
469 break;
470
471 /* Do not print control characters directly as they can affect terminal
472 settings. Such characters usually appear in the names generated
473 by the assembler for local labels. */
474 if (ISCNTRL (c))
475 {
476 if (width_remaining < 2)
477 break;
478
479 printf ("^%c", c + 0x40);
480 width_remaining -= 2;
481 num_printed += 2;
482 }
483 else if (ISPRINT (c))
484 {
485 putchar (c);
486 width_remaining --;
487 num_printed ++;
488 }
489 else
490 {
491 #ifdef HAVE_MBSTATE_T
492 wchar_t w;
493 #endif
494 /* Let printf do the hard work of displaying multibyte characters. */
495 printf ("%.1s", symbol - 1);
496 width_remaining --;
497 num_printed ++;
498
499 #ifdef HAVE_MBSTATE_T
500 /* Try to find out how many bytes made up the character that was
501 just printed. Advance the symbol pointer past the bytes that
502 were displayed. */
503 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
504 #else
505 n = 1;
506 #endif
507 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
508 symbol += (n - 1);
509 }
510 }
511
512 if (extra_padding && num_printed < width)
513 {
514 /* Fill in the remaining spaces. */
515 printf ("%-*s", width - num_printed, " ");
516 num_printed = width;
517 }
518
519 return num_printed;
520 }
521
522 /* Returns a pointer to a static buffer containing a printable version of
523 the given section's name. Like print_symbol, except that it does not try
524 to print multibyte characters, it just interprets them as hex values. */
525
526 static const char *
527 printable_section_name (Elf_Internal_Shdr * sec)
528 {
529 #define MAX_PRINT_SEC_NAME_LEN 128
530 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
531 const char * name = SECTION_NAME (sec);
532 char * buf = sec_name_buf;
533 char c;
534 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
535
536 while ((c = * name ++) != 0)
537 {
538 if (ISCNTRL (c))
539 {
540 if (remaining < 2)
541 break;
542
543 * buf ++ = '^';
544 * buf ++ = c + 0x40;
545 remaining -= 2;
546 }
547 else if (ISPRINT (c))
548 {
549 * buf ++ = c;
550 remaining -= 1;
551 }
552 else
553 {
554 static char hex[17] = "0123456789ABCDEF";
555
556 if (remaining < 4)
557 break;
558 * buf ++ = '<';
559 * buf ++ = hex[(c & 0xf0) >> 4];
560 * buf ++ = hex[c & 0x0f];
561 * buf ++ = '>';
562 remaining -= 4;
563 }
564
565 if (remaining == 0)
566 break;
567 }
568
569 * buf = 0;
570 return sec_name_buf;
571 }
572
573 static const char *
574 printable_section_name_from_index (unsigned long ndx)
575 {
576 if (ndx >= elf_header.e_shnum)
577 return _("<corrupt>");
578
579 return printable_section_name (section_headers + ndx);
580 }
581
582 /* Return a pointer to section NAME, or NULL if no such section exists. */
583
584 static Elf_Internal_Shdr *
585 find_section (const char * name)
586 {
587 unsigned int i;
588
589 for (i = 0; i < elf_header.e_shnum; i++)
590 if (streq (SECTION_NAME (section_headers + i), name))
591 return section_headers + i;
592
593 return NULL;
594 }
595
596 /* Return a pointer to a section containing ADDR, or NULL if no such
597 section exists. */
598
599 static Elf_Internal_Shdr *
600 find_section_by_address (bfd_vma addr)
601 {
602 unsigned int i;
603
604 for (i = 0; i < elf_header.e_shnum; i++)
605 {
606 Elf_Internal_Shdr *sec = section_headers + i;
607 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
608 return sec;
609 }
610
611 return NULL;
612 }
613
614 static Elf_Internal_Shdr *
615 find_section_by_type (unsigned int type)
616 {
617 unsigned int i;
618
619 for (i = 0; i < elf_header.e_shnum; i++)
620 {
621 Elf_Internal_Shdr *sec = section_headers + i;
622 if (sec->sh_type == type)
623 return sec;
624 }
625
626 return NULL;
627 }
628
629 /* Return a pointer to section NAME, or NULL if no such section exists,
630 restricted to the list of sections given in SET. */
631
632 static Elf_Internal_Shdr *
633 find_section_in_set (const char * name, unsigned int * set)
634 {
635 unsigned int i;
636
637 if (set != NULL)
638 {
639 while ((i = *set++) > 0)
640 if (streq (SECTION_NAME (section_headers + i), name))
641 return section_headers + i;
642 }
643
644 return find_section (name);
645 }
646
647 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
648 bytes read. */
649
650 static inline unsigned long
651 read_uleb128 (unsigned char *data,
652 unsigned int *length_return,
653 const unsigned char * const end)
654 {
655 return read_leb128 (data, length_return, FALSE, end);
656 }
657
658 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
659 This OS has so many departures from the ELF standard that we test it at
660 many places. */
661
662 static inline int
663 is_ia64_vms (void)
664 {
665 return elf_header.e_machine == EM_IA_64
666 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
667 }
668
669 /* Guess the relocation size commonly used by the specific machines. */
670
671 static int
672 guess_is_rela (unsigned int e_machine)
673 {
674 switch (e_machine)
675 {
676 /* Targets that use REL relocations. */
677 case EM_386:
678 case EM_486:
679 case EM_960:
680 case EM_ARM:
681 case EM_D10V:
682 case EM_CYGNUS_D10V:
683 case EM_DLX:
684 case EM_MIPS:
685 case EM_MIPS_RS3_LE:
686 case EM_CYGNUS_M32R:
687 case EM_SCORE:
688 case EM_XGATE:
689 return FALSE;
690
691 /* Targets that use RELA relocations. */
692 case EM_68K:
693 case EM_860:
694 case EM_AARCH64:
695 case EM_ADAPTEVA_EPIPHANY:
696 case EM_ALPHA:
697 case EM_ALTERA_NIOS2:
698 case EM_AVR:
699 case EM_AVR_OLD:
700 case EM_BLACKFIN:
701 case EM_CR16:
702 case EM_CRIS:
703 case EM_CRX:
704 case EM_D30V:
705 case EM_CYGNUS_D30V:
706 case EM_FR30:
707 case EM_CYGNUS_FR30:
708 case EM_CYGNUS_FRV:
709 case EM_H8S:
710 case EM_H8_300:
711 case EM_H8_300H:
712 case EM_IA_64:
713 case EM_IP2K:
714 case EM_IP2K_OLD:
715 case EM_IQ2000:
716 case EM_LATTICEMICO32:
717 case EM_M32C_OLD:
718 case EM_M32C:
719 case EM_M32R:
720 case EM_MCORE:
721 case EM_CYGNUS_MEP:
722 case EM_METAG:
723 case EM_MMIX:
724 case EM_MN10200:
725 case EM_CYGNUS_MN10200:
726 case EM_MN10300:
727 case EM_CYGNUS_MN10300:
728 case EM_MOXIE:
729 case EM_MSP430:
730 case EM_MSP430_OLD:
731 case EM_MT:
732 case EM_NDS32:
733 case EM_NIOS32:
734 case EM_OR1K:
735 case EM_PPC64:
736 case EM_PPC:
737 case EM_RL78:
738 case EM_RX:
739 case EM_S390:
740 case EM_S390_OLD:
741 case EM_SH:
742 case EM_SPARC:
743 case EM_SPARC32PLUS:
744 case EM_SPARCV9:
745 case EM_SPU:
746 case EM_TI_C6000:
747 case EM_TILEGX:
748 case EM_TILEPRO:
749 case EM_V800:
750 case EM_V850:
751 case EM_CYGNUS_V850:
752 case EM_VAX:
753 case EM_X86_64:
754 case EM_L1OM:
755 case EM_K1OM:
756 case EM_XSTORMY16:
757 case EM_XTENSA:
758 case EM_XTENSA_OLD:
759 case EM_MICROBLAZE:
760 case EM_MICROBLAZE_OLD:
761 return TRUE;
762
763 case EM_68HC05:
764 case EM_68HC08:
765 case EM_68HC11:
766 case EM_68HC16:
767 case EM_FX66:
768 case EM_ME16:
769 case EM_MMA:
770 case EM_NCPU:
771 case EM_NDR1:
772 case EM_PCP:
773 case EM_ST100:
774 case EM_ST19:
775 case EM_ST7:
776 case EM_ST9PLUS:
777 case EM_STARCORE:
778 case EM_SVX:
779 case EM_TINYJ:
780 default:
781 warn (_("Don't know about relocations on this machine architecture\n"));
782 return FALSE;
783 }
784 }
785
786 static int
787 slurp_rela_relocs (FILE * file,
788 unsigned long rel_offset,
789 unsigned long rel_size,
790 Elf_Internal_Rela ** relasp,
791 unsigned long * nrelasp)
792 {
793 Elf_Internal_Rela * relas;
794 size_t nrelas;
795 unsigned int i;
796
797 if (is_32bit_elf)
798 {
799 Elf32_External_Rela * erelas;
800
801 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
802 rel_size, _("32-bit relocation data"));
803 if (!erelas)
804 return 0;
805
806 nrelas = rel_size / sizeof (Elf32_External_Rela);
807
808 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
809 sizeof (Elf_Internal_Rela));
810
811 if (relas == NULL)
812 {
813 free (erelas);
814 error (_("out of memory parsing relocs\n"));
815 return 0;
816 }
817
818 for (i = 0; i < nrelas; i++)
819 {
820 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
821 relas[i].r_info = BYTE_GET (erelas[i].r_info);
822 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
823 }
824
825 free (erelas);
826 }
827 else
828 {
829 Elf64_External_Rela * erelas;
830
831 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
832 rel_size, _("64-bit relocation data"));
833 if (!erelas)
834 return 0;
835
836 nrelas = rel_size / sizeof (Elf64_External_Rela);
837
838 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
839 sizeof (Elf_Internal_Rela));
840
841 if (relas == NULL)
842 {
843 free (erelas);
844 error (_("out of memory parsing relocs\n"));
845 return 0;
846 }
847
848 for (i = 0; i < nrelas; i++)
849 {
850 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
851 relas[i].r_info = BYTE_GET (erelas[i].r_info);
852 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
853
854 /* The #ifdef BFD64 below is to prevent a compile time
855 warning. We know that if we do not have a 64 bit data
856 type that we will never execute this code anyway. */
857 #ifdef BFD64
858 if (elf_header.e_machine == EM_MIPS
859 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
860 {
861 /* In little-endian objects, r_info isn't really a
862 64-bit little-endian value: it has a 32-bit
863 little-endian symbol index followed by four
864 individual byte fields. Reorder INFO
865 accordingly. */
866 bfd_vma inf = relas[i].r_info;
867 inf = (((inf & 0xffffffff) << 32)
868 | ((inf >> 56) & 0xff)
869 | ((inf >> 40) & 0xff00)
870 | ((inf >> 24) & 0xff0000)
871 | ((inf >> 8) & 0xff000000));
872 relas[i].r_info = inf;
873 }
874 #endif /* BFD64 */
875 }
876
877 free (erelas);
878 }
879 *relasp = relas;
880 *nrelasp = nrelas;
881 return 1;
882 }
883
884 static int
885 slurp_rel_relocs (FILE * file,
886 unsigned long rel_offset,
887 unsigned long rel_size,
888 Elf_Internal_Rela ** relsp,
889 unsigned long * nrelsp)
890 {
891 Elf_Internal_Rela * rels;
892 size_t nrels;
893 unsigned int i;
894
895 if (is_32bit_elf)
896 {
897 Elf32_External_Rel * erels;
898
899 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
900 rel_size, _("32-bit relocation data"));
901 if (!erels)
902 return 0;
903
904 nrels = rel_size / sizeof (Elf32_External_Rel);
905
906 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
907
908 if (rels == NULL)
909 {
910 free (erels);
911 error (_("out of memory parsing relocs\n"));
912 return 0;
913 }
914
915 for (i = 0; i < nrels; i++)
916 {
917 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
918 rels[i].r_info = BYTE_GET (erels[i].r_info);
919 rels[i].r_addend = 0;
920 }
921
922 free (erels);
923 }
924 else
925 {
926 Elf64_External_Rel * erels;
927
928 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
929 rel_size, _("64-bit relocation data"));
930 if (!erels)
931 return 0;
932
933 nrels = rel_size / sizeof (Elf64_External_Rel);
934
935 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
936
937 if (rels == NULL)
938 {
939 free (erels);
940 error (_("out of memory parsing relocs\n"));
941 return 0;
942 }
943
944 for (i = 0; i < nrels; i++)
945 {
946 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
947 rels[i].r_info = BYTE_GET (erels[i].r_info);
948 rels[i].r_addend = 0;
949
950 /* The #ifdef BFD64 below is to prevent a compile time
951 warning. We know that if we do not have a 64 bit data
952 type that we will never execute this code anyway. */
953 #ifdef BFD64
954 if (elf_header.e_machine == EM_MIPS
955 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
956 {
957 /* In little-endian objects, r_info isn't really a
958 64-bit little-endian value: it has a 32-bit
959 little-endian symbol index followed by four
960 individual byte fields. Reorder INFO
961 accordingly. */
962 bfd_vma inf = rels[i].r_info;
963 inf = (((inf & 0xffffffff) << 32)
964 | ((inf >> 56) & 0xff)
965 | ((inf >> 40) & 0xff00)
966 | ((inf >> 24) & 0xff0000)
967 | ((inf >> 8) & 0xff000000));
968 rels[i].r_info = inf;
969 }
970 #endif /* BFD64 */
971 }
972
973 free (erels);
974 }
975 *relsp = rels;
976 *nrelsp = nrels;
977 return 1;
978 }
979
980 /* Returns the reloc type extracted from the reloc info field. */
981
982 static unsigned int
983 get_reloc_type (bfd_vma reloc_info)
984 {
985 if (is_32bit_elf)
986 return ELF32_R_TYPE (reloc_info);
987
988 switch (elf_header.e_machine)
989 {
990 case EM_MIPS:
991 /* Note: We assume that reloc_info has already been adjusted for us. */
992 return ELF64_MIPS_R_TYPE (reloc_info);
993
994 case EM_SPARCV9:
995 return ELF64_R_TYPE_ID (reloc_info);
996
997 default:
998 return ELF64_R_TYPE (reloc_info);
999 }
1000 }
1001
1002 /* Return the symbol index extracted from the reloc info field. */
1003
1004 static bfd_vma
1005 get_reloc_symindex (bfd_vma reloc_info)
1006 {
1007 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1008 }
1009
1010 static inline bfd_boolean
1011 uses_msp430x_relocs (void)
1012 {
1013 return
1014 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1015 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1016 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1017 /* TI compiler uses ELFOSABI_NONE. */
1018 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1019 }
1020
1021 /* Display the contents of the relocation data found at the specified
1022 offset. */
1023
1024 static void
1025 dump_relocations (FILE * file,
1026 unsigned long rel_offset,
1027 unsigned long rel_size,
1028 Elf_Internal_Sym * symtab,
1029 unsigned long nsyms,
1030 char * strtab,
1031 unsigned long strtablen,
1032 int is_rela,
1033 int is_dynsym)
1034 {
1035 unsigned int i;
1036 Elf_Internal_Rela * rels;
1037
1038 if (is_rela == UNKNOWN)
1039 is_rela = guess_is_rela (elf_header.e_machine);
1040
1041 if (is_rela)
1042 {
1043 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1044 return;
1045 }
1046 else
1047 {
1048 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1049 return;
1050 }
1051
1052 if (is_32bit_elf)
1053 {
1054 if (is_rela)
1055 {
1056 if (do_wide)
1057 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1058 else
1059 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1060 }
1061 else
1062 {
1063 if (do_wide)
1064 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1065 else
1066 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1067 }
1068 }
1069 else
1070 {
1071 if (is_rela)
1072 {
1073 if (do_wide)
1074 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1075 else
1076 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1077 }
1078 else
1079 {
1080 if (do_wide)
1081 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1082 else
1083 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1084 }
1085 }
1086
1087 for (i = 0; i < rel_size; i++)
1088 {
1089 const char * rtype;
1090 bfd_vma offset;
1091 bfd_vma inf;
1092 bfd_vma symtab_index;
1093 bfd_vma type;
1094
1095 offset = rels[i].r_offset;
1096 inf = rels[i].r_info;
1097
1098 type = get_reloc_type (inf);
1099 symtab_index = get_reloc_symindex (inf);
1100
1101 if (is_32bit_elf)
1102 {
1103 printf ("%8.8lx %8.8lx ",
1104 (unsigned long) offset & 0xffffffff,
1105 (unsigned long) inf & 0xffffffff);
1106 }
1107 else
1108 {
1109 #if BFD_HOST_64BIT_LONG
1110 printf (do_wide
1111 ? "%16.16lx %16.16lx "
1112 : "%12.12lx %12.12lx ",
1113 offset, inf);
1114 #elif BFD_HOST_64BIT_LONG_LONG
1115 #ifndef __MSVCRT__
1116 printf (do_wide
1117 ? "%16.16llx %16.16llx "
1118 : "%12.12llx %12.12llx ",
1119 offset, inf);
1120 #else
1121 printf (do_wide
1122 ? "%16.16I64x %16.16I64x "
1123 : "%12.12I64x %12.12I64x ",
1124 offset, inf);
1125 #endif
1126 #else
1127 printf (do_wide
1128 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1129 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1130 _bfd_int64_high (offset),
1131 _bfd_int64_low (offset),
1132 _bfd_int64_high (inf),
1133 _bfd_int64_low (inf));
1134 #endif
1135 }
1136
1137 switch (elf_header.e_machine)
1138 {
1139 default:
1140 rtype = NULL;
1141 break;
1142
1143 case EM_AARCH64:
1144 rtype = elf_aarch64_reloc_type (type);
1145 break;
1146
1147 case EM_M32R:
1148 case EM_CYGNUS_M32R:
1149 rtype = elf_m32r_reloc_type (type);
1150 break;
1151
1152 case EM_386:
1153 case EM_486:
1154 rtype = elf_i386_reloc_type (type);
1155 break;
1156
1157 case EM_68HC11:
1158 case EM_68HC12:
1159 rtype = elf_m68hc11_reloc_type (type);
1160 break;
1161
1162 case EM_68K:
1163 rtype = elf_m68k_reloc_type (type);
1164 break;
1165
1166 case EM_960:
1167 rtype = elf_i960_reloc_type (type);
1168 break;
1169
1170 case EM_AVR:
1171 case EM_AVR_OLD:
1172 rtype = elf_avr_reloc_type (type);
1173 break;
1174
1175 case EM_OLD_SPARCV9:
1176 case EM_SPARC32PLUS:
1177 case EM_SPARCV9:
1178 case EM_SPARC:
1179 rtype = elf_sparc_reloc_type (type);
1180 break;
1181
1182 case EM_SPU:
1183 rtype = elf_spu_reloc_type (type);
1184 break;
1185
1186 case EM_V800:
1187 rtype = v800_reloc_type (type);
1188 break;
1189 case EM_V850:
1190 case EM_CYGNUS_V850:
1191 rtype = v850_reloc_type (type);
1192 break;
1193
1194 case EM_D10V:
1195 case EM_CYGNUS_D10V:
1196 rtype = elf_d10v_reloc_type (type);
1197 break;
1198
1199 case EM_D30V:
1200 case EM_CYGNUS_D30V:
1201 rtype = elf_d30v_reloc_type (type);
1202 break;
1203
1204 case EM_DLX:
1205 rtype = elf_dlx_reloc_type (type);
1206 break;
1207
1208 case EM_SH:
1209 rtype = elf_sh_reloc_type (type);
1210 break;
1211
1212 case EM_MN10300:
1213 case EM_CYGNUS_MN10300:
1214 rtype = elf_mn10300_reloc_type (type);
1215 break;
1216
1217 case EM_MN10200:
1218 case EM_CYGNUS_MN10200:
1219 rtype = elf_mn10200_reloc_type (type);
1220 break;
1221
1222 case EM_FR30:
1223 case EM_CYGNUS_FR30:
1224 rtype = elf_fr30_reloc_type (type);
1225 break;
1226
1227 case EM_CYGNUS_FRV:
1228 rtype = elf_frv_reloc_type (type);
1229 break;
1230
1231 case EM_MCORE:
1232 rtype = elf_mcore_reloc_type (type);
1233 break;
1234
1235 case EM_MMIX:
1236 rtype = elf_mmix_reloc_type (type);
1237 break;
1238
1239 case EM_MOXIE:
1240 rtype = elf_moxie_reloc_type (type);
1241 break;
1242
1243 case EM_MSP430:
1244 if (uses_msp430x_relocs ())
1245 {
1246 rtype = elf_msp430x_reloc_type (type);
1247 break;
1248 }
1249 case EM_MSP430_OLD:
1250 rtype = elf_msp430_reloc_type (type);
1251 break;
1252
1253 case EM_NDS32:
1254 rtype = elf_nds32_reloc_type (type);
1255 break;
1256
1257 case EM_PPC:
1258 rtype = elf_ppc_reloc_type (type);
1259 break;
1260
1261 case EM_PPC64:
1262 rtype = elf_ppc64_reloc_type (type);
1263 break;
1264
1265 case EM_MIPS:
1266 case EM_MIPS_RS3_LE:
1267 rtype = elf_mips_reloc_type (type);
1268 break;
1269
1270 case EM_ALPHA:
1271 rtype = elf_alpha_reloc_type (type);
1272 break;
1273
1274 case EM_ARM:
1275 rtype = elf_arm_reloc_type (type);
1276 break;
1277
1278 case EM_ARC:
1279 rtype = elf_arc_reloc_type (type);
1280 break;
1281
1282 case EM_PARISC:
1283 rtype = elf_hppa_reloc_type (type);
1284 break;
1285
1286 case EM_H8_300:
1287 case EM_H8_300H:
1288 case EM_H8S:
1289 rtype = elf_h8_reloc_type (type);
1290 break;
1291
1292 case EM_OR1K:
1293 rtype = elf_or1k_reloc_type (type);
1294 break;
1295
1296 case EM_PJ:
1297 case EM_PJ_OLD:
1298 rtype = elf_pj_reloc_type (type);
1299 break;
1300 case EM_IA_64:
1301 rtype = elf_ia64_reloc_type (type);
1302 break;
1303
1304 case EM_CRIS:
1305 rtype = elf_cris_reloc_type (type);
1306 break;
1307
1308 case EM_860:
1309 rtype = elf_i860_reloc_type (type);
1310 break;
1311
1312 case EM_X86_64:
1313 case EM_L1OM:
1314 case EM_K1OM:
1315 rtype = elf_x86_64_reloc_type (type);
1316 break;
1317
1318 case EM_S370:
1319 rtype = i370_reloc_type (type);
1320 break;
1321
1322 case EM_S390_OLD:
1323 case EM_S390:
1324 rtype = elf_s390_reloc_type (type);
1325 break;
1326
1327 case EM_SCORE:
1328 rtype = elf_score_reloc_type (type);
1329 break;
1330
1331 case EM_XSTORMY16:
1332 rtype = elf_xstormy16_reloc_type (type);
1333 break;
1334
1335 case EM_CRX:
1336 rtype = elf_crx_reloc_type (type);
1337 break;
1338
1339 case EM_VAX:
1340 rtype = elf_vax_reloc_type (type);
1341 break;
1342
1343 case EM_ADAPTEVA_EPIPHANY:
1344 rtype = elf_epiphany_reloc_type (type);
1345 break;
1346
1347 case EM_IP2K:
1348 case EM_IP2K_OLD:
1349 rtype = elf_ip2k_reloc_type (type);
1350 break;
1351
1352 case EM_IQ2000:
1353 rtype = elf_iq2000_reloc_type (type);
1354 break;
1355
1356 case EM_XTENSA_OLD:
1357 case EM_XTENSA:
1358 rtype = elf_xtensa_reloc_type (type);
1359 break;
1360
1361 case EM_LATTICEMICO32:
1362 rtype = elf_lm32_reloc_type (type);
1363 break;
1364
1365 case EM_M32C_OLD:
1366 case EM_M32C:
1367 rtype = elf_m32c_reloc_type (type);
1368 break;
1369
1370 case EM_MT:
1371 rtype = elf_mt_reloc_type (type);
1372 break;
1373
1374 case EM_BLACKFIN:
1375 rtype = elf_bfin_reloc_type (type);
1376 break;
1377
1378 case EM_CYGNUS_MEP:
1379 rtype = elf_mep_reloc_type (type);
1380 break;
1381
1382 case EM_CR16:
1383 rtype = elf_cr16_reloc_type (type);
1384 break;
1385
1386 case EM_MICROBLAZE:
1387 case EM_MICROBLAZE_OLD:
1388 rtype = elf_microblaze_reloc_type (type);
1389 break;
1390
1391 case EM_RL78:
1392 rtype = elf_rl78_reloc_type (type);
1393 break;
1394
1395 case EM_RX:
1396 rtype = elf_rx_reloc_type (type);
1397 break;
1398
1399 case EM_METAG:
1400 rtype = elf_metag_reloc_type (type);
1401 break;
1402
1403 case EM_XC16X:
1404 case EM_C166:
1405 rtype = elf_xc16x_reloc_type (type);
1406 break;
1407
1408 case EM_TI_C6000:
1409 rtype = elf_tic6x_reloc_type (type);
1410 break;
1411
1412 case EM_TILEGX:
1413 rtype = elf_tilegx_reloc_type (type);
1414 break;
1415
1416 case EM_TILEPRO:
1417 rtype = elf_tilepro_reloc_type (type);
1418 break;
1419
1420 case EM_XGATE:
1421 rtype = elf_xgate_reloc_type (type);
1422 break;
1423
1424 case EM_ALTERA_NIOS2:
1425 rtype = elf_nios2_reloc_type (type);
1426 break;
1427 }
1428
1429 if (rtype == NULL)
1430 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1431 else
1432 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1433
1434 if (elf_header.e_machine == EM_ALPHA
1435 && rtype != NULL
1436 && streq (rtype, "R_ALPHA_LITUSE")
1437 && is_rela)
1438 {
1439 switch (rels[i].r_addend)
1440 {
1441 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1442 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1443 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1444 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1445 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1446 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1447 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1448 default: rtype = NULL;
1449 }
1450 if (rtype)
1451 printf (" (%s)", rtype);
1452 else
1453 {
1454 putchar (' ');
1455 printf (_("<unknown addend: %lx>"),
1456 (unsigned long) rels[i].r_addend);
1457 }
1458 }
1459 else if (symtab_index)
1460 {
1461 if (symtab == NULL || symtab_index >= nsyms)
1462 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1463 else
1464 {
1465 Elf_Internal_Sym * psym;
1466 const char * version_string;
1467 enum versioned_symbol_info sym_info;
1468 unsigned short vna_other;
1469
1470 psym = symtab + symtab_index;
1471
1472 version_string
1473 = get_symbol_version_string (file, is_dynsym,
1474 strtab, strtablen,
1475 symtab_index,
1476 psym,
1477 &sym_info,
1478 &vna_other);
1479
1480 printf (" ");
1481
1482 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1483 {
1484 const char * name;
1485 unsigned int len;
1486 unsigned int width = is_32bit_elf ? 8 : 14;
1487
1488 /* Relocations against GNU_IFUNC symbols do not use the value
1489 of the symbol as the address to relocate against. Instead
1490 they invoke the function named by the symbol and use its
1491 result as the address for relocation.
1492
1493 To indicate this to the user, do not display the value of
1494 the symbol in the "Symbols's Value" field. Instead show
1495 its name followed by () as a hint that the symbol is
1496 invoked. */
1497
1498 if (strtab == NULL
1499 || psym->st_name == 0
1500 || psym->st_name >= strtablen)
1501 name = "??";
1502 else
1503 name = strtab + psym->st_name;
1504
1505 len = print_symbol (width, name);
1506 if (version_string)
1507 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1508 version_string);
1509 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1510 }
1511 else
1512 {
1513 print_vma (psym->st_value, LONG_HEX);
1514
1515 printf (is_32bit_elf ? " " : " ");
1516 }
1517
1518 if (psym->st_name == 0)
1519 {
1520 const char * sec_name = "<null>";
1521 char name_buf[40];
1522
1523 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1524 {
1525 if (psym->st_shndx < elf_header.e_shnum)
1526 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1527 else if (psym->st_shndx == SHN_ABS)
1528 sec_name = "ABS";
1529 else if (psym->st_shndx == SHN_COMMON)
1530 sec_name = "COMMON";
1531 else if ((elf_header.e_machine == EM_MIPS
1532 && psym->st_shndx == SHN_MIPS_SCOMMON)
1533 || (elf_header.e_machine == EM_TI_C6000
1534 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1535 sec_name = "SCOMMON";
1536 else if (elf_header.e_machine == EM_MIPS
1537 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1538 sec_name = "SUNDEF";
1539 else if ((elf_header.e_machine == EM_X86_64
1540 || elf_header.e_machine == EM_L1OM
1541 || elf_header.e_machine == EM_K1OM)
1542 && psym->st_shndx == SHN_X86_64_LCOMMON)
1543 sec_name = "LARGE_COMMON";
1544 else if (elf_header.e_machine == EM_IA_64
1545 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1546 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1547 sec_name = "ANSI_COM";
1548 else if (is_ia64_vms ()
1549 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1550 sec_name = "VMS_SYMVEC";
1551 else
1552 {
1553 sprintf (name_buf, "<section 0x%x>",
1554 (unsigned int) psym->st_shndx);
1555 sec_name = name_buf;
1556 }
1557 }
1558 print_symbol (22, sec_name);
1559 }
1560 else if (strtab == NULL)
1561 printf (_("<string table index: %3ld>"), psym->st_name);
1562 else if (psym->st_name >= strtablen)
1563 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1564 else
1565 {
1566 print_symbol (22, strtab + psym->st_name);
1567 if (version_string)
1568 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1569 version_string);
1570 }
1571
1572 if (is_rela)
1573 {
1574 bfd_signed_vma off = rels[i].r_addend;
1575
1576 if (off < 0)
1577 printf (" - %" BFD_VMA_FMT "x", - off);
1578 else
1579 printf (" + %" BFD_VMA_FMT "x", off);
1580 }
1581 }
1582 }
1583 else if (is_rela)
1584 {
1585 bfd_signed_vma off = rels[i].r_addend;
1586
1587 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1588 if (off < 0)
1589 printf ("-%" BFD_VMA_FMT "x", - off);
1590 else
1591 printf ("%" BFD_VMA_FMT "x", off);
1592 }
1593
1594 if (elf_header.e_machine == EM_SPARCV9
1595 && rtype != NULL
1596 && streq (rtype, "R_SPARC_OLO10"))
1597 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1598
1599 putchar ('\n');
1600
1601 #ifdef BFD64
1602 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1603 {
1604 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1605 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1606 const char * rtype2 = elf_mips_reloc_type (type2);
1607 const char * rtype3 = elf_mips_reloc_type (type3);
1608
1609 printf (" Type2: ");
1610
1611 if (rtype2 == NULL)
1612 printf (_("unrecognized: %-7lx"),
1613 (unsigned long) type2 & 0xffffffff);
1614 else
1615 printf ("%-17.17s", rtype2);
1616
1617 printf ("\n Type3: ");
1618
1619 if (rtype3 == NULL)
1620 printf (_("unrecognized: %-7lx"),
1621 (unsigned long) type3 & 0xffffffff);
1622 else
1623 printf ("%-17.17s", rtype3);
1624
1625 putchar ('\n');
1626 }
1627 #endif /* BFD64 */
1628 }
1629
1630 free (rels);
1631 }
1632
1633 static const char *
1634 get_mips_dynamic_type (unsigned long type)
1635 {
1636 switch (type)
1637 {
1638 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1639 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1640 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1641 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1642 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1643 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1644 case DT_MIPS_MSYM: return "MIPS_MSYM";
1645 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1646 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1647 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1648 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1649 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1650 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1651 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1652 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1653 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1654 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1655 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1656 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1657 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1658 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1659 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1660 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1661 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1662 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1663 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1664 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1665 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1666 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1667 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1668 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1669 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1670 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1671 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1672 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1673 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1674 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1675 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1676 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1677 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1678 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1679 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1680 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1681 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1682 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1683 default:
1684 return NULL;
1685 }
1686 }
1687
1688 static const char *
1689 get_sparc64_dynamic_type (unsigned long type)
1690 {
1691 switch (type)
1692 {
1693 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1694 default:
1695 return NULL;
1696 }
1697 }
1698
1699 static const char *
1700 get_ppc_dynamic_type (unsigned long type)
1701 {
1702 switch (type)
1703 {
1704 case DT_PPC_GOT: return "PPC_GOT";
1705 case DT_PPC_OPT: return "PPC_OPT";
1706 default:
1707 return NULL;
1708 }
1709 }
1710
1711 static const char *
1712 get_ppc64_dynamic_type (unsigned long type)
1713 {
1714 switch (type)
1715 {
1716 case DT_PPC64_GLINK: return "PPC64_GLINK";
1717 case DT_PPC64_OPD: return "PPC64_OPD";
1718 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1719 case DT_PPC64_OPT: return "PPC64_OPT";
1720 default:
1721 return NULL;
1722 }
1723 }
1724
1725 static const char *
1726 get_parisc_dynamic_type (unsigned long type)
1727 {
1728 switch (type)
1729 {
1730 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1731 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1732 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1733 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1734 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1735 case DT_HP_PREINIT: return "HP_PREINIT";
1736 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1737 case DT_HP_NEEDED: return "HP_NEEDED";
1738 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1739 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1740 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1741 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1742 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1743 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1744 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1745 case DT_HP_FILTERED: return "HP_FILTERED";
1746 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1747 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1748 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1749 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1750 case DT_PLT: return "PLT";
1751 case DT_PLT_SIZE: return "PLT_SIZE";
1752 case DT_DLT: return "DLT";
1753 case DT_DLT_SIZE: return "DLT_SIZE";
1754 default:
1755 return NULL;
1756 }
1757 }
1758
1759 static const char *
1760 get_ia64_dynamic_type (unsigned long type)
1761 {
1762 switch (type)
1763 {
1764 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1765 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1766 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1767 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1768 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1769 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1770 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1771 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1772 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1773 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1774 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1775 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1776 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1777 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1778 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1779 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1780 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1781 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1782 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1783 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1784 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1785 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1786 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1787 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1788 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1789 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1790 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1791 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1792 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1793 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1794 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1795 default:
1796 return NULL;
1797 }
1798 }
1799
1800 static const char *
1801 get_alpha_dynamic_type (unsigned long type)
1802 {
1803 switch (type)
1804 {
1805 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1806 default:
1807 return NULL;
1808 }
1809 }
1810
1811 static const char *
1812 get_score_dynamic_type (unsigned long type)
1813 {
1814 switch (type)
1815 {
1816 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1817 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1818 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1819 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1820 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1821 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1822 default:
1823 return NULL;
1824 }
1825 }
1826
1827 static const char *
1828 get_tic6x_dynamic_type (unsigned long type)
1829 {
1830 switch (type)
1831 {
1832 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1833 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1834 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1835 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1836 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1837 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1838 default:
1839 return NULL;
1840 }
1841 }
1842
1843 static const char *
1844 get_nios2_dynamic_type (unsigned long type)
1845 {
1846 switch (type)
1847 {
1848 case DT_NIOS2_GP: return "NIOS2_GP";
1849 default:
1850 return NULL;
1851 }
1852 }
1853
1854 static const char *
1855 get_dynamic_type (unsigned long type)
1856 {
1857 static char buff[64];
1858
1859 switch (type)
1860 {
1861 case DT_NULL: return "NULL";
1862 case DT_NEEDED: return "NEEDED";
1863 case DT_PLTRELSZ: return "PLTRELSZ";
1864 case DT_PLTGOT: return "PLTGOT";
1865 case DT_HASH: return "HASH";
1866 case DT_STRTAB: return "STRTAB";
1867 case DT_SYMTAB: return "SYMTAB";
1868 case DT_RELA: return "RELA";
1869 case DT_RELASZ: return "RELASZ";
1870 case DT_RELAENT: return "RELAENT";
1871 case DT_STRSZ: return "STRSZ";
1872 case DT_SYMENT: return "SYMENT";
1873 case DT_INIT: return "INIT";
1874 case DT_FINI: return "FINI";
1875 case DT_SONAME: return "SONAME";
1876 case DT_RPATH: return "RPATH";
1877 case DT_SYMBOLIC: return "SYMBOLIC";
1878 case DT_REL: return "REL";
1879 case DT_RELSZ: return "RELSZ";
1880 case DT_RELENT: return "RELENT";
1881 case DT_PLTREL: return "PLTREL";
1882 case DT_DEBUG: return "DEBUG";
1883 case DT_TEXTREL: return "TEXTREL";
1884 case DT_JMPREL: return "JMPREL";
1885 case DT_BIND_NOW: return "BIND_NOW";
1886 case DT_INIT_ARRAY: return "INIT_ARRAY";
1887 case DT_FINI_ARRAY: return "FINI_ARRAY";
1888 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1889 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1890 case DT_RUNPATH: return "RUNPATH";
1891 case DT_FLAGS: return "FLAGS";
1892
1893 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1894 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1895
1896 case DT_CHECKSUM: return "CHECKSUM";
1897 case DT_PLTPADSZ: return "PLTPADSZ";
1898 case DT_MOVEENT: return "MOVEENT";
1899 case DT_MOVESZ: return "MOVESZ";
1900 case DT_FEATURE: return "FEATURE";
1901 case DT_POSFLAG_1: return "POSFLAG_1";
1902 case DT_SYMINSZ: return "SYMINSZ";
1903 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1904
1905 case DT_ADDRRNGLO: return "ADDRRNGLO";
1906 case DT_CONFIG: return "CONFIG";
1907 case DT_DEPAUDIT: return "DEPAUDIT";
1908 case DT_AUDIT: return "AUDIT";
1909 case DT_PLTPAD: return "PLTPAD";
1910 case DT_MOVETAB: return "MOVETAB";
1911 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1912
1913 case DT_VERSYM: return "VERSYM";
1914
1915 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1916 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1917 case DT_RELACOUNT: return "RELACOUNT";
1918 case DT_RELCOUNT: return "RELCOUNT";
1919 case DT_FLAGS_1: return "FLAGS_1";
1920 case DT_VERDEF: return "VERDEF";
1921 case DT_VERDEFNUM: return "VERDEFNUM";
1922 case DT_VERNEED: return "VERNEED";
1923 case DT_VERNEEDNUM: return "VERNEEDNUM";
1924
1925 case DT_AUXILIARY: return "AUXILIARY";
1926 case DT_USED: return "USED";
1927 case DT_FILTER: return "FILTER";
1928
1929 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1930 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1931 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1932 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1933 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1934 case DT_GNU_HASH: return "GNU_HASH";
1935
1936 default:
1937 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1938 {
1939 const char * result;
1940
1941 switch (elf_header.e_machine)
1942 {
1943 case EM_MIPS:
1944 case EM_MIPS_RS3_LE:
1945 result = get_mips_dynamic_type (type);
1946 break;
1947 case EM_SPARCV9:
1948 result = get_sparc64_dynamic_type (type);
1949 break;
1950 case EM_PPC:
1951 result = get_ppc_dynamic_type (type);
1952 break;
1953 case EM_PPC64:
1954 result = get_ppc64_dynamic_type (type);
1955 break;
1956 case EM_IA_64:
1957 result = get_ia64_dynamic_type (type);
1958 break;
1959 case EM_ALPHA:
1960 result = get_alpha_dynamic_type (type);
1961 break;
1962 case EM_SCORE:
1963 result = get_score_dynamic_type (type);
1964 break;
1965 case EM_TI_C6000:
1966 result = get_tic6x_dynamic_type (type);
1967 break;
1968 case EM_ALTERA_NIOS2:
1969 result = get_nios2_dynamic_type (type);
1970 break;
1971 default:
1972 result = NULL;
1973 break;
1974 }
1975
1976 if (result != NULL)
1977 return result;
1978
1979 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1980 }
1981 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1982 || (elf_header.e_machine == EM_PARISC
1983 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1984 {
1985 const char * result;
1986
1987 switch (elf_header.e_machine)
1988 {
1989 case EM_PARISC:
1990 result = get_parisc_dynamic_type (type);
1991 break;
1992 case EM_IA_64:
1993 result = get_ia64_dynamic_type (type);
1994 break;
1995 default:
1996 result = NULL;
1997 break;
1998 }
1999
2000 if (result != NULL)
2001 return result;
2002
2003 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2004 type);
2005 }
2006 else
2007 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2008
2009 return buff;
2010 }
2011 }
2012
2013 static char *
2014 get_file_type (unsigned e_type)
2015 {
2016 static char buff[32];
2017
2018 switch (e_type)
2019 {
2020 case ET_NONE: return _("NONE (None)");
2021 case ET_REL: return _("REL (Relocatable file)");
2022 case ET_EXEC: return _("EXEC (Executable file)");
2023 case ET_DYN: return _("DYN (Shared object file)");
2024 case ET_CORE: return _("CORE (Core file)");
2025
2026 default:
2027 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2028 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2029 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2030 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2031 else
2032 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2033 return buff;
2034 }
2035 }
2036
2037 static char *
2038 get_machine_name (unsigned e_machine)
2039 {
2040 static char buff[64]; /* XXX */
2041
2042 switch (e_machine)
2043 {
2044 case EM_NONE: return _("None");
2045 case EM_AARCH64: return "AArch64";
2046 case EM_M32: return "WE32100";
2047 case EM_SPARC: return "Sparc";
2048 case EM_SPU: return "SPU";
2049 case EM_386: return "Intel 80386";
2050 case EM_68K: return "MC68000";
2051 case EM_88K: return "MC88000";
2052 case EM_486: return "Intel 80486";
2053 case EM_860: return "Intel 80860";
2054 case EM_MIPS: return "MIPS R3000";
2055 case EM_S370: return "IBM System/370";
2056 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2057 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2058 case EM_PARISC: return "HPPA";
2059 case EM_PPC_OLD: return "Power PC (old)";
2060 case EM_SPARC32PLUS: return "Sparc v8+" ;
2061 case EM_960: return "Intel 90860";
2062 case EM_PPC: return "PowerPC";
2063 case EM_PPC64: return "PowerPC64";
2064 case EM_FR20: return "Fujitsu FR20";
2065 case EM_RH32: return "TRW RH32";
2066 case EM_MCORE: return "MCORE";
2067 case EM_ARM: return "ARM";
2068 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2069 case EM_SH: return "Renesas / SuperH SH";
2070 case EM_SPARCV9: return "Sparc v9";
2071 case EM_TRICORE: return "Siemens Tricore";
2072 case EM_ARC: return "ARC";
2073 case EM_H8_300: return "Renesas H8/300";
2074 case EM_H8_300H: return "Renesas H8/300H";
2075 case EM_H8S: return "Renesas H8S";
2076 case EM_H8_500: return "Renesas H8/500";
2077 case EM_IA_64: return "Intel IA-64";
2078 case EM_MIPS_X: return "Stanford MIPS-X";
2079 case EM_COLDFIRE: return "Motorola Coldfire";
2080 case EM_ALPHA: return "Alpha";
2081 case EM_CYGNUS_D10V:
2082 case EM_D10V: return "d10v";
2083 case EM_CYGNUS_D30V:
2084 case EM_D30V: return "d30v";
2085 case EM_CYGNUS_M32R:
2086 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2087 case EM_CYGNUS_V850:
2088 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2089 case EM_V850: return "Renesas V850";
2090 case EM_CYGNUS_MN10300:
2091 case EM_MN10300: return "mn10300";
2092 case EM_CYGNUS_MN10200:
2093 case EM_MN10200: return "mn10200";
2094 case EM_MOXIE: return "Moxie";
2095 case EM_CYGNUS_FR30:
2096 case EM_FR30: return "Fujitsu FR30";
2097 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2098 case EM_PJ_OLD:
2099 case EM_PJ: return "picoJava";
2100 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2101 case EM_PCP: return "Siemens PCP";
2102 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2103 case EM_NDR1: return "Denso NDR1 microprocesspr";
2104 case EM_STARCORE: return "Motorola Star*Core processor";
2105 case EM_ME16: return "Toyota ME16 processor";
2106 case EM_ST100: return "STMicroelectronics ST100 processor";
2107 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2108 case EM_PDSP: return "Sony DSP processor";
2109 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2110 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2111 case EM_FX66: return "Siemens FX66 microcontroller";
2112 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2113 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2114 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2115 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2116 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2117 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2118 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2119 case EM_SVX: return "Silicon Graphics SVx";
2120 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2121 case EM_VAX: return "Digital VAX";
2122 case EM_AVR_OLD:
2123 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2124 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2125 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2126 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2127 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2128 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2129 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2130 case EM_PRISM: return "Vitesse Prism";
2131 case EM_X86_64: return "Advanced Micro Devices X86-64";
2132 case EM_L1OM: return "Intel L1OM";
2133 case EM_K1OM: return "Intel K1OM";
2134 case EM_S390_OLD:
2135 case EM_S390: return "IBM S/390";
2136 case EM_SCORE: return "SUNPLUS S+Core";
2137 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2138 case EM_OR1K: return "OpenRISC 1000";
2139 case EM_ARC_A5: return "ARC International ARCompact processor";
2140 case EM_CRX: return "National Semiconductor CRX microprocessor";
2141 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2142 case EM_DLX: return "OpenDLX";
2143 case EM_IP2K_OLD:
2144 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2145 case EM_IQ2000: return "Vitesse IQ2000";
2146 case EM_XTENSA_OLD:
2147 case EM_XTENSA: return "Tensilica Xtensa Processor";
2148 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2149 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2150 case EM_NS32K: return "National Semiconductor 32000 series";
2151 case EM_TPC: return "Tenor Network TPC processor";
2152 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2153 case EM_MAX: return "MAX Processor";
2154 case EM_CR: return "National Semiconductor CompactRISC";
2155 case EM_F2MC16: return "Fujitsu F2MC16";
2156 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2157 case EM_LATTICEMICO32: return "Lattice Mico32";
2158 case EM_M32C_OLD:
2159 case EM_M32C: return "Renesas M32c";
2160 case EM_MT: return "Morpho Techologies MT processor";
2161 case EM_BLACKFIN: return "Analog Devices Blackfin";
2162 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2163 case EM_SEP: return "Sharp embedded microprocessor";
2164 case EM_ARCA: return "Arca RISC microprocessor";
2165 case EM_UNICORE: return "Unicore";
2166 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2167 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2168 case EM_NIOS32: return "Altera Nios";
2169 case EM_ALTERA_NIOS2: return "Altera Nios II";
2170 case EM_C166:
2171 case EM_XC16X: return "Infineon Technologies xc16x";
2172 case EM_M16C: return "Renesas M16C series microprocessors";
2173 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2174 case EM_CE: return "Freescale Communication Engine RISC core";
2175 case EM_TSK3000: return "Altium TSK3000 core";
2176 case EM_RS08: return "Freescale RS08 embedded processor";
2177 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2178 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2179 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2180 case EM_SE_C17: return "Seiko Epson C17 family";
2181 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2182 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2183 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2184 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2185 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2186 case EM_R32C: return "Renesas R32C series microprocessors";
2187 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2188 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2189 case EM_8051: return "Intel 8051 and variants";
2190 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2191 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2192 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2193 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2194 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2195 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2196 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2197 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2198 case EM_CR16:
2199 case EM_MICROBLAZE:
2200 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2201 case EM_RL78: return "Renesas RL78";
2202 case EM_RX: return "Renesas RX";
2203 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2204 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2205 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2206 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2207 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2208 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2209 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2210 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2211 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2212 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2213 case EM_CUDA: return "NVIDIA CUDA architecture";
2214 case EM_XGATE: return "Motorola XGATE embedded processor";
2215 default:
2216 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2217 return buff;
2218 }
2219 }
2220
2221 static void
2222 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2223 {
2224 unsigned eabi;
2225 int unknown = 0;
2226
2227 eabi = EF_ARM_EABI_VERSION (e_flags);
2228 e_flags &= ~ EF_ARM_EABIMASK;
2229
2230 /* Handle "generic" ARM flags. */
2231 if (e_flags & EF_ARM_RELEXEC)
2232 {
2233 strcat (buf, ", relocatable executable");
2234 e_flags &= ~ EF_ARM_RELEXEC;
2235 }
2236
2237 if (e_flags & EF_ARM_HASENTRY)
2238 {
2239 strcat (buf, ", has entry point");
2240 e_flags &= ~ EF_ARM_HASENTRY;
2241 }
2242
2243 /* Now handle EABI specific flags. */
2244 switch (eabi)
2245 {
2246 default:
2247 strcat (buf, ", <unrecognized EABI>");
2248 if (e_flags)
2249 unknown = 1;
2250 break;
2251
2252 case EF_ARM_EABI_VER1:
2253 strcat (buf, ", Version1 EABI");
2254 while (e_flags)
2255 {
2256 unsigned flag;
2257
2258 /* Process flags one bit at a time. */
2259 flag = e_flags & - e_flags;
2260 e_flags &= ~ flag;
2261
2262 switch (flag)
2263 {
2264 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2265 strcat (buf, ", sorted symbol tables");
2266 break;
2267
2268 default:
2269 unknown = 1;
2270 break;
2271 }
2272 }
2273 break;
2274
2275 case EF_ARM_EABI_VER2:
2276 strcat (buf, ", Version2 EABI");
2277 while (e_flags)
2278 {
2279 unsigned flag;
2280
2281 /* Process flags one bit at a time. */
2282 flag = e_flags & - e_flags;
2283 e_flags &= ~ flag;
2284
2285 switch (flag)
2286 {
2287 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2288 strcat (buf, ", sorted symbol tables");
2289 break;
2290
2291 case EF_ARM_DYNSYMSUSESEGIDX:
2292 strcat (buf, ", dynamic symbols use segment index");
2293 break;
2294
2295 case EF_ARM_MAPSYMSFIRST:
2296 strcat (buf, ", mapping symbols precede others");
2297 break;
2298
2299 default:
2300 unknown = 1;
2301 break;
2302 }
2303 }
2304 break;
2305
2306 case EF_ARM_EABI_VER3:
2307 strcat (buf, ", Version3 EABI");
2308 break;
2309
2310 case EF_ARM_EABI_VER4:
2311 strcat (buf, ", Version4 EABI");
2312 while (e_flags)
2313 {
2314 unsigned flag;
2315
2316 /* Process flags one bit at a time. */
2317 flag = e_flags & - e_flags;
2318 e_flags &= ~ flag;
2319
2320 switch (flag)
2321 {
2322 case EF_ARM_BE8:
2323 strcat (buf, ", BE8");
2324 break;
2325
2326 case EF_ARM_LE8:
2327 strcat (buf, ", LE8");
2328 break;
2329
2330 default:
2331 unknown = 1;
2332 break;
2333 }
2334 break;
2335 }
2336 break;
2337
2338 case EF_ARM_EABI_VER5:
2339 strcat (buf, ", Version5 EABI");
2340 while (e_flags)
2341 {
2342 unsigned flag;
2343
2344 /* Process flags one bit at a time. */
2345 flag = e_flags & - e_flags;
2346 e_flags &= ~ flag;
2347
2348 switch (flag)
2349 {
2350 case EF_ARM_BE8:
2351 strcat (buf, ", BE8");
2352 break;
2353
2354 case EF_ARM_LE8:
2355 strcat (buf, ", LE8");
2356 break;
2357
2358 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2359 strcat (buf, ", soft-float ABI");
2360 break;
2361
2362 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2363 strcat (buf, ", hard-float ABI");
2364 break;
2365
2366 default:
2367 unknown = 1;
2368 break;
2369 }
2370 }
2371 break;
2372
2373 case EF_ARM_EABI_UNKNOWN:
2374 strcat (buf, ", GNU EABI");
2375 while (e_flags)
2376 {
2377 unsigned flag;
2378
2379 /* Process flags one bit at a time. */
2380 flag = e_flags & - e_flags;
2381 e_flags &= ~ flag;
2382
2383 switch (flag)
2384 {
2385 case EF_ARM_INTERWORK:
2386 strcat (buf, ", interworking enabled");
2387 break;
2388
2389 case EF_ARM_APCS_26:
2390 strcat (buf, ", uses APCS/26");
2391 break;
2392
2393 case EF_ARM_APCS_FLOAT:
2394 strcat (buf, ", uses APCS/float");
2395 break;
2396
2397 case EF_ARM_PIC:
2398 strcat (buf, ", position independent");
2399 break;
2400
2401 case EF_ARM_ALIGN8:
2402 strcat (buf, ", 8 bit structure alignment");
2403 break;
2404
2405 case EF_ARM_NEW_ABI:
2406 strcat (buf, ", uses new ABI");
2407 break;
2408
2409 case EF_ARM_OLD_ABI:
2410 strcat (buf, ", uses old ABI");
2411 break;
2412
2413 case EF_ARM_SOFT_FLOAT:
2414 strcat (buf, ", software FP");
2415 break;
2416
2417 case EF_ARM_VFP_FLOAT:
2418 strcat (buf, ", VFP");
2419 break;
2420
2421 case EF_ARM_MAVERICK_FLOAT:
2422 strcat (buf, ", Maverick FP");
2423 break;
2424
2425 default:
2426 unknown = 1;
2427 break;
2428 }
2429 }
2430 }
2431
2432 if (unknown)
2433 strcat (buf,_(", <unknown>"));
2434 }
2435
2436 static void
2437 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2438 {
2439 unsigned abi;
2440 unsigned arch;
2441 unsigned config;
2442 unsigned version;
2443 int has_fpu = 0;
2444 int r = 0;
2445
2446 static const char *ABI_STRINGS[] =
2447 {
2448 "ABI v0", /* use r5 as return register; only used in N1213HC */
2449 "ABI v1", /* use r0 as return register */
2450 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2451 "ABI v2fp", /* for FPU */
2452 "AABI",
2453 "ABI2 FP+"
2454 };
2455 static const char *VER_STRINGS[] =
2456 {
2457 "Andes ELF V1.3 or older",
2458 "Andes ELF V1.3.1",
2459 "Andes ELF V1.4"
2460 };
2461 static const char *ARCH_STRINGS[] =
2462 {
2463 "",
2464 "Andes Star v1.0",
2465 "Andes Star v2.0",
2466 "Andes Star v3.0",
2467 "Andes Star v3.0m"
2468 };
2469
2470 abi = EF_NDS_ABI & e_flags;
2471 arch = EF_NDS_ARCH & e_flags;
2472 config = EF_NDS_INST & e_flags;
2473 version = EF_NDS32_ELF_VERSION & e_flags;
2474
2475 memset (buf, 0, size);
2476
2477 switch (abi)
2478 {
2479 case E_NDS_ABI_V0:
2480 case E_NDS_ABI_V1:
2481 case E_NDS_ABI_V2:
2482 case E_NDS_ABI_V2FP:
2483 case E_NDS_ABI_AABI:
2484 case E_NDS_ABI_V2FP_PLUS:
2485 /* In case there are holes in the array. */
2486 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2487 break;
2488
2489 default:
2490 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2491 break;
2492 }
2493
2494 switch (version)
2495 {
2496 case E_NDS32_ELF_VER_1_2:
2497 case E_NDS32_ELF_VER_1_3:
2498 case E_NDS32_ELF_VER_1_4:
2499 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2500 break;
2501
2502 default:
2503 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2504 break;
2505 }
2506
2507 if (E_NDS_ABI_V0 == abi)
2508 {
2509 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2510 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2511 if (arch == E_NDS_ARCH_STAR_V1_0)
2512 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2513 return;
2514 }
2515
2516 switch (arch)
2517 {
2518 case E_NDS_ARCH_STAR_V1_0:
2519 case E_NDS_ARCH_STAR_V2_0:
2520 case E_NDS_ARCH_STAR_V3_0:
2521 case E_NDS_ARCH_STAR_V3_M:
2522 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2523 break;
2524
2525 default:
2526 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2527 /* ARCH version determines how the e_flags are interpreted.
2528 If it is unknown, we cannot proceed. */
2529 return;
2530 }
2531
2532 /* Newer ABI; Now handle architecture specific flags. */
2533 if (arch == E_NDS_ARCH_STAR_V1_0)
2534 {
2535 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2536 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2537
2538 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2539 r += snprintf (buf + r, size -r, ", MAC");
2540
2541 if (config & E_NDS32_HAS_DIV_INST)
2542 r += snprintf (buf + r, size -r, ", DIV");
2543
2544 if (config & E_NDS32_HAS_16BIT_INST)
2545 r += snprintf (buf + r, size -r, ", 16b");
2546 }
2547 else
2548 {
2549 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2550 {
2551 if (version <= E_NDS32_ELF_VER_1_3)
2552 r += snprintf (buf + r, size -r, ", [B8]");
2553 else
2554 r += snprintf (buf + r, size -r, ", EX9");
2555 }
2556
2557 if (config & E_NDS32_HAS_MAC_DX_INST)
2558 r += snprintf (buf + r, size -r, ", MAC_DX");
2559
2560 if (config & E_NDS32_HAS_DIV_DX_INST)
2561 r += snprintf (buf + r, size -r, ", DIV_DX");
2562
2563 if (config & E_NDS32_HAS_16BIT_INST)
2564 {
2565 if (version <= E_NDS32_ELF_VER_1_3)
2566 r += snprintf (buf + r, size -r, ", 16b");
2567 else
2568 r += snprintf (buf + r, size -r, ", IFC");
2569 }
2570 }
2571
2572 if (config & E_NDS32_HAS_EXT_INST)
2573 r += snprintf (buf + r, size -r, ", PERF1");
2574
2575 if (config & E_NDS32_HAS_EXT2_INST)
2576 r += snprintf (buf + r, size -r, ", PERF2");
2577
2578 if (config & E_NDS32_HAS_FPU_INST)
2579 {
2580 has_fpu = 1;
2581 r += snprintf (buf + r, size -r, ", FPU_SP");
2582 }
2583
2584 if (config & E_NDS32_HAS_FPU_DP_INST)
2585 {
2586 has_fpu = 1;
2587 r += snprintf (buf + r, size -r, ", FPU_DP");
2588 }
2589
2590 if (config & E_NDS32_HAS_FPU_MAC_INST)
2591 {
2592 has_fpu = 1;
2593 r += snprintf (buf + r, size -r, ", FPU_MAC");
2594 }
2595
2596 if (has_fpu)
2597 {
2598 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2599 {
2600 case E_NDS32_FPU_REG_8SP_4DP:
2601 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2602 break;
2603 case E_NDS32_FPU_REG_16SP_8DP:
2604 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2605 break;
2606 case E_NDS32_FPU_REG_32SP_16DP:
2607 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2608 break;
2609 case E_NDS32_FPU_REG_32SP_32DP:
2610 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2611 break;
2612 }
2613 }
2614
2615 if (config & E_NDS32_HAS_AUDIO_INST)
2616 r += snprintf (buf + r, size -r, ", AUDIO");
2617
2618 if (config & E_NDS32_HAS_STRING_INST)
2619 r += snprintf (buf + r, size -r, ", STR");
2620
2621 if (config & E_NDS32_HAS_REDUCED_REGS)
2622 r += snprintf (buf + r, size -r, ", 16REG");
2623
2624 if (config & E_NDS32_HAS_VIDEO_INST)
2625 {
2626 if (version <= E_NDS32_ELF_VER_1_3)
2627 r += snprintf (buf + r, size -r, ", VIDEO");
2628 else
2629 r += snprintf (buf + r, size -r, ", SATURATION");
2630 }
2631
2632 if (config & E_NDS32_HAS_ENCRIPT_INST)
2633 r += snprintf (buf + r, size -r, ", ENCRP");
2634
2635 if (config & E_NDS32_HAS_L2C_INST)
2636 r += snprintf (buf + r, size -r, ", L2C");
2637 }
2638
2639 static char *
2640 get_machine_flags (unsigned e_flags, unsigned e_machine)
2641 {
2642 static char buf[1024];
2643
2644 buf[0] = '\0';
2645
2646 if (e_flags)
2647 {
2648 switch (e_machine)
2649 {
2650 default:
2651 break;
2652
2653 case EM_ARM:
2654 decode_ARM_machine_flags (e_flags, buf);
2655 break;
2656
2657 case EM_BLACKFIN:
2658 if (e_flags & EF_BFIN_PIC)
2659 strcat (buf, ", PIC");
2660
2661 if (e_flags & EF_BFIN_FDPIC)
2662 strcat (buf, ", FDPIC");
2663
2664 if (e_flags & EF_BFIN_CODE_IN_L1)
2665 strcat (buf, ", code in L1");
2666
2667 if (e_flags & EF_BFIN_DATA_IN_L1)
2668 strcat (buf, ", data in L1");
2669
2670 break;
2671
2672 case EM_CYGNUS_FRV:
2673 switch (e_flags & EF_FRV_CPU_MASK)
2674 {
2675 case EF_FRV_CPU_GENERIC:
2676 break;
2677
2678 default:
2679 strcat (buf, ", fr???");
2680 break;
2681
2682 case EF_FRV_CPU_FR300:
2683 strcat (buf, ", fr300");
2684 break;
2685
2686 case EF_FRV_CPU_FR400:
2687 strcat (buf, ", fr400");
2688 break;
2689 case EF_FRV_CPU_FR405:
2690 strcat (buf, ", fr405");
2691 break;
2692
2693 case EF_FRV_CPU_FR450:
2694 strcat (buf, ", fr450");
2695 break;
2696
2697 case EF_FRV_CPU_FR500:
2698 strcat (buf, ", fr500");
2699 break;
2700 case EF_FRV_CPU_FR550:
2701 strcat (buf, ", fr550");
2702 break;
2703
2704 case EF_FRV_CPU_SIMPLE:
2705 strcat (buf, ", simple");
2706 break;
2707 case EF_FRV_CPU_TOMCAT:
2708 strcat (buf, ", tomcat");
2709 break;
2710 }
2711 break;
2712
2713 case EM_68K:
2714 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2715 strcat (buf, ", m68000");
2716 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2717 strcat (buf, ", cpu32");
2718 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2719 strcat (buf, ", fido_a");
2720 else
2721 {
2722 char const * isa = _("unknown");
2723 char const * mac = _("unknown mac");
2724 char const * additional = NULL;
2725
2726 switch (e_flags & EF_M68K_CF_ISA_MASK)
2727 {
2728 case EF_M68K_CF_ISA_A_NODIV:
2729 isa = "A";
2730 additional = ", nodiv";
2731 break;
2732 case EF_M68K_CF_ISA_A:
2733 isa = "A";
2734 break;
2735 case EF_M68K_CF_ISA_A_PLUS:
2736 isa = "A+";
2737 break;
2738 case EF_M68K_CF_ISA_B_NOUSP:
2739 isa = "B";
2740 additional = ", nousp";
2741 break;
2742 case EF_M68K_CF_ISA_B:
2743 isa = "B";
2744 break;
2745 case EF_M68K_CF_ISA_C:
2746 isa = "C";
2747 break;
2748 case EF_M68K_CF_ISA_C_NODIV:
2749 isa = "C";
2750 additional = ", nodiv";
2751 break;
2752 }
2753 strcat (buf, ", cf, isa ");
2754 strcat (buf, isa);
2755 if (additional)
2756 strcat (buf, additional);
2757 if (e_flags & EF_M68K_CF_FLOAT)
2758 strcat (buf, ", float");
2759 switch (e_flags & EF_M68K_CF_MAC_MASK)
2760 {
2761 case 0:
2762 mac = NULL;
2763 break;
2764 case EF_M68K_CF_MAC:
2765 mac = "mac";
2766 break;
2767 case EF_M68K_CF_EMAC:
2768 mac = "emac";
2769 break;
2770 case EF_M68K_CF_EMAC_B:
2771 mac = "emac_b";
2772 break;
2773 }
2774 if (mac)
2775 {
2776 strcat (buf, ", ");
2777 strcat (buf, mac);
2778 }
2779 }
2780 break;
2781
2782 case EM_PPC:
2783 if (e_flags & EF_PPC_EMB)
2784 strcat (buf, ", emb");
2785
2786 if (e_flags & EF_PPC_RELOCATABLE)
2787 strcat (buf, _(", relocatable"));
2788
2789 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2790 strcat (buf, _(", relocatable-lib"));
2791 break;
2792
2793 case EM_PPC64:
2794 if (e_flags & EF_PPC64_ABI)
2795 {
2796 char abi[] = ", abiv0";
2797
2798 abi[6] += e_flags & EF_PPC64_ABI;
2799 strcat (buf, abi);
2800 }
2801 break;
2802
2803 case EM_V800:
2804 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2805 strcat (buf, ", RH850 ABI");
2806
2807 if (e_flags & EF_V800_850E3)
2808 strcat (buf, ", V3 architecture");
2809
2810 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2811 strcat (buf, ", FPU not used");
2812
2813 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2814 strcat (buf, ", regmode: COMMON");
2815
2816 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2817 strcat (buf, ", r4 not used");
2818
2819 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2820 strcat (buf, ", r30 not used");
2821
2822 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2823 strcat (buf, ", r5 not used");
2824
2825 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2826 strcat (buf, ", r2 not used");
2827
2828 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2829 {
2830 switch (e_flags & - e_flags)
2831 {
2832 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2833 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2834 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2835 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2836 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2837 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2838 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2839 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2840 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2841 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2842 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2843 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2844 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2845 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2846 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2847 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2848 default: break;
2849 }
2850 }
2851 break;
2852
2853 case EM_V850:
2854 case EM_CYGNUS_V850:
2855 switch (e_flags & EF_V850_ARCH)
2856 {
2857 case E_V850E3V5_ARCH:
2858 strcat (buf, ", v850e3v5");
2859 break;
2860 case E_V850E2V3_ARCH:
2861 strcat (buf, ", v850e2v3");
2862 break;
2863 case E_V850E2_ARCH:
2864 strcat (buf, ", v850e2");
2865 break;
2866 case E_V850E1_ARCH:
2867 strcat (buf, ", v850e1");
2868 break;
2869 case E_V850E_ARCH:
2870 strcat (buf, ", v850e");
2871 break;
2872 case E_V850_ARCH:
2873 strcat (buf, ", v850");
2874 break;
2875 default:
2876 strcat (buf, _(", unknown v850 architecture variant"));
2877 break;
2878 }
2879 break;
2880
2881 case EM_M32R:
2882 case EM_CYGNUS_M32R:
2883 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2884 strcat (buf, ", m32r");
2885 break;
2886
2887 case EM_MIPS:
2888 case EM_MIPS_RS3_LE:
2889 if (e_flags & EF_MIPS_NOREORDER)
2890 strcat (buf, ", noreorder");
2891
2892 if (e_flags & EF_MIPS_PIC)
2893 strcat (buf, ", pic");
2894
2895 if (e_flags & EF_MIPS_CPIC)
2896 strcat (buf, ", cpic");
2897
2898 if (e_flags & EF_MIPS_UCODE)
2899 strcat (buf, ", ugen_reserved");
2900
2901 if (e_flags & EF_MIPS_ABI2)
2902 strcat (buf, ", abi2");
2903
2904 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2905 strcat (buf, ", odk first");
2906
2907 if (e_flags & EF_MIPS_32BITMODE)
2908 strcat (buf, ", 32bitmode");
2909
2910 if (e_flags & EF_MIPS_NAN2008)
2911 strcat (buf, ", nan2008");
2912
2913 if (e_flags & EF_MIPS_FP64)
2914 strcat (buf, ", fp64");
2915
2916 switch ((e_flags & EF_MIPS_MACH))
2917 {
2918 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2919 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2920 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2921 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2922 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2923 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2924 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2925 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2926 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2927 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2928 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2929 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2930 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2931 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2932 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2933 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2934 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2935 case 0:
2936 /* We simply ignore the field in this case to avoid confusion:
2937 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2938 extension. */
2939 break;
2940 default: strcat (buf, _(", unknown CPU")); break;
2941 }
2942
2943 switch ((e_flags & EF_MIPS_ABI))
2944 {
2945 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2946 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2947 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2948 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2949 case 0:
2950 /* We simply ignore the field in this case to avoid confusion:
2951 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2952 This means it is likely to be an o32 file, but not for
2953 sure. */
2954 break;
2955 default: strcat (buf, _(", unknown ABI")); break;
2956 }
2957
2958 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2959 strcat (buf, ", mdmx");
2960
2961 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2962 strcat (buf, ", mips16");
2963
2964 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2965 strcat (buf, ", micromips");
2966
2967 switch ((e_flags & EF_MIPS_ARCH))
2968 {
2969 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2970 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2971 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2972 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2973 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2974 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2975 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2976 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
2977 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2978 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2979 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2980 default: strcat (buf, _(", unknown ISA")); break;
2981 }
2982 break;
2983
2984 case EM_NDS32:
2985 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2986 break;
2987
2988 case EM_SH:
2989 switch ((e_flags & EF_SH_MACH_MASK))
2990 {
2991 case EF_SH1: strcat (buf, ", sh1"); break;
2992 case EF_SH2: strcat (buf, ", sh2"); break;
2993 case EF_SH3: strcat (buf, ", sh3"); break;
2994 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2995 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2996 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2997 case EF_SH3E: strcat (buf, ", sh3e"); break;
2998 case EF_SH4: strcat (buf, ", sh4"); break;
2999 case EF_SH5: strcat (buf, ", sh5"); break;
3000 case EF_SH2E: strcat (buf, ", sh2e"); break;
3001 case EF_SH4A: strcat (buf, ", sh4a"); break;
3002 case EF_SH2A: strcat (buf, ", sh2a"); break;
3003 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3004 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3005 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3006 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3007 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3008 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3009 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3010 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3011 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3012 default: strcat (buf, _(", unknown ISA")); break;
3013 }
3014
3015 if (e_flags & EF_SH_PIC)
3016 strcat (buf, ", pic");
3017
3018 if (e_flags & EF_SH_FDPIC)
3019 strcat (buf, ", fdpic");
3020 break;
3021
3022 case EM_OR1K:
3023 if (e_flags & EF_OR1K_NODELAY)
3024 strcat (buf, ", no delay");
3025 break;
3026
3027 case EM_SPARCV9:
3028 if (e_flags & EF_SPARC_32PLUS)
3029 strcat (buf, ", v8+");
3030
3031 if (e_flags & EF_SPARC_SUN_US1)
3032 strcat (buf, ", ultrasparcI");
3033
3034 if (e_flags & EF_SPARC_SUN_US3)
3035 strcat (buf, ", ultrasparcIII");
3036
3037 if (e_flags & EF_SPARC_HAL_R1)
3038 strcat (buf, ", halr1");
3039
3040 if (e_flags & EF_SPARC_LEDATA)
3041 strcat (buf, ", ledata");
3042
3043 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3044 strcat (buf, ", tso");
3045
3046 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3047 strcat (buf, ", pso");
3048
3049 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3050 strcat (buf, ", rmo");
3051 break;
3052
3053 case EM_PARISC:
3054 switch (e_flags & EF_PARISC_ARCH)
3055 {
3056 case EFA_PARISC_1_0:
3057 strcpy (buf, ", PA-RISC 1.0");
3058 break;
3059 case EFA_PARISC_1_1:
3060 strcpy (buf, ", PA-RISC 1.1");
3061 break;
3062 case EFA_PARISC_2_0:
3063 strcpy (buf, ", PA-RISC 2.0");
3064 break;
3065 default:
3066 break;
3067 }
3068 if (e_flags & EF_PARISC_TRAPNIL)
3069 strcat (buf, ", trapnil");
3070 if (e_flags & EF_PARISC_EXT)
3071 strcat (buf, ", ext");
3072 if (e_flags & EF_PARISC_LSB)
3073 strcat (buf, ", lsb");
3074 if (e_flags & EF_PARISC_WIDE)
3075 strcat (buf, ", wide");
3076 if (e_flags & EF_PARISC_NO_KABP)
3077 strcat (buf, ", no kabp");
3078 if (e_flags & EF_PARISC_LAZYSWAP)
3079 strcat (buf, ", lazyswap");
3080 break;
3081
3082 case EM_PJ:
3083 case EM_PJ_OLD:
3084 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3085 strcat (buf, ", new calling convention");
3086
3087 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3088 strcat (buf, ", gnu calling convention");
3089 break;
3090
3091 case EM_IA_64:
3092 if ((e_flags & EF_IA_64_ABI64))
3093 strcat (buf, ", 64-bit");
3094 else
3095 strcat (buf, ", 32-bit");
3096 if ((e_flags & EF_IA_64_REDUCEDFP))
3097 strcat (buf, ", reduced fp model");
3098 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3099 strcat (buf, ", no function descriptors, constant gp");
3100 else if ((e_flags & EF_IA_64_CONS_GP))
3101 strcat (buf, ", constant gp");
3102 if ((e_flags & EF_IA_64_ABSOLUTE))
3103 strcat (buf, ", absolute");
3104 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3105 {
3106 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3107 strcat (buf, ", vms_linkages");
3108 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3109 {
3110 case EF_IA_64_VMS_COMCOD_SUCCESS:
3111 break;
3112 case EF_IA_64_VMS_COMCOD_WARNING:
3113 strcat (buf, ", warning");
3114 break;
3115 case EF_IA_64_VMS_COMCOD_ERROR:
3116 strcat (buf, ", error");
3117 break;
3118 case EF_IA_64_VMS_COMCOD_ABORT:
3119 strcat (buf, ", abort");
3120 break;
3121 default:
3122 abort ();
3123 }
3124 }
3125 break;
3126
3127 case EM_VAX:
3128 if ((e_flags & EF_VAX_NONPIC))
3129 strcat (buf, ", non-PIC");
3130 if ((e_flags & EF_VAX_DFLOAT))
3131 strcat (buf, ", D-Float");
3132 if ((e_flags & EF_VAX_GFLOAT))
3133 strcat (buf, ", G-Float");
3134 break;
3135
3136 case EM_RL78:
3137 if (e_flags & E_FLAG_RL78_G10)
3138 strcat (buf, ", G10");
3139 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3140 strcat (buf, ", 64-bit doubles");
3141 break;
3142
3143 case EM_RX:
3144 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3145 strcat (buf, ", 64-bit doubles");
3146 if (e_flags & E_FLAG_RX_DSP)
3147 strcat (buf, ", dsp");
3148 if (e_flags & E_FLAG_RX_PID)
3149 strcat (buf, ", pid");
3150 if (e_flags & E_FLAG_RX_ABI)
3151 strcat (buf, ", RX ABI");
3152 break;
3153
3154 case EM_S390:
3155 if (e_flags & EF_S390_HIGH_GPRS)
3156 strcat (buf, ", highgprs");
3157 break;
3158
3159 case EM_TI_C6000:
3160 if ((e_flags & EF_C6000_REL))
3161 strcat (buf, ", relocatable module");
3162 break;
3163
3164 case EM_MSP430:
3165 strcat (buf, _(": architecture variant: "));
3166 switch (e_flags & EF_MSP430_MACH)
3167 {
3168 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3169 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3170 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3171 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3172 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3173 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3174 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3175 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3176 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3177 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3178 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3179 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3180 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3181 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3182 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3183 default:
3184 strcat (buf, _(": unknown")); break;
3185 }
3186
3187 if (e_flags & ~ EF_MSP430_MACH)
3188 strcat (buf, _(": unknown extra flag bits also present"));
3189 }
3190 }
3191
3192 return buf;
3193 }
3194
3195 static const char *
3196 get_osabi_name (unsigned int osabi)
3197 {
3198 static char buff[32];
3199
3200 switch (osabi)
3201 {
3202 case ELFOSABI_NONE: return "UNIX - System V";
3203 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3204 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3205 case ELFOSABI_GNU: return "UNIX - GNU";
3206 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3207 case ELFOSABI_AIX: return "UNIX - AIX";
3208 case ELFOSABI_IRIX: return "UNIX - IRIX";
3209 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3210 case ELFOSABI_TRU64: return "UNIX - TRU64";
3211 case ELFOSABI_MODESTO: return "Novell - Modesto";
3212 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3213 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3214 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3215 case ELFOSABI_AROS: return "AROS";
3216 case ELFOSABI_FENIXOS: return "FenixOS";
3217 default:
3218 if (osabi >= 64)
3219 switch (elf_header.e_machine)
3220 {
3221 case EM_ARM:
3222 switch (osabi)
3223 {
3224 case ELFOSABI_ARM: return "ARM";
3225 default:
3226 break;
3227 }
3228 break;
3229
3230 case EM_MSP430:
3231 case EM_MSP430_OLD:
3232 switch (osabi)
3233 {
3234 case ELFOSABI_STANDALONE: return _("Standalone App");
3235 default:
3236 break;
3237 }
3238 break;
3239
3240 case EM_TI_C6000:
3241 switch (osabi)
3242 {
3243 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3244 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3245 default:
3246 break;
3247 }
3248 break;
3249
3250 default:
3251 break;
3252 }
3253 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3254 return buff;
3255 }
3256 }
3257
3258 static const char *
3259 get_aarch64_segment_type (unsigned long type)
3260 {
3261 switch (type)
3262 {
3263 case PT_AARCH64_ARCHEXT:
3264 return "AARCH64_ARCHEXT";
3265 default:
3266 break;
3267 }
3268
3269 return NULL;
3270 }
3271
3272 static const char *
3273 get_arm_segment_type (unsigned long type)
3274 {
3275 switch (type)
3276 {
3277 case PT_ARM_EXIDX:
3278 return "EXIDX";
3279 default:
3280 break;
3281 }
3282
3283 return NULL;
3284 }
3285
3286 static const char *
3287 get_mips_segment_type (unsigned long type)
3288 {
3289 switch (type)
3290 {
3291 case PT_MIPS_REGINFO:
3292 return "REGINFO";
3293 case PT_MIPS_RTPROC:
3294 return "RTPROC";
3295 case PT_MIPS_OPTIONS:
3296 return "OPTIONS";
3297 case PT_MIPS_ABIFLAGS:
3298 return "ABIFLAGS";
3299 default:
3300 break;
3301 }
3302
3303 return NULL;
3304 }
3305
3306 static const char *
3307 get_parisc_segment_type (unsigned long type)
3308 {
3309 switch (type)
3310 {
3311 case PT_HP_TLS: return "HP_TLS";
3312 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3313 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3314 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3315 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3316 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3317 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3318 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3319 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3320 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3321 case PT_HP_PARALLEL: return "HP_PARALLEL";
3322 case PT_HP_FASTBIND: return "HP_FASTBIND";
3323 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3324 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3325 case PT_HP_STACK: return "HP_STACK";
3326 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3327 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3328 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3329 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3330 default:
3331 break;
3332 }
3333
3334 return NULL;
3335 }
3336
3337 static const char *
3338 get_ia64_segment_type (unsigned long type)
3339 {
3340 switch (type)
3341 {
3342 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3343 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3344 case PT_HP_TLS: return "HP_TLS";
3345 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3346 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3347 case PT_IA_64_HP_STACK: return "HP_STACK";
3348 default:
3349 break;
3350 }
3351
3352 return NULL;
3353 }
3354
3355 static const char *
3356 get_tic6x_segment_type (unsigned long type)
3357 {
3358 switch (type)
3359 {
3360 case PT_C6000_PHATTR: return "C6000_PHATTR";
3361 default:
3362 break;
3363 }
3364
3365 return NULL;
3366 }
3367
3368 static const char *
3369 get_segment_type (unsigned long p_type)
3370 {
3371 static char buff[32];
3372
3373 switch (p_type)
3374 {
3375 case PT_NULL: return "NULL";
3376 case PT_LOAD: return "LOAD";
3377 case PT_DYNAMIC: return "DYNAMIC";
3378 case PT_INTERP: return "INTERP";
3379 case PT_NOTE: return "NOTE";
3380 case PT_SHLIB: return "SHLIB";
3381 case PT_PHDR: return "PHDR";
3382 case PT_TLS: return "TLS";
3383
3384 case PT_GNU_EH_FRAME:
3385 return "GNU_EH_FRAME";
3386 case PT_GNU_STACK: return "GNU_STACK";
3387 case PT_GNU_RELRO: return "GNU_RELRO";
3388
3389 default:
3390 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3391 {
3392 const char * result;
3393
3394 switch (elf_header.e_machine)
3395 {
3396 case EM_AARCH64:
3397 result = get_aarch64_segment_type (p_type);
3398 break;
3399 case EM_ARM:
3400 result = get_arm_segment_type (p_type);
3401 break;
3402 case EM_MIPS:
3403 case EM_MIPS_RS3_LE:
3404 result = get_mips_segment_type (p_type);
3405 break;
3406 case EM_PARISC:
3407 result = get_parisc_segment_type (p_type);
3408 break;
3409 case EM_IA_64:
3410 result = get_ia64_segment_type (p_type);
3411 break;
3412 case EM_TI_C6000:
3413 result = get_tic6x_segment_type (p_type);
3414 break;
3415 default:
3416 result = NULL;
3417 break;
3418 }
3419
3420 if (result != NULL)
3421 return result;
3422
3423 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3424 }
3425 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3426 {
3427 const char * result;
3428
3429 switch (elf_header.e_machine)
3430 {
3431 case EM_PARISC:
3432 result = get_parisc_segment_type (p_type);
3433 break;
3434 case EM_IA_64:
3435 result = get_ia64_segment_type (p_type);
3436 break;
3437 default:
3438 result = NULL;
3439 break;
3440 }
3441
3442 if (result != NULL)
3443 return result;
3444
3445 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3446 }
3447 else
3448 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3449
3450 return buff;
3451 }
3452 }
3453
3454 static const char *
3455 get_mips_section_type_name (unsigned int sh_type)
3456 {
3457 switch (sh_type)
3458 {
3459 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3460 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3461 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3462 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3463 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3464 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3465 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3466 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3467 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3468 case SHT_MIPS_RELD: return "MIPS_RELD";
3469 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3470 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3471 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3472 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3473 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3474 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3475 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3476 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3477 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3478 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3479 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3480 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3481 case SHT_MIPS_LINE: return "MIPS_LINE";
3482 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3483 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3484 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3485 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3486 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3487 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3488 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3489 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3490 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3491 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3492 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3493 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3494 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3495 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3496 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3497 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3498 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3499 default:
3500 break;
3501 }
3502 return NULL;
3503 }
3504
3505 static const char *
3506 get_parisc_section_type_name (unsigned int sh_type)
3507 {
3508 switch (sh_type)
3509 {
3510 case SHT_PARISC_EXT: return "PARISC_EXT";
3511 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3512 case SHT_PARISC_DOC: return "PARISC_DOC";
3513 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3514 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3515 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3516 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3517 default:
3518 break;
3519 }
3520 return NULL;
3521 }
3522
3523 static const char *
3524 get_ia64_section_type_name (unsigned int sh_type)
3525 {
3526 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3527 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3528 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3529
3530 switch (sh_type)
3531 {
3532 case SHT_IA_64_EXT: return "IA_64_EXT";
3533 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3534 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3535 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3536 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3537 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3538 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3539 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3540 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3541 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3542 default:
3543 break;
3544 }
3545 return NULL;
3546 }
3547
3548 static const char *
3549 get_x86_64_section_type_name (unsigned int sh_type)
3550 {
3551 switch (sh_type)
3552 {
3553 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3554 default:
3555 break;
3556 }
3557 return NULL;
3558 }
3559
3560 static const char *
3561 get_aarch64_section_type_name (unsigned int sh_type)
3562 {
3563 switch (sh_type)
3564 {
3565 case SHT_AARCH64_ATTRIBUTES:
3566 return "AARCH64_ATTRIBUTES";
3567 default:
3568 break;
3569 }
3570 return NULL;
3571 }
3572
3573 static const char *
3574 get_arm_section_type_name (unsigned int sh_type)
3575 {
3576 switch (sh_type)
3577 {
3578 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3579 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3580 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3581 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3582 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3583 default:
3584 break;
3585 }
3586 return NULL;
3587 }
3588
3589 static const char *
3590 get_tic6x_section_type_name (unsigned int sh_type)
3591 {
3592 switch (sh_type)
3593 {
3594 case SHT_C6000_UNWIND:
3595 return "C6000_UNWIND";
3596 case SHT_C6000_PREEMPTMAP:
3597 return "C6000_PREEMPTMAP";
3598 case SHT_C6000_ATTRIBUTES:
3599 return "C6000_ATTRIBUTES";
3600 case SHT_TI_ICODE:
3601 return "TI_ICODE";
3602 case SHT_TI_XREF:
3603 return "TI_XREF";
3604 case SHT_TI_HANDLER:
3605 return "TI_HANDLER";
3606 case SHT_TI_INITINFO:
3607 return "TI_INITINFO";
3608 case SHT_TI_PHATTRS:
3609 return "TI_PHATTRS";
3610 default:
3611 break;
3612 }
3613 return NULL;
3614 }
3615
3616 static const char *
3617 get_msp430x_section_type_name (unsigned int sh_type)
3618 {
3619 switch (sh_type)
3620 {
3621 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3622 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3623 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3624 default: return NULL;
3625 }
3626 }
3627
3628 static const char *
3629 get_section_type_name (unsigned int sh_type)
3630 {
3631 static char buff[32];
3632
3633 switch (sh_type)
3634 {
3635 case SHT_NULL: return "NULL";
3636 case SHT_PROGBITS: return "PROGBITS";
3637 case SHT_SYMTAB: return "SYMTAB";
3638 case SHT_STRTAB: return "STRTAB";
3639 case SHT_RELA: return "RELA";
3640 case SHT_HASH: return "HASH";
3641 case SHT_DYNAMIC: return "DYNAMIC";
3642 case SHT_NOTE: return "NOTE";
3643 case SHT_NOBITS: return "NOBITS";
3644 case SHT_REL: return "REL";
3645 case SHT_SHLIB: return "SHLIB";
3646 case SHT_DYNSYM: return "DYNSYM";
3647 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3648 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3649 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3650 case SHT_GNU_HASH: return "GNU_HASH";
3651 case SHT_GROUP: return "GROUP";
3652 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3653 case SHT_GNU_verdef: return "VERDEF";
3654 case SHT_GNU_verneed: return "VERNEED";
3655 case SHT_GNU_versym: return "VERSYM";
3656 case 0x6ffffff0: return "VERSYM";
3657 case 0x6ffffffc: return "VERDEF";
3658 case 0x7ffffffd: return "AUXILIARY";
3659 case 0x7fffffff: return "FILTER";
3660 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3661
3662 default:
3663 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3664 {
3665 const char * result;
3666
3667 switch (elf_header.e_machine)
3668 {
3669 case EM_MIPS:
3670 case EM_MIPS_RS3_LE:
3671 result = get_mips_section_type_name (sh_type);
3672 break;
3673 case EM_PARISC:
3674 result = get_parisc_section_type_name (sh_type);
3675 break;
3676 case EM_IA_64:
3677 result = get_ia64_section_type_name (sh_type);
3678 break;
3679 case EM_X86_64:
3680 case EM_L1OM:
3681 case EM_K1OM:
3682 result = get_x86_64_section_type_name (sh_type);
3683 break;
3684 case EM_AARCH64:
3685 result = get_aarch64_section_type_name (sh_type);
3686 break;
3687 case EM_ARM:
3688 result = get_arm_section_type_name (sh_type);
3689 break;
3690 case EM_TI_C6000:
3691 result = get_tic6x_section_type_name (sh_type);
3692 break;
3693 case EM_MSP430:
3694 result = get_msp430x_section_type_name (sh_type);
3695 break;
3696 default:
3697 result = NULL;
3698 break;
3699 }
3700
3701 if (result != NULL)
3702 return result;
3703
3704 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3705 }
3706 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3707 {
3708 const char * result;
3709
3710 switch (elf_header.e_machine)
3711 {
3712 case EM_IA_64:
3713 result = get_ia64_section_type_name (sh_type);
3714 break;
3715 default:
3716 result = NULL;
3717 break;
3718 }
3719
3720 if (result != NULL)
3721 return result;
3722
3723 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3724 }
3725 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3726 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3727 else
3728 /* This message is probably going to be displayed in a 15
3729 character wide field, so put the hex value first. */
3730 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3731
3732 return buff;
3733 }
3734 }
3735
3736 #define OPTION_DEBUG_DUMP 512
3737 #define OPTION_DYN_SYMS 513
3738 #define OPTION_DWARF_DEPTH 514
3739 #define OPTION_DWARF_START 515
3740 #define OPTION_DWARF_CHECK 516
3741
3742 static struct option options[] =
3743 {
3744 {"all", no_argument, 0, 'a'},
3745 {"file-header", no_argument, 0, 'h'},
3746 {"program-headers", no_argument, 0, 'l'},
3747 {"headers", no_argument, 0, 'e'},
3748 {"histogram", no_argument, 0, 'I'},
3749 {"segments", no_argument, 0, 'l'},
3750 {"sections", no_argument, 0, 'S'},
3751 {"section-headers", no_argument, 0, 'S'},
3752 {"section-groups", no_argument, 0, 'g'},
3753 {"section-details", no_argument, 0, 't'},
3754 {"full-section-name",no_argument, 0, 'N'},
3755 {"symbols", no_argument, 0, 's'},
3756 {"syms", no_argument, 0, 's'},
3757 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3758 {"relocs", no_argument, 0, 'r'},
3759 {"notes", no_argument, 0, 'n'},
3760 {"dynamic", no_argument, 0, 'd'},
3761 {"arch-specific", no_argument, 0, 'A'},
3762 {"version-info", no_argument, 0, 'V'},
3763 {"use-dynamic", no_argument, 0, 'D'},
3764 {"unwind", no_argument, 0, 'u'},
3765 {"archive-index", no_argument, 0, 'c'},
3766 {"hex-dump", required_argument, 0, 'x'},
3767 {"relocated-dump", required_argument, 0, 'R'},
3768 {"string-dump", required_argument, 0, 'p'},
3769 #ifdef SUPPORT_DISASSEMBLY
3770 {"instruction-dump", required_argument, 0, 'i'},
3771 #endif
3772 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3773
3774 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3775 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3776 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3777
3778 {"version", no_argument, 0, 'v'},
3779 {"wide", no_argument, 0, 'W'},
3780 {"help", no_argument, 0, 'H'},
3781 {0, no_argument, 0, 0}
3782 };
3783
3784 static void
3785 usage (FILE * stream)
3786 {
3787 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3788 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3789 fprintf (stream, _(" Options are:\n\
3790 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3791 -h --file-header Display the ELF file header\n\
3792 -l --program-headers Display the program headers\n\
3793 --segments An alias for --program-headers\n\
3794 -S --section-headers Display the sections' header\n\
3795 --sections An alias for --section-headers\n\
3796 -g --section-groups Display the section groups\n\
3797 -t --section-details Display the section details\n\
3798 -e --headers Equivalent to: -h -l -S\n\
3799 -s --syms Display the symbol table\n\
3800 --symbols An alias for --syms\n\
3801 --dyn-syms Display the dynamic symbol table\n\
3802 -n --notes Display the core notes (if present)\n\
3803 -r --relocs Display the relocations (if present)\n\
3804 -u --unwind Display the unwind info (if present)\n\
3805 -d --dynamic Display the dynamic section (if present)\n\
3806 -V --version-info Display the version sections (if present)\n\
3807 -A --arch-specific Display architecture specific information (if any)\n\
3808 -c --archive-index Display the symbol/file index in an archive\n\
3809 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3810 -x --hex-dump=<number|name>\n\
3811 Dump the contents of section <number|name> as bytes\n\
3812 -p --string-dump=<number|name>\n\
3813 Dump the contents of section <number|name> as strings\n\
3814 -R --relocated-dump=<number|name>\n\
3815 Dump the contents of section <number|name> as relocated bytes\n\
3816 -w[lLiaprmfFsoRt] or\n\
3817 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3818 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3819 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3820 =addr,=cu_index]\n\
3821 Display the contents of DWARF2 debug sections\n"));
3822 fprintf (stream, _("\
3823 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3824 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3825 or deeper\n"));
3826 #ifdef SUPPORT_DISASSEMBLY
3827 fprintf (stream, _("\
3828 -i --instruction-dump=<number|name>\n\
3829 Disassemble the contents of section <number|name>\n"));
3830 #endif
3831 fprintf (stream, _("\
3832 -I --histogram Display histogram of bucket list lengths\n\
3833 -W --wide Allow output width to exceed 80 characters\n\
3834 @<file> Read options from <file>\n\
3835 -H --help Display this information\n\
3836 -v --version Display the version number of readelf\n"));
3837
3838 if (REPORT_BUGS_TO[0] && stream == stdout)
3839 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3840
3841 exit (stream == stdout ? 0 : 1);
3842 }
3843
3844 /* Record the fact that the user wants the contents of section number
3845 SECTION to be displayed using the method(s) encoded as flags bits
3846 in TYPE. Note, TYPE can be zero if we are creating the array for
3847 the first time. */
3848
3849 static void
3850 request_dump_bynumber (unsigned int section, dump_type type)
3851 {
3852 if (section >= num_dump_sects)
3853 {
3854 dump_type * new_dump_sects;
3855
3856 new_dump_sects = (dump_type *) calloc (section + 1,
3857 sizeof (* dump_sects));
3858
3859 if (new_dump_sects == NULL)
3860 error (_("Out of memory allocating dump request table.\n"));
3861 else
3862 {
3863 /* Copy current flag settings. */
3864 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3865
3866 free (dump_sects);
3867
3868 dump_sects = new_dump_sects;
3869 num_dump_sects = section + 1;
3870 }
3871 }
3872
3873 if (dump_sects)
3874 dump_sects[section] |= type;
3875
3876 return;
3877 }
3878
3879 /* Request a dump by section name. */
3880
3881 static void
3882 request_dump_byname (const char * section, dump_type type)
3883 {
3884 struct dump_list_entry * new_request;
3885
3886 new_request = (struct dump_list_entry *)
3887 malloc (sizeof (struct dump_list_entry));
3888 if (!new_request)
3889 error (_("Out of memory allocating dump request table.\n"));
3890
3891 new_request->name = strdup (section);
3892 if (!new_request->name)
3893 error (_("Out of memory allocating dump request table.\n"));
3894
3895 new_request->type = type;
3896
3897 new_request->next = dump_sects_byname;
3898 dump_sects_byname = new_request;
3899 }
3900
3901 static inline void
3902 request_dump (dump_type type)
3903 {
3904 int section;
3905 char * cp;
3906
3907 do_dump++;
3908 section = strtoul (optarg, & cp, 0);
3909
3910 if (! *cp && section >= 0)
3911 request_dump_bynumber (section, type);
3912 else
3913 request_dump_byname (optarg, type);
3914 }
3915
3916
3917 static void
3918 parse_args (int argc, char ** argv)
3919 {
3920 int c;
3921
3922 if (argc < 2)
3923 usage (stderr);
3924
3925 while ((c = getopt_long
3926 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3927 {
3928 switch (c)
3929 {
3930 case 0:
3931 /* Long options. */
3932 break;
3933 case 'H':
3934 usage (stdout);
3935 break;
3936
3937 case 'a':
3938 do_syms++;
3939 do_reloc++;
3940 do_unwind++;
3941 do_dynamic++;
3942 do_header++;
3943 do_sections++;
3944 do_section_groups++;
3945 do_segments++;
3946 do_version++;
3947 do_histogram++;
3948 do_arch++;
3949 do_notes++;
3950 break;
3951 case 'g':
3952 do_section_groups++;
3953 break;
3954 case 't':
3955 case 'N':
3956 do_sections++;
3957 do_section_details++;
3958 break;
3959 case 'e':
3960 do_header++;
3961 do_sections++;
3962 do_segments++;
3963 break;
3964 case 'A':
3965 do_arch++;
3966 break;
3967 case 'D':
3968 do_using_dynamic++;
3969 break;
3970 case 'r':
3971 do_reloc++;
3972 break;
3973 case 'u':
3974 do_unwind++;
3975 break;
3976 case 'h':
3977 do_header++;
3978 break;
3979 case 'l':
3980 do_segments++;
3981 break;
3982 case 's':
3983 do_syms++;
3984 break;
3985 case 'S':
3986 do_sections++;
3987 break;
3988 case 'd':
3989 do_dynamic++;
3990 break;
3991 case 'I':
3992 do_histogram++;
3993 break;
3994 case 'n':
3995 do_notes++;
3996 break;
3997 case 'c':
3998 do_archive_index++;
3999 break;
4000 case 'x':
4001 request_dump (HEX_DUMP);
4002 break;
4003 case 'p':
4004 request_dump (STRING_DUMP);
4005 break;
4006 case 'R':
4007 request_dump (RELOC_DUMP);
4008 break;
4009 case 'w':
4010 do_dump++;
4011 if (optarg == 0)
4012 {
4013 do_debugging = 1;
4014 dwarf_select_sections_all ();
4015 }
4016 else
4017 {
4018 do_debugging = 0;
4019 dwarf_select_sections_by_letters (optarg);
4020 }
4021 break;
4022 case OPTION_DEBUG_DUMP:
4023 do_dump++;
4024 if (optarg == 0)
4025 do_debugging = 1;
4026 else
4027 {
4028 do_debugging = 0;
4029 dwarf_select_sections_by_names (optarg);
4030 }
4031 break;
4032 case OPTION_DWARF_DEPTH:
4033 {
4034 char *cp;
4035
4036 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4037 }
4038 break;
4039 case OPTION_DWARF_START:
4040 {
4041 char *cp;
4042
4043 dwarf_start_die = strtoul (optarg, & cp, 0);
4044 }
4045 break;
4046 case OPTION_DWARF_CHECK:
4047 dwarf_check = 1;
4048 break;
4049 case OPTION_DYN_SYMS:
4050 do_dyn_syms++;
4051 break;
4052 #ifdef SUPPORT_DISASSEMBLY
4053 case 'i':
4054 request_dump (DISASS_DUMP);
4055 break;
4056 #endif
4057 case 'v':
4058 print_version (program_name);
4059 break;
4060 case 'V':
4061 do_version++;
4062 break;
4063 case 'W':
4064 do_wide++;
4065 break;
4066 default:
4067 /* xgettext:c-format */
4068 error (_("Invalid option '-%c'\n"), c);
4069 /* Drop through. */
4070 case '?':
4071 usage (stderr);
4072 }
4073 }
4074
4075 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4076 && !do_segments && !do_header && !do_dump && !do_version
4077 && !do_histogram && !do_debugging && !do_arch && !do_notes
4078 && !do_section_groups && !do_archive_index
4079 && !do_dyn_syms)
4080 usage (stderr);
4081 else if (argc < 3)
4082 {
4083 warn (_("Nothing to do.\n"));
4084 usage (stderr);
4085 }
4086 }
4087
4088 static const char *
4089 get_elf_class (unsigned int elf_class)
4090 {
4091 static char buff[32];
4092
4093 switch (elf_class)
4094 {
4095 case ELFCLASSNONE: return _("none");
4096 case ELFCLASS32: return "ELF32";
4097 case ELFCLASS64: return "ELF64";
4098 default:
4099 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4100 return buff;
4101 }
4102 }
4103
4104 static const char *
4105 get_data_encoding (unsigned int encoding)
4106 {
4107 static char buff[32];
4108
4109 switch (encoding)
4110 {
4111 case ELFDATANONE: return _("none");
4112 case ELFDATA2LSB: return _("2's complement, little endian");
4113 case ELFDATA2MSB: return _("2's complement, big endian");
4114 default:
4115 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4116 return buff;
4117 }
4118 }
4119
4120 /* Decode the data held in 'elf_header'. */
4121
4122 static int
4123 process_file_header (void)
4124 {
4125 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4126 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4127 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4128 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4129 {
4130 error
4131 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4132 return 0;
4133 }
4134
4135 init_dwarf_regnames (elf_header.e_machine);
4136
4137 if (do_header)
4138 {
4139 int i;
4140
4141 printf (_("ELF Header:\n"));
4142 printf (_(" Magic: "));
4143 for (i = 0; i < EI_NIDENT; i++)
4144 printf ("%2.2x ", elf_header.e_ident[i]);
4145 printf ("\n");
4146 printf (_(" Class: %s\n"),
4147 get_elf_class (elf_header.e_ident[EI_CLASS]));
4148 printf (_(" Data: %s\n"),
4149 get_data_encoding (elf_header.e_ident[EI_DATA]));
4150 printf (_(" Version: %d %s\n"),
4151 elf_header.e_ident[EI_VERSION],
4152 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4153 ? "(current)"
4154 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4155 ? _("<unknown: %lx>")
4156 : "")));
4157 printf (_(" OS/ABI: %s\n"),
4158 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4159 printf (_(" ABI Version: %d\n"),
4160 elf_header.e_ident[EI_ABIVERSION]);
4161 printf (_(" Type: %s\n"),
4162 get_file_type (elf_header.e_type));
4163 printf (_(" Machine: %s\n"),
4164 get_machine_name (elf_header.e_machine));
4165 printf (_(" Version: 0x%lx\n"),
4166 (unsigned long) elf_header.e_version);
4167
4168 printf (_(" Entry point address: "));
4169 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4170 printf (_("\n Start of program headers: "));
4171 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4172 printf (_(" (bytes into file)\n Start of section headers: "));
4173 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4174 printf (_(" (bytes into file)\n"));
4175
4176 printf (_(" Flags: 0x%lx%s\n"),
4177 (unsigned long) elf_header.e_flags,
4178 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4179 printf (_(" Size of this header: %ld (bytes)\n"),
4180 (long) elf_header.e_ehsize);
4181 printf (_(" Size of program headers: %ld (bytes)\n"),
4182 (long) elf_header.e_phentsize);
4183 printf (_(" Number of program headers: %ld"),
4184 (long) elf_header.e_phnum);
4185 if (section_headers != NULL
4186 && elf_header.e_phnum == PN_XNUM
4187 && section_headers[0].sh_info != 0)
4188 printf (" (%ld)", (long) section_headers[0].sh_info);
4189 putc ('\n', stdout);
4190 printf (_(" Size of section headers: %ld (bytes)\n"),
4191 (long) elf_header.e_shentsize);
4192 printf (_(" Number of section headers: %ld"),
4193 (long) elf_header.e_shnum);
4194 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4195 printf (" (%ld)", (long) section_headers[0].sh_size);
4196 putc ('\n', stdout);
4197 printf (_(" Section header string table index: %ld"),
4198 (long) elf_header.e_shstrndx);
4199 if (section_headers != NULL
4200 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4201 printf (" (%u)", section_headers[0].sh_link);
4202 else if (elf_header.e_shstrndx != SHN_UNDEF
4203 && elf_header.e_shstrndx >= elf_header.e_shnum)
4204 printf (_(" <corrupt: out of range>"));
4205 putc ('\n', stdout);
4206 }
4207
4208 if (section_headers != NULL)
4209 {
4210 if (elf_header.e_phnum == PN_XNUM
4211 && section_headers[0].sh_info != 0)
4212 elf_header.e_phnum = section_headers[0].sh_info;
4213 if (elf_header.e_shnum == SHN_UNDEF)
4214 elf_header.e_shnum = section_headers[0].sh_size;
4215 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4216 elf_header.e_shstrndx = section_headers[0].sh_link;
4217 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4218 elf_header.e_shstrndx = SHN_UNDEF;
4219 free (section_headers);
4220 section_headers = NULL;
4221 }
4222
4223 return 1;
4224 }
4225
4226 static bfd_boolean
4227 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4228 {
4229 Elf32_External_Phdr * phdrs;
4230 Elf32_External_Phdr * external;
4231 Elf_Internal_Phdr * internal;
4232 unsigned int i;
4233 unsigned int size = elf_header.e_phentsize;
4234 unsigned int num = elf_header.e_phnum;
4235
4236 /* PR binutils/17531: Cope with unexpected section header sizes. */
4237 if (size == 0 || num == 0)
4238 return FALSE;
4239 if (size < sizeof * phdrs)
4240 {
4241 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4242 return FALSE;
4243 }
4244 if (size > sizeof * phdrs)
4245 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4246
4247 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4248 size, num, _("program headers"));
4249 if (phdrs == NULL)
4250 return FALSE;
4251
4252 for (i = 0, internal = pheaders, external = phdrs;
4253 i < elf_header.e_phnum;
4254 i++, internal++, external++)
4255 {
4256 internal->p_type = BYTE_GET (external->p_type);
4257 internal->p_offset = BYTE_GET (external->p_offset);
4258 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4259 internal->p_paddr = BYTE_GET (external->p_paddr);
4260 internal->p_filesz = BYTE_GET (external->p_filesz);
4261 internal->p_memsz = BYTE_GET (external->p_memsz);
4262 internal->p_flags = BYTE_GET (external->p_flags);
4263 internal->p_align = BYTE_GET (external->p_align);
4264 }
4265
4266 free (phdrs);
4267 return TRUE;
4268 }
4269
4270 static bfd_boolean
4271 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4272 {
4273 Elf64_External_Phdr * phdrs;
4274 Elf64_External_Phdr * external;
4275 Elf_Internal_Phdr * internal;
4276 unsigned int i;
4277 unsigned int size = elf_header.e_phentsize;
4278 unsigned int num = elf_header.e_phnum;
4279
4280 /* PR binutils/17531: Cope with unexpected section header sizes. */
4281 if (size == 0 || num == 0)
4282 return FALSE;
4283 if (size < sizeof * phdrs)
4284 {
4285 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4286 return FALSE;
4287 }
4288 if (size > sizeof * phdrs)
4289 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4290
4291 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4292 size, num, _("program headers"));
4293 if (!phdrs)
4294 return FALSE;
4295
4296 for (i = 0, internal = pheaders, external = phdrs;
4297 i < elf_header.e_phnum;
4298 i++, internal++, external++)
4299 {
4300 internal->p_type = BYTE_GET (external->p_type);
4301 internal->p_flags = BYTE_GET (external->p_flags);
4302 internal->p_offset = BYTE_GET (external->p_offset);
4303 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4304 internal->p_paddr = BYTE_GET (external->p_paddr);
4305 internal->p_filesz = BYTE_GET (external->p_filesz);
4306 internal->p_memsz = BYTE_GET (external->p_memsz);
4307 internal->p_align = BYTE_GET (external->p_align);
4308 }
4309
4310 free (phdrs);
4311 return TRUE;
4312 }
4313
4314 /* Returns 1 if the program headers were read into `program_headers'. */
4315
4316 static int
4317 get_program_headers (FILE * file)
4318 {
4319 Elf_Internal_Phdr * phdrs;
4320
4321 /* Check cache of prior read. */
4322 if (program_headers != NULL)
4323 return 1;
4324
4325 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4326 sizeof (Elf_Internal_Phdr));
4327
4328 if (phdrs == NULL)
4329 {
4330 error (_("Out of memory reading %u program headers\n"),
4331 elf_header.e_phnum);
4332 return 0;
4333 }
4334
4335 if (is_32bit_elf
4336 ? get_32bit_program_headers (file, phdrs)
4337 : get_64bit_program_headers (file, phdrs))
4338 {
4339 program_headers = phdrs;
4340 return 1;
4341 }
4342
4343 free (phdrs);
4344 return 0;
4345 }
4346
4347 /* Returns 1 if the program headers were loaded. */
4348
4349 static int
4350 process_program_headers (FILE * file)
4351 {
4352 Elf_Internal_Phdr * segment;
4353 unsigned int i;
4354
4355 if (elf_header.e_phnum == 0)
4356 {
4357 /* PR binutils/12467. */
4358 if (elf_header.e_phoff != 0)
4359 warn (_("possibly corrupt ELF header - it has a non-zero program"
4360 " header offset, but no program headers"));
4361 else if (do_segments)
4362 printf (_("\nThere are no program headers in this file.\n"));
4363 return 0;
4364 }
4365
4366 if (do_segments && !do_header)
4367 {
4368 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4369 printf (_("Entry point "));
4370 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4371 printf (_("\nThere are %d program headers, starting at offset "),
4372 elf_header.e_phnum);
4373 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4374 printf ("\n");
4375 }
4376
4377 if (! get_program_headers (file))
4378 return 0;
4379
4380 if (do_segments)
4381 {
4382 if (elf_header.e_phnum > 1)
4383 printf (_("\nProgram Headers:\n"));
4384 else
4385 printf (_("\nProgram Headers:\n"));
4386
4387 if (is_32bit_elf)
4388 printf
4389 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4390 else if (do_wide)
4391 printf
4392 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4393 else
4394 {
4395 printf
4396 (_(" Type Offset VirtAddr PhysAddr\n"));
4397 printf
4398 (_(" FileSiz MemSiz Flags Align\n"));
4399 }
4400 }
4401
4402 dynamic_addr = 0;
4403 dynamic_size = 0;
4404
4405 for (i = 0, segment = program_headers;
4406 i < elf_header.e_phnum;
4407 i++, segment++)
4408 {
4409 if (do_segments)
4410 {
4411 printf (" %-14.14s ", get_segment_type (segment->p_type));
4412
4413 if (is_32bit_elf)
4414 {
4415 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4416 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4417 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4418 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4419 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4420 printf ("%c%c%c ",
4421 (segment->p_flags & PF_R ? 'R' : ' '),
4422 (segment->p_flags & PF_W ? 'W' : ' '),
4423 (segment->p_flags & PF_X ? 'E' : ' '));
4424 printf ("%#lx", (unsigned long) segment->p_align);
4425 }
4426 else if (do_wide)
4427 {
4428 if ((unsigned long) segment->p_offset == segment->p_offset)
4429 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4430 else
4431 {
4432 print_vma (segment->p_offset, FULL_HEX);
4433 putchar (' ');
4434 }
4435
4436 print_vma (segment->p_vaddr, FULL_HEX);
4437 putchar (' ');
4438 print_vma (segment->p_paddr, FULL_HEX);
4439 putchar (' ');
4440
4441 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4442 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4443 else
4444 {
4445 print_vma (segment->p_filesz, FULL_HEX);
4446 putchar (' ');
4447 }
4448
4449 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4450 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4451 else
4452 {
4453 print_vma (segment->p_memsz, FULL_HEX);
4454 }
4455
4456 printf (" %c%c%c ",
4457 (segment->p_flags & PF_R ? 'R' : ' '),
4458 (segment->p_flags & PF_W ? 'W' : ' '),
4459 (segment->p_flags & PF_X ? 'E' : ' '));
4460
4461 if ((unsigned long) segment->p_align == segment->p_align)
4462 printf ("%#lx", (unsigned long) segment->p_align);
4463 else
4464 {
4465 print_vma (segment->p_align, PREFIX_HEX);
4466 }
4467 }
4468 else
4469 {
4470 print_vma (segment->p_offset, FULL_HEX);
4471 putchar (' ');
4472 print_vma (segment->p_vaddr, FULL_HEX);
4473 putchar (' ');
4474 print_vma (segment->p_paddr, FULL_HEX);
4475 printf ("\n ");
4476 print_vma (segment->p_filesz, FULL_HEX);
4477 putchar (' ');
4478 print_vma (segment->p_memsz, FULL_HEX);
4479 printf (" %c%c%c ",
4480 (segment->p_flags & PF_R ? 'R' : ' '),
4481 (segment->p_flags & PF_W ? 'W' : ' '),
4482 (segment->p_flags & PF_X ? 'E' : ' '));
4483 print_vma (segment->p_align, HEX);
4484 }
4485 }
4486
4487 if (do_segments)
4488 putc ('\n', stdout);
4489
4490 switch (segment->p_type)
4491 {
4492 case PT_DYNAMIC:
4493 if (dynamic_addr)
4494 error (_("more than one dynamic segment\n"));
4495
4496 /* By default, assume that the .dynamic section is the first
4497 section in the DYNAMIC segment. */
4498 dynamic_addr = segment->p_offset;
4499 dynamic_size = segment->p_filesz;
4500 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4501 if (dynamic_addr + dynamic_size >= current_file_size)
4502 {
4503 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4504 dynamic_addr = dynamic_size = 0;
4505 }
4506
4507 /* Try to locate the .dynamic section. If there is
4508 a section header table, we can easily locate it. */
4509 if (section_headers != NULL)
4510 {
4511 Elf_Internal_Shdr * sec;
4512
4513 sec = find_section (".dynamic");
4514 if (sec == NULL || sec->sh_size == 0)
4515 {
4516 /* A corresponding .dynamic section is expected, but on
4517 IA-64/OpenVMS it is OK for it to be missing. */
4518 if (!is_ia64_vms ())
4519 error (_("no .dynamic section in the dynamic segment\n"));
4520 break;
4521 }
4522
4523 if (sec->sh_type == SHT_NOBITS)
4524 {
4525 dynamic_size = 0;
4526 break;
4527 }
4528
4529 dynamic_addr = sec->sh_offset;
4530 dynamic_size = sec->sh_size;
4531
4532 if (dynamic_addr < segment->p_offset
4533 || dynamic_addr > segment->p_offset + segment->p_filesz)
4534 warn (_("the .dynamic section is not contained"
4535 " within the dynamic segment\n"));
4536 else if (dynamic_addr > segment->p_offset)
4537 warn (_("the .dynamic section is not the first section"
4538 " in the dynamic segment.\n"));
4539 }
4540 break;
4541
4542 case PT_INTERP:
4543 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4544 SEEK_SET))
4545 error (_("Unable to find program interpreter name\n"));
4546 else
4547 {
4548 char fmt [32];
4549 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4550
4551 if (ret >= (int) sizeof (fmt) || ret < 0)
4552 error (_("Internal error: failed to create format string to display program interpreter\n"));
4553
4554 program_interpreter[0] = 0;
4555 if (fscanf (file, fmt, program_interpreter) <= 0)
4556 error (_("Unable to read program interpreter name\n"));
4557
4558 if (do_segments)
4559 printf (_(" [Requesting program interpreter: %s]\n"),
4560 program_interpreter);
4561 }
4562 break;
4563 }
4564 }
4565
4566 if (do_segments && section_headers != NULL && string_table != NULL)
4567 {
4568 printf (_("\n Section to Segment mapping:\n"));
4569 printf (_(" Segment Sections...\n"));
4570
4571 for (i = 0; i < elf_header.e_phnum; i++)
4572 {
4573 unsigned int j;
4574 Elf_Internal_Shdr * section;
4575
4576 segment = program_headers + i;
4577 section = section_headers + 1;
4578
4579 printf (" %2.2d ", i);
4580
4581 for (j = 1; j < elf_header.e_shnum; j++, section++)
4582 {
4583 if (!ELF_TBSS_SPECIAL (section, segment)
4584 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4585 printf ("%s ", printable_section_name (section));
4586 }
4587
4588 putc ('\n',stdout);
4589 }
4590 }
4591
4592 return 1;
4593 }
4594
4595
4596 /* Find the file offset corresponding to VMA by using the program headers. */
4597
4598 static long
4599 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4600 {
4601 Elf_Internal_Phdr * seg;
4602
4603 if (! get_program_headers (file))
4604 {
4605 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4606 return (long) vma;
4607 }
4608
4609 for (seg = program_headers;
4610 seg < program_headers + elf_header.e_phnum;
4611 ++seg)
4612 {
4613 if (seg->p_type != PT_LOAD)
4614 continue;
4615
4616 if (vma >= (seg->p_vaddr & -seg->p_align)
4617 && vma + size <= seg->p_vaddr + seg->p_filesz)
4618 return vma - seg->p_vaddr + seg->p_offset;
4619 }
4620
4621 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4622 (unsigned long) vma);
4623 return (long) vma;
4624 }
4625
4626
4627 /* Allocate memory and load the sections headers into the global pointer
4628 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4629 generate any error messages if the load fails. */
4630
4631 static bfd_boolean
4632 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4633 {
4634 Elf32_External_Shdr * shdrs;
4635 Elf_Internal_Shdr * internal;
4636 unsigned int i;
4637 unsigned int size = elf_header.e_shentsize;
4638 unsigned int num = probe ? 1 : elf_header.e_shnum;
4639
4640 /* PR binutils/17531: Cope with unexpected section header sizes. */
4641 if (size == 0 || num == 0)
4642 return FALSE;
4643 if (size < sizeof * shdrs)
4644 {
4645 if (! probe)
4646 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4647 return FALSE;
4648 }
4649 if (!probe && size > sizeof * shdrs)
4650 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4651
4652 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4653 size, num,
4654 probe ? NULL : _("section headers"));
4655 if (shdrs == NULL)
4656 return FALSE;
4657
4658 if (section_headers != NULL)
4659 free (section_headers);
4660 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4661 sizeof (Elf_Internal_Shdr));
4662 if (section_headers == NULL)
4663 {
4664 if (!probe)
4665 error (_("Out of memory reading %u section headers\n"), num);
4666 return FALSE;
4667 }
4668
4669 for (i = 0, internal = section_headers;
4670 i < num;
4671 i++, internal++)
4672 {
4673 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4674 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4675 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4676 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4677 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4678 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4679 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4680 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4681 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4682 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4683 }
4684
4685 free (shdrs);
4686 return TRUE;
4687 }
4688
4689 static bfd_boolean
4690 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4691 {
4692 Elf64_External_Shdr * shdrs;
4693 Elf_Internal_Shdr * internal;
4694 unsigned int i;
4695 unsigned int size = elf_header.e_shentsize;
4696 unsigned int num = probe ? 1 : elf_header.e_shnum;
4697
4698 /* PR binutils/17531: Cope with unexpected section header sizes. */
4699 if (size == 0 || num == 0)
4700 return FALSE;
4701 if (size < sizeof * shdrs)
4702 {
4703 if (! probe)
4704 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4705 return FALSE;
4706 }
4707 if (! probe && size > sizeof * shdrs)
4708 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4709
4710 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4711 size, num,
4712 probe ? NULL : _("section headers"));
4713 if (shdrs == NULL)
4714 return FALSE;
4715
4716 if (section_headers != NULL)
4717 free (section_headers);
4718 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4719 sizeof (Elf_Internal_Shdr));
4720 if (section_headers == NULL)
4721 {
4722 if (! probe)
4723 error (_("Out of memory reading %u section headers\n"), num);
4724 return FALSE;
4725 }
4726
4727 for (i = 0, internal = section_headers;
4728 i < num;
4729 i++, internal++)
4730 {
4731 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4732 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4733 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4734 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4735 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4736 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4737 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4738 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4739 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4740 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4741 }
4742
4743 free (shdrs);
4744 return TRUE;
4745 }
4746
4747 static Elf_Internal_Sym *
4748 get_32bit_elf_symbols (FILE * file,
4749 Elf_Internal_Shdr * section,
4750 unsigned long * num_syms_return)
4751 {
4752 unsigned long number = 0;
4753 Elf32_External_Sym * esyms = NULL;
4754 Elf_External_Sym_Shndx * shndx = NULL;
4755 Elf_Internal_Sym * isyms = NULL;
4756 Elf_Internal_Sym * psym;
4757 unsigned int j;
4758
4759 /* Run some sanity checks first. */
4760 if (section->sh_entsize == 0)
4761 {
4762 error (_("sh_entsize is zero\n"));
4763 goto exit_point;
4764 }
4765
4766 if (section->sh_size > current_file_size)
4767 {
4768 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4769 printable_section_name (section), (unsigned long) section->sh_size);
4770 goto exit_point;
4771 }
4772
4773 number = section->sh_size / section->sh_entsize;
4774
4775 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4776 {
4777 error (_("Invalid sh_entsize\n"));
4778 goto exit_point;
4779 }
4780
4781 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4782 section->sh_size, _("symbols"));
4783 if (esyms == NULL)
4784 goto exit_point;
4785
4786 shndx = NULL;
4787 if (symtab_shndx_hdr != NULL
4788 && (symtab_shndx_hdr->sh_link
4789 == (unsigned long) (section - section_headers)))
4790 {
4791 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4792 symtab_shndx_hdr->sh_offset,
4793 1, symtab_shndx_hdr->sh_size,
4794 _("symbol table section indicies"));
4795 if (shndx == NULL)
4796 goto exit_point;
4797 }
4798
4799 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4800
4801 if (isyms == NULL)
4802 {
4803 error (_("Out of memory reading %lu symbols\n"),
4804 (unsigned long) number);
4805 goto exit_point;
4806 }
4807
4808 for (j = 0, psym = isyms; j < number; j++, psym++)
4809 {
4810 psym->st_name = BYTE_GET (esyms[j].st_name);
4811 psym->st_value = BYTE_GET (esyms[j].st_value);
4812 psym->st_size = BYTE_GET (esyms[j].st_size);
4813 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4814 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4815 psym->st_shndx
4816 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4817 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4818 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4819 psym->st_info = BYTE_GET (esyms[j].st_info);
4820 psym->st_other = BYTE_GET (esyms[j].st_other);
4821 }
4822
4823 exit_point:
4824 if (shndx != NULL)
4825 free (shndx);
4826 if (esyms != NULL)
4827 free (esyms);
4828
4829 if (num_syms_return != NULL)
4830 * num_syms_return = isyms == NULL ? 0 : number;
4831
4832 return isyms;
4833 }
4834
4835 static Elf_Internal_Sym *
4836 get_64bit_elf_symbols (FILE * file,
4837 Elf_Internal_Shdr * section,
4838 unsigned long * num_syms_return)
4839 {
4840 unsigned long number = 0;
4841 Elf64_External_Sym * esyms = NULL;
4842 Elf_External_Sym_Shndx * shndx = NULL;
4843 Elf_Internal_Sym * isyms = NULL;
4844 Elf_Internal_Sym * psym;
4845 unsigned int j;
4846
4847 /* Run some sanity checks first. */
4848 if (section->sh_entsize == 0)
4849 {
4850 error (_("sh_entsize is zero\n"));
4851 goto exit_point;
4852 }
4853
4854 if (section->sh_size > current_file_size)
4855 {
4856 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4857 printable_section_name (section), (unsigned long) section->sh_size);
4858 goto exit_point;
4859 }
4860
4861 number = section->sh_size / section->sh_entsize;
4862
4863 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4864 {
4865 error (_("Invalid sh_entsize\n"));
4866 goto exit_point;
4867 }
4868
4869 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4870 section->sh_size, _("symbols"));
4871 if (!esyms)
4872 goto exit_point;
4873
4874 if (symtab_shndx_hdr != NULL
4875 && (symtab_shndx_hdr->sh_link
4876 == (unsigned long) (section - section_headers)))
4877 {
4878 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4879 symtab_shndx_hdr->sh_offset,
4880 1, symtab_shndx_hdr->sh_size,
4881 _("symbol table section indicies"));
4882 if (shndx == NULL)
4883 goto exit_point;
4884 }
4885
4886 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4887
4888 if (isyms == NULL)
4889 {
4890 error (_("Out of memory reading %lu symbols\n"),
4891 (unsigned long) number);
4892 goto exit_point;
4893 }
4894
4895 for (j = 0, psym = isyms; j < number; j++, psym++)
4896 {
4897 psym->st_name = BYTE_GET (esyms[j].st_name);
4898 psym->st_info = BYTE_GET (esyms[j].st_info);
4899 psym->st_other = BYTE_GET (esyms[j].st_other);
4900 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4901
4902 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4903 psym->st_shndx
4904 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4905 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4906 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4907
4908 psym->st_value = BYTE_GET (esyms[j].st_value);
4909 psym->st_size = BYTE_GET (esyms[j].st_size);
4910 }
4911
4912 exit_point:
4913 if (shndx != NULL)
4914 free (shndx);
4915 if (esyms != NULL)
4916 free (esyms);
4917
4918 if (num_syms_return != NULL)
4919 * num_syms_return = isyms == NULL ? 0 : number;
4920
4921 return isyms;
4922 }
4923
4924 static const char *
4925 get_elf_section_flags (bfd_vma sh_flags)
4926 {
4927 static char buff[1024];
4928 char * p = buff;
4929 int field_size = is_32bit_elf ? 8 : 16;
4930 int sindex;
4931 int size = sizeof (buff) - (field_size + 4 + 1);
4932 bfd_vma os_flags = 0;
4933 bfd_vma proc_flags = 0;
4934 bfd_vma unknown_flags = 0;
4935 static const struct
4936 {
4937 const char * str;
4938 int len;
4939 }
4940 flags [] =
4941 {
4942 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4943 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4944 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4945 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4946 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4947 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4948 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4949 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4950 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4951 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4952 /* IA-64 specific. */
4953 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4954 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4955 /* IA-64 OpenVMS specific. */
4956 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4957 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4958 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4959 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4960 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4961 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4962 /* Generic. */
4963 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4964 /* SPARC specific. */
4965 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4966 };
4967
4968 if (do_section_details)
4969 {
4970 sprintf (buff, "[%*.*lx]: ",
4971 field_size, field_size, (unsigned long) sh_flags);
4972 p += field_size + 4;
4973 }
4974
4975 while (sh_flags)
4976 {
4977 bfd_vma flag;
4978
4979 flag = sh_flags & - sh_flags;
4980 sh_flags &= ~ flag;
4981
4982 if (do_section_details)
4983 {
4984 switch (flag)
4985 {
4986 case SHF_WRITE: sindex = 0; break;
4987 case SHF_ALLOC: sindex = 1; break;
4988 case SHF_EXECINSTR: sindex = 2; break;
4989 case SHF_MERGE: sindex = 3; break;
4990 case SHF_STRINGS: sindex = 4; break;
4991 case SHF_INFO_LINK: sindex = 5; break;
4992 case SHF_LINK_ORDER: sindex = 6; break;
4993 case SHF_OS_NONCONFORMING: sindex = 7; break;
4994 case SHF_GROUP: sindex = 8; break;
4995 case SHF_TLS: sindex = 9; break;
4996 case SHF_EXCLUDE: sindex = 18; break;
4997
4998 default:
4999 sindex = -1;
5000 switch (elf_header.e_machine)
5001 {
5002 case EM_IA_64:
5003 if (flag == SHF_IA_64_SHORT)
5004 sindex = 10;
5005 else if (flag == SHF_IA_64_NORECOV)
5006 sindex = 11;
5007 #ifdef BFD64
5008 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5009 switch (flag)
5010 {
5011 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5012 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5013 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5014 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5015 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5016 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5017 default: break;
5018 }
5019 #endif
5020 break;
5021
5022 case EM_386:
5023 case EM_486:
5024 case EM_X86_64:
5025 case EM_L1OM:
5026 case EM_K1OM:
5027 case EM_OLD_SPARCV9:
5028 case EM_SPARC32PLUS:
5029 case EM_SPARCV9:
5030 case EM_SPARC:
5031 if (flag == SHF_ORDERED)
5032 sindex = 19;
5033 break;
5034 default:
5035 break;
5036 }
5037 }
5038
5039 if (sindex != -1)
5040 {
5041 if (p != buff + field_size + 4)
5042 {
5043 if (size < (10 + 2))
5044 abort ();
5045 size -= 2;
5046 *p++ = ',';
5047 *p++ = ' ';
5048 }
5049
5050 size -= flags [sindex].len;
5051 p = stpcpy (p, flags [sindex].str);
5052 }
5053 else if (flag & SHF_MASKOS)
5054 os_flags |= flag;
5055 else if (flag & SHF_MASKPROC)
5056 proc_flags |= flag;
5057 else
5058 unknown_flags |= flag;
5059 }
5060 else
5061 {
5062 switch (flag)
5063 {
5064 case SHF_WRITE: *p = 'W'; break;
5065 case SHF_ALLOC: *p = 'A'; break;
5066 case SHF_EXECINSTR: *p = 'X'; break;
5067 case SHF_MERGE: *p = 'M'; break;
5068 case SHF_STRINGS: *p = 'S'; break;
5069 case SHF_INFO_LINK: *p = 'I'; break;
5070 case SHF_LINK_ORDER: *p = 'L'; break;
5071 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5072 case SHF_GROUP: *p = 'G'; break;
5073 case SHF_TLS: *p = 'T'; break;
5074 case SHF_EXCLUDE: *p = 'E'; break;
5075
5076 default:
5077 if ((elf_header.e_machine == EM_X86_64
5078 || elf_header.e_machine == EM_L1OM
5079 || elf_header.e_machine == EM_K1OM)
5080 && flag == SHF_X86_64_LARGE)
5081 *p = 'l';
5082 else if (flag & SHF_MASKOS)
5083 {
5084 *p = 'o';
5085 sh_flags &= ~ SHF_MASKOS;
5086 }
5087 else if (flag & SHF_MASKPROC)
5088 {
5089 *p = 'p';
5090 sh_flags &= ~ SHF_MASKPROC;
5091 }
5092 else
5093 *p = 'x';
5094 break;
5095 }
5096 p++;
5097 }
5098 }
5099
5100 if (do_section_details)
5101 {
5102 if (os_flags)
5103 {
5104 size -= 5 + field_size;
5105 if (p != buff + field_size + 4)
5106 {
5107 if (size < (2 + 1))
5108 abort ();
5109 size -= 2;
5110 *p++ = ',';
5111 *p++ = ' ';
5112 }
5113 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5114 (unsigned long) os_flags);
5115 p += 5 + field_size;
5116 }
5117 if (proc_flags)
5118 {
5119 size -= 7 + field_size;
5120 if (p != buff + field_size + 4)
5121 {
5122 if (size < (2 + 1))
5123 abort ();
5124 size -= 2;
5125 *p++ = ',';
5126 *p++ = ' ';
5127 }
5128 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5129 (unsigned long) proc_flags);
5130 p += 7 + field_size;
5131 }
5132 if (unknown_flags)
5133 {
5134 size -= 10 + field_size;
5135 if (p != buff + field_size + 4)
5136 {
5137 if (size < (2 + 1))
5138 abort ();
5139 size -= 2;
5140 *p++ = ',';
5141 *p++ = ' ';
5142 }
5143 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5144 (unsigned long) unknown_flags);
5145 p += 10 + field_size;
5146 }
5147 }
5148
5149 *p = '\0';
5150 return buff;
5151 }
5152
5153 static int
5154 process_section_headers (FILE * file)
5155 {
5156 Elf_Internal_Shdr * section;
5157 unsigned int i;
5158
5159 section_headers = NULL;
5160
5161 if (elf_header.e_shnum == 0)
5162 {
5163 /* PR binutils/12467. */
5164 if (elf_header.e_shoff != 0)
5165 warn (_("possibly corrupt ELF file header - it has a non-zero"
5166 " section header offset, but no section headers\n"));
5167 else if (do_sections)
5168 printf (_("\nThere are no sections in this file.\n"));
5169
5170 return 1;
5171 }
5172
5173 if (do_sections && !do_header)
5174 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5175 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5176
5177 if (is_32bit_elf)
5178 {
5179 if (! get_32bit_section_headers (file, FALSE))
5180 return 0;
5181 }
5182 else if (! get_64bit_section_headers (file, FALSE))
5183 return 0;
5184
5185 /* Read in the string table, so that we have names to display. */
5186 if (elf_header.e_shstrndx != SHN_UNDEF
5187 && elf_header.e_shstrndx < elf_header.e_shnum)
5188 {
5189 section = section_headers + elf_header.e_shstrndx;
5190
5191 if (section->sh_size != 0)
5192 {
5193 string_table = (char *) get_data (NULL, file, section->sh_offset,
5194 1, section->sh_size,
5195 _("string table"));
5196
5197 string_table_length = string_table != NULL ? section->sh_size : 0;
5198 }
5199 }
5200
5201 /* Scan the sections for the dynamic symbol table
5202 and dynamic string table and debug sections. */
5203 dynamic_symbols = NULL;
5204 dynamic_strings = NULL;
5205 dynamic_syminfo = NULL;
5206 symtab_shndx_hdr = NULL;
5207
5208 eh_addr_size = is_32bit_elf ? 4 : 8;
5209 switch (elf_header.e_machine)
5210 {
5211 case EM_MIPS:
5212 case EM_MIPS_RS3_LE:
5213 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5214 FDE addresses. However, the ABI also has a semi-official ILP32
5215 variant for which the normal FDE address size rules apply.
5216
5217 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5218 section, where XX is the size of longs in bits. Unfortunately,
5219 earlier compilers provided no way of distinguishing ILP32 objects
5220 from LP64 objects, so if there's any doubt, we should assume that
5221 the official LP64 form is being used. */
5222 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5223 && find_section (".gcc_compiled_long32") == NULL)
5224 eh_addr_size = 8;
5225 break;
5226
5227 case EM_H8_300:
5228 case EM_H8_300H:
5229 switch (elf_header.e_flags & EF_H8_MACH)
5230 {
5231 case E_H8_MACH_H8300:
5232 case E_H8_MACH_H8300HN:
5233 case E_H8_MACH_H8300SN:
5234 case E_H8_MACH_H8300SXN:
5235 eh_addr_size = 2;
5236 break;
5237 case E_H8_MACH_H8300H:
5238 case E_H8_MACH_H8300S:
5239 case E_H8_MACH_H8300SX:
5240 eh_addr_size = 4;
5241 break;
5242 }
5243 break;
5244
5245 case EM_M32C_OLD:
5246 case EM_M32C:
5247 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5248 {
5249 case EF_M32C_CPU_M16C:
5250 eh_addr_size = 2;
5251 break;
5252 }
5253 break;
5254 }
5255
5256 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5257 do \
5258 { \
5259 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5260 if (section->sh_entsize != expected_entsize) \
5261 { \
5262 char buf[40]; \
5263 sprintf_vma (buf, section->sh_entsize); \
5264 /* Note: coded this way so that there is a single string for \
5265 translation. */ \
5266 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5267 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5268 (unsigned) expected_entsize); \
5269 section->sh_entsize = expected_entsize; \
5270 } \
5271 } \
5272 while (0)
5273
5274 #define CHECK_ENTSIZE(section, i, type) \
5275 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5276 sizeof (Elf64_External_##type))
5277
5278 for (i = 0, section = section_headers;
5279 i < elf_header.e_shnum;
5280 i++, section++)
5281 {
5282 char * name = SECTION_NAME (section);
5283
5284 if (section->sh_type == SHT_DYNSYM)
5285 {
5286 if (dynamic_symbols != NULL)
5287 {
5288 error (_("File contains multiple dynamic symbol tables\n"));
5289 continue;
5290 }
5291
5292 CHECK_ENTSIZE (section, i, Sym);
5293 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5294 }
5295 else if (section->sh_type == SHT_STRTAB
5296 && streq (name, ".dynstr"))
5297 {
5298 if (dynamic_strings != NULL)
5299 {
5300 error (_("File contains multiple dynamic string tables\n"));
5301 continue;
5302 }
5303
5304 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5305 1, section->sh_size,
5306 _("dynamic strings"));
5307 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5308 }
5309 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5310 {
5311 if (symtab_shndx_hdr != NULL)
5312 {
5313 error (_("File contains multiple symtab shndx tables\n"));
5314 continue;
5315 }
5316 symtab_shndx_hdr = section;
5317 }
5318 else if (section->sh_type == SHT_SYMTAB)
5319 CHECK_ENTSIZE (section, i, Sym);
5320 else if (section->sh_type == SHT_GROUP)
5321 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5322 else if (section->sh_type == SHT_REL)
5323 CHECK_ENTSIZE (section, i, Rel);
5324 else if (section->sh_type == SHT_RELA)
5325 CHECK_ENTSIZE (section, i, Rela);
5326 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5327 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5328 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5329 || do_debug_str || do_debug_loc || do_debug_ranges
5330 || do_debug_addr || do_debug_cu_index)
5331 && (const_strneq (name, ".debug_")
5332 || const_strneq (name, ".zdebug_")))
5333 {
5334 if (name[1] == 'z')
5335 name += sizeof (".zdebug_") - 1;
5336 else
5337 name += sizeof (".debug_") - 1;
5338
5339 if (do_debugging
5340 || (do_debug_info && const_strneq (name, "info"))
5341 || (do_debug_info && const_strneq (name, "types"))
5342 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5343 || (do_debug_lines && strcmp (name, "line") == 0)
5344 || (do_debug_lines && const_strneq (name, "line."))
5345 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5346 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5347 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5348 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5349 || (do_debug_aranges && const_strneq (name, "aranges"))
5350 || (do_debug_ranges && const_strneq (name, "ranges"))
5351 || (do_debug_frames && const_strneq (name, "frame"))
5352 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5353 || (do_debug_macinfo && const_strneq (name, "macro"))
5354 || (do_debug_str && const_strneq (name, "str"))
5355 || (do_debug_loc && const_strneq (name, "loc"))
5356 || (do_debug_addr && const_strneq (name, "addr"))
5357 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5358 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5359 )
5360 request_dump_bynumber (i, DEBUG_DUMP);
5361 }
5362 /* Linkonce section to be combined with .debug_info at link time. */
5363 else if ((do_debugging || do_debug_info)
5364 && const_strneq (name, ".gnu.linkonce.wi."))
5365 request_dump_bynumber (i, DEBUG_DUMP);
5366 else if (do_debug_frames && streq (name, ".eh_frame"))
5367 request_dump_bynumber (i, DEBUG_DUMP);
5368 else if (do_gdb_index && streq (name, ".gdb_index"))
5369 request_dump_bynumber (i, DEBUG_DUMP);
5370 /* Trace sections for Itanium VMS. */
5371 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5372 || do_trace_aranges)
5373 && const_strneq (name, ".trace_"))
5374 {
5375 name += sizeof (".trace_") - 1;
5376
5377 if (do_debugging
5378 || (do_trace_info && streq (name, "info"))
5379 || (do_trace_abbrevs && streq (name, "abbrev"))
5380 || (do_trace_aranges && streq (name, "aranges"))
5381 )
5382 request_dump_bynumber (i, DEBUG_DUMP);
5383 }
5384 }
5385
5386 if (! do_sections)
5387 return 1;
5388
5389 if (elf_header.e_shnum > 1)
5390 printf (_("\nSection Headers:\n"));
5391 else
5392 printf (_("\nSection Header:\n"));
5393
5394 if (is_32bit_elf)
5395 {
5396 if (do_section_details)
5397 {
5398 printf (_(" [Nr] Name\n"));
5399 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5400 }
5401 else
5402 printf
5403 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5404 }
5405 else if (do_wide)
5406 {
5407 if (do_section_details)
5408 {
5409 printf (_(" [Nr] Name\n"));
5410 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5411 }
5412 else
5413 printf
5414 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5415 }
5416 else
5417 {
5418 if (do_section_details)
5419 {
5420 printf (_(" [Nr] Name\n"));
5421 printf (_(" Type Address Offset Link\n"));
5422 printf (_(" Size EntSize Info Align\n"));
5423 }
5424 else
5425 {
5426 printf (_(" [Nr] Name Type Address Offset\n"));
5427 printf (_(" Size EntSize Flags Link Info Align\n"));
5428 }
5429 }
5430
5431 if (do_section_details)
5432 printf (_(" Flags\n"));
5433
5434 for (i = 0, section = section_headers;
5435 i < elf_header.e_shnum;
5436 i++, section++)
5437 {
5438 printf (" [%2u] ", i);
5439 if (do_section_details)
5440 printf ("%s\n ", printable_section_name (section));
5441 else
5442 print_symbol (-17, SECTION_NAME (section));
5443
5444 printf (do_wide ? " %-15s " : " %-15.15s ",
5445 get_section_type_name (section->sh_type));
5446
5447 if (is_32bit_elf)
5448 {
5449 const char * link_too_big = NULL;
5450
5451 print_vma (section->sh_addr, LONG_HEX);
5452
5453 printf ( " %6.6lx %6.6lx %2.2lx",
5454 (unsigned long) section->sh_offset,
5455 (unsigned long) section->sh_size,
5456 (unsigned long) section->sh_entsize);
5457
5458 if (do_section_details)
5459 fputs (" ", stdout);
5460 else
5461 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5462
5463 if (section->sh_link >= elf_header.e_shnum)
5464 {
5465 link_too_big = "";
5466 /* The sh_link value is out of range. Normally this indicates
5467 an error but it can have special values in Solaris binaries. */
5468 switch (elf_header.e_machine)
5469 {
5470 case EM_386:
5471 case EM_486:
5472 case EM_X86_64:
5473 case EM_L1OM:
5474 case EM_K1OM:
5475 case EM_OLD_SPARCV9:
5476 case EM_SPARC32PLUS:
5477 case EM_SPARCV9:
5478 case EM_SPARC:
5479 if (section->sh_link == (SHN_BEFORE & 0xffff))
5480 link_too_big = "BEFORE";
5481 else if (section->sh_link == (SHN_AFTER & 0xffff))
5482 link_too_big = "AFTER";
5483 break;
5484 default:
5485 break;
5486 }
5487 }
5488
5489 if (do_section_details)
5490 {
5491 if (link_too_big != NULL && * link_too_big)
5492 printf ("<%s> ", link_too_big);
5493 else
5494 printf ("%2u ", section->sh_link);
5495 printf ("%3u %2lu\n", section->sh_info,
5496 (unsigned long) section->sh_addralign);
5497 }
5498 else
5499 printf ("%2u %3u %2lu\n",
5500 section->sh_link,
5501 section->sh_info,
5502 (unsigned long) section->sh_addralign);
5503
5504 if (link_too_big && ! * link_too_big)
5505 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5506 i, section->sh_link);
5507 }
5508 else if (do_wide)
5509 {
5510 print_vma (section->sh_addr, LONG_HEX);
5511
5512 if ((long) section->sh_offset == section->sh_offset)
5513 printf (" %6.6lx", (unsigned long) section->sh_offset);
5514 else
5515 {
5516 putchar (' ');
5517 print_vma (section->sh_offset, LONG_HEX);
5518 }
5519
5520 if ((unsigned long) section->sh_size == section->sh_size)
5521 printf (" %6.6lx", (unsigned long) section->sh_size);
5522 else
5523 {
5524 putchar (' ');
5525 print_vma (section->sh_size, LONG_HEX);
5526 }
5527
5528 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5529 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5530 else
5531 {
5532 putchar (' ');
5533 print_vma (section->sh_entsize, LONG_HEX);
5534 }
5535
5536 if (do_section_details)
5537 fputs (" ", stdout);
5538 else
5539 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5540
5541 printf ("%2u %3u ", section->sh_link, section->sh_info);
5542
5543 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5544 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5545 else
5546 {
5547 print_vma (section->sh_addralign, DEC);
5548 putchar ('\n');
5549 }
5550 }
5551 else if (do_section_details)
5552 {
5553 printf (" %-15.15s ",
5554 get_section_type_name (section->sh_type));
5555 print_vma (section->sh_addr, LONG_HEX);
5556 if ((long) section->sh_offset == section->sh_offset)
5557 printf (" %16.16lx", (unsigned long) section->sh_offset);
5558 else
5559 {
5560 printf (" ");
5561 print_vma (section->sh_offset, LONG_HEX);
5562 }
5563 printf (" %u\n ", section->sh_link);
5564 print_vma (section->sh_size, LONG_HEX);
5565 putchar (' ');
5566 print_vma (section->sh_entsize, LONG_HEX);
5567
5568 printf (" %-16u %lu\n",
5569 section->sh_info,
5570 (unsigned long) section->sh_addralign);
5571 }
5572 else
5573 {
5574 putchar (' ');
5575 print_vma (section->sh_addr, LONG_HEX);
5576 if ((long) section->sh_offset == section->sh_offset)
5577 printf (" %8.8lx", (unsigned long) section->sh_offset);
5578 else
5579 {
5580 printf (" ");
5581 print_vma (section->sh_offset, LONG_HEX);
5582 }
5583 printf ("\n ");
5584 print_vma (section->sh_size, LONG_HEX);
5585 printf (" ");
5586 print_vma (section->sh_entsize, LONG_HEX);
5587
5588 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5589
5590 printf (" %2u %3u %lu\n",
5591 section->sh_link,
5592 section->sh_info,
5593 (unsigned long) section->sh_addralign);
5594 }
5595
5596 if (do_section_details)
5597 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5598 }
5599
5600 if (!do_section_details)
5601 {
5602 if (elf_header.e_machine == EM_X86_64
5603 || elf_header.e_machine == EM_L1OM
5604 || elf_header.e_machine == EM_K1OM)
5605 printf (_("Key to Flags:\n\
5606 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5607 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5608 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5609 else
5610 printf (_("Key to Flags:\n\
5611 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5612 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5613 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5614 }
5615
5616 return 1;
5617 }
5618
5619 static const char *
5620 get_group_flags (unsigned int flags)
5621 {
5622 static char buff[32];
5623 switch (flags)
5624 {
5625 case 0:
5626 return "";
5627
5628 case GRP_COMDAT:
5629 return "COMDAT ";
5630
5631 default:
5632 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5633 break;
5634 }
5635 return buff;
5636 }
5637
5638 static int
5639 process_section_groups (FILE * file)
5640 {
5641 Elf_Internal_Shdr * section;
5642 unsigned int i;
5643 struct group * group;
5644 Elf_Internal_Shdr * symtab_sec;
5645 Elf_Internal_Shdr * strtab_sec;
5646 Elf_Internal_Sym * symtab;
5647 unsigned long num_syms;
5648 char * strtab;
5649 size_t strtab_size;
5650
5651 /* Don't process section groups unless needed. */
5652 if (!do_unwind && !do_section_groups)
5653 return 1;
5654
5655 if (elf_header.e_shnum == 0)
5656 {
5657 if (do_section_groups)
5658 printf (_("\nThere are no sections to group in this file.\n"));
5659
5660 return 1;
5661 }
5662
5663 if (section_headers == NULL)
5664 {
5665 error (_("Section headers are not available!\n"));
5666 /* PR 13622: This can happen with a corrupt ELF header. */
5667 return 0;
5668 }
5669
5670 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5671 sizeof (struct group *));
5672
5673 if (section_headers_groups == NULL)
5674 {
5675 error (_("Out of memory reading %u section group headers\n"),
5676 elf_header.e_shnum);
5677 return 0;
5678 }
5679
5680 /* Scan the sections for the group section. */
5681 group_count = 0;
5682 for (i = 0, section = section_headers;
5683 i < elf_header.e_shnum;
5684 i++, section++)
5685 if (section->sh_type == SHT_GROUP)
5686 group_count++;
5687
5688 if (group_count == 0)
5689 {
5690 if (do_section_groups)
5691 printf (_("\nThere are no section groups in this file.\n"));
5692
5693 return 1;
5694 }
5695
5696 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5697
5698 if (section_groups == NULL)
5699 {
5700 error (_("Out of memory reading %lu groups\n"),
5701 (unsigned long) group_count);
5702 return 0;
5703 }
5704
5705 symtab_sec = NULL;
5706 strtab_sec = NULL;
5707 symtab = NULL;
5708 num_syms = 0;
5709 strtab = NULL;
5710 strtab_size = 0;
5711 for (i = 0, section = section_headers, group = section_groups;
5712 i < elf_header.e_shnum;
5713 i++, section++)
5714 {
5715 if (section->sh_type == SHT_GROUP)
5716 {
5717 const char * name = printable_section_name (section);
5718 const char * group_name;
5719 unsigned char * start;
5720 unsigned char * indices;
5721 unsigned int entry, j, size;
5722 Elf_Internal_Shdr * sec;
5723 Elf_Internal_Sym * sym;
5724
5725 /* Get the symbol table. */
5726 if (section->sh_link >= elf_header.e_shnum
5727 || ((sec = section_headers + section->sh_link)->sh_type
5728 != SHT_SYMTAB))
5729 {
5730 error (_("Bad sh_link in group section `%s'\n"), name);
5731 continue;
5732 }
5733
5734 if (symtab_sec != sec)
5735 {
5736 symtab_sec = sec;
5737 if (symtab)
5738 free (symtab);
5739 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5740 }
5741
5742 if (symtab == NULL)
5743 {
5744 error (_("Corrupt header in group section `%s'\n"), name);
5745 continue;
5746 }
5747
5748 if (section->sh_info >= num_syms)
5749 {
5750 error (_("Bad sh_info in group section `%s'\n"), name);
5751 continue;
5752 }
5753
5754 sym = symtab + section->sh_info;
5755
5756 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5757 {
5758 if (sym->st_shndx == 0
5759 || sym->st_shndx >= elf_header.e_shnum)
5760 {
5761 error (_("Bad sh_info in group section `%s'\n"), name);
5762 continue;
5763 }
5764
5765 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5766 strtab_sec = NULL;
5767 if (strtab)
5768 free (strtab);
5769 strtab = NULL;
5770 strtab_size = 0;
5771 }
5772 else
5773 {
5774 /* Get the string table. */
5775 if (symtab_sec->sh_link >= elf_header.e_shnum)
5776 {
5777 strtab_sec = NULL;
5778 if (strtab)
5779 free (strtab);
5780 strtab = NULL;
5781 strtab_size = 0;
5782 }
5783 else if (strtab_sec
5784 != (sec = section_headers + symtab_sec->sh_link))
5785 {
5786 strtab_sec = sec;
5787 if (strtab)
5788 free (strtab);
5789
5790 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5791 1, strtab_sec->sh_size,
5792 _("string table"));
5793 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5794 }
5795 group_name = sym->st_name < strtab_size
5796 ? strtab + sym->st_name : _("<corrupt>");
5797 }
5798
5799 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5800 1, section->sh_size,
5801 _("section data"));
5802 if (start == NULL)
5803 continue;
5804
5805 indices = start;
5806 size = (section->sh_size / section->sh_entsize) - 1;
5807 entry = byte_get (indices, 4);
5808 indices += 4;
5809
5810 if (do_section_groups)
5811 {
5812 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5813 get_group_flags (entry), i, name, group_name, size);
5814
5815 printf (_(" [Index] Name\n"));
5816 }
5817
5818 group->group_index = i;
5819
5820 for (j = 0; j < size; j++)
5821 {
5822 struct group_list * g;
5823
5824 entry = byte_get (indices, 4);
5825 indices += 4;
5826
5827 if (entry >= elf_header.e_shnum)
5828 {
5829 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5830 entry, i, elf_header.e_shnum - 1);
5831 continue;
5832 }
5833
5834 if (section_headers_groups [entry] != NULL)
5835 {
5836 if (entry)
5837 {
5838 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5839 entry, i,
5840 section_headers_groups [entry]->group_index);
5841 continue;
5842 }
5843 else
5844 {
5845 /* Intel C/C++ compiler may put section 0 in a
5846 section group. We just warn it the first time
5847 and ignore it afterwards. */
5848 static int warned = 0;
5849 if (!warned)
5850 {
5851 error (_("section 0 in group section [%5u]\n"),
5852 section_headers_groups [entry]->group_index);
5853 warned++;
5854 }
5855 }
5856 }
5857
5858 section_headers_groups [entry] = group;
5859
5860 if (do_section_groups)
5861 {
5862 sec = section_headers + entry;
5863 printf (" [%5u] %s\n", entry, printable_section_name (sec));
5864 }
5865
5866 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5867 g->section_index = entry;
5868 g->next = group->root;
5869 group->root = g;
5870 }
5871
5872 if (start)
5873 free (start);
5874
5875 group++;
5876 }
5877 }
5878
5879 if (symtab)
5880 free (symtab);
5881 if (strtab)
5882 free (strtab);
5883 return 1;
5884 }
5885
5886 /* Data used to display dynamic fixups. */
5887
5888 struct ia64_vms_dynfixup
5889 {
5890 bfd_vma needed_ident; /* Library ident number. */
5891 bfd_vma needed; /* Index in the dstrtab of the library name. */
5892 bfd_vma fixup_needed; /* Index of the library. */
5893 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5894 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5895 };
5896
5897 /* Data used to display dynamic relocations. */
5898
5899 struct ia64_vms_dynimgrela
5900 {
5901 bfd_vma img_rela_cnt; /* Number of relocations. */
5902 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5903 };
5904
5905 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5906 library). */
5907
5908 static void
5909 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5910 const char *strtab, unsigned int strtab_sz)
5911 {
5912 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5913 long i;
5914 const char *lib_name;
5915
5916 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5917 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5918 _("dynamic section image fixups"));
5919 if (!imfs)
5920 return;
5921
5922 if (fixup->needed < strtab_sz)
5923 lib_name = strtab + fixup->needed;
5924 else
5925 {
5926 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5927 (unsigned long) fixup->needed);
5928 lib_name = "???";
5929 }
5930 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5931 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5932 printf
5933 (_("Seg Offset Type SymVec DataType\n"));
5934
5935 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5936 {
5937 unsigned int type;
5938 const char *rtype;
5939
5940 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5941 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5942 type = BYTE_GET (imfs [i].type);
5943 rtype = elf_ia64_reloc_type (type);
5944 if (rtype == NULL)
5945 printf (" 0x%08x ", type);
5946 else
5947 printf (" %-32s ", rtype);
5948 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5949 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5950 }
5951
5952 free (imfs);
5953 }
5954
5955 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5956
5957 static void
5958 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5959 {
5960 Elf64_External_VMS_IMAGE_RELA *imrs;
5961 long i;
5962
5963 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5964 1, imgrela->img_rela_cnt * sizeof (*imrs),
5965 _("dynamic section image relocations"));
5966 if (!imrs)
5967 return;
5968
5969 printf (_("\nImage relocs\n"));
5970 printf
5971 (_("Seg Offset Type Addend Seg Sym Off\n"));
5972
5973 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5974 {
5975 unsigned int type;
5976 const char *rtype;
5977
5978 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5979 printf ("%08" BFD_VMA_FMT "x ",
5980 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5981 type = BYTE_GET (imrs [i].type);
5982 rtype = elf_ia64_reloc_type (type);
5983 if (rtype == NULL)
5984 printf ("0x%08x ", type);
5985 else
5986 printf ("%-31s ", rtype);
5987 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5988 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5989 printf ("%08" BFD_VMA_FMT "x\n",
5990 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5991 }
5992
5993 free (imrs);
5994 }
5995
5996 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5997
5998 static int
5999 process_ia64_vms_dynamic_relocs (FILE *file)
6000 {
6001 struct ia64_vms_dynfixup fixup;
6002 struct ia64_vms_dynimgrela imgrela;
6003 Elf_Internal_Dyn *entry;
6004 int res = 0;
6005 bfd_vma strtab_off = 0;
6006 bfd_vma strtab_sz = 0;
6007 char *strtab = NULL;
6008
6009 memset (&fixup, 0, sizeof (fixup));
6010 memset (&imgrela, 0, sizeof (imgrela));
6011
6012 /* Note: the order of the entries is specified by the OpenVMS specs. */
6013 for (entry = dynamic_section;
6014 entry < dynamic_section + dynamic_nent;
6015 entry++)
6016 {
6017 switch (entry->d_tag)
6018 {
6019 case DT_IA_64_VMS_STRTAB_OFFSET:
6020 strtab_off = entry->d_un.d_val;
6021 break;
6022 case DT_STRSZ:
6023 strtab_sz = entry->d_un.d_val;
6024 if (strtab == NULL)
6025 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6026 1, strtab_sz, _("dynamic string section"));
6027 break;
6028
6029 case DT_IA_64_VMS_NEEDED_IDENT:
6030 fixup.needed_ident = entry->d_un.d_val;
6031 break;
6032 case DT_NEEDED:
6033 fixup.needed = entry->d_un.d_val;
6034 break;
6035 case DT_IA_64_VMS_FIXUP_NEEDED:
6036 fixup.fixup_needed = entry->d_un.d_val;
6037 break;
6038 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6039 fixup.fixup_rela_cnt = entry->d_un.d_val;
6040 break;
6041 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6042 fixup.fixup_rela_off = entry->d_un.d_val;
6043 res++;
6044 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6045 break;
6046
6047 case DT_IA_64_VMS_IMG_RELA_CNT:
6048 imgrela.img_rela_cnt = entry->d_un.d_val;
6049 break;
6050 case DT_IA_64_VMS_IMG_RELA_OFF:
6051 imgrela.img_rela_off = entry->d_un.d_val;
6052 res++;
6053 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6054 break;
6055
6056 default:
6057 break;
6058 }
6059 }
6060
6061 if (strtab != NULL)
6062 free (strtab);
6063
6064 return res;
6065 }
6066
6067 static struct
6068 {
6069 const char * name;
6070 int reloc;
6071 int size;
6072 int rela;
6073 } dynamic_relocations [] =
6074 {
6075 { "REL", DT_REL, DT_RELSZ, FALSE },
6076 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6077 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6078 };
6079
6080 /* Process the reloc section. */
6081
6082 static int
6083 process_relocs (FILE * file)
6084 {
6085 unsigned long rel_size;
6086 unsigned long rel_offset;
6087
6088
6089 if (!do_reloc)
6090 return 1;
6091
6092 if (do_using_dynamic)
6093 {
6094 int is_rela;
6095 const char * name;
6096 int has_dynamic_reloc;
6097 unsigned int i;
6098
6099 has_dynamic_reloc = 0;
6100
6101 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6102 {
6103 is_rela = dynamic_relocations [i].rela;
6104 name = dynamic_relocations [i].name;
6105 rel_size = dynamic_info [dynamic_relocations [i].size];
6106 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6107
6108 has_dynamic_reloc |= rel_size;
6109
6110 if (is_rela == UNKNOWN)
6111 {
6112 if (dynamic_relocations [i].reloc == DT_JMPREL)
6113 switch (dynamic_info[DT_PLTREL])
6114 {
6115 case DT_REL:
6116 is_rela = FALSE;
6117 break;
6118 case DT_RELA:
6119 is_rela = TRUE;
6120 break;
6121 }
6122 }
6123
6124 if (rel_size)
6125 {
6126 printf
6127 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6128 name, rel_offset, rel_size);
6129
6130 dump_relocations (file,
6131 offset_from_vma (file, rel_offset, rel_size),
6132 rel_size,
6133 dynamic_symbols, num_dynamic_syms,
6134 dynamic_strings, dynamic_strings_length,
6135 is_rela, 1);
6136 }
6137 }
6138
6139 if (is_ia64_vms ())
6140 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6141
6142 if (! has_dynamic_reloc)
6143 printf (_("\nThere are no dynamic relocations in this file.\n"));
6144 }
6145 else
6146 {
6147 Elf_Internal_Shdr * section;
6148 unsigned long i;
6149 int found = 0;
6150
6151 for (i = 0, section = section_headers;
6152 i < elf_header.e_shnum;
6153 i++, section++)
6154 {
6155 if ( section->sh_type != SHT_RELA
6156 && section->sh_type != SHT_REL)
6157 continue;
6158
6159 rel_offset = section->sh_offset;
6160 rel_size = section->sh_size;
6161
6162 if (rel_size)
6163 {
6164 Elf_Internal_Shdr * strsec;
6165 int is_rela;
6166
6167 printf (_("\nRelocation section "));
6168
6169 if (string_table == NULL)
6170 printf ("%d", section->sh_name);
6171 else
6172 printf ("'%s'", printable_section_name (section));
6173
6174 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6175 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6176
6177 is_rela = section->sh_type == SHT_RELA;
6178
6179 if (section->sh_link != 0
6180 && section->sh_link < elf_header.e_shnum)
6181 {
6182 Elf_Internal_Shdr * symsec;
6183 Elf_Internal_Sym * symtab;
6184 unsigned long nsyms;
6185 unsigned long strtablen = 0;
6186 char * strtab = NULL;
6187
6188 symsec = section_headers + section->sh_link;
6189 if (symsec->sh_type != SHT_SYMTAB
6190 && symsec->sh_type != SHT_DYNSYM)
6191 continue;
6192
6193 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6194
6195 if (symtab == NULL)
6196 continue;
6197
6198 if (symsec->sh_link != 0
6199 && symsec->sh_link < elf_header.e_shnum)
6200 {
6201 strsec = section_headers + symsec->sh_link;
6202
6203 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6204 1, strsec->sh_size,
6205 _("string table"));
6206 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6207 }
6208
6209 dump_relocations (file, rel_offset, rel_size,
6210 symtab, nsyms, strtab, strtablen,
6211 is_rela,
6212 symsec->sh_type == SHT_DYNSYM);
6213 if (strtab)
6214 free (strtab);
6215 free (symtab);
6216 }
6217 else
6218 dump_relocations (file, rel_offset, rel_size,
6219 NULL, 0, NULL, 0, is_rela, 0);
6220
6221 found = 1;
6222 }
6223 }
6224
6225 if (! found)
6226 printf (_("\nThere are no relocations in this file.\n"));
6227 }
6228
6229 return 1;
6230 }
6231
6232 /* Process the unwind section. */
6233
6234 #include "unwind-ia64.h"
6235
6236 /* An absolute address consists of a section and an offset. If the
6237 section is NULL, the offset itself is the address, otherwise, the
6238 address equals to LOAD_ADDRESS(section) + offset. */
6239
6240 struct absaddr
6241 {
6242 unsigned short section;
6243 bfd_vma offset;
6244 };
6245
6246 #define ABSADDR(a) \
6247 ((a).section \
6248 ? section_headers [(a).section].sh_addr + (a).offset \
6249 : (a).offset)
6250
6251 struct ia64_unw_table_entry
6252 {
6253 struct absaddr start;
6254 struct absaddr end;
6255 struct absaddr info;
6256 };
6257
6258 struct ia64_unw_aux_info
6259 {
6260
6261 struct ia64_unw_table_entry *table; /* Unwind table. */
6262 unsigned long table_len; /* Length of unwind table. */
6263 unsigned char * info; /* Unwind info. */
6264 unsigned long info_size; /* Size of unwind info. */
6265 bfd_vma info_addr; /* starting address of unwind info. */
6266 bfd_vma seg_base; /* Starting address of segment. */
6267 Elf_Internal_Sym * symtab; /* The symbol table. */
6268 unsigned long nsyms; /* Number of symbols. */
6269 char * strtab; /* The string table. */
6270 unsigned long strtab_size; /* Size of string table. */
6271 };
6272
6273 static void
6274 find_symbol_for_address (Elf_Internal_Sym * symtab,
6275 unsigned long nsyms,
6276 const char * strtab,
6277 unsigned long strtab_size,
6278 struct absaddr addr,
6279 const char ** symname,
6280 bfd_vma * offset)
6281 {
6282 bfd_vma dist = 0x100000;
6283 Elf_Internal_Sym * sym;
6284 Elf_Internal_Sym * best = NULL;
6285 unsigned long i;
6286
6287 REMOVE_ARCH_BITS (addr.offset);
6288
6289 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6290 {
6291 bfd_vma value = sym->st_value;
6292
6293 REMOVE_ARCH_BITS (value);
6294
6295 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6296 && sym->st_name != 0
6297 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6298 && addr.offset >= value
6299 && addr.offset - value < dist)
6300 {
6301 best = sym;
6302 dist = addr.offset - value;
6303 if (!dist)
6304 break;
6305 }
6306 }
6307
6308 if (best)
6309 {
6310 *symname = (best->st_name >= strtab_size
6311 ? _("<corrupt>") : strtab + best->st_name);
6312 *offset = dist;
6313 return;
6314 }
6315
6316 *symname = NULL;
6317 *offset = addr.offset;
6318 }
6319
6320 static void
6321 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6322 {
6323 struct ia64_unw_table_entry * tp;
6324 int in_body;
6325
6326 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6327 {
6328 bfd_vma stamp;
6329 bfd_vma offset;
6330 const unsigned char * dp;
6331 const unsigned char * head;
6332 const char * procname;
6333
6334 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6335 aux->strtab_size, tp->start, &procname, &offset);
6336
6337 fputs ("\n<", stdout);
6338
6339 if (procname)
6340 {
6341 fputs (procname, stdout);
6342
6343 if (offset)
6344 printf ("+%lx", (unsigned long) offset);
6345 }
6346
6347 fputs (">: [", stdout);
6348 print_vma (tp->start.offset, PREFIX_HEX);
6349 fputc ('-', stdout);
6350 print_vma (tp->end.offset, PREFIX_HEX);
6351 printf ("], info at +0x%lx\n",
6352 (unsigned long) (tp->info.offset - aux->seg_base));
6353
6354 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6355 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6356
6357 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6358 (unsigned) UNW_VER (stamp),
6359 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6360 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6361 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6362 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6363
6364 if (UNW_VER (stamp) != 1)
6365 {
6366 printf (_("\tUnknown version.\n"));
6367 continue;
6368 }
6369
6370 in_body = 0;
6371 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6372 dp = unw_decode (dp, in_body, & in_body);
6373 }
6374 }
6375
6376 static int
6377 slurp_ia64_unwind_table (FILE * file,
6378 struct ia64_unw_aux_info * aux,
6379 Elf_Internal_Shdr * sec)
6380 {
6381 unsigned long size, nrelas, i;
6382 Elf_Internal_Phdr * seg;
6383 struct ia64_unw_table_entry * tep;
6384 Elf_Internal_Shdr * relsec;
6385 Elf_Internal_Rela * rela;
6386 Elf_Internal_Rela * rp;
6387 unsigned char * table;
6388 unsigned char * tp;
6389 Elf_Internal_Sym * sym;
6390 const char * relname;
6391
6392 /* First, find the starting address of the segment that includes
6393 this section: */
6394
6395 if (elf_header.e_phnum)
6396 {
6397 if (! get_program_headers (file))
6398 return 0;
6399
6400 for (seg = program_headers;
6401 seg < program_headers + elf_header.e_phnum;
6402 ++seg)
6403 {
6404 if (seg->p_type != PT_LOAD)
6405 continue;
6406
6407 if (sec->sh_addr >= seg->p_vaddr
6408 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6409 {
6410 aux->seg_base = seg->p_vaddr;
6411 break;
6412 }
6413 }
6414 }
6415
6416 /* Second, build the unwind table from the contents of the unwind section: */
6417 size = sec->sh_size;
6418 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6419 _("unwind table"));
6420 if (!table)
6421 return 0;
6422
6423 aux->table = (struct ia64_unw_table_entry *)
6424 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6425 tep = aux->table;
6426 for (tp = table; tp < table + size; ++tep)
6427 {
6428 tep->start.section = SHN_UNDEF;
6429 tep->end.section = SHN_UNDEF;
6430 tep->info.section = SHN_UNDEF;
6431 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6432 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6433 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6434 tep->start.offset += aux->seg_base;
6435 tep->end.offset += aux->seg_base;
6436 tep->info.offset += aux->seg_base;
6437 }
6438 free (table);
6439
6440 /* Third, apply any relocations to the unwind table: */
6441 for (relsec = section_headers;
6442 relsec < section_headers + elf_header.e_shnum;
6443 ++relsec)
6444 {
6445 if (relsec->sh_type != SHT_RELA
6446 || relsec->sh_info >= elf_header.e_shnum
6447 || section_headers + relsec->sh_info != sec)
6448 continue;
6449
6450 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6451 & rela, & nrelas))
6452 return 0;
6453
6454 for (rp = rela; rp < rela + nrelas; ++rp)
6455 {
6456 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6457 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6458
6459 if (! const_strneq (relname, "R_IA64_SEGREL"))
6460 {
6461 warn (_("Skipping unexpected relocation type %s\n"), relname);
6462 continue;
6463 }
6464
6465 i = rp->r_offset / (3 * eh_addr_size);
6466
6467 switch (rp->r_offset/eh_addr_size % 3)
6468 {
6469 case 0:
6470 aux->table[i].start.section = sym->st_shndx;
6471 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6472 break;
6473 case 1:
6474 aux->table[i].end.section = sym->st_shndx;
6475 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6476 break;
6477 case 2:
6478 aux->table[i].info.section = sym->st_shndx;
6479 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6480 break;
6481 default:
6482 break;
6483 }
6484 }
6485
6486 free (rela);
6487 }
6488
6489 aux->table_len = size / (3 * eh_addr_size);
6490 return 1;
6491 }
6492
6493 static void
6494 ia64_process_unwind (FILE * file)
6495 {
6496 Elf_Internal_Shdr * sec;
6497 Elf_Internal_Shdr * unwsec = NULL;
6498 Elf_Internal_Shdr * strsec;
6499 unsigned long i, unwcount = 0, unwstart = 0;
6500 struct ia64_unw_aux_info aux;
6501
6502 memset (& aux, 0, sizeof (aux));
6503
6504 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6505 {
6506 if (sec->sh_type == SHT_SYMTAB
6507 && sec->sh_link < elf_header.e_shnum)
6508 {
6509 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6510
6511 strsec = section_headers + sec->sh_link;
6512 if (aux.strtab != NULL)
6513 {
6514 error (_("Multiple auxillary string tables encountered\n"));
6515 free (aux.strtab);
6516 }
6517 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6518 1, strsec->sh_size,
6519 _("string table"));
6520 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6521 }
6522 else if (sec->sh_type == SHT_IA_64_UNWIND)
6523 unwcount++;
6524 }
6525
6526 if (!unwcount)
6527 printf (_("\nThere are no unwind sections in this file.\n"));
6528
6529 while (unwcount-- > 0)
6530 {
6531 char * suffix;
6532 size_t len, len2;
6533
6534 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6535 i < elf_header.e_shnum; ++i, ++sec)
6536 if (sec->sh_type == SHT_IA_64_UNWIND)
6537 {
6538 unwsec = sec;
6539 break;
6540 }
6541 /* We have already counted the number of SHT_IA64_UNWIND
6542 sections so the loop above should never fail. */
6543 assert (unwsec != NULL);
6544
6545 unwstart = i + 1;
6546 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6547
6548 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6549 {
6550 /* We need to find which section group it is in. */
6551 struct group_list * g;
6552
6553 if (section_headers_groups == NULL
6554 || section_headers_groups [i] == NULL)
6555 i = elf_header.e_shnum;
6556 else
6557 {
6558 g = section_headers_groups [i]->root;
6559
6560 for (; g != NULL; g = g->next)
6561 {
6562 sec = section_headers + g->section_index;
6563
6564 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6565 break;
6566 }
6567
6568 if (g == NULL)
6569 i = elf_header.e_shnum;
6570 }
6571 }
6572 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6573 {
6574 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6575 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6576 suffix = SECTION_NAME (unwsec) + len;
6577 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6578 ++i, ++sec)
6579 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6580 && streq (SECTION_NAME (sec) + len2, suffix))
6581 break;
6582 }
6583 else
6584 {
6585 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6586 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6587 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6588 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6589 suffix = "";
6590 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6591 suffix = SECTION_NAME (unwsec) + len;
6592 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6593 ++i, ++sec)
6594 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6595 && streq (SECTION_NAME (sec) + len2, suffix))
6596 break;
6597 }
6598
6599 if (i == elf_header.e_shnum)
6600 {
6601 printf (_("\nCould not find unwind info section for "));
6602
6603 if (string_table == NULL)
6604 printf ("%d", unwsec->sh_name);
6605 else
6606 printf ("'%s'", printable_section_name (unwsec));
6607 }
6608 else
6609 {
6610 aux.info_addr = sec->sh_addr;
6611 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6612 sec->sh_size,
6613 _("unwind info"));
6614 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6615
6616 printf (_("\nUnwind section "));
6617
6618 if (string_table == NULL)
6619 printf ("%d", unwsec->sh_name);
6620 else
6621 printf ("'%s'", printable_section_name (unwsec));
6622
6623 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6624 (unsigned long) unwsec->sh_offset,
6625 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6626
6627 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6628
6629 if (aux.table_len > 0)
6630 dump_ia64_unwind (& aux);
6631
6632 if (aux.table)
6633 free ((char *) aux.table);
6634 if (aux.info)
6635 free ((char *) aux.info);
6636 aux.table = NULL;
6637 aux.info = NULL;
6638 }
6639 }
6640
6641 if (aux.symtab)
6642 free (aux.symtab);
6643 if (aux.strtab)
6644 free ((char *) aux.strtab);
6645 }
6646
6647 struct hppa_unw_table_entry
6648 {
6649 struct absaddr start;
6650 struct absaddr end;
6651 unsigned int Cannot_unwind:1; /* 0 */
6652 unsigned int Millicode:1; /* 1 */
6653 unsigned int Millicode_save_sr0:1; /* 2 */
6654 unsigned int Region_description:2; /* 3..4 */
6655 unsigned int reserved1:1; /* 5 */
6656 unsigned int Entry_SR:1; /* 6 */
6657 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6658 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6659 unsigned int Args_stored:1; /* 16 */
6660 unsigned int Variable_Frame:1; /* 17 */
6661 unsigned int Separate_Package_Body:1; /* 18 */
6662 unsigned int Frame_Extension_Millicode:1; /* 19 */
6663 unsigned int Stack_Overflow_Check:1; /* 20 */
6664 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
6665 unsigned int Ada_Region:1; /* 22 */
6666 unsigned int cxx_info:1; /* 23 */
6667 unsigned int cxx_try_catch:1; /* 24 */
6668 unsigned int sched_entry_seq:1; /* 25 */
6669 unsigned int reserved2:1; /* 26 */
6670 unsigned int Save_SP:1; /* 27 */
6671 unsigned int Save_RP:1; /* 28 */
6672 unsigned int Save_MRP_in_frame:1; /* 29 */
6673 unsigned int extn_ptr_defined:1; /* 30 */
6674 unsigned int Cleanup_defined:1; /* 31 */
6675
6676 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6677 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6678 unsigned int Large_frame:1; /* 2 */
6679 unsigned int Pseudo_SP_Set:1; /* 3 */
6680 unsigned int reserved4:1; /* 4 */
6681 unsigned int Total_frame_size:27; /* 5..31 */
6682 };
6683
6684 struct hppa_unw_aux_info
6685 {
6686 struct hppa_unw_table_entry *table; /* Unwind table. */
6687 unsigned long table_len; /* Length of unwind table. */
6688 bfd_vma seg_base; /* Starting address of segment. */
6689 Elf_Internal_Sym * symtab; /* The symbol table. */
6690 unsigned long nsyms; /* Number of symbols. */
6691 char * strtab; /* The string table. */
6692 unsigned long strtab_size; /* Size of string table. */
6693 };
6694
6695 static void
6696 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6697 {
6698 struct hppa_unw_table_entry * tp;
6699
6700 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6701 {
6702 bfd_vma offset;
6703 const char * procname;
6704
6705 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6706 aux->strtab_size, tp->start, &procname,
6707 &offset);
6708
6709 fputs ("\n<", stdout);
6710
6711 if (procname)
6712 {
6713 fputs (procname, stdout);
6714
6715 if (offset)
6716 printf ("+%lx", (unsigned long) offset);
6717 }
6718
6719 fputs (">: [", stdout);
6720 print_vma (tp->start.offset, PREFIX_HEX);
6721 fputc ('-', stdout);
6722 print_vma (tp->end.offset, PREFIX_HEX);
6723 printf ("]\n\t");
6724
6725 #define PF(_m) if (tp->_m) printf (#_m " ");
6726 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6727 PF(Cannot_unwind);
6728 PF(Millicode);
6729 PF(Millicode_save_sr0);
6730 /* PV(Region_description); */
6731 PF(Entry_SR);
6732 PV(Entry_FR);
6733 PV(Entry_GR);
6734 PF(Args_stored);
6735 PF(Variable_Frame);
6736 PF(Separate_Package_Body);
6737 PF(Frame_Extension_Millicode);
6738 PF(Stack_Overflow_Check);
6739 PF(Two_Instruction_SP_Increment);
6740 PF(Ada_Region);
6741 PF(cxx_info);
6742 PF(cxx_try_catch);
6743 PF(sched_entry_seq);
6744 PF(Save_SP);
6745 PF(Save_RP);
6746 PF(Save_MRP_in_frame);
6747 PF(extn_ptr_defined);
6748 PF(Cleanup_defined);
6749 PF(MPE_XL_interrupt_marker);
6750 PF(HP_UX_interrupt_marker);
6751 PF(Large_frame);
6752 PF(Pseudo_SP_Set);
6753 PV(Total_frame_size);
6754 #undef PF
6755 #undef PV
6756 }
6757
6758 printf ("\n");
6759 }
6760
6761 static int
6762 slurp_hppa_unwind_table (FILE * file,
6763 struct hppa_unw_aux_info * aux,
6764 Elf_Internal_Shdr * sec)
6765 {
6766 unsigned long size, unw_ent_size, nentries, nrelas, i;
6767 Elf_Internal_Phdr * seg;
6768 struct hppa_unw_table_entry * tep;
6769 Elf_Internal_Shdr * relsec;
6770 Elf_Internal_Rela * rela;
6771 Elf_Internal_Rela * rp;
6772 unsigned char * table;
6773 unsigned char * tp;
6774 Elf_Internal_Sym * sym;
6775 const char * relname;
6776
6777 /* First, find the starting address of the segment that includes
6778 this section. */
6779
6780 if (elf_header.e_phnum)
6781 {
6782 if (! get_program_headers (file))
6783 return 0;
6784
6785 for (seg = program_headers;
6786 seg < program_headers + elf_header.e_phnum;
6787 ++seg)
6788 {
6789 if (seg->p_type != PT_LOAD)
6790 continue;
6791
6792 if (sec->sh_addr >= seg->p_vaddr
6793 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6794 {
6795 aux->seg_base = seg->p_vaddr;
6796 break;
6797 }
6798 }
6799 }
6800
6801 /* Second, build the unwind table from the contents of the unwind
6802 section. */
6803 size = sec->sh_size;
6804 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6805 _("unwind table"));
6806 if (!table)
6807 return 0;
6808
6809 unw_ent_size = 16;
6810 nentries = size / unw_ent_size;
6811 size = unw_ent_size * nentries;
6812
6813 tep = aux->table = (struct hppa_unw_table_entry *)
6814 xcmalloc (nentries, sizeof (aux->table[0]));
6815
6816 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6817 {
6818 unsigned int tmp1, tmp2;
6819
6820 tep->start.section = SHN_UNDEF;
6821 tep->end.section = SHN_UNDEF;
6822
6823 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6824 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6825 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6826 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6827
6828 tep->start.offset += aux->seg_base;
6829 tep->end.offset += aux->seg_base;
6830
6831 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6832 tep->Millicode = (tmp1 >> 30) & 0x1;
6833 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6834 tep->Region_description = (tmp1 >> 27) & 0x3;
6835 tep->reserved1 = (tmp1 >> 26) & 0x1;
6836 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6837 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6838 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6839 tep->Args_stored = (tmp1 >> 15) & 0x1;
6840 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6841 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6842 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6843 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6844 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6845 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6846 tep->cxx_info = (tmp1 >> 8) & 0x1;
6847 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6848 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6849 tep->reserved2 = (tmp1 >> 5) & 0x1;
6850 tep->Save_SP = (tmp1 >> 4) & 0x1;
6851 tep->Save_RP = (tmp1 >> 3) & 0x1;
6852 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6853 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6854 tep->Cleanup_defined = tmp1 & 0x1;
6855
6856 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6857 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6858 tep->Large_frame = (tmp2 >> 29) & 0x1;
6859 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6860 tep->reserved4 = (tmp2 >> 27) & 0x1;
6861 tep->Total_frame_size = tmp2 & 0x7ffffff;
6862 }
6863 free (table);
6864
6865 /* Third, apply any relocations to the unwind table. */
6866 for (relsec = section_headers;
6867 relsec < section_headers + elf_header.e_shnum;
6868 ++relsec)
6869 {
6870 if (relsec->sh_type != SHT_RELA
6871 || relsec->sh_info >= elf_header.e_shnum
6872 || section_headers + relsec->sh_info != sec)
6873 continue;
6874
6875 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6876 & rela, & nrelas))
6877 return 0;
6878
6879 for (rp = rela; rp < rela + nrelas; ++rp)
6880 {
6881 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6882 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6883
6884 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6885 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6886 {
6887 warn (_("Skipping unexpected relocation type %s\n"), relname);
6888 continue;
6889 }
6890
6891 i = rp->r_offset / unw_ent_size;
6892
6893 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6894 {
6895 case 0:
6896 aux->table[i].start.section = sym->st_shndx;
6897 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6898 break;
6899 case 1:
6900 aux->table[i].end.section = sym->st_shndx;
6901 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6902 break;
6903 default:
6904 break;
6905 }
6906 }
6907
6908 free (rela);
6909 }
6910
6911 aux->table_len = nentries;
6912
6913 return 1;
6914 }
6915
6916 static void
6917 hppa_process_unwind (FILE * file)
6918 {
6919 struct hppa_unw_aux_info aux;
6920 Elf_Internal_Shdr * unwsec = NULL;
6921 Elf_Internal_Shdr * strsec;
6922 Elf_Internal_Shdr * sec;
6923 unsigned long i;
6924
6925 if (string_table == NULL)
6926 return;
6927
6928 memset (& aux, 0, sizeof (aux));
6929
6930 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6931 {
6932 if (sec->sh_type == SHT_SYMTAB
6933 && sec->sh_link < elf_header.e_shnum)
6934 {
6935 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6936
6937 strsec = section_headers + sec->sh_link;
6938 if (aux.strtab != NULL)
6939 {
6940 error (_("Multiple auxillary string tables encountered\n"));
6941 free (aux.strtab);
6942 }
6943 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6944 1, strsec->sh_size,
6945 _("string table"));
6946 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6947 }
6948 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6949 unwsec = sec;
6950 }
6951
6952 if (!unwsec)
6953 printf (_("\nThere are no unwind sections in this file.\n"));
6954
6955 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6956 {
6957 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6958 {
6959 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
6960 printable_section_name (sec),
6961 (unsigned long) sec->sh_offset,
6962 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6963
6964 slurp_hppa_unwind_table (file, &aux, sec);
6965 if (aux.table_len > 0)
6966 dump_hppa_unwind (&aux);
6967
6968 if (aux.table)
6969 free ((char *) aux.table);
6970 aux.table = NULL;
6971 }
6972 }
6973
6974 if (aux.symtab)
6975 free (aux.symtab);
6976 if (aux.strtab)
6977 free ((char *) aux.strtab);
6978 }
6979
6980 struct arm_section
6981 {
6982 unsigned char * data; /* The unwind data. */
6983 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
6984 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
6985 unsigned long nrelas; /* The number of relocations. */
6986 unsigned int rel_type; /* REL or RELA ? */
6987 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
6988 };
6989
6990 struct arm_unw_aux_info
6991 {
6992 FILE * file; /* The file containing the unwind sections. */
6993 Elf_Internal_Sym * symtab; /* The file's symbol table. */
6994 unsigned long nsyms; /* Number of symbols. */
6995 char * strtab; /* The file's string table. */
6996 unsigned long strtab_size; /* Size of string table. */
6997 };
6998
6999 static const char *
7000 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7001 bfd_vma fn, struct absaddr addr)
7002 {
7003 const char *procname;
7004 bfd_vma sym_offset;
7005
7006 if (addr.section == SHN_UNDEF)
7007 addr.offset = fn;
7008
7009 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
7010 aux->strtab_size, addr, &procname,
7011 &sym_offset);
7012
7013 print_vma (fn, PREFIX_HEX);
7014
7015 if (procname)
7016 {
7017 fputs (" <", stdout);
7018 fputs (procname, stdout);
7019
7020 if (sym_offset)
7021 printf ("+0x%lx", (unsigned long) sym_offset);
7022 fputc ('>', stdout);
7023 }
7024
7025 return procname;
7026 }
7027
7028 static void
7029 arm_free_section (struct arm_section *arm_sec)
7030 {
7031 if (arm_sec->data != NULL)
7032 free (arm_sec->data);
7033
7034 if (arm_sec->rela != NULL)
7035 free (arm_sec->rela);
7036 }
7037
7038 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7039 cached section and install SEC instead.
7040 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7041 and return its valued in * WORDP, relocating if necessary.
7042 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7043 relocation's offset in ADDR.
7044 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7045 into the string table of the symbol associated with the reloc. If no
7046 reloc was applied store -1 there.
7047 5) Return TRUE upon success, FALSE otherwise. */
7048
7049 static bfd_boolean
7050 get_unwind_section_word (struct arm_unw_aux_info * aux,
7051 struct arm_section * arm_sec,
7052 Elf_Internal_Shdr * sec,
7053 bfd_vma word_offset,
7054 unsigned int * wordp,
7055 struct absaddr * addr,
7056 bfd_vma * sym_name)
7057 {
7058 Elf_Internal_Rela *rp;
7059 Elf_Internal_Sym *sym;
7060 const char * relname;
7061 unsigned int word;
7062 bfd_boolean wrapped;
7063
7064 if (sec == NULL || arm_sec == NULL)
7065 return FALSE;
7066
7067 addr->section = SHN_UNDEF;
7068 addr->offset = 0;
7069
7070 if (sym_name != NULL)
7071 *sym_name = (bfd_vma) -1;
7072
7073 /* If necessary, update the section cache. */
7074 if (sec != arm_sec->sec)
7075 {
7076 Elf_Internal_Shdr *relsec;
7077
7078 arm_free_section (arm_sec);
7079
7080 arm_sec->sec = sec;
7081 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7082 sec->sh_size, _("unwind data"));
7083 arm_sec->rela = NULL;
7084 arm_sec->nrelas = 0;
7085
7086 for (relsec = section_headers;
7087 relsec < section_headers + elf_header.e_shnum;
7088 ++relsec)
7089 {
7090 if (relsec->sh_info >= elf_header.e_shnum
7091 || section_headers + relsec->sh_info != sec
7092 /* PR 15745: Check the section type as well. */
7093 || (relsec->sh_type != SHT_REL
7094 && relsec->sh_type != SHT_RELA))
7095 continue;
7096
7097 arm_sec->rel_type = relsec->sh_type;
7098 if (relsec->sh_type == SHT_REL)
7099 {
7100 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7101 relsec->sh_size,
7102 & arm_sec->rela, & arm_sec->nrelas))
7103 return FALSE;
7104 }
7105 else /* relsec->sh_type == SHT_RELA */
7106 {
7107 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7108 relsec->sh_size,
7109 & arm_sec->rela, & arm_sec->nrelas))
7110 return FALSE;
7111 }
7112 break;
7113 }
7114
7115 arm_sec->next_rela = arm_sec->rela;
7116 }
7117
7118 /* If there is no unwind data we can do nothing. */
7119 if (arm_sec->data == NULL)
7120 return FALSE;
7121
7122 /* If the offset is invalid then fail. */
7123 if (word_offset > sec->sh_size - 4)
7124 return FALSE;
7125
7126 /* Get the word at the required offset. */
7127 word = byte_get (arm_sec->data + word_offset, 4);
7128
7129 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7130 if (arm_sec->rela == NULL)
7131 {
7132 * wordp = word;
7133 return TRUE;
7134 }
7135
7136 /* Look through the relocs to find the one that applies to the provided offset. */
7137 wrapped = FALSE;
7138 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7139 {
7140 bfd_vma prelval, offset;
7141
7142 if (rp->r_offset > word_offset && !wrapped)
7143 {
7144 rp = arm_sec->rela;
7145 wrapped = TRUE;
7146 }
7147 if (rp->r_offset > word_offset)
7148 break;
7149
7150 if (rp->r_offset & 3)
7151 {
7152 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7153 (unsigned long) rp->r_offset);
7154 continue;
7155 }
7156
7157 if (rp->r_offset < word_offset)
7158 continue;
7159
7160 /* PR 17531: file: 027-161405-0.004 */
7161 if (aux->symtab == NULL)
7162 continue;
7163
7164 if (arm_sec->rel_type == SHT_REL)
7165 {
7166 offset = word & 0x7fffffff;
7167 if (offset & 0x40000000)
7168 offset |= ~ (bfd_vma) 0x7fffffff;
7169 }
7170 else if (arm_sec->rel_type == SHT_RELA)
7171 offset = rp->r_addend;
7172 else
7173 {
7174 error (_("Unknown section relocation type %d encountered\n"),
7175 arm_sec->rel_type);
7176 break;
7177 }
7178
7179 /* PR 17531 file: 027-1241568-0.004. */
7180 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7181 {
7182 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7183 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7184 break;
7185 }
7186
7187 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7188 offset += sym->st_value;
7189 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7190
7191 /* Check that we are processing the expected reloc type. */
7192 if (elf_header.e_machine == EM_ARM)
7193 {
7194 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7195 if (relname == NULL)
7196 {
7197 warn (_("Skipping unknown ARM relocation type: %d\n"),
7198 (int) ELF32_R_TYPE (rp->r_info));
7199 continue;
7200 }
7201
7202 if (streq (relname, "R_ARM_NONE"))
7203 continue;
7204
7205 if (! streq (relname, "R_ARM_PREL31"))
7206 {
7207 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7208 continue;
7209 }
7210 }
7211 else if (elf_header.e_machine == EM_TI_C6000)
7212 {
7213 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7214 if (relname == NULL)
7215 {
7216 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7217 (int) ELF32_R_TYPE (rp->r_info));
7218 continue;
7219 }
7220
7221 if (streq (relname, "R_C6000_NONE"))
7222 continue;
7223
7224 if (! streq (relname, "R_C6000_PREL31"))
7225 {
7226 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7227 continue;
7228 }
7229
7230 prelval >>= 1;
7231 }
7232 else
7233 {
7234 /* This function currently only supports ARM and TI unwinders. */
7235 warn (_("Only TI and ARM unwinders are currently supported\n"));
7236 break;
7237 }
7238
7239 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7240 addr->section = sym->st_shndx;
7241 addr->offset = offset;
7242
7243 if (sym_name)
7244 * sym_name = sym->st_name;
7245 break;
7246 }
7247
7248 *wordp = word;
7249 arm_sec->next_rela = rp;
7250
7251 return TRUE;
7252 }
7253
7254 static const char *tic6x_unwind_regnames[16] =
7255 {
7256 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7257 "A14", "A13", "A12", "A11", "A10",
7258 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7259 };
7260
7261 static void
7262 decode_tic6x_unwind_regmask (unsigned int mask)
7263 {
7264 int i;
7265
7266 for (i = 12; mask; mask >>= 1, i--)
7267 {
7268 if (mask & 1)
7269 {
7270 fputs (tic6x_unwind_regnames[i], stdout);
7271 if (mask > 1)
7272 fputs (", ", stdout);
7273 }
7274 }
7275 }
7276
7277 #define ADVANCE \
7278 if (remaining == 0 && more_words) \
7279 { \
7280 data_offset += 4; \
7281 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7282 data_offset, & word, & addr, NULL)) \
7283 return; \
7284 remaining = 4; \
7285 more_words--; \
7286 } \
7287
7288 #define GET_OP(OP) \
7289 ADVANCE; \
7290 if (remaining) \
7291 { \
7292 remaining--; \
7293 (OP) = word >> 24; \
7294 word <<= 8; \
7295 } \
7296 else \
7297 { \
7298 printf (_("[Truncated opcode]\n")); \
7299 return; \
7300 } \
7301 printf ("0x%02x ", OP)
7302
7303 static void
7304 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7305 unsigned int word, unsigned int remaining,
7306 unsigned int more_words,
7307 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7308 struct arm_section *data_arm_sec)
7309 {
7310 struct absaddr addr;
7311
7312 /* Decode the unwinding instructions. */
7313 while (1)
7314 {
7315 unsigned int op, op2;
7316
7317 ADVANCE;
7318 if (remaining == 0)
7319 break;
7320 remaining--;
7321 op = word >> 24;
7322 word <<= 8;
7323
7324 printf (" 0x%02x ", op);
7325
7326 if ((op & 0xc0) == 0x00)
7327 {
7328 int offset = ((op & 0x3f) << 2) + 4;
7329
7330 printf (" vsp = vsp + %d", offset);
7331 }
7332 else if ((op & 0xc0) == 0x40)
7333 {
7334 int offset = ((op & 0x3f) << 2) + 4;
7335
7336 printf (" vsp = vsp - %d", offset);
7337 }
7338 else if ((op & 0xf0) == 0x80)
7339 {
7340 GET_OP (op2);
7341 if (op == 0x80 && op2 == 0)
7342 printf (_("Refuse to unwind"));
7343 else
7344 {
7345 unsigned int mask = ((op & 0x0f) << 8) | op2;
7346 int first = 1;
7347 int i;
7348
7349 printf ("pop {");
7350 for (i = 0; i < 12; i++)
7351 if (mask & (1 << i))
7352 {
7353 if (first)
7354 first = 0;
7355 else
7356 printf (", ");
7357 printf ("r%d", 4 + i);
7358 }
7359 printf ("}");
7360 }
7361 }
7362 else if ((op & 0xf0) == 0x90)
7363 {
7364 if (op == 0x9d || op == 0x9f)
7365 printf (_(" [Reserved]"));
7366 else
7367 printf (" vsp = r%d", op & 0x0f);
7368 }
7369 else if ((op & 0xf0) == 0xa0)
7370 {
7371 int end = 4 + (op & 0x07);
7372 int first = 1;
7373 int i;
7374
7375 printf (" pop {");
7376 for (i = 4; i <= end; i++)
7377 {
7378 if (first)
7379 first = 0;
7380 else
7381 printf (", ");
7382 printf ("r%d", i);
7383 }
7384 if (op & 0x08)
7385 {
7386 if (!first)
7387 printf (", ");
7388 printf ("r14");
7389 }
7390 printf ("}");
7391 }
7392 else if (op == 0xb0)
7393 printf (_(" finish"));
7394 else if (op == 0xb1)
7395 {
7396 GET_OP (op2);
7397 if (op2 == 0 || (op2 & 0xf0) != 0)
7398 printf (_("[Spare]"));
7399 else
7400 {
7401 unsigned int mask = op2 & 0x0f;
7402 int first = 1;
7403 int i;
7404
7405 printf ("pop {");
7406 for (i = 0; i < 12; i++)
7407 if (mask & (1 << i))
7408 {
7409 if (first)
7410 first = 0;
7411 else
7412 printf (", ");
7413 printf ("r%d", i);
7414 }
7415 printf ("}");
7416 }
7417 }
7418 else if (op == 0xb2)
7419 {
7420 unsigned char buf[9];
7421 unsigned int i, len;
7422 unsigned long offset;
7423
7424 for (i = 0; i < sizeof (buf); i++)
7425 {
7426 GET_OP (buf[i]);
7427 if ((buf[i] & 0x80) == 0)
7428 break;
7429 }
7430 if (i == sizeof (buf))
7431 printf (_("corrupt change to vsp"));
7432 else
7433 {
7434 offset = read_uleb128 (buf, &len, buf + i + 1);
7435 assert (len == i + 1);
7436 offset = offset * 4 + 0x204;
7437 printf ("vsp = vsp + %ld", offset);
7438 }
7439 }
7440 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7441 {
7442 unsigned int first, last;
7443
7444 GET_OP (op2);
7445 first = op2 >> 4;
7446 last = op2 & 0x0f;
7447 if (op == 0xc8)
7448 first = first + 16;
7449 printf ("pop {D%d", first);
7450 if (last)
7451 printf ("-D%d", first + last);
7452 printf ("}");
7453 }
7454 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7455 {
7456 unsigned int count = op & 0x07;
7457
7458 printf ("pop {D8");
7459 if (count)
7460 printf ("-D%d", 8 + count);
7461 printf ("}");
7462 }
7463 else if (op >= 0xc0 && op <= 0xc5)
7464 {
7465 unsigned int count = op & 0x07;
7466
7467 printf (" pop {wR10");
7468 if (count)
7469 printf ("-wR%d", 10 + count);
7470 printf ("}");
7471 }
7472 else if (op == 0xc6)
7473 {
7474 unsigned int first, last;
7475
7476 GET_OP (op2);
7477 first = op2 >> 4;
7478 last = op2 & 0x0f;
7479 printf ("pop {wR%d", first);
7480 if (last)
7481 printf ("-wR%d", first + last);
7482 printf ("}");
7483 }
7484 else if (op == 0xc7)
7485 {
7486 GET_OP (op2);
7487 if (op2 == 0 || (op2 & 0xf0) != 0)
7488 printf (_("[Spare]"));
7489 else
7490 {
7491 unsigned int mask = op2 & 0x0f;
7492 int first = 1;
7493 int i;
7494
7495 printf ("pop {");
7496 for (i = 0; i < 4; i++)
7497 if (mask & (1 << i))
7498 {
7499 if (first)
7500 first = 0;
7501 else
7502 printf (", ");
7503 printf ("wCGR%d", i);
7504 }
7505 printf ("}");
7506 }
7507 }
7508 else
7509 printf (_(" [unsupported opcode]"));
7510 printf ("\n");
7511 }
7512 }
7513
7514 static void
7515 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7516 unsigned int word, unsigned int remaining,
7517 unsigned int more_words,
7518 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7519 struct arm_section *data_arm_sec)
7520 {
7521 struct absaddr addr;
7522
7523 /* Decode the unwinding instructions. */
7524 while (1)
7525 {
7526 unsigned int op, op2;
7527
7528 ADVANCE;
7529 if (remaining == 0)
7530 break;
7531 remaining--;
7532 op = word >> 24;
7533 word <<= 8;
7534
7535 printf (" 0x%02x ", op);
7536
7537 if ((op & 0xc0) == 0x00)
7538 {
7539 int offset = ((op & 0x3f) << 3) + 8;
7540 printf (" sp = sp + %d", offset);
7541 }
7542 else if ((op & 0xc0) == 0x80)
7543 {
7544 GET_OP (op2);
7545 if (op == 0x80 && op2 == 0)
7546 printf (_("Refuse to unwind"));
7547 else
7548 {
7549 unsigned int mask = ((op & 0x1f) << 8) | op2;
7550 if (op & 0x20)
7551 printf ("pop compact {");
7552 else
7553 printf ("pop {");
7554
7555 decode_tic6x_unwind_regmask (mask);
7556 printf("}");
7557 }
7558 }
7559 else if ((op & 0xf0) == 0xc0)
7560 {
7561 unsigned int reg;
7562 unsigned int nregs;
7563 unsigned int i;
7564 const char *name;
7565 struct
7566 {
7567 unsigned int offset;
7568 unsigned int reg;
7569 } regpos[16];
7570
7571 /* Scan entire instruction first so that GET_OP output is not
7572 interleaved with disassembly. */
7573 nregs = 0;
7574 for (i = 0; nregs < (op & 0xf); i++)
7575 {
7576 GET_OP (op2);
7577 reg = op2 >> 4;
7578 if (reg != 0xf)
7579 {
7580 regpos[nregs].offset = i * 2;
7581 regpos[nregs].reg = reg;
7582 nregs++;
7583 }
7584
7585 reg = op2 & 0xf;
7586 if (reg != 0xf)
7587 {
7588 regpos[nregs].offset = i * 2 + 1;
7589 regpos[nregs].reg = reg;
7590 nregs++;
7591 }
7592 }
7593
7594 printf (_("pop frame {"));
7595 reg = nregs - 1;
7596 for (i = i * 2; i > 0; i--)
7597 {
7598 if (regpos[reg].offset == i - 1)
7599 {
7600 name = tic6x_unwind_regnames[regpos[reg].reg];
7601 if (reg > 0)
7602 reg--;
7603 }
7604 else
7605 name = _("[pad]");
7606
7607 fputs (name, stdout);
7608 if (i > 1)
7609 printf (", ");
7610 }
7611
7612 printf ("}");
7613 }
7614 else if (op == 0xd0)
7615 printf (" MOV FP, SP");
7616 else if (op == 0xd1)
7617 printf (" __c6xabi_pop_rts");
7618 else if (op == 0xd2)
7619 {
7620 unsigned char buf[9];
7621 unsigned int i, len;
7622 unsigned long offset;
7623
7624 for (i = 0; i < sizeof (buf); i++)
7625 {
7626 GET_OP (buf[i]);
7627 if ((buf[i] & 0x80) == 0)
7628 break;
7629 }
7630 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
7631 if (i == sizeof (buf))
7632 {
7633 printf ("<corrupt sp adjust>\n");
7634 warn (_("Corrupt stack pointer adjustment detected\n"));
7635 return;
7636 }
7637
7638 offset = read_uleb128 (buf, &len, buf + i + 1);
7639 assert (len == i + 1);
7640 offset = offset * 8 + 0x408;
7641 printf (_("sp = sp + %ld"), offset);
7642 }
7643 else if ((op & 0xf0) == 0xe0)
7644 {
7645 if ((op & 0x0f) == 7)
7646 printf (" RETURN");
7647 else
7648 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7649 }
7650 else
7651 {
7652 printf (_(" [unsupported opcode]"));
7653 }
7654 putchar ('\n');
7655 }
7656 }
7657
7658 static bfd_vma
7659 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7660 {
7661 bfd_vma offset;
7662
7663 offset = word & 0x7fffffff;
7664 if (offset & 0x40000000)
7665 offset |= ~ (bfd_vma) 0x7fffffff;
7666
7667 if (elf_header.e_machine == EM_TI_C6000)
7668 offset <<= 1;
7669
7670 return offset + where;
7671 }
7672
7673 static void
7674 decode_arm_unwind (struct arm_unw_aux_info * aux,
7675 unsigned int word,
7676 unsigned int remaining,
7677 bfd_vma data_offset,
7678 Elf_Internal_Shdr * data_sec,
7679 struct arm_section * data_arm_sec)
7680 {
7681 int per_index;
7682 unsigned int more_words = 0;
7683 struct absaddr addr;
7684 bfd_vma sym_name = (bfd_vma) -1;
7685
7686 if (remaining == 0)
7687 {
7688 /* Fetch the first word.
7689 Note - when decoding an object file the address extracted
7690 here will always be 0. So we also pass in the sym_name
7691 parameter so that we can find the symbol associated with
7692 the personality routine. */
7693 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7694 & word, & addr, & sym_name))
7695 return;
7696
7697 remaining = 4;
7698 }
7699
7700 if ((word & 0x80000000) == 0)
7701 {
7702 /* Expand prel31 for personality routine. */
7703 bfd_vma fn;
7704 const char *procname;
7705
7706 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7707 printf (_(" Personality routine: "));
7708 if (fn == 0
7709 && addr.section == SHN_UNDEF && addr.offset == 0
7710 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7711 {
7712 procname = aux->strtab + sym_name;
7713 print_vma (fn, PREFIX_HEX);
7714 if (procname)
7715 {
7716 fputs (" <", stdout);
7717 fputs (procname, stdout);
7718 fputc ('>', stdout);
7719 }
7720 }
7721 else
7722 procname = arm_print_vma_and_name (aux, fn, addr);
7723 fputc ('\n', stdout);
7724
7725 /* The GCC personality routines use the standard compact
7726 encoding, starting with one byte giving the number of
7727 words. */
7728 if (procname != NULL
7729 && (const_strneq (procname, "__gcc_personality_v0")
7730 || const_strneq (procname, "__gxx_personality_v0")
7731 || const_strneq (procname, "__gcj_personality_v0")
7732 || const_strneq (procname, "__gnu_objc_personality_v0")))
7733 {
7734 remaining = 0;
7735 more_words = 1;
7736 ADVANCE;
7737 if (!remaining)
7738 {
7739 printf (_(" [Truncated data]\n"));
7740 return;
7741 }
7742 more_words = word >> 24;
7743 word <<= 8;
7744 remaining--;
7745 per_index = -1;
7746 }
7747 else
7748 return;
7749 }
7750 else
7751 {
7752 /* ARM EHABI Section 6.3:
7753
7754 An exception-handling table entry for the compact model looks like:
7755
7756 31 30-28 27-24 23-0
7757 -- ----- ----- ----
7758 1 0 index Data for personalityRoutine[index] */
7759
7760 if (elf_header.e_machine == EM_ARM
7761 && (word & 0x70000000))
7762 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7763
7764 per_index = (word >> 24) & 0x7f;
7765 printf (_(" Compact model index: %d\n"), per_index);
7766 if (per_index == 0)
7767 {
7768 more_words = 0;
7769 word <<= 8;
7770 remaining--;
7771 }
7772 else if (per_index < 3)
7773 {
7774 more_words = (word >> 16) & 0xff;
7775 word <<= 16;
7776 remaining -= 2;
7777 }
7778 }
7779
7780 switch (elf_header.e_machine)
7781 {
7782 case EM_ARM:
7783 if (per_index < 3)
7784 {
7785 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7786 data_offset, data_sec, data_arm_sec);
7787 }
7788 else
7789 {
7790 warn (_("Unknown ARM compact model index encountered\n"));
7791 printf (_(" [reserved]\n"));
7792 }
7793 break;
7794
7795 case EM_TI_C6000:
7796 if (per_index < 3)
7797 {
7798 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7799 data_offset, data_sec, data_arm_sec);
7800 }
7801 else if (per_index < 5)
7802 {
7803 if (((word >> 17) & 0x7f) == 0x7f)
7804 printf (_(" Restore stack from frame pointer\n"));
7805 else
7806 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
7807 printf (_(" Registers restored: "));
7808 if (per_index == 4)
7809 printf (" (compact) ");
7810 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7811 putchar ('\n');
7812 printf (_(" Return register: %s\n"),
7813 tic6x_unwind_regnames[word & 0xf]);
7814 }
7815 else
7816 printf (_(" [reserved (%d)]\n"), per_index);
7817 break;
7818
7819 default:
7820 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
7821 elf_header.e_machine);
7822 }
7823
7824 /* Decode the descriptors. Not implemented. */
7825 }
7826
7827 static void
7828 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7829 {
7830 struct arm_section exidx_arm_sec, extab_arm_sec;
7831 unsigned int i, exidx_len;
7832
7833 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7834 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7835 exidx_len = exidx_sec->sh_size / 8;
7836
7837 for (i = 0; i < exidx_len; i++)
7838 {
7839 unsigned int exidx_fn, exidx_entry;
7840 struct absaddr fn_addr, entry_addr;
7841 bfd_vma fn;
7842
7843 fputc ('\n', stdout);
7844
7845 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7846 8 * i, & exidx_fn, & fn_addr, NULL)
7847 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7848 8 * i + 4, & exidx_entry, & entry_addr, NULL))
7849 {
7850 arm_free_section (& exidx_arm_sec);
7851 arm_free_section (& extab_arm_sec);
7852 return;
7853 }
7854
7855 /* ARM EHABI, Section 5:
7856 An index table entry consists of 2 words.
7857 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
7858 if (exidx_fn & 0x80000000)
7859 warn (_("corrupt index table entry: %x\n"), exidx_fn);
7860
7861 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7862
7863 arm_print_vma_and_name (aux, fn, fn_addr);
7864 fputs (": ", stdout);
7865
7866 if (exidx_entry == 1)
7867 {
7868 print_vma (exidx_entry, PREFIX_HEX);
7869 fputs (" [cantunwind]\n", stdout);
7870 }
7871 else if (exidx_entry & 0x80000000)
7872 {
7873 print_vma (exidx_entry, PREFIX_HEX);
7874 fputc ('\n', stdout);
7875 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7876 }
7877 else
7878 {
7879 bfd_vma table, table_offset = 0;
7880 Elf_Internal_Shdr *table_sec;
7881
7882 fputs ("@", stdout);
7883 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7884 print_vma (table, PREFIX_HEX);
7885 printf ("\n");
7886
7887 /* Locate the matching .ARM.extab. */
7888 if (entry_addr.section != SHN_UNDEF
7889 && entry_addr.section < elf_header.e_shnum)
7890 {
7891 table_sec = section_headers + entry_addr.section;
7892 table_offset = entry_addr.offset;
7893 }
7894 else
7895 {
7896 table_sec = find_section_by_address (table);
7897 if (table_sec != NULL)
7898 table_offset = table - table_sec->sh_addr;
7899 }
7900 if (table_sec == NULL)
7901 {
7902 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7903 (unsigned long) table);
7904 continue;
7905 }
7906 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7907 &extab_arm_sec);
7908 }
7909 }
7910
7911 printf ("\n");
7912
7913 arm_free_section (&exidx_arm_sec);
7914 arm_free_section (&extab_arm_sec);
7915 }
7916
7917 /* Used for both ARM and C6X unwinding tables. */
7918
7919 static void
7920 arm_process_unwind (FILE *file)
7921 {
7922 struct arm_unw_aux_info aux;
7923 Elf_Internal_Shdr *unwsec = NULL;
7924 Elf_Internal_Shdr *strsec;
7925 Elf_Internal_Shdr *sec;
7926 unsigned long i;
7927 unsigned int sec_type;
7928
7929 switch (elf_header.e_machine)
7930 {
7931 case EM_ARM:
7932 sec_type = SHT_ARM_EXIDX;
7933 break;
7934
7935 case EM_TI_C6000:
7936 sec_type = SHT_C6000_UNWIND;
7937 break;
7938
7939 default:
7940 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
7941 elf_header.e_machine);
7942 return;
7943 }
7944
7945 if (string_table == NULL)
7946 return;
7947
7948 memset (& aux, 0, sizeof (aux));
7949 aux.file = file;
7950
7951 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7952 {
7953 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7954 {
7955 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7956
7957 strsec = section_headers + sec->sh_link;
7958
7959 /* PR binutils/17531 file: 011-12666-0.004. */
7960 if (aux.strtab != NULL)
7961 {
7962 error (_("Multiple string tables found in file.\n"));
7963 free (aux.strtab);
7964 }
7965 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7966 1, strsec->sh_size, _("string table"));
7967 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7968 }
7969 else if (sec->sh_type == sec_type)
7970 unwsec = sec;
7971 }
7972
7973 if (unwsec == NULL)
7974 printf (_("\nThere are no unwind sections in this file.\n"));
7975 else
7976 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7977 {
7978 if (sec->sh_type == sec_type)
7979 {
7980 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7981 printable_section_name (sec),
7982 (unsigned long) sec->sh_offset,
7983 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7984
7985 dump_arm_unwind (&aux, sec);
7986 }
7987 }
7988
7989 if (aux.symtab)
7990 free (aux.symtab);
7991 if (aux.strtab)
7992 free ((char *) aux.strtab);
7993 }
7994
7995 static void
7996 process_unwind (FILE * file)
7997 {
7998 struct unwind_handler
7999 {
8000 int machtype;
8001 void (* handler)(FILE *);
8002 } handlers[] =
8003 {
8004 { EM_ARM, arm_process_unwind },
8005 { EM_IA_64, ia64_process_unwind },
8006 { EM_PARISC, hppa_process_unwind },
8007 { EM_TI_C6000, arm_process_unwind },
8008 { 0, 0 }
8009 };
8010 int i;
8011
8012 if (!do_unwind)
8013 return;
8014
8015 for (i = 0; handlers[i].handler != NULL; i++)
8016 if (elf_header.e_machine == handlers[i].machtype)
8017 {
8018 handlers[i].handler (file);
8019 return;
8020 }
8021
8022 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8023 get_machine_name (elf_header.e_machine));
8024 }
8025
8026 static void
8027 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8028 {
8029 switch (entry->d_tag)
8030 {
8031 case DT_MIPS_FLAGS:
8032 if (entry->d_un.d_val == 0)
8033 printf (_("NONE"));
8034 else
8035 {
8036 static const char * opts[] =
8037 {
8038 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8039 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8040 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8041 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8042 "RLD_ORDER_SAFE"
8043 };
8044 unsigned int cnt;
8045 int first = 1;
8046
8047 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8048 if (entry->d_un.d_val & (1 << cnt))
8049 {
8050 printf ("%s%s", first ? "" : " ", opts[cnt]);
8051 first = 0;
8052 }
8053 }
8054 break;
8055
8056 case DT_MIPS_IVERSION:
8057 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8058 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8059 else
8060 {
8061 char buf[40];
8062 sprintf_vma (buf, entry->d_un.d_ptr);
8063 /* Note: coded this way so that there is a single string for translation. */
8064 printf (_("<corrupt: %s>"), buf);
8065 }
8066 break;
8067
8068 case DT_MIPS_TIME_STAMP:
8069 {
8070 char timebuf[20];
8071 struct tm * tmp;
8072
8073 time_t atime = entry->d_un.d_val;
8074 tmp = gmtime (&atime);
8075 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8076 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8077 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8078 printf (_("Time Stamp: %s"), timebuf);
8079 }
8080 break;
8081
8082 case DT_MIPS_RLD_VERSION:
8083 case DT_MIPS_LOCAL_GOTNO:
8084 case DT_MIPS_CONFLICTNO:
8085 case DT_MIPS_LIBLISTNO:
8086 case DT_MIPS_SYMTABNO:
8087 case DT_MIPS_UNREFEXTNO:
8088 case DT_MIPS_HIPAGENO:
8089 case DT_MIPS_DELTA_CLASS_NO:
8090 case DT_MIPS_DELTA_INSTANCE_NO:
8091 case DT_MIPS_DELTA_RELOC_NO:
8092 case DT_MIPS_DELTA_SYM_NO:
8093 case DT_MIPS_DELTA_CLASSSYM_NO:
8094 case DT_MIPS_COMPACT_SIZE:
8095 print_vma (entry->d_un.d_ptr, DEC);
8096 break;
8097
8098 default:
8099 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8100 }
8101 putchar ('\n');
8102 }
8103
8104 static void
8105 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8106 {
8107 switch (entry->d_tag)
8108 {
8109 case DT_HP_DLD_FLAGS:
8110 {
8111 static struct
8112 {
8113 long int bit;
8114 const char * str;
8115 }
8116 flags[] =
8117 {
8118 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8119 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8120 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8121 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8122 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8123 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8124 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8125 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8126 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8127 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8128 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8129 { DT_HP_GST, "HP_GST" },
8130 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8131 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8132 { DT_HP_NODELETE, "HP_NODELETE" },
8133 { DT_HP_GROUP, "HP_GROUP" },
8134 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8135 };
8136 int first = 1;
8137 size_t cnt;
8138 bfd_vma val = entry->d_un.d_val;
8139
8140 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8141 if (val & flags[cnt].bit)
8142 {
8143 if (! first)
8144 putchar (' ');
8145 fputs (flags[cnt].str, stdout);
8146 first = 0;
8147 val ^= flags[cnt].bit;
8148 }
8149
8150 if (val != 0 || first)
8151 {
8152 if (! first)
8153 putchar (' ');
8154 print_vma (val, HEX);
8155 }
8156 }
8157 break;
8158
8159 default:
8160 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8161 break;
8162 }
8163 putchar ('\n');
8164 }
8165
8166 #ifdef BFD64
8167
8168 /* VMS vs Unix time offset and factor. */
8169
8170 #define VMS_EPOCH_OFFSET 35067168000000000LL
8171 #define VMS_GRANULARITY_FACTOR 10000000
8172
8173 /* Display a VMS time in a human readable format. */
8174
8175 static void
8176 print_vms_time (bfd_int64_t vmstime)
8177 {
8178 struct tm *tm;
8179 time_t unxtime;
8180
8181 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8182 tm = gmtime (&unxtime);
8183 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8184 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8185 tm->tm_hour, tm->tm_min, tm->tm_sec);
8186 }
8187 #endif /* BFD64 */
8188
8189 static void
8190 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8191 {
8192 switch (entry->d_tag)
8193 {
8194 case DT_IA_64_PLT_RESERVE:
8195 /* First 3 slots reserved. */
8196 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8197 printf (" -- ");
8198 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8199 break;
8200
8201 case DT_IA_64_VMS_LINKTIME:
8202 #ifdef BFD64
8203 print_vms_time (entry->d_un.d_val);
8204 #endif
8205 break;
8206
8207 case DT_IA_64_VMS_LNKFLAGS:
8208 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8209 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8210 printf (" CALL_DEBUG");
8211 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8212 printf (" NOP0BUFS");
8213 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8214 printf (" P0IMAGE");
8215 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8216 printf (" MKTHREADS");
8217 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8218 printf (" UPCALLS");
8219 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8220 printf (" IMGSTA");
8221 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8222 printf (" INITIALIZE");
8223 if (entry->d_un.d_val & VMS_LF_MAIN)
8224 printf (" MAIN");
8225 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8226 printf (" EXE_INIT");
8227 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8228 printf (" TBK_IN_IMG");
8229 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8230 printf (" DBG_IN_IMG");
8231 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8232 printf (" TBK_IN_DSF");
8233 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8234 printf (" DBG_IN_DSF");
8235 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8236 printf (" SIGNATURES");
8237 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8238 printf (" REL_SEG_OFF");
8239 break;
8240
8241 default:
8242 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8243 break;
8244 }
8245 putchar ('\n');
8246 }
8247
8248 static int
8249 get_32bit_dynamic_section (FILE * file)
8250 {
8251 Elf32_External_Dyn * edyn;
8252 Elf32_External_Dyn * ext;
8253 Elf_Internal_Dyn * entry;
8254
8255 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8256 dynamic_size, _("dynamic section"));
8257 if (!edyn)
8258 return 0;
8259
8260 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8261 might not have the luxury of section headers. Look for the DT_NULL
8262 terminator to determine the number of entries. */
8263 for (ext = edyn, dynamic_nent = 0;
8264 (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8265 ext++)
8266 {
8267 dynamic_nent++;
8268 if (BYTE_GET (ext->d_tag) == DT_NULL)
8269 break;
8270 }
8271
8272 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8273 sizeof (* entry));
8274 if (dynamic_section == NULL)
8275 {
8276 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8277 (unsigned long) dynamic_nent);
8278 free (edyn);
8279 return 0;
8280 }
8281
8282 for (ext = edyn, entry = dynamic_section;
8283 entry < dynamic_section + dynamic_nent;
8284 ext++, entry++)
8285 {
8286 entry->d_tag = BYTE_GET (ext->d_tag);
8287 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8288 }
8289
8290 free (edyn);
8291
8292 return 1;
8293 }
8294
8295 static int
8296 get_64bit_dynamic_section (FILE * file)
8297 {
8298 Elf64_External_Dyn * edyn;
8299 Elf64_External_Dyn * ext;
8300 Elf_Internal_Dyn * entry;
8301
8302 /* Read in the data. */
8303 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8304 dynamic_size, _("dynamic section"));
8305 if (!edyn)
8306 return 0;
8307
8308 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8309 might not have the luxury of section headers. Look for the DT_NULL
8310 terminator to determine the number of entries. */
8311 for (ext = edyn, dynamic_nent = 0;
8312 /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer. */
8313 (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8314 ext++)
8315 {
8316 dynamic_nent++;
8317 if (BYTE_GET (ext->d_tag) == DT_NULL)
8318 break;
8319 }
8320
8321 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8322 sizeof (* entry));
8323 if (dynamic_section == NULL)
8324 {
8325 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8326 (unsigned long) dynamic_nent);
8327 free (edyn);
8328 return 0;
8329 }
8330
8331 /* Convert from external to internal formats. */
8332 for (ext = edyn, entry = dynamic_section;
8333 entry < dynamic_section + dynamic_nent;
8334 ext++, entry++)
8335 {
8336 entry->d_tag = BYTE_GET (ext->d_tag);
8337 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8338 }
8339
8340 free (edyn);
8341
8342 return 1;
8343 }
8344
8345 static void
8346 print_dynamic_flags (bfd_vma flags)
8347 {
8348 int first = 1;
8349
8350 while (flags)
8351 {
8352 bfd_vma flag;
8353
8354 flag = flags & - flags;
8355 flags &= ~ flag;
8356
8357 if (first)
8358 first = 0;
8359 else
8360 putc (' ', stdout);
8361
8362 switch (flag)
8363 {
8364 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8365 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8366 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8367 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8368 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8369 default: fputs (_("unknown"), stdout); break;
8370 }
8371 }
8372 puts ("");
8373 }
8374
8375 /* Parse and display the contents of the dynamic section. */
8376
8377 static int
8378 process_dynamic_section (FILE * file)
8379 {
8380 Elf_Internal_Dyn * entry;
8381
8382 if (dynamic_size == 0)
8383 {
8384 if (do_dynamic)
8385 printf (_("\nThere is no dynamic section in this file.\n"));
8386
8387 return 1;
8388 }
8389
8390 if (is_32bit_elf)
8391 {
8392 if (! get_32bit_dynamic_section (file))
8393 return 0;
8394 }
8395 else if (! get_64bit_dynamic_section (file))
8396 return 0;
8397
8398 /* Find the appropriate symbol table. */
8399 if (dynamic_symbols == NULL)
8400 {
8401 for (entry = dynamic_section;
8402 entry < dynamic_section + dynamic_nent;
8403 ++entry)
8404 {
8405 Elf_Internal_Shdr section;
8406
8407 if (entry->d_tag != DT_SYMTAB)
8408 continue;
8409
8410 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8411
8412 /* Since we do not know how big the symbol table is,
8413 we default to reading in the entire file (!) and
8414 processing that. This is overkill, I know, but it
8415 should work. */
8416 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8417
8418 if (archive_file_offset != 0)
8419 section.sh_size = archive_file_size - section.sh_offset;
8420 else
8421 {
8422 if (fseek (file, 0, SEEK_END))
8423 error (_("Unable to seek to end of file!\n"));
8424
8425 section.sh_size = ftell (file) - section.sh_offset;
8426 }
8427
8428 if (is_32bit_elf)
8429 section.sh_entsize = sizeof (Elf32_External_Sym);
8430 else
8431 section.sh_entsize = sizeof (Elf64_External_Sym);
8432 section.sh_name = string_table_length;
8433
8434 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8435 if (num_dynamic_syms < 1)
8436 {
8437 error (_("Unable to determine the number of symbols to load\n"));
8438 continue;
8439 }
8440 }
8441 }
8442
8443 /* Similarly find a string table. */
8444 if (dynamic_strings == NULL)
8445 {
8446 for (entry = dynamic_section;
8447 entry < dynamic_section + dynamic_nent;
8448 ++entry)
8449 {
8450 unsigned long offset;
8451 long str_tab_len;
8452
8453 if (entry->d_tag != DT_STRTAB)
8454 continue;
8455
8456 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8457
8458 /* Since we do not know how big the string table is,
8459 we default to reading in the entire file (!) and
8460 processing that. This is overkill, I know, but it
8461 should work. */
8462
8463 offset = offset_from_vma (file, entry->d_un.d_val, 0);
8464
8465 if (archive_file_offset != 0)
8466 str_tab_len = archive_file_size - offset;
8467 else
8468 {
8469 if (fseek (file, 0, SEEK_END))
8470 error (_("Unable to seek to end of file\n"));
8471 str_tab_len = ftell (file) - offset;
8472 }
8473
8474 if (str_tab_len < 1)
8475 {
8476 error
8477 (_("Unable to determine the length of the dynamic string table\n"));
8478 continue;
8479 }
8480
8481 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8482 str_tab_len,
8483 _("dynamic string table"));
8484 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8485 break;
8486 }
8487 }
8488
8489 /* And find the syminfo section if available. */
8490 if (dynamic_syminfo == NULL)
8491 {
8492 unsigned long syminsz = 0;
8493
8494 for (entry = dynamic_section;
8495 entry < dynamic_section + dynamic_nent;
8496 ++entry)
8497 {
8498 if (entry->d_tag == DT_SYMINENT)
8499 {
8500 /* Note: these braces are necessary to avoid a syntax
8501 error from the SunOS4 C compiler. */
8502 /* PR binutils/17531: A corrupt file can trigger this test.
8503 So do not use an assert, instead generate an error message. */
8504 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8505 error (_("Bad value (%d) for SYMINENT entry\n"),
8506 (int) entry->d_un.d_val);
8507 }
8508 else if (entry->d_tag == DT_SYMINSZ)
8509 syminsz = entry->d_un.d_val;
8510 else if (entry->d_tag == DT_SYMINFO)
8511 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8512 syminsz);
8513 }
8514
8515 if (dynamic_syminfo_offset != 0 && syminsz != 0)
8516 {
8517 Elf_External_Syminfo * extsyminfo;
8518 Elf_External_Syminfo * extsym;
8519 Elf_Internal_Syminfo * syminfo;
8520
8521 /* There is a syminfo section. Read the data. */
8522 extsyminfo = (Elf_External_Syminfo *)
8523 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8524 _("symbol information"));
8525 if (!extsyminfo)
8526 return 0;
8527
8528 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8529 if (dynamic_syminfo == NULL)
8530 {
8531 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8532 (unsigned long) syminsz);
8533 return 0;
8534 }
8535
8536 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8537 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8538 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8539 ++syminfo, ++extsym)
8540 {
8541 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8542 syminfo->si_flags = BYTE_GET (extsym->si_flags);
8543 }
8544
8545 free (extsyminfo);
8546 }
8547 }
8548
8549 if (do_dynamic && dynamic_addr)
8550 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8551 dynamic_addr, (unsigned long) dynamic_nent);
8552 if (do_dynamic)
8553 printf (_(" Tag Type Name/Value\n"));
8554
8555 for (entry = dynamic_section;
8556 entry < dynamic_section + dynamic_nent;
8557 entry++)
8558 {
8559 if (do_dynamic)
8560 {
8561 const char * dtype;
8562
8563 putchar (' ');
8564 print_vma (entry->d_tag, FULL_HEX);
8565 dtype = get_dynamic_type (entry->d_tag);
8566 printf (" (%s)%*s", dtype,
8567 ((is_32bit_elf ? 27 : 19)
8568 - (int) strlen (dtype)),
8569 " ");
8570 }
8571
8572 switch (entry->d_tag)
8573 {
8574 case DT_FLAGS:
8575 if (do_dynamic)
8576 print_dynamic_flags (entry->d_un.d_val);
8577 break;
8578
8579 case DT_AUXILIARY:
8580 case DT_FILTER:
8581 case DT_CONFIG:
8582 case DT_DEPAUDIT:
8583 case DT_AUDIT:
8584 if (do_dynamic)
8585 {
8586 switch (entry->d_tag)
8587 {
8588 case DT_AUXILIARY:
8589 printf (_("Auxiliary library"));
8590 break;
8591
8592 case DT_FILTER:
8593 printf (_("Filter library"));
8594 break;
8595
8596 case DT_CONFIG:
8597 printf (_("Configuration file"));
8598 break;
8599
8600 case DT_DEPAUDIT:
8601 printf (_("Dependency audit library"));
8602 break;
8603
8604 case DT_AUDIT:
8605 printf (_("Audit library"));
8606 break;
8607 }
8608
8609 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8610 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8611 else
8612 {
8613 printf (": ");
8614 print_vma (entry->d_un.d_val, PREFIX_HEX);
8615 putchar ('\n');
8616 }
8617 }
8618 break;
8619
8620 case DT_FEATURE:
8621 if (do_dynamic)
8622 {
8623 printf (_("Flags:"));
8624
8625 if (entry->d_un.d_val == 0)
8626 printf (_(" None\n"));
8627 else
8628 {
8629 unsigned long int val = entry->d_un.d_val;
8630
8631 if (val & DTF_1_PARINIT)
8632 {
8633 printf (" PARINIT");
8634 val ^= DTF_1_PARINIT;
8635 }
8636 if (val & DTF_1_CONFEXP)
8637 {
8638 printf (" CONFEXP");
8639 val ^= DTF_1_CONFEXP;
8640 }
8641 if (val != 0)
8642 printf (" %lx", val);
8643 puts ("");
8644 }
8645 }
8646 break;
8647
8648 case DT_POSFLAG_1:
8649 if (do_dynamic)
8650 {
8651 printf (_("Flags:"));
8652
8653 if (entry->d_un.d_val == 0)
8654 printf (_(" None\n"));
8655 else
8656 {
8657 unsigned long int val = entry->d_un.d_val;
8658
8659 if (val & DF_P1_LAZYLOAD)
8660 {
8661 printf (" LAZYLOAD");
8662 val ^= DF_P1_LAZYLOAD;
8663 }
8664 if (val & DF_P1_GROUPPERM)
8665 {
8666 printf (" GROUPPERM");
8667 val ^= DF_P1_GROUPPERM;
8668 }
8669 if (val != 0)
8670 printf (" %lx", val);
8671 puts ("");
8672 }
8673 }
8674 break;
8675
8676 case DT_FLAGS_1:
8677 if (do_dynamic)
8678 {
8679 printf (_("Flags:"));
8680 if (entry->d_un.d_val == 0)
8681 printf (_(" None\n"));
8682 else
8683 {
8684 unsigned long int val = entry->d_un.d_val;
8685
8686 if (val & DF_1_NOW)
8687 {
8688 printf (" NOW");
8689 val ^= DF_1_NOW;
8690 }
8691 if (val & DF_1_GLOBAL)
8692 {
8693 printf (" GLOBAL");
8694 val ^= DF_1_GLOBAL;
8695 }
8696 if (val & DF_1_GROUP)
8697 {
8698 printf (" GROUP");
8699 val ^= DF_1_GROUP;
8700 }
8701 if (val & DF_1_NODELETE)
8702 {
8703 printf (" NODELETE");
8704 val ^= DF_1_NODELETE;
8705 }
8706 if (val & DF_1_LOADFLTR)
8707 {
8708 printf (" LOADFLTR");
8709 val ^= DF_1_LOADFLTR;
8710 }
8711 if (val & DF_1_INITFIRST)
8712 {
8713 printf (" INITFIRST");
8714 val ^= DF_1_INITFIRST;
8715 }
8716 if (val & DF_1_NOOPEN)
8717 {
8718 printf (" NOOPEN");
8719 val ^= DF_1_NOOPEN;
8720 }
8721 if (val & DF_1_ORIGIN)
8722 {
8723 printf (" ORIGIN");
8724 val ^= DF_1_ORIGIN;
8725 }
8726 if (val & DF_1_DIRECT)
8727 {
8728 printf (" DIRECT");
8729 val ^= DF_1_DIRECT;
8730 }
8731 if (val & DF_1_TRANS)
8732 {
8733 printf (" TRANS");
8734 val ^= DF_1_TRANS;
8735 }
8736 if (val & DF_1_INTERPOSE)
8737 {
8738 printf (" INTERPOSE");
8739 val ^= DF_1_INTERPOSE;
8740 }
8741 if (val & DF_1_NODEFLIB)
8742 {
8743 printf (" NODEFLIB");
8744 val ^= DF_1_NODEFLIB;
8745 }
8746 if (val & DF_1_NODUMP)
8747 {
8748 printf (" NODUMP");
8749 val ^= DF_1_NODUMP;
8750 }
8751 if (val & DF_1_CONFALT)
8752 {
8753 printf (" CONFALT");
8754 val ^= DF_1_CONFALT;
8755 }
8756 if (val & DF_1_ENDFILTEE)
8757 {
8758 printf (" ENDFILTEE");
8759 val ^= DF_1_ENDFILTEE;
8760 }
8761 if (val & DF_1_DISPRELDNE)
8762 {
8763 printf (" DISPRELDNE");
8764 val ^= DF_1_DISPRELDNE;
8765 }
8766 if (val & DF_1_DISPRELPND)
8767 {
8768 printf (" DISPRELPND");
8769 val ^= DF_1_DISPRELPND;
8770 }
8771 if (val & DF_1_NODIRECT)
8772 {
8773 printf (" NODIRECT");
8774 val ^= DF_1_NODIRECT;
8775 }
8776 if (val & DF_1_IGNMULDEF)
8777 {
8778 printf (" IGNMULDEF");
8779 val ^= DF_1_IGNMULDEF;
8780 }
8781 if (val & DF_1_NOKSYMS)
8782 {
8783 printf (" NOKSYMS");
8784 val ^= DF_1_NOKSYMS;
8785 }
8786 if (val & DF_1_NOHDR)
8787 {
8788 printf (" NOHDR");
8789 val ^= DF_1_NOHDR;
8790 }
8791 if (val & DF_1_EDITED)
8792 {
8793 printf (" EDITED");
8794 val ^= DF_1_EDITED;
8795 }
8796 if (val & DF_1_NORELOC)
8797 {
8798 printf (" NORELOC");
8799 val ^= DF_1_NORELOC;
8800 }
8801 if (val & DF_1_SYMINTPOSE)
8802 {
8803 printf (" SYMINTPOSE");
8804 val ^= DF_1_SYMINTPOSE;
8805 }
8806 if (val & DF_1_GLOBAUDIT)
8807 {
8808 printf (" GLOBAUDIT");
8809 val ^= DF_1_GLOBAUDIT;
8810 }
8811 if (val & DF_1_SINGLETON)
8812 {
8813 printf (" SINGLETON");
8814 val ^= DF_1_SINGLETON;
8815 }
8816 if (val != 0)
8817 printf (" %lx", val);
8818 puts ("");
8819 }
8820 }
8821 break;
8822
8823 case DT_PLTREL:
8824 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8825 if (do_dynamic)
8826 puts (get_dynamic_type (entry->d_un.d_val));
8827 break;
8828
8829 case DT_NULL :
8830 case DT_NEEDED :
8831 case DT_PLTGOT :
8832 case DT_HASH :
8833 case DT_STRTAB :
8834 case DT_SYMTAB :
8835 case DT_RELA :
8836 case DT_INIT :
8837 case DT_FINI :
8838 case DT_SONAME :
8839 case DT_RPATH :
8840 case DT_SYMBOLIC:
8841 case DT_REL :
8842 case DT_DEBUG :
8843 case DT_TEXTREL :
8844 case DT_JMPREL :
8845 case DT_RUNPATH :
8846 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8847
8848 if (do_dynamic)
8849 {
8850 char * name;
8851
8852 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8853 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8854 else
8855 name = NULL;
8856
8857 if (name)
8858 {
8859 switch (entry->d_tag)
8860 {
8861 case DT_NEEDED:
8862 printf (_("Shared library: [%s]"), name);
8863
8864 if (streq (name, program_interpreter))
8865 printf (_(" program interpreter"));
8866 break;
8867
8868 case DT_SONAME:
8869 printf (_("Library soname: [%s]"), name);
8870 break;
8871
8872 case DT_RPATH:
8873 printf (_("Library rpath: [%s]"), name);
8874 break;
8875
8876 case DT_RUNPATH:
8877 printf (_("Library runpath: [%s]"), name);
8878 break;
8879
8880 default:
8881 print_vma (entry->d_un.d_val, PREFIX_HEX);
8882 break;
8883 }
8884 }
8885 else
8886 print_vma (entry->d_un.d_val, PREFIX_HEX);
8887
8888 putchar ('\n');
8889 }
8890 break;
8891
8892 case DT_PLTRELSZ:
8893 case DT_RELASZ :
8894 case DT_STRSZ :
8895 case DT_RELSZ :
8896 case DT_RELAENT :
8897 case DT_SYMENT :
8898 case DT_RELENT :
8899 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8900 case DT_PLTPADSZ:
8901 case DT_MOVEENT :
8902 case DT_MOVESZ :
8903 case DT_INIT_ARRAYSZ:
8904 case DT_FINI_ARRAYSZ:
8905 case DT_GNU_CONFLICTSZ:
8906 case DT_GNU_LIBLISTSZ:
8907 if (do_dynamic)
8908 {
8909 print_vma (entry->d_un.d_val, UNSIGNED);
8910 printf (_(" (bytes)\n"));
8911 }
8912 break;
8913
8914 case DT_VERDEFNUM:
8915 case DT_VERNEEDNUM:
8916 case DT_RELACOUNT:
8917 case DT_RELCOUNT:
8918 if (do_dynamic)
8919 {
8920 print_vma (entry->d_un.d_val, UNSIGNED);
8921 putchar ('\n');
8922 }
8923 break;
8924
8925 case DT_SYMINSZ:
8926 case DT_SYMINENT:
8927 case DT_SYMINFO:
8928 case DT_USED:
8929 case DT_INIT_ARRAY:
8930 case DT_FINI_ARRAY:
8931 if (do_dynamic)
8932 {
8933 if (entry->d_tag == DT_USED
8934 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8935 {
8936 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8937
8938 if (*name)
8939 {
8940 printf (_("Not needed object: [%s]\n"), name);
8941 break;
8942 }
8943 }
8944
8945 print_vma (entry->d_un.d_val, PREFIX_HEX);
8946 putchar ('\n');
8947 }
8948 break;
8949
8950 case DT_BIND_NOW:
8951 /* The value of this entry is ignored. */
8952 if (do_dynamic)
8953 putchar ('\n');
8954 break;
8955
8956 case DT_GNU_PRELINKED:
8957 if (do_dynamic)
8958 {
8959 struct tm * tmp;
8960 time_t atime = entry->d_un.d_val;
8961
8962 tmp = gmtime (&atime);
8963 /* PR 17533 file: 041-1244816-0.004. */
8964 if (tmp == NULL)
8965 printf (_("<corrupt time val: %lx"),
8966 (unsigned long) atime);
8967 else
8968 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8969 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8970 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8971
8972 }
8973 break;
8974
8975 case DT_GNU_HASH:
8976 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8977 if (do_dynamic)
8978 {
8979 print_vma (entry->d_un.d_val, PREFIX_HEX);
8980 putchar ('\n');
8981 }
8982 break;
8983
8984 default:
8985 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8986 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8987 entry->d_un.d_val;
8988
8989 if (do_dynamic)
8990 {
8991 switch (elf_header.e_machine)
8992 {
8993 case EM_MIPS:
8994 case EM_MIPS_RS3_LE:
8995 dynamic_section_mips_val (entry);
8996 break;
8997 case EM_PARISC:
8998 dynamic_section_parisc_val (entry);
8999 break;
9000 case EM_IA_64:
9001 dynamic_section_ia64_val (entry);
9002 break;
9003 default:
9004 print_vma (entry->d_un.d_val, PREFIX_HEX);
9005 putchar ('\n');
9006 }
9007 }
9008 break;
9009 }
9010 }
9011
9012 return 1;
9013 }
9014
9015 static char *
9016 get_ver_flags (unsigned int flags)
9017 {
9018 static char buff[32];
9019
9020 buff[0] = 0;
9021
9022 if (flags == 0)
9023 return _("none");
9024
9025 if (flags & VER_FLG_BASE)
9026 strcat (buff, "BASE ");
9027
9028 if (flags & VER_FLG_WEAK)
9029 {
9030 if (flags & VER_FLG_BASE)
9031 strcat (buff, "| ");
9032
9033 strcat (buff, "WEAK ");
9034 }
9035
9036 if (flags & VER_FLG_INFO)
9037 {
9038 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9039 strcat (buff, "| ");
9040
9041 strcat (buff, "INFO ");
9042 }
9043
9044 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9045 strcat (buff, _("| <unknown>"));
9046
9047 return buff;
9048 }
9049
9050 /* Display the contents of the version sections. */
9051
9052 static int
9053 process_version_sections (FILE * file)
9054 {
9055 Elf_Internal_Shdr * section;
9056 unsigned i;
9057 int found = 0;
9058
9059 if (! do_version)
9060 return 1;
9061
9062 for (i = 0, section = section_headers;
9063 i < elf_header.e_shnum;
9064 i++, section++)
9065 {
9066 switch (section->sh_type)
9067 {
9068 case SHT_GNU_verdef:
9069 {
9070 Elf_External_Verdef * edefs;
9071 unsigned int idx;
9072 unsigned int cnt;
9073 char * endbuf;
9074
9075 found = 1;
9076
9077 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9078 printable_section_name (section),
9079 section->sh_info);
9080
9081 printf (_(" Addr: 0x"));
9082 printf_vma (section->sh_addr);
9083 printf (_(" Offset: %#08lx Link: %u (%s)"),
9084 (unsigned long) section->sh_offset, section->sh_link,
9085 printable_section_name_from_index (section->sh_link));
9086
9087 edefs = (Elf_External_Verdef *)
9088 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9089 _("version definition section"));
9090 if (!edefs)
9091 break;
9092 endbuf = (char *) edefs + section->sh_size;
9093
9094 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9095 {
9096 char * vstart;
9097 Elf_External_Verdef * edef;
9098 Elf_Internal_Verdef ent;
9099 Elf_External_Verdaux * eaux;
9100 Elf_Internal_Verdaux aux;
9101 int j;
9102 int isum;
9103
9104 /* Check for very large indicies. */
9105 if (idx > (size_t) (endbuf - (char *) edefs))
9106 break;
9107
9108 vstart = ((char *) edefs) + idx;
9109 if (vstart + sizeof (*edef) > endbuf)
9110 break;
9111
9112 edef = (Elf_External_Verdef *) vstart;
9113
9114 ent.vd_version = BYTE_GET (edef->vd_version);
9115 ent.vd_flags = BYTE_GET (edef->vd_flags);
9116 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9117 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9118 ent.vd_hash = BYTE_GET (edef->vd_hash);
9119 ent.vd_aux = BYTE_GET (edef->vd_aux);
9120 ent.vd_next = BYTE_GET (edef->vd_next);
9121
9122 printf (_(" %#06x: Rev: %d Flags: %s"),
9123 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9124
9125 printf (_(" Index: %d Cnt: %d "),
9126 ent.vd_ndx, ent.vd_cnt);
9127
9128 /* Check for overflow. */
9129 if (ent.vd_aux > (size_t) (endbuf - vstart))
9130 break;
9131
9132 vstart += ent.vd_aux;
9133
9134 eaux = (Elf_External_Verdaux *) vstart;
9135
9136 aux.vda_name = BYTE_GET (eaux->vda_name);
9137 aux.vda_next = BYTE_GET (eaux->vda_next);
9138
9139 if (VALID_DYNAMIC_NAME (aux.vda_name))
9140 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9141 else
9142 printf (_("Name index: %ld\n"), aux.vda_name);
9143
9144 isum = idx + ent.vd_aux;
9145
9146 for (j = 1; j < ent.vd_cnt; j++)
9147 {
9148 /* Check for overflow. */
9149 if (aux.vda_next > (size_t) (endbuf - vstart))
9150 break;
9151
9152 isum += aux.vda_next;
9153 vstart += aux.vda_next;
9154
9155 eaux = (Elf_External_Verdaux *) vstart;
9156 if (vstart + sizeof (*eaux) > endbuf)
9157 break;
9158
9159 aux.vda_name = BYTE_GET (eaux->vda_name);
9160 aux.vda_next = BYTE_GET (eaux->vda_next);
9161
9162 if (VALID_DYNAMIC_NAME (aux.vda_name))
9163 printf (_(" %#06x: Parent %d: %s\n"),
9164 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9165 else
9166 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9167 isum, j, aux.vda_name);
9168 }
9169
9170 if (j < ent.vd_cnt)
9171 printf (_(" Version def aux past end of section\n"));
9172
9173 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9174 if (idx + ent.vd_next <= idx)
9175 break;
9176
9177 idx += ent.vd_next;
9178 }
9179
9180 if (cnt < section->sh_info)
9181 printf (_(" Version definition past end of section\n"));
9182
9183 free (edefs);
9184 }
9185 break;
9186
9187 case SHT_GNU_verneed:
9188 {
9189 Elf_External_Verneed * eneed;
9190 unsigned int idx;
9191 unsigned int cnt;
9192 char * endbuf;
9193
9194 found = 1;
9195
9196 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9197 printable_section_name (section), section->sh_info);
9198
9199 printf (_(" Addr: 0x"));
9200 printf_vma (section->sh_addr);
9201 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9202 (unsigned long) section->sh_offset, section->sh_link,
9203 printable_section_name_from_index (section->sh_link));
9204
9205 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9206 section->sh_offset, 1,
9207 section->sh_size,
9208 _("Version Needs section"));
9209 if (!eneed)
9210 break;
9211 endbuf = (char *) eneed + section->sh_size;
9212
9213 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9214 {
9215 Elf_External_Verneed * entry;
9216 Elf_Internal_Verneed ent;
9217 int j;
9218 int isum;
9219 char * vstart;
9220
9221 if (idx > (size_t) (endbuf - (char *) eneed))
9222 break;
9223
9224 vstart = ((char *) eneed) + idx;
9225 if (vstart + sizeof (*entry) > endbuf)
9226 break;
9227
9228 entry = (Elf_External_Verneed *) vstart;
9229
9230 ent.vn_version = BYTE_GET (entry->vn_version);
9231 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9232 ent.vn_file = BYTE_GET (entry->vn_file);
9233 ent.vn_aux = BYTE_GET (entry->vn_aux);
9234 ent.vn_next = BYTE_GET (entry->vn_next);
9235
9236 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9237
9238 if (VALID_DYNAMIC_NAME (ent.vn_file))
9239 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9240 else
9241 printf (_(" File: %lx"), ent.vn_file);
9242
9243 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9244
9245 /* Check for overflow. */
9246 if (ent.vn_aux > (size_t) (endbuf - vstart))
9247 break;
9248
9249 vstart += ent.vn_aux;
9250
9251 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9252 {
9253 Elf_External_Vernaux * eaux;
9254 Elf_Internal_Vernaux aux;
9255
9256 if (vstart + sizeof (*eaux) > endbuf)
9257 break;
9258 eaux = (Elf_External_Vernaux *) vstart;
9259
9260 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9261 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9262 aux.vna_other = BYTE_GET (eaux->vna_other);
9263 aux.vna_name = BYTE_GET (eaux->vna_name);
9264 aux.vna_next = BYTE_GET (eaux->vna_next);
9265
9266 if (VALID_DYNAMIC_NAME (aux.vna_name))
9267 printf (_(" %#06x: Name: %s"),
9268 isum, GET_DYNAMIC_NAME (aux.vna_name));
9269 else
9270 printf (_(" %#06x: Name index: %lx"),
9271 isum, aux.vna_name);
9272
9273 printf (_(" Flags: %s Version: %d\n"),
9274 get_ver_flags (aux.vna_flags), aux.vna_other);
9275
9276 /* Check for overflow. */
9277 if (aux.vna_next > (size_t) (endbuf - vstart))
9278 break;
9279
9280 isum += aux.vna_next;
9281 vstart += aux.vna_next;
9282 }
9283
9284 if (j < ent.vn_cnt)
9285 warn (_("Missing Version Needs auxillary information\n"));
9286
9287 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9288 {
9289 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9290 cnt = section->sh_info;
9291 break;
9292 }
9293 idx += ent.vn_next;
9294 }
9295
9296 if (cnt < section->sh_info)
9297 warn (_("Missing Version Needs information\n"));
9298
9299 free (eneed);
9300 }
9301 break;
9302
9303 case SHT_GNU_versym:
9304 {
9305 Elf_Internal_Shdr * link_section;
9306 size_t total;
9307 unsigned int cnt;
9308 unsigned char * edata;
9309 unsigned short * data;
9310 char * strtab;
9311 Elf_Internal_Sym * symbols;
9312 Elf_Internal_Shdr * string_sec;
9313 unsigned long num_syms;
9314 long off;
9315
9316 if (section->sh_link >= elf_header.e_shnum)
9317 break;
9318
9319 link_section = section_headers + section->sh_link;
9320 total = section->sh_size / sizeof (Elf_External_Versym);
9321
9322 if (link_section->sh_link >= elf_header.e_shnum)
9323 break;
9324
9325 found = 1;
9326
9327 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9328 if (symbols == NULL)
9329 break;
9330
9331 string_sec = section_headers + link_section->sh_link;
9332
9333 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9334 string_sec->sh_size,
9335 _("version string table"));
9336 if (!strtab)
9337 {
9338 free (symbols);
9339 break;
9340 }
9341
9342 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9343 printable_section_name (section), (unsigned long) total);
9344
9345 printf (_(" Addr: "));
9346 printf_vma (section->sh_addr);
9347 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9348 (unsigned long) section->sh_offset, section->sh_link,
9349 printable_section_name (link_section));
9350
9351 off = offset_from_vma (file,
9352 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9353 total * sizeof (short));
9354 edata = (unsigned char *) get_data (NULL, file, off, total,
9355 sizeof (short),
9356 _("version symbol data"));
9357 if (!edata)
9358 {
9359 free (strtab);
9360 free (symbols);
9361 break;
9362 }
9363
9364 data = (short unsigned int *) cmalloc (total, sizeof (short));
9365
9366 for (cnt = total; cnt --;)
9367 data[cnt] = byte_get (edata + cnt * sizeof (short),
9368 sizeof (short));
9369
9370 free (edata);
9371
9372 for (cnt = 0; cnt < total; cnt += 4)
9373 {
9374 int j, nn;
9375 int check_def, check_need;
9376 char * name;
9377
9378 printf (" %03x:", cnt);
9379
9380 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9381 switch (data[cnt + j])
9382 {
9383 case 0:
9384 fputs (_(" 0 (*local*) "), stdout);
9385 break;
9386
9387 case 1:
9388 fputs (_(" 1 (*global*) "), stdout);
9389 break;
9390
9391 default:
9392 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9393 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9394
9395 /* If this index value is greater than the size of the symbols
9396 array, break to avoid an out-of-bounds read. */
9397 if ((unsigned long)(cnt + j) >= num_syms)
9398 {
9399 warn (_("invalid index into symbol array\n"));
9400 break;
9401 }
9402
9403 check_def = 1;
9404 check_need = 1;
9405 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9406 || section_headers[symbols[cnt + j].st_shndx].sh_type
9407 != SHT_NOBITS)
9408 {
9409 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9410 check_def = 0;
9411 else
9412 check_need = 0;
9413 }
9414
9415 if (check_need
9416 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9417 {
9418 Elf_Internal_Verneed ivn;
9419 unsigned long offset;
9420
9421 offset = offset_from_vma
9422 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9423 sizeof (Elf_External_Verneed));
9424
9425 do
9426 {
9427 Elf_Internal_Vernaux ivna;
9428 Elf_External_Verneed evn;
9429 Elf_External_Vernaux evna;
9430 unsigned long a_off;
9431
9432 if (get_data (&evn, file, offset, sizeof (evn), 1,
9433 _("version need")) == NULL)
9434 break;
9435
9436 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9437 ivn.vn_next = BYTE_GET (evn.vn_next);
9438
9439 a_off = offset + ivn.vn_aux;
9440
9441 do
9442 {
9443 if (get_data (&evna, file, a_off, sizeof (evna),
9444 1, _("version need aux (2)")) == NULL)
9445 {
9446 ivna.vna_next = 0;
9447 ivna.vna_other = 0;
9448 }
9449 else
9450 {
9451 ivna.vna_next = BYTE_GET (evna.vna_next);
9452 ivna.vna_other = BYTE_GET (evna.vna_other);
9453 }
9454
9455 a_off += ivna.vna_next;
9456 }
9457 while (ivna.vna_other != data[cnt + j]
9458 && ivna.vna_next != 0);
9459
9460 if (ivna.vna_other == data[cnt + j])
9461 {
9462 ivna.vna_name = BYTE_GET (evna.vna_name);
9463
9464 if (ivna.vna_name >= string_sec->sh_size)
9465 name = _("*invalid*");
9466 else
9467 name = strtab + ivna.vna_name;
9468 nn += printf ("(%s%-*s",
9469 name,
9470 12 - (int) strlen (name),
9471 ")");
9472 check_def = 0;
9473 break;
9474 }
9475
9476 offset += ivn.vn_next;
9477 }
9478 while (ivn.vn_next);
9479 }
9480
9481 if (check_def && data[cnt + j] != 0x8001
9482 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9483 {
9484 Elf_Internal_Verdef ivd;
9485 Elf_External_Verdef evd;
9486 unsigned long offset;
9487
9488 offset = offset_from_vma
9489 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9490 sizeof evd);
9491
9492 do
9493 {
9494 if (get_data (&evd, file, offset, sizeof (evd), 1,
9495 _("version def")) == NULL)
9496 {
9497 ivd.vd_next = 0;
9498 /* PR 17531: file: 046-1082287-0.004. */
9499 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
9500 break;
9501 }
9502 else
9503 {
9504 ivd.vd_next = BYTE_GET (evd.vd_next);
9505 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9506 }
9507
9508 offset += ivd.vd_next;
9509 }
9510 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9511 && ivd.vd_next != 0);
9512
9513 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9514 {
9515 Elf_External_Verdaux evda;
9516 Elf_Internal_Verdaux ivda;
9517
9518 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9519
9520 if (get_data (&evda, file,
9521 offset - ivd.vd_next + ivd.vd_aux,
9522 sizeof (evda), 1,
9523 _("version def aux")) == NULL)
9524 break;
9525
9526 ivda.vda_name = BYTE_GET (evda.vda_name);
9527
9528 if (ivda.vda_name >= string_sec->sh_size)
9529 name = _("*invalid*");
9530 else
9531 name = strtab + ivda.vda_name;
9532 nn += printf ("(%s%-*s",
9533 name,
9534 12 - (int) strlen (name),
9535 ")");
9536 }
9537 }
9538
9539 if (nn < 18)
9540 printf ("%*c", 18 - nn, ' ');
9541 }
9542
9543 putchar ('\n');
9544 }
9545
9546 free (data);
9547 free (strtab);
9548 free (symbols);
9549 }
9550 break;
9551
9552 default:
9553 break;
9554 }
9555 }
9556
9557 if (! found)
9558 printf (_("\nNo version information found in this file.\n"));
9559
9560 return 1;
9561 }
9562
9563 static const char *
9564 get_symbol_binding (unsigned int binding)
9565 {
9566 static char buff[32];
9567
9568 switch (binding)
9569 {
9570 case STB_LOCAL: return "LOCAL";
9571 case STB_GLOBAL: return "GLOBAL";
9572 case STB_WEAK: return "WEAK";
9573 default:
9574 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9575 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9576 binding);
9577 else if (binding >= STB_LOOS && binding <= STB_HIOS)
9578 {
9579 if (binding == STB_GNU_UNIQUE
9580 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9581 /* GNU is still using the default value 0. */
9582 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9583 return "UNIQUE";
9584 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9585 }
9586 else
9587 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9588 return buff;
9589 }
9590 }
9591
9592 static const char *
9593 get_symbol_type (unsigned int type)
9594 {
9595 static char buff[32];
9596
9597 switch (type)
9598 {
9599 case STT_NOTYPE: return "NOTYPE";
9600 case STT_OBJECT: return "OBJECT";
9601 case STT_FUNC: return "FUNC";
9602 case STT_SECTION: return "SECTION";
9603 case STT_FILE: return "FILE";
9604 case STT_COMMON: return "COMMON";
9605 case STT_TLS: return "TLS";
9606 case STT_RELC: return "RELC";
9607 case STT_SRELC: return "SRELC";
9608 default:
9609 if (type >= STT_LOPROC && type <= STT_HIPROC)
9610 {
9611 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9612 return "THUMB_FUNC";
9613
9614 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9615 return "REGISTER";
9616
9617 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9618 return "PARISC_MILLI";
9619
9620 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9621 }
9622 else if (type >= STT_LOOS && type <= STT_HIOS)
9623 {
9624 if (elf_header.e_machine == EM_PARISC)
9625 {
9626 if (type == STT_HP_OPAQUE)
9627 return "HP_OPAQUE";
9628 if (type == STT_HP_STUB)
9629 return "HP_STUB";
9630 }
9631
9632 if (type == STT_GNU_IFUNC
9633 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9634 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9635 /* GNU is still using the default value 0. */
9636 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9637 return "IFUNC";
9638
9639 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9640 }
9641 else
9642 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9643 return buff;
9644 }
9645 }
9646
9647 static const char *
9648 get_symbol_visibility (unsigned int visibility)
9649 {
9650 switch (visibility)
9651 {
9652 case STV_DEFAULT: return "DEFAULT";
9653 case STV_INTERNAL: return "INTERNAL";
9654 case STV_HIDDEN: return "HIDDEN";
9655 case STV_PROTECTED: return "PROTECTED";
9656 default: abort ();
9657 }
9658 }
9659
9660 static const char *
9661 get_mips_symbol_other (unsigned int other)
9662 {
9663 switch (other)
9664 {
9665 case STO_OPTIONAL:
9666 return "OPTIONAL";
9667 case STO_MIPS_PLT:
9668 return "MIPS PLT";
9669 case STO_MIPS_PIC:
9670 return "MIPS PIC";
9671 case STO_MICROMIPS:
9672 return "MICROMIPS";
9673 case STO_MICROMIPS | STO_MIPS_PIC:
9674 return "MICROMIPS, MIPS PIC";
9675 case STO_MIPS16:
9676 return "MIPS16";
9677 default:
9678 return NULL;
9679 }
9680 }
9681
9682 static const char *
9683 get_ia64_symbol_other (unsigned int other)
9684 {
9685 if (is_ia64_vms ())
9686 {
9687 static char res[32];
9688
9689 res[0] = 0;
9690
9691 /* Function types is for images and .STB files only. */
9692 switch (elf_header.e_type)
9693 {
9694 case ET_DYN:
9695 case ET_EXEC:
9696 switch (VMS_ST_FUNC_TYPE (other))
9697 {
9698 case VMS_SFT_CODE_ADDR:
9699 strcat (res, " CA");
9700 break;
9701 case VMS_SFT_SYMV_IDX:
9702 strcat (res, " VEC");
9703 break;
9704 case VMS_SFT_FD:
9705 strcat (res, " FD");
9706 break;
9707 case VMS_SFT_RESERVE:
9708 strcat (res, " RSV");
9709 break;
9710 default:
9711 abort ();
9712 }
9713 break;
9714 default:
9715 break;
9716 }
9717 switch (VMS_ST_LINKAGE (other))
9718 {
9719 case VMS_STL_IGNORE:
9720 strcat (res, " IGN");
9721 break;
9722 case VMS_STL_RESERVE:
9723 strcat (res, " RSV");
9724 break;
9725 case VMS_STL_STD:
9726 strcat (res, " STD");
9727 break;
9728 case VMS_STL_LNK:
9729 strcat (res, " LNK");
9730 break;
9731 default:
9732 abort ();
9733 }
9734
9735 if (res[0] != 0)
9736 return res + 1;
9737 else
9738 return res;
9739 }
9740 return NULL;
9741 }
9742
9743 static const char *
9744 get_ppc64_symbol_other (unsigned int other)
9745 {
9746 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9747 {
9748 static char buf[32];
9749 snprintf (buf, sizeof buf, _("<localentry>: %d"),
9750 PPC64_LOCAL_ENTRY_OFFSET (other));
9751 return buf;
9752 }
9753 return NULL;
9754 }
9755
9756 static const char *
9757 get_symbol_other (unsigned int other)
9758 {
9759 const char * result = NULL;
9760 static char buff [32];
9761
9762 if (other == 0)
9763 return "";
9764
9765 switch (elf_header.e_machine)
9766 {
9767 case EM_MIPS:
9768 result = get_mips_symbol_other (other);
9769 break;
9770 case EM_IA_64:
9771 result = get_ia64_symbol_other (other);
9772 break;
9773 case EM_PPC64:
9774 result = get_ppc64_symbol_other (other);
9775 break;
9776 default:
9777 break;
9778 }
9779
9780 if (result)
9781 return result;
9782
9783 snprintf (buff, sizeof buff, _("<other>: %x"), other);
9784 return buff;
9785 }
9786
9787 static const char *
9788 get_symbol_index_type (unsigned int type)
9789 {
9790 static char buff[32];
9791
9792 switch (type)
9793 {
9794 case SHN_UNDEF: return "UND";
9795 case SHN_ABS: return "ABS";
9796 case SHN_COMMON: return "COM";
9797 default:
9798 if (type == SHN_IA_64_ANSI_COMMON
9799 && elf_header.e_machine == EM_IA_64
9800 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9801 return "ANSI_COM";
9802 else if ((elf_header.e_machine == EM_X86_64
9803 || elf_header.e_machine == EM_L1OM
9804 || elf_header.e_machine == EM_K1OM)
9805 && type == SHN_X86_64_LCOMMON)
9806 return "LARGE_COM";
9807 else if ((type == SHN_MIPS_SCOMMON
9808 && elf_header.e_machine == EM_MIPS)
9809 || (type == SHN_TIC6X_SCOMMON
9810 && elf_header.e_machine == EM_TI_C6000))
9811 return "SCOM";
9812 else if (type == SHN_MIPS_SUNDEFINED
9813 && elf_header.e_machine == EM_MIPS)
9814 return "SUND";
9815 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9816 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9817 else if (type >= SHN_LOOS && type <= SHN_HIOS)
9818 sprintf (buff, "OS [0x%04x]", type & 0xffff);
9819 else if (type >= SHN_LORESERVE)
9820 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9821 else if (type >= elf_header.e_shnum)
9822 sprintf (buff, _("bad section index[%3d]"), type);
9823 else
9824 sprintf (buff, "%3d", type);
9825 break;
9826 }
9827
9828 return buff;
9829 }
9830
9831 static bfd_vma *
9832 get_dynamic_data (FILE * file, size_t number, unsigned int ent_size)
9833 {
9834 unsigned char * e_data;
9835 bfd_vma * i_data;
9836
9837 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
9838 attempting to allocate memory when the read is bound to fail. */
9839 if (ent_size * number > current_file_size)
9840 {
9841 error (_("Invalid number of dynamic entries: %lu\n"),
9842 (unsigned long) number);
9843 return NULL;
9844 }
9845
9846 e_data = (unsigned char *) cmalloc (number, ent_size);
9847 if (e_data == NULL)
9848 {
9849 error (_("Out of memory reading %lu dynamic entries\n"),
9850 (unsigned long) number);
9851 return NULL;
9852 }
9853
9854 if (fread (e_data, ent_size, number, file) != number)
9855 {
9856 error (_("Unable to read in %lu bytes of dynamic data\n"),
9857 (unsigned long) (number * ent_size));
9858 free (e_data);
9859 return NULL;
9860 }
9861
9862 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9863 if (i_data == NULL)
9864 {
9865 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9866 (unsigned long) number);
9867 free (e_data);
9868 return NULL;
9869 }
9870
9871 while (number--)
9872 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9873
9874 free (e_data);
9875
9876 return i_data;
9877 }
9878
9879 static void
9880 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9881 {
9882 Elf_Internal_Sym * psym;
9883 int n;
9884
9885 n = print_vma (si, DEC_5);
9886 if (n < 5)
9887 fputs (&" "[n], stdout);
9888 printf (" %3lu: ", hn);
9889
9890 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
9891 {
9892 printf (_("<No info available for dynamic symbol number %lu>\n"),
9893 (unsigned long) si);
9894 return;
9895 }
9896
9897 psym = dynamic_symbols + si;
9898 print_vma (psym->st_value, LONG_HEX);
9899 putchar (' ');
9900 print_vma (psym->st_size, DEC_5);
9901
9902 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9903 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9904 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9905 /* Check to see if any other bits in the st_other field are set.
9906 Note - displaying this information disrupts the layout of the
9907 table being generated, but for the moment this case is very
9908 rare. */
9909 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9910 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9911 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9912 if (VALID_DYNAMIC_NAME (psym->st_name))
9913 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9914 else
9915 printf (_(" <corrupt: %14ld>"), psym->st_name);
9916 putchar ('\n');
9917 }
9918
9919 static const char *
9920 get_symbol_version_string (FILE *file, int is_dynsym,
9921 const char *strtab,
9922 unsigned long int strtab_size,
9923 unsigned int si, Elf_Internal_Sym *psym,
9924 enum versioned_symbol_info *sym_info,
9925 unsigned short *vna_other)
9926 {
9927 const char *version_string = NULL;
9928
9929 if (is_dynsym
9930 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9931 {
9932 unsigned char data[2];
9933 unsigned short vers_data;
9934 unsigned long offset;
9935 int is_nobits;
9936 int check_def;
9937
9938 offset = offset_from_vma
9939 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9940 sizeof data + si * sizeof (vers_data));
9941
9942 if (get_data (&data, file, offset + si * sizeof (vers_data),
9943 sizeof (data), 1, _("version data")) == NULL)
9944 return NULL;
9945
9946 vers_data = byte_get (data, 2);
9947
9948 is_nobits = (psym->st_shndx < elf_header.e_shnum
9949 && section_headers[psym->st_shndx].sh_type
9950 == SHT_NOBITS);
9951
9952 check_def = (psym->st_shndx != SHN_UNDEF);
9953
9954 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9955 {
9956 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9957 && (is_nobits || ! check_def))
9958 {
9959 Elf_External_Verneed evn;
9960 Elf_Internal_Verneed ivn;
9961 Elf_Internal_Vernaux ivna;
9962
9963 /* We must test both. */
9964 offset = offset_from_vma
9965 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9966 sizeof evn);
9967
9968 do
9969 {
9970 unsigned long vna_off;
9971
9972 if (get_data (&evn, file, offset, sizeof (evn), 1,
9973 _("version need")) == NULL)
9974 {
9975 ivna.vna_next = 0;
9976 ivna.vna_other = 0;
9977 ivna.vna_name = 0;
9978 break;
9979 }
9980
9981 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9982 ivn.vn_next = BYTE_GET (evn.vn_next);
9983
9984 vna_off = offset + ivn.vn_aux;
9985
9986 do
9987 {
9988 Elf_External_Vernaux evna;
9989
9990 if (get_data (&evna, file, vna_off,
9991 sizeof (evna), 1,
9992 _("version need aux (3)")) == NULL)
9993 {
9994 ivna.vna_next = 0;
9995 ivna.vna_other = 0;
9996 ivna.vna_name = 0;
9997 }
9998 else
9999 {
10000 ivna.vna_other = BYTE_GET (evna.vna_other);
10001 ivna.vna_next = BYTE_GET (evna.vna_next);
10002 ivna.vna_name = BYTE_GET (evna.vna_name);
10003 }
10004
10005 vna_off += ivna.vna_next;
10006 }
10007 while (ivna.vna_other != vers_data
10008 && ivna.vna_next != 0);
10009
10010 if (ivna.vna_other == vers_data)
10011 break;
10012
10013 offset += ivn.vn_next;
10014 }
10015 while (ivn.vn_next != 0);
10016
10017 if (ivna.vna_other == vers_data)
10018 {
10019 *sym_info = symbol_undefined;
10020 *vna_other = ivna.vna_other;
10021 version_string = (ivna.vna_name < strtab_size
10022 ? strtab + ivna.vna_name
10023 : _("<corrupt>"));
10024 check_def = 0;
10025 }
10026 else if (! is_nobits)
10027 error (_("bad dynamic symbol\n"));
10028 else
10029 check_def = 1;
10030 }
10031
10032 if (check_def)
10033 {
10034 if (vers_data != 0x8001
10035 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10036 {
10037 Elf_Internal_Verdef ivd;
10038 Elf_Internal_Verdaux ivda;
10039 Elf_External_Verdaux evda;
10040 unsigned long off;
10041
10042 off = offset_from_vma
10043 (file,
10044 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10045 sizeof (Elf_External_Verdef));
10046
10047 do
10048 {
10049 Elf_External_Verdef evd;
10050
10051 if (get_data (&evd, file, off, sizeof (evd),
10052 1, _("version def")) == NULL)
10053 {
10054 ivd.vd_ndx = 0;
10055 ivd.vd_aux = 0;
10056 ivd.vd_next = 0;
10057 }
10058 else
10059 {
10060 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10061 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10062 ivd.vd_next = BYTE_GET (evd.vd_next);
10063 }
10064
10065 off += ivd.vd_next;
10066 }
10067 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10068 && ivd.vd_next != 0);
10069
10070 off -= ivd.vd_next;
10071 off += ivd.vd_aux;
10072
10073 if (get_data (&evda, file, off, sizeof (evda),
10074 1, _("version def aux")) == NULL)
10075 return version_string;
10076
10077 ivda.vda_name = BYTE_GET (evda.vda_name);
10078
10079 if (psym->st_name != ivda.vda_name)
10080 {
10081 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10082 ? symbol_hidden : symbol_public);
10083 version_string = (ivda.vda_name < strtab_size
10084 ? strtab + ivda.vda_name
10085 : _("<corrupt>"));
10086 }
10087 }
10088 }
10089 }
10090 }
10091 return version_string;
10092 }
10093
10094 /* Dump the symbol table. */
10095 static int
10096 process_symbol_table (FILE * file)
10097 {
10098 Elf_Internal_Shdr * section;
10099 bfd_size_type nbuckets = 0;
10100 bfd_size_type nchains = 0;
10101 bfd_vma * buckets = NULL;
10102 bfd_vma * chains = NULL;
10103 bfd_vma ngnubuckets = 0;
10104 bfd_vma * gnubuckets = NULL;
10105 bfd_vma * gnuchains = NULL;
10106 bfd_vma gnusymidx = 0;
10107 bfd_size_type ngnuchains = 0;
10108
10109 if (!do_syms && !do_dyn_syms && !do_histogram)
10110 return 1;
10111
10112 if (dynamic_info[DT_HASH]
10113 && (do_histogram
10114 || (do_using_dynamic
10115 && !do_dyn_syms
10116 && dynamic_strings != NULL)))
10117 {
10118 unsigned char nb[8];
10119 unsigned char nc[8];
10120 unsigned int hash_ent_size = 4;
10121
10122 if ((elf_header.e_machine == EM_ALPHA
10123 || elf_header.e_machine == EM_S390
10124 || elf_header.e_machine == EM_S390_OLD)
10125 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10126 hash_ent_size = 8;
10127
10128 if (fseek (file,
10129 (archive_file_offset
10130 + offset_from_vma (file, dynamic_info[DT_HASH],
10131 sizeof nb + sizeof nc)),
10132 SEEK_SET))
10133 {
10134 error (_("Unable to seek to start of dynamic information\n"));
10135 goto no_hash;
10136 }
10137
10138 if (fread (nb, hash_ent_size, 1, file) != 1)
10139 {
10140 error (_("Failed to read in number of buckets\n"));
10141 goto no_hash;
10142 }
10143
10144 if (fread (nc, hash_ent_size, 1, file) != 1)
10145 {
10146 error (_("Failed to read in number of chains\n"));
10147 goto no_hash;
10148 }
10149
10150 nbuckets = byte_get (nb, hash_ent_size);
10151 nchains = byte_get (nc, hash_ent_size);
10152
10153 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10154 chains = get_dynamic_data (file, nchains, hash_ent_size);
10155
10156 no_hash:
10157 if (buckets == NULL || chains == NULL)
10158 {
10159 if (do_using_dynamic)
10160 return 0;
10161 free (buckets);
10162 free (chains);
10163 buckets = NULL;
10164 chains = NULL;
10165 nbuckets = 0;
10166 nchains = 0;
10167 }
10168 }
10169
10170 if (dynamic_info_DT_GNU_HASH
10171 && (do_histogram
10172 || (do_using_dynamic
10173 && !do_dyn_syms
10174 && dynamic_strings != NULL)))
10175 {
10176 unsigned char nb[16];
10177 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10178 bfd_vma buckets_vma;
10179
10180 if (fseek (file,
10181 (archive_file_offset
10182 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10183 sizeof nb)),
10184 SEEK_SET))
10185 {
10186 error (_("Unable to seek to start of dynamic information\n"));
10187 goto no_gnu_hash;
10188 }
10189
10190 if (fread (nb, 16, 1, file) != 1)
10191 {
10192 error (_("Failed to read in number of buckets\n"));
10193 goto no_gnu_hash;
10194 }
10195
10196 ngnubuckets = byte_get (nb, 4);
10197 gnusymidx = byte_get (nb + 4, 4);
10198 bitmaskwords = byte_get (nb + 8, 4);
10199 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10200 if (is_32bit_elf)
10201 buckets_vma += bitmaskwords * 4;
10202 else
10203 buckets_vma += bitmaskwords * 8;
10204
10205 if (fseek (file,
10206 (archive_file_offset
10207 + offset_from_vma (file, buckets_vma, 4)),
10208 SEEK_SET))
10209 {
10210 error (_("Unable to seek to start of dynamic information\n"));
10211 goto no_gnu_hash;
10212 }
10213
10214 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10215
10216 if (gnubuckets == NULL)
10217 goto no_gnu_hash;
10218
10219 for (i = 0; i < ngnubuckets; i++)
10220 if (gnubuckets[i] != 0)
10221 {
10222 if (gnubuckets[i] < gnusymidx)
10223 return 0;
10224
10225 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10226 maxchain = gnubuckets[i];
10227 }
10228
10229 if (maxchain == 0xffffffff)
10230 goto no_gnu_hash;
10231
10232 maxchain -= gnusymidx;
10233
10234 if (fseek (file,
10235 (archive_file_offset
10236 + offset_from_vma (file, buckets_vma
10237 + 4 * (ngnubuckets + maxchain), 4)),
10238 SEEK_SET))
10239 {
10240 error (_("Unable to seek to start of dynamic information\n"));
10241 goto no_gnu_hash;
10242 }
10243
10244 do
10245 {
10246 if (fread (nb, 4, 1, file) != 1)
10247 {
10248 error (_("Failed to determine last chain length\n"));
10249 goto no_gnu_hash;
10250 }
10251
10252 if (maxchain + 1 == 0)
10253 goto no_gnu_hash;
10254
10255 ++maxchain;
10256 }
10257 while ((byte_get (nb, 4) & 1) == 0);
10258
10259 if (fseek (file,
10260 (archive_file_offset
10261 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10262 SEEK_SET))
10263 {
10264 error (_("Unable to seek to start of dynamic information\n"));
10265 goto no_gnu_hash;
10266 }
10267
10268 gnuchains = get_dynamic_data (file, maxchain, 4);
10269 ngnuchains = maxchain;
10270
10271 no_gnu_hash:
10272 if (gnuchains == NULL)
10273 {
10274 free (gnubuckets);
10275 gnubuckets = NULL;
10276 ngnubuckets = 0;
10277 if (do_using_dynamic)
10278 return 0;
10279 }
10280 }
10281
10282 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10283 && do_syms
10284 && do_using_dynamic
10285 && dynamic_strings != NULL
10286 && dynamic_symbols != NULL)
10287 {
10288 unsigned long hn;
10289
10290 if (dynamic_info[DT_HASH])
10291 {
10292 bfd_vma si;
10293
10294 printf (_("\nSymbol table for image:\n"));
10295 if (is_32bit_elf)
10296 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10297 else
10298 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10299
10300 for (hn = 0; hn < nbuckets; hn++)
10301 {
10302 if (! buckets[hn])
10303 continue;
10304
10305 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10306 print_dynamic_symbol (si, hn);
10307 }
10308 }
10309
10310 if (dynamic_info_DT_GNU_HASH)
10311 {
10312 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10313 if (is_32bit_elf)
10314 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10315 else
10316 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10317
10318 for (hn = 0; hn < ngnubuckets; ++hn)
10319 if (gnubuckets[hn] != 0)
10320 {
10321 bfd_vma si = gnubuckets[hn];
10322 bfd_vma off = si - gnusymidx;
10323
10324 do
10325 {
10326 print_dynamic_symbol (si, hn);
10327 si++;
10328 }
10329 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10330 }
10331 }
10332 }
10333 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10334 && section_headers != NULL)
10335 {
10336 unsigned int i;
10337
10338 for (i = 0, section = section_headers;
10339 i < elf_header.e_shnum;
10340 i++, section++)
10341 {
10342 unsigned int si;
10343 char * strtab = NULL;
10344 unsigned long int strtab_size = 0;
10345 Elf_Internal_Sym * symtab;
10346 Elf_Internal_Sym * psym;
10347 unsigned long num_syms;
10348
10349 if ((section->sh_type != SHT_SYMTAB
10350 && section->sh_type != SHT_DYNSYM)
10351 || (!do_syms
10352 && section->sh_type == SHT_SYMTAB))
10353 continue;
10354
10355 if (section->sh_entsize == 0)
10356 {
10357 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10358 printable_section_name (section));
10359 continue;
10360 }
10361
10362 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10363 printable_section_name (section),
10364 (unsigned long) (section->sh_size / section->sh_entsize));
10365
10366 if (is_32bit_elf)
10367 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10368 else
10369 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10370
10371 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10372 if (symtab == NULL)
10373 continue;
10374
10375 if (section->sh_link == elf_header.e_shstrndx)
10376 {
10377 strtab = string_table;
10378 strtab_size = string_table_length;
10379 }
10380 else if (section->sh_link < elf_header.e_shnum)
10381 {
10382 Elf_Internal_Shdr * string_sec;
10383
10384 string_sec = section_headers + section->sh_link;
10385
10386 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10387 1, string_sec->sh_size,
10388 _("string table"));
10389 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10390 }
10391
10392 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10393 {
10394 const char *version_string;
10395 enum versioned_symbol_info sym_info;
10396 unsigned short vna_other;
10397
10398 printf ("%6d: ", si);
10399 print_vma (psym->st_value, LONG_HEX);
10400 putchar (' ');
10401 print_vma (psym->st_size, DEC_5);
10402 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10403 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10404 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10405 /* Check to see if any other bits in the st_other field are set.
10406 Note - displaying this information disrupts the layout of the
10407 table being generated, but for the moment this case is very rare. */
10408 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10409 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10410 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10411 print_symbol (25, psym->st_name < strtab_size
10412 ? strtab + psym->st_name : _("<corrupt>"));
10413
10414 version_string
10415 = get_symbol_version_string (file,
10416 section->sh_type == SHT_DYNSYM,
10417 strtab, strtab_size, si,
10418 psym, &sym_info, &vna_other);
10419 if (version_string)
10420 {
10421 if (sym_info == symbol_undefined)
10422 printf ("@%s (%d)", version_string, vna_other);
10423 else
10424 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10425 version_string);
10426 }
10427
10428 putchar ('\n');
10429 }
10430
10431 free (symtab);
10432 if (strtab != string_table)
10433 free (strtab);
10434 }
10435 }
10436 else if (do_syms)
10437 printf
10438 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10439
10440 if (do_histogram && buckets != NULL)
10441 {
10442 unsigned long * lengths;
10443 unsigned long * counts;
10444 unsigned long hn;
10445 bfd_vma si;
10446 unsigned long maxlength = 0;
10447 unsigned long nzero_counts = 0;
10448 unsigned long nsyms = 0;
10449
10450 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10451 (unsigned long) nbuckets);
10452
10453 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10454 if (lengths == NULL)
10455 {
10456 error (_("Out of memory allocating space for histogram buckets\n"));
10457 return 0;
10458 }
10459
10460 printf (_(" Length Number %% of total Coverage\n"));
10461 for (hn = 0; hn < nbuckets; ++hn)
10462 {
10463 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10464 {
10465 ++nsyms;
10466 if (maxlength < ++lengths[hn])
10467 ++maxlength;
10468
10469 /* PR binutils/17531: A corrupt binary could contain broken
10470 histogram data. Do not go into an infinite loop trying
10471 to process it. */
10472 if (chains[si] == si)
10473 {
10474 error (_("histogram chain links to itself\n"));
10475 break;
10476 }
10477 }
10478 }
10479
10480 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10481 if (counts == NULL)
10482 {
10483 free (lengths);
10484 error (_("Out of memory allocating space for histogram counts\n"));
10485 return 0;
10486 }
10487
10488 for (hn = 0; hn < nbuckets; ++hn)
10489 ++counts[lengths[hn]];
10490
10491 if (nbuckets > 0)
10492 {
10493 unsigned long i;
10494 printf (" 0 %-10lu (%5.1f%%)\n",
10495 counts[0], (counts[0] * 100.0) / nbuckets);
10496 for (i = 1; i <= maxlength; ++i)
10497 {
10498 nzero_counts += counts[i] * i;
10499 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10500 i, counts[i], (counts[i] * 100.0) / nbuckets,
10501 (nzero_counts * 100.0) / nsyms);
10502 }
10503 }
10504
10505 free (counts);
10506 free (lengths);
10507 }
10508
10509 if (buckets != NULL)
10510 {
10511 free (buckets);
10512 free (chains);
10513 }
10514
10515 if (do_histogram && gnubuckets != NULL)
10516 {
10517 unsigned long * lengths;
10518 unsigned long * counts;
10519 unsigned long hn;
10520 unsigned long maxlength = 0;
10521 unsigned long nzero_counts = 0;
10522 unsigned long nsyms = 0;
10523
10524 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10525 (unsigned long) ngnubuckets);
10526
10527 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10528 if (lengths == NULL)
10529 {
10530 error (_("Out of memory allocating space for gnu histogram buckets\n"));
10531 return 0;
10532 }
10533
10534 printf (_(" Length Number %% of total Coverage\n"));
10535
10536 for (hn = 0; hn < ngnubuckets; ++hn)
10537 if (gnubuckets[hn] != 0)
10538 {
10539 bfd_vma off, length = 1;
10540
10541 for (off = gnubuckets[hn] - gnusymidx;
10542 /* PR 17531 file: 010-77222-0.004. */
10543 off < ngnuchains && (gnuchains[off] & 1) == 0;
10544 ++off)
10545 ++length;
10546 lengths[hn] = length;
10547 if (length > maxlength)
10548 maxlength = length;
10549 nsyms += length;
10550 }
10551
10552 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10553 if (counts == NULL)
10554 {
10555 free (lengths);
10556 error (_("Out of memory allocating space for gnu histogram counts\n"));
10557 return 0;
10558 }
10559
10560 for (hn = 0; hn < ngnubuckets; ++hn)
10561 ++counts[lengths[hn]];
10562
10563 if (ngnubuckets > 0)
10564 {
10565 unsigned long j;
10566 printf (" 0 %-10lu (%5.1f%%)\n",
10567 counts[0], (counts[0] * 100.0) / ngnubuckets);
10568 for (j = 1; j <= maxlength; ++j)
10569 {
10570 nzero_counts += counts[j] * j;
10571 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10572 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10573 (nzero_counts * 100.0) / nsyms);
10574 }
10575 }
10576
10577 free (counts);
10578 free (lengths);
10579 free (gnubuckets);
10580 free (gnuchains);
10581 }
10582
10583 return 1;
10584 }
10585
10586 static int
10587 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10588 {
10589 unsigned int i;
10590
10591 if (dynamic_syminfo == NULL
10592 || !do_dynamic)
10593 /* No syminfo, this is ok. */
10594 return 1;
10595
10596 /* There better should be a dynamic symbol section. */
10597 if (dynamic_symbols == NULL || dynamic_strings == NULL)
10598 return 0;
10599
10600 if (dynamic_addr)
10601 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10602 dynamic_syminfo_offset, dynamic_syminfo_nent);
10603
10604 printf (_(" Num: Name BoundTo Flags\n"));
10605 for (i = 0; i < dynamic_syminfo_nent; ++i)
10606 {
10607 unsigned short int flags = dynamic_syminfo[i].si_flags;
10608
10609 printf ("%4d: ", i);
10610 if (i >= num_dynamic_syms)
10611 printf (_("<corrupt index>"));
10612 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10613 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10614 else
10615 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10616 putchar (' ');
10617
10618 switch (dynamic_syminfo[i].si_boundto)
10619 {
10620 case SYMINFO_BT_SELF:
10621 fputs ("SELF ", stdout);
10622 break;
10623 case SYMINFO_BT_PARENT:
10624 fputs ("PARENT ", stdout);
10625 break;
10626 default:
10627 if (dynamic_syminfo[i].si_boundto > 0
10628 && dynamic_syminfo[i].si_boundto < dynamic_nent
10629 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10630 {
10631 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10632 putchar (' ' );
10633 }
10634 else
10635 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10636 break;
10637 }
10638
10639 if (flags & SYMINFO_FLG_DIRECT)
10640 printf (" DIRECT");
10641 if (flags & SYMINFO_FLG_PASSTHRU)
10642 printf (" PASSTHRU");
10643 if (flags & SYMINFO_FLG_COPY)
10644 printf (" COPY");
10645 if (flags & SYMINFO_FLG_LAZYLOAD)
10646 printf (" LAZYLOAD");
10647
10648 puts ("");
10649 }
10650
10651 return 1;
10652 }
10653
10654 /* Check to see if the given reloc needs to be handled in a target specific
10655 manner. If so then process the reloc and return TRUE otherwise return
10656 FALSE. */
10657
10658 static bfd_boolean
10659 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10660 unsigned char * start,
10661 Elf_Internal_Sym * symtab)
10662 {
10663 unsigned int reloc_type = get_reloc_type (reloc->r_info);
10664
10665 switch (elf_header.e_machine)
10666 {
10667 case EM_MSP430:
10668 case EM_MSP430_OLD:
10669 {
10670 static Elf_Internal_Sym * saved_sym = NULL;
10671
10672 switch (reloc_type)
10673 {
10674 case 10: /* R_MSP430_SYM_DIFF */
10675 if (uses_msp430x_relocs ())
10676 break;
10677 case 21: /* R_MSP430X_SYM_DIFF */
10678 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10679 return TRUE;
10680
10681 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10682 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10683 goto handle_sym_diff;
10684
10685 case 5: /* R_MSP430_16_BYTE */
10686 case 9: /* R_MSP430_8 */
10687 if (uses_msp430x_relocs ())
10688 break;
10689 goto handle_sym_diff;
10690
10691 case 2: /* R_MSP430_ABS16 */
10692 case 15: /* R_MSP430X_ABS16 */
10693 if (! uses_msp430x_relocs ())
10694 break;
10695 goto handle_sym_diff;
10696
10697 handle_sym_diff:
10698 if (saved_sym != NULL)
10699 {
10700 bfd_vma value;
10701
10702 value = reloc->r_addend
10703 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10704 - saved_sym->st_value);
10705
10706 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10707
10708 saved_sym = NULL;
10709 return TRUE;
10710 }
10711 break;
10712
10713 default:
10714 if (saved_sym != NULL)
10715 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
10716 break;
10717 }
10718 break;
10719 }
10720
10721 case EM_MN10300:
10722 case EM_CYGNUS_MN10300:
10723 {
10724 static Elf_Internal_Sym * saved_sym = NULL;
10725
10726 switch (reloc_type)
10727 {
10728 case 34: /* R_MN10300_ALIGN */
10729 return TRUE;
10730 case 33: /* R_MN10300_SYM_DIFF */
10731 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10732 return TRUE;
10733 case 1: /* R_MN10300_32 */
10734 case 2: /* R_MN10300_16 */
10735 if (saved_sym != NULL)
10736 {
10737 bfd_vma value;
10738
10739 value = reloc->r_addend
10740 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10741 - saved_sym->st_value);
10742
10743 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10744
10745 saved_sym = NULL;
10746 return TRUE;
10747 }
10748 break;
10749 default:
10750 if (saved_sym != NULL)
10751 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
10752 break;
10753 }
10754 break;
10755 }
10756 }
10757
10758 return FALSE;
10759 }
10760
10761 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10762 DWARF debug sections. This is a target specific test. Note - we do not
10763 go through the whole including-target-headers-multiple-times route, (as
10764 we have already done with <elf/h8.h>) because this would become very
10765 messy and even then this function would have to contain target specific
10766 information (the names of the relocs instead of their numeric values).
10767 FIXME: This is not the correct way to solve this problem. The proper way
10768 is to have target specific reloc sizing and typing functions created by
10769 the reloc-macros.h header, in the same way that it already creates the
10770 reloc naming functions. */
10771
10772 static bfd_boolean
10773 is_32bit_abs_reloc (unsigned int reloc_type)
10774 {
10775 switch (elf_header.e_machine)
10776 {
10777 case EM_386:
10778 case EM_486:
10779 return reloc_type == 1; /* R_386_32. */
10780 case EM_68K:
10781 return reloc_type == 1; /* R_68K_32. */
10782 case EM_860:
10783 return reloc_type == 1; /* R_860_32. */
10784 case EM_960:
10785 return reloc_type == 2; /* R_960_32. */
10786 case EM_AARCH64:
10787 return reloc_type == 258; /* R_AARCH64_ABS32 */
10788 case EM_ALPHA:
10789 return reloc_type == 1; /* R_ALPHA_REFLONG. */
10790 case EM_ARC:
10791 return reloc_type == 1; /* R_ARC_32. */
10792 case EM_ARM:
10793 return reloc_type == 2; /* R_ARM_ABS32 */
10794 case EM_AVR_OLD:
10795 case EM_AVR:
10796 return reloc_type == 1;
10797 case EM_ADAPTEVA_EPIPHANY:
10798 return reloc_type == 3;
10799 case EM_BLACKFIN:
10800 return reloc_type == 0x12; /* R_byte4_data. */
10801 case EM_CRIS:
10802 return reloc_type == 3; /* R_CRIS_32. */
10803 case EM_CR16:
10804 return reloc_type == 3; /* R_CR16_NUM32. */
10805 case EM_CRX:
10806 return reloc_type == 15; /* R_CRX_NUM32. */
10807 case EM_CYGNUS_FRV:
10808 return reloc_type == 1;
10809 case EM_CYGNUS_D10V:
10810 case EM_D10V:
10811 return reloc_type == 6; /* R_D10V_32. */
10812 case EM_CYGNUS_D30V:
10813 case EM_D30V:
10814 return reloc_type == 12; /* R_D30V_32_NORMAL. */
10815 case EM_DLX:
10816 return reloc_type == 3; /* R_DLX_RELOC_32. */
10817 case EM_CYGNUS_FR30:
10818 case EM_FR30:
10819 return reloc_type == 3; /* R_FR30_32. */
10820 case EM_H8S:
10821 case EM_H8_300:
10822 case EM_H8_300H:
10823 return reloc_type == 1; /* R_H8_DIR32. */
10824 case EM_IA_64:
10825 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
10826 case EM_IP2K_OLD:
10827 case EM_IP2K:
10828 return reloc_type == 2; /* R_IP2K_32. */
10829 case EM_IQ2000:
10830 return reloc_type == 2; /* R_IQ2000_32. */
10831 case EM_LATTICEMICO32:
10832 return reloc_type == 3; /* R_LM32_32. */
10833 case EM_M32C_OLD:
10834 case EM_M32C:
10835 return reloc_type == 3; /* R_M32C_32. */
10836 case EM_M32R:
10837 return reloc_type == 34; /* R_M32R_32_RELA. */
10838 case EM_MCORE:
10839 return reloc_type == 1; /* R_MCORE_ADDR32. */
10840 case EM_CYGNUS_MEP:
10841 return reloc_type == 4; /* R_MEP_32. */
10842 case EM_METAG:
10843 return reloc_type == 2; /* R_METAG_ADDR32. */
10844 case EM_MICROBLAZE:
10845 return reloc_type == 1; /* R_MICROBLAZE_32. */
10846 case EM_MIPS:
10847 return reloc_type == 2; /* R_MIPS_32. */
10848 case EM_MMIX:
10849 return reloc_type == 4; /* R_MMIX_32. */
10850 case EM_CYGNUS_MN10200:
10851 case EM_MN10200:
10852 return reloc_type == 1; /* R_MN10200_32. */
10853 case EM_CYGNUS_MN10300:
10854 case EM_MN10300:
10855 return reloc_type == 1; /* R_MN10300_32. */
10856 case EM_MOXIE:
10857 return reloc_type == 1; /* R_MOXIE_32. */
10858 case EM_MSP430_OLD:
10859 case EM_MSP430:
10860 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
10861 case EM_MT:
10862 return reloc_type == 2; /* R_MT_32. */
10863 case EM_NDS32:
10864 return reloc_type == 20; /* R_NDS32_RELA. */
10865 case EM_ALTERA_NIOS2:
10866 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
10867 case EM_NIOS32:
10868 return reloc_type == 1; /* R_NIOS_32. */
10869 case EM_OR1K:
10870 return reloc_type == 1; /* R_OR1K_32. */
10871 case EM_PARISC:
10872 return (reloc_type == 1 /* R_PARISC_DIR32. */
10873 || reloc_type == 41); /* R_PARISC_SECREL32. */
10874 case EM_PJ:
10875 case EM_PJ_OLD:
10876 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
10877 case EM_PPC64:
10878 return reloc_type == 1; /* R_PPC64_ADDR32. */
10879 case EM_PPC:
10880 return reloc_type == 1; /* R_PPC_ADDR32. */
10881 case EM_RL78:
10882 return reloc_type == 1; /* R_RL78_DIR32. */
10883 case EM_RX:
10884 return reloc_type == 1; /* R_RX_DIR32. */
10885 case EM_S370:
10886 return reloc_type == 1; /* R_I370_ADDR31. */
10887 case EM_S390_OLD:
10888 case EM_S390:
10889 return reloc_type == 4; /* R_S390_32. */
10890 case EM_SCORE:
10891 return reloc_type == 8; /* R_SCORE_ABS32. */
10892 case EM_SH:
10893 return reloc_type == 1; /* R_SH_DIR32. */
10894 case EM_SPARC32PLUS:
10895 case EM_SPARCV9:
10896 case EM_SPARC:
10897 return reloc_type == 3 /* R_SPARC_32. */
10898 || reloc_type == 23; /* R_SPARC_UA32. */
10899 case EM_SPU:
10900 return reloc_type == 6; /* R_SPU_ADDR32 */
10901 case EM_TI_C6000:
10902 return reloc_type == 1; /* R_C6000_ABS32. */
10903 case EM_TILEGX:
10904 return reloc_type == 2; /* R_TILEGX_32. */
10905 case EM_TILEPRO:
10906 return reloc_type == 1; /* R_TILEPRO_32. */
10907 case EM_CYGNUS_V850:
10908 case EM_V850:
10909 return reloc_type == 6; /* R_V850_ABS32. */
10910 case EM_V800:
10911 return reloc_type == 0x33; /* R_V810_WORD. */
10912 case EM_VAX:
10913 return reloc_type == 1; /* R_VAX_32. */
10914 case EM_X86_64:
10915 case EM_L1OM:
10916 case EM_K1OM:
10917 return reloc_type == 10; /* R_X86_64_32. */
10918 case EM_XC16X:
10919 case EM_C166:
10920 return reloc_type == 3; /* R_XC16C_ABS_32. */
10921 case EM_XGATE:
10922 return reloc_type == 4; /* R_XGATE_32. */
10923 case EM_XSTORMY16:
10924 return reloc_type == 1; /* R_XSTROMY16_32. */
10925 case EM_XTENSA_OLD:
10926 case EM_XTENSA:
10927 return reloc_type == 1; /* R_XTENSA_32. */
10928 default:
10929 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10930 elf_header.e_machine);
10931 abort ();
10932 }
10933 }
10934
10935 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10936 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
10937
10938 static bfd_boolean
10939 is_32bit_pcrel_reloc (unsigned int reloc_type)
10940 {
10941 switch (elf_header.e_machine)
10942 {
10943 case EM_386:
10944 case EM_486:
10945 return reloc_type == 2; /* R_386_PC32. */
10946 case EM_68K:
10947 return reloc_type == 4; /* R_68K_PC32. */
10948 case EM_AARCH64:
10949 return reloc_type == 261; /* R_AARCH64_PREL32 */
10950 case EM_ADAPTEVA_EPIPHANY:
10951 return reloc_type == 6;
10952 case EM_ALPHA:
10953 return reloc_type == 10; /* R_ALPHA_SREL32. */
10954 case EM_ARM:
10955 return reloc_type == 3; /* R_ARM_REL32 */
10956 case EM_MICROBLAZE:
10957 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
10958 case EM_OR1K:
10959 return reloc_type == 9; /* R_OR1K_32_PCREL. */
10960 case EM_PARISC:
10961 return reloc_type == 9; /* R_PARISC_PCREL32. */
10962 case EM_PPC:
10963 return reloc_type == 26; /* R_PPC_REL32. */
10964 case EM_PPC64:
10965 return reloc_type == 26; /* R_PPC64_REL32. */
10966 case EM_S390_OLD:
10967 case EM_S390:
10968 return reloc_type == 5; /* R_390_PC32. */
10969 case EM_SH:
10970 return reloc_type == 2; /* R_SH_REL32. */
10971 case EM_SPARC32PLUS:
10972 case EM_SPARCV9:
10973 case EM_SPARC:
10974 return reloc_type == 6; /* R_SPARC_DISP32. */
10975 case EM_SPU:
10976 return reloc_type == 13; /* R_SPU_REL32. */
10977 case EM_TILEGX:
10978 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
10979 case EM_TILEPRO:
10980 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
10981 case EM_X86_64:
10982 case EM_L1OM:
10983 case EM_K1OM:
10984 return reloc_type == 2; /* R_X86_64_PC32. */
10985 case EM_XTENSA_OLD:
10986 case EM_XTENSA:
10987 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
10988 default:
10989 /* Do not abort or issue an error message here. Not all targets use
10990 pc-relative 32-bit relocs in their DWARF debug information and we
10991 have already tested for target coverage in is_32bit_abs_reloc. A
10992 more helpful warning message will be generated by apply_relocations
10993 anyway, so just return. */
10994 return FALSE;
10995 }
10996 }
10997
10998 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10999 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11000
11001 static bfd_boolean
11002 is_64bit_abs_reloc (unsigned int reloc_type)
11003 {
11004 switch (elf_header.e_machine)
11005 {
11006 case EM_AARCH64:
11007 return reloc_type == 257; /* R_AARCH64_ABS64. */
11008 case EM_ALPHA:
11009 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11010 case EM_IA_64:
11011 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11012 case EM_PARISC:
11013 return reloc_type == 80; /* R_PARISC_DIR64. */
11014 case EM_PPC64:
11015 return reloc_type == 38; /* R_PPC64_ADDR64. */
11016 case EM_SPARC32PLUS:
11017 case EM_SPARCV9:
11018 case EM_SPARC:
11019 return reloc_type == 54; /* R_SPARC_UA64. */
11020 case EM_X86_64:
11021 case EM_L1OM:
11022 case EM_K1OM:
11023 return reloc_type == 1; /* R_X86_64_64. */
11024 case EM_S390_OLD:
11025 case EM_S390:
11026 return reloc_type == 22; /* R_S390_64. */
11027 case EM_TILEGX:
11028 return reloc_type == 1; /* R_TILEGX_64. */
11029 case EM_MIPS:
11030 return reloc_type == 18; /* R_MIPS_64. */
11031 default:
11032 return FALSE;
11033 }
11034 }
11035
11036 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11037 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11038
11039 static bfd_boolean
11040 is_64bit_pcrel_reloc (unsigned int reloc_type)
11041 {
11042 switch (elf_header.e_machine)
11043 {
11044 case EM_AARCH64:
11045 return reloc_type == 260; /* R_AARCH64_PREL64. */
11046 case EM_ALPHA:
11047 return reloc_type == 11; /* R_ALPHA_SREL64. */
11048 case EM_IA_64:
11049 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11050 case EM_PARISC:
11051 return reloc_type == 72; /* R_PARISC_PCREL64. */
11052 case EM_PPC64:
11053 return reloc_type == 44; /* R_PPC64_REL64. */
11054 case EM_SPARC32PLUS:
11055 case EM_SPARCV9:
11056 case EM_SPARC:
11057 return reloc_type == 46; /* R_SPARC_DISP64. */
11058 case EM_X86_64:
11059 case EM_L1OM:
11060 case EM_K1OM:
11061 return reloc_type == 24; /* R_X86_64_PC64. */
11062 case EM_S390_OLD:
11063 case EM_S390:
11064 return reloc_type == 23; /* R_S390_PC64. */
11065 case EM_TILEGX:
11066 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11067 default:
11068 return FALSE;
11069 }
11070 }
11071
11072 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11073 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11074
11075 static bfd_boolean
11076 is_24bit_abs_reloc (unsigned int reloc_type)
11077 {
11078 switch (elf_header.e_machine)
11079 {
11080 case EM_CYGNUS_MN10200:
11081 case EM_MN10200:
11082 return reloc_type == 4; /* R_MN10200_24. */
11083 default:
11084 return FALSE;
11085 }
11086 }
11087
11088 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11089 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11090
11091 static bfd_boolean
11092 is_16bit_abs_reloc (unsigned int reloc_type)
11093 {
11094 switch (elf_header.e_machine)
11095 {
11096 case EM_AVR_OLD:
11097 case EM_AVR:
11098 return reloc_type == 4; /* R_AVR_16. */
11099 case EM_ADAPTEVA_EPIPHANY:
11100 return reloc_type == 5;
11101 case EM_CYGNUS_D10V:
11102 case EM_D10V:
11103 return reloc_type == 3; /* R_D10V_16. */
11104 case EM_H8S:
11105 case EM_H8_300:
11106 case EM_H8_300H:
11107 return reloc_type == R_H8_DIR16;
11108 case EM_IP2K_OLD:
11109 case EM_IP2K:
11110 return reloc_type == 1; /* R_IP2K_16. */
11111 case EM_M32C_OLD:
11112 case EM_M32C:
11113 return reloc_type == 1; /* R_M32C_16 */
11114 case EM_MSP430:
11115 if (uses_msp430x_relocs ())
11116 return reloc_type == 2; /* R_MSP430_ABS16. */
11117 case EM_MSP430_OLD:
11118 return reloc_type == 5; /* R_MSP430_16_BYTE. */
11119 case EM_NDS32:
11120 return reloc_type == 19; /* R_NDS32_RELA. */
11121 case EM_ALTERA_NIOS2:
11122 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
11123 case EM_NIOS32:
11124 return reloc_type == 9; /* R_NIOS_16. */
11125 case EM_OR1K:
11126 return reloc_type == 2; /* R_OR1K_16. */
11127 case EM_TI_C6000:
11128 return reloc_type == 2; /* R_C6000_ABS16. */
11129 case EM_XC16X:
11130 case EM_C166:
11131 return reloc_type == 2; /* R_XC16C_ABS_16. */
11132 case EM_CYGNUS_MN10200:
11133 case EM_MN10200:
11134 return reloc_type == 2; /* R_MN10200_16. */
11135 case EM_CYGNUS_MN10300:
11136 case EM_MN10300:
11137 return reloc_type == 2; /* R_MN10300_16. */
11138 case EM_XGATE:
11139 return reloc_type == 3; /* R_XGATE_16. */
11140 default:
11141 return FALSE;
11142 }
11143 }
11144
11145 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11146 relocation entries (possibly formerly used for SHT_GROUP sections). */
11147
11148 static bfd_boolean
11149 is_none_reloc (unsigned int reloc_type)
11150 {
11151 switch (elf_header.e_machine)
11152 {
11153 case EM_68K: /* R_68K_NONE. */
11154 case EM_386: /* R_386_NONE. */
11155 case EM_SPARC32PLUS:
11156 case EM_SPARCV9:
11157 case EM_SPARC: /* R_SPARC_NONE. */
11158 case EM_MIPS: /* R_MIPS_NONE. */
11159 case EM_PARISC: /* R_PARISC_NONE. */
11160 case EM_ALPHA: /* R_ALPHA_NONE. */
11161 case EM_ADAPTEVA_EPIPHANY:
11162 case EM_PPC: /* R_PPC_NONE. */
11163 case EM_PPC64: /* R_PPC64_NONE. */
11164 case EM_ARM: /* R_ARM_NONE. */
11165 case EM_IA_64: /* R_IA64_NONE. */
11166 case EM_SH: /* R_SH_NONE. */
11167 case EM_S390_OLD:
11168 case EM_S390: /* R_390_NONE. */
11169 case EM_CRIS: /* R_CRIS_NONE. */
11170 case EM_X86_64: /* R_X86_64_NONE. */
11171 case EM_L1OM: /* R_X86_64_NONE. */
11172 case EM_K1OM: /* R_X86_64_NONE. */
11173 case EM_MN10300: /* R_MN10300_NONE. */
11174 case EM_MOXIE: /* R_MOXIE_NONE. */
11175 case EM_M32R: /* R_M32R_NONE. */
11176 case EM_TI_C6000:/* R_C6000_NONE. */
11177 case EM_TILEGX: /* R_TILEGX_NONE. */
11178 case EM_TILEPRO: /* R_TILEPRO_NONE. */
11179 case EM_XC16X:
11180 case EM_C166: /* R_XC16X_NONE. */
11181 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11182 case EM_NIOS32: /* R_NIOS_NONE. */
11183 case EM_OR1K: /* R_OR1K_NONE. */
11184 return reloc_type == 0;
11185 case EM_AARCH64:
11186 return reloc_type == 0 || reloc_type == 256;
11187 case EM_NDS32:
11188 return (reloc_type == 0 /* R_XTENSA_NONE. */
11189 || reloc_type == 204 /* R_NDS32_DIFF8. */
11190 || reloc_type == 205 /* R_NDS32_DIFF16. */
11191 || reloc_type == 206 /* R_NDS32_DIFF32. */
11192 || reloc_type == 207 /* R_NDS32_ULEB128. */);
11193 case EM_XTENSA_OLD:
11194 case EM_XTENSA:
11195 return (reloc_type == 0 /* R_XTENSA_NONE. */
11196 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11197 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11198 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
11199 case EM_METAG:
11200 return reloc_type == 3; /* R_METAG_NONE. */
11201 }
11202 return FALSE;
11203 }
11204
11205 /* Apply relocations to a section.
11206 Note: So far support has been added only for those relocations
11207 which can be found in debug sections.
11208 FIXME: Add support for more relocations ? */
11209
11210 static void
11211 apply_relocations (void * file,
11212 Elf_Internal_Shdr * section,
11213 unsigned char * start)
11214 {
11215 Elf_Internal_Shdr * relsec;
11216 unsigned char * end = start + section->sh_size;
11217
11218 if (elf_header.e_type != ET_REL)
11219 return;
11220
11221 /* Find the reloc section associated with the section. */
11222 for (relsec = section_headers;
11223 relsec < section_headers + elf_header.e_shnum;
11224 ++relsec)
11225 {
11226 bfd_boolean is_rela;
11227 unsigned long num_relocs;
11228 Elf_Internal_Rela * relocs;
11229 Elf_Internal_Rela * rp;
11230 Elf_Internal_Shdr * symsec;
11231 Elf_Internal_Sym * symtab;
11232 unsigned long num_syms;
11233 Elf_Internal_Sym * sym;
11234
11235 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11236 || relsec->sh_info >= elf_header.e_shnum
11237 || section_headers + relsec->sh_info != section
11238 || relsec->sh_size == 0
11239 || relsec->sh_link >= elf_header.e_shnum)
11240 continue;
11241
11242 is_rela = relsec->sh_type == SHT_RELA;
11243
11244 if (is_rela)
11245 {
11246 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11247 relsec->sh_size, & relocs, & num_relocs))
11248 return;
11249 }
11250 else
11251 {
11252 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11253 relsec->sh_size, & relocs, & num_relocs))
11254 return;
11255 }
11256
11257 /* SH uses RELA but uses in place value instead of the addend field. */
11258 if (elf_header.e_machine == EM_SH)
11259 is_rela = FALSE;
11260
11261 symsec = section_headers + relsec->sh_link;
11262 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11263
11264 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11265 {
11266 bfd_vma addend;
11267 unsigned int reloc_type;
11268 unsigned int reloc_size;
11269 unsigned char * rloc;
11270 unsigned long sym_index;
11271
11272 reloc_type = get_reloc_type (rp->r_info);
11273
11274 if (target_specific_reloc_handling (rp, start, symtab))
11275 continue;
11276 else if (is_none_reloc (reloc_type))
11277 continue;
11278 else if (is_32bit_abs_reloc (reloc_type)
11279 || is_32bit_pcrel_reloc (reloc_type))
11280 reloc_size = 4;
11281 else if (is_64bit_abs_reloc (reloc_type)
11282 || is_64bit_pcrel_reloc (reloc_type))
11283 reloc_size = 8;
11284 else if (is_24bit_abs_reloc (reloc_type))
11285 reloc_size = 3;
11286 else if (is_16bit_abs_reloc (reloc_type))
11287 reloc_size = 2;
11288 else
11289 {
11290 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11291 reloc_type, printable_section_name (section));
11292 continue;
11293 }
11294
11295 rloc = start + rp->r_offset;
11296 if ((rloc + reloc_size) > end || (rloc < start))
11297 {
11298 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11299 (unsigned long) rp->r_offset,
11300 printable_section_name (section));
11301 continue;
11302 }
11303
11304 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11305 if (sym_index >= num_syms)
11306 {
11307 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11308 sym_index, printable_section_name (section));
11309 continue;
11310 }
11311 sym = symtab + sym_index;
11312
11313 /* If the reloc has a symbol associated with it,
11314 make sure that it is of an appropriate type.
11315
11316 Relocations against symbols without type can happen.
11317 Gcc -feliminate-dwarf2-dups may generate symbols
11318 without type for debug info.
11319
11320 Icc generates relocations against function symbols
11321 instead of local labels.
11322
11323 Relocations against object symbols can happen, eg when
11324 referencing a global array. For an example of this see
11325 the _clz.o binary in libgcc.a. */
11326 if (sym != symtab
11327 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11328 {
11329 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11330 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11331 (long int)(rp - relocs),
11332 printable_section_name (relsec));
11333 continue;
11334 }
11335
11336 addend = 0;
11337 if (is_rela)
11338 addend += rp->r_addend;
11339 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11340 partial_inplace. */
11341 if (!is_rela
11342 || (elf_header.e_machine == EM_XTENSA
11343 && reloc_type == 1)
11344 || ((elf_header.e_machine == EM_PJ
11345 || elf_header.e_machine == EM_PJ_OLD)
11346 && reloc_type == 1)
11347 || ((elf_header.e_machine == EM_D30V
11348 || elf_header.e_machine == EM_CYGNUS_D30V)
11349 && reloc_type == 12))
11350 addend += byte_get (rloc, reloc_size);
11351
11352 if (is_32bit_pcrel_reloc (reloc_type)
11353 || is_64bit_pcrel_reloc (reloc_type))
11354 {
11355 /* On HPPA, all pc-relative relocations are biased by 8. */
11356 if (elf_header.e_machine == EM_PARISC)
11357 addend -= 8;
11358 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11359 reloc_size);
11360 }
11361 else
11362 byte_put (rloc, addend + sym->st_value, reloc_size);
11363 }
11364
11365 free (symtab);
11366 free (relocs);
11367 break;
11368 }
11369 }
11370
11371 #ifdef SUPPORT_DISASSEMBLY
11372 static int
11373 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11374 {
11375 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11376
11377 /* FIXME: XXX -- to be done --- XXX */
11378
11379 return 1;
11380 }
11381 #endif
11382
11383 /* Reads in the contents of SECTION from FILE, returning a pointer
11384 to a malloc'ed buffer or NULL if something went wrong. */
11385
11386 static char *
11387 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11388 {
11389 bfd_size_type num_bytes;
11390
11391 num_bytes = section->sh_size;
11392
11393 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11394 {
11395 printf (_("\nSection '%s' has no data to dump.\n"),
11396 printable_section_name (section));
11397 return NULL;
11398 }
11399
11400 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11401 _("section contents"));
11402 }
11403
11404
11405 static void
11406 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11407 {
11408 Elf_Internal_Shdr * relsec;
11409 bfd_size_type num_bytes;
11410 char * data;
11411 char * end;
11412 char * start;
11413 bfd_boolean some_strings_shown;
11414
11415 start = get_section_contents (section, file);
11416 if (start == NULL)
11417 return;
11418
11419 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11420
11421 /* If the section being dumped has relocations against it the user might
11422 be expecting these relocations to have been applied. Check for this
11423 case and issue a warning message in order to avoid confusion.
11424 FIXME: Maybe we ought to have an option that dumps a section with
11425 relocs applied ? */
11426 for (relsec = section_headers;
11427 relsec < section_headers + elf_header.e_shnum;
11428 ++relsec)
11429 {
11430 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11431 || relsec->sh_info >= elf_header.e_shnum
11432 || section_headers + relsec->sh_info != section
11433 || relsec->sh_size == 0
11434 || relsec->sh_link >= elf_header.e_shnum)
11435 continue;
11436
11437 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11438 break;
11439 }
11440
11441 num_bytes = section->sh_size;
11442 data = start;
11443 end = start + num_bytes;
11444 some_strings_shown = FALSE;
11445
11446 while (data < end)
11447 {
11448 while (!ISPRINT (* data))
11449 if (++ data >= end)
11450 break;
11451
11452 if (data < end)
11453 {
11454 size_t maxlen = end - data;
11455
11456 #ifndef __MSVCRT__
11457 /* PR 11128: Use two separate invocations in order to work
11458 around bugs in the Solaris 8 implementation of printf. */
11459 printf (" [%6tx] ", data - start);
11460 #else
11461 printf (" [%6Ix] ", (size_t) (data - start));
11462 #endif
11463 if (maxlen > 0)
11464 {
11465 print_symbol ((int) maxlen, data);
11466 putchar ('\n');
11467 data += strnlen (data, maxlen);
11468 }
11469 else
11470 {
11471 printf (_("<corrupt>\n"));
11472 data = end;
11473 }
11474 some_strings_shown = TRUE;
11475 }
11476 }
11477
11478 if (! some_strings_shown)
11479 printf (_(" No strings found in this section."));
11480
11481 free (start);
11482
11483 putchar ('\n');
11484 }
11485
11486 static void
11487 dump_section_as_bytes (Elf_Internal_Shdr * section,
11488 FILE * file,
11489 bfd_boolean relocate)
11490 {
11491 Elf_Internal_Shdr * relsec;
11492 bfd_size_type bytes;
11493 bfd_vma addr;
11494 unsigned char * data;
11495 unsigned char * start;
11496
11497 start = (unsigned char *) get_section_contents (section, file);
11498 if (start == NULL)
11499 return;
11500
11501 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11502
11503 if (relocate)
11504 {
11505 apply_relocations (file, section, start);
11506 }
11507 else
11508 {
11509 /* If the section being dumped has relocations against it the user might
11510 be expecting these relocations to have been applied. Check for this
11511 case and issue a warning message in order to avoid confusion.
11512 FIXME: Maybe we ought to have an option that dumps a section with
11513 relocs applied ? */
11514 for (relsec = section_headers;
11515 relsec < section_headers + elf_header.e_shnum;
11516 ++relsec)
11517 {
11518 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11519 || relsec->sh_info >= elf_header.e_shnum
11520 || section_headers + relsec->sh_info != section
11521 || relsec->sh_size == 0
11522 || relsec->sh_link >= elf_header.e_shnum)
11523 continue;
11524
11525 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11526 break;
11527 }
11528 }
11529
11530 addr = section->sh_addr;
11531 bytes = section->sh_size;
11532 data = start;
11533
11534 while (bytes)
11535 {
11536 int j;
11537 int k;
11538 int lbytes;
11539
11540 lbytes = (bytes > 16 ? 16 : bytes);
11541
11542 printf (" 0x%8.8lx ", (unsigned long) addr);
11543
11544 for (j = 0; j < 16; j++)
11545 {
11546 if (j < lbytes)
11547 printf ("%2.2x", data[j]);
11548 else
11549 printf (" ");
11550
11551 if ((j & 3) == 3)
11552 printf (" ");
11553 }
11554
11555 for (j = 0; j < lbytes; j++)
11556 {
11557 k = data[j];
11558 if (k >= ' ' && k < 0x7f)
11559 printf ("%c", k);
11560 else
11561 printf (".");
11562 }
11563
11564 putchar ('\n');
11565
11566 data += lbytes;
11567 addr += lbytes;
11568 bytes -= lbytes;
11569 }
11570
11571 free (start);
11572
11573 putchar ('\n');
11574 }
11575
11576 /* Uncompresses a section that was compressed using zlib, in place. */
11577
11578 static int
11579 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11580 dwarf_size_type *size ATTRIBUTE_UNUSED)
11581 {
11582 #ifndef HAVE_ZLIB_H
11583 return FALSE;
11584 #else
11585 dwarf_size_type compressed_size = *size;
11586 unsigned char * compressed_buffer = *buffer;
11587 dwarf_size_type uncompressed_size;
11588 unsigned char * uncompressed_buffer;
11589 z_stream strm;
11590 int rc;
11591 dwarf_size_type header_size = 12;
11592
11593 /* Read the zlib header. In this case, it should be "ZLIB" followed
11594 by the uncompressed section size, 8 bytes in big-endian order. */
11595 if (compressed_size < header_size
11596 || ! streq ((char *) compressed_buffer, "ZLIB"))
11597 return 0;
11598
11599 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11600 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11601 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11602 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11603 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11604 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11605 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11606 uncompressed_size += compressed_buffer[11];
11607
11608 /* It is possible the section consists of several compressed
11609 buffers concatenated together, so we uncompress in a loop. */
11610 strm.zalloc = NULL;
11611 strm.zfree = NULL;
11612 strm.opaque = NULL;
11613 strm.avail_in = compressed_size - header_size;
11614 strm.next_in = (Bytef *) compressed_buffer + header_size;
11615 strm.avail_out = uncompressed_size;
11616 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11617
11618 rc = inflateInit (& strm);
11619 while (strm.avail_in > 0)
11620 {
11621 if (rc != Z_OK)
11622 goto fail;
11623 strm.next_out = ((Bytef *) uncompressed_buffer
11624 + (uncompressed_size - strm.avail_out));
11625 rc = inflate (&strm, Z_FINISH);
11626 if (rc != Z_STREAM_END)
11627 goto fail;
11628 rc = inflateReset (& strm);
11629 }
11630 rc = inflateEnd (& strm);
11631 if (rc != Z_OK
11632 || strm.avail_out != 0)
11633 goto fail;
11634
11635 free (compressed_buffer);
11636 *buffer = uncompressed_buffer;
11637 *size = uncompressed_size;
11638 return 1;
11639
11640 fail:
11641 free (uncompressed_buffer);
11642 /* Indicate decompression failure. */
11643 *buffer = NULL;
11644 return 0;
11645 #endif /* HAVE_ZLIB_H */
11646 }
11647
11648 static int
11649 load_specific_debug_section (enum dwarf_section_display_enum debug,
11650 Elf_Internal_Shdr * sec, void * file)
11651 {
11652 struct dwarf_section * section = &debug_displays [debug].section;
11653 char buf [64];
11654
11655 /* If it is already loaded, do nothing. */
11656 if (section->start != NULL)
11657 return 1;
11658
11659 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11660 section->address = sec->sh_addr;
11661 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11662 sec->sh_offset, 1,
11663 sec->sh_size, buf);
11664 if (section->start == NULL)
11665 section->size = 0;
11666 else
11667 {
11668 section->size = sec->sh_size;
11669 if (uncompress_section_contents (&section->start, &section->size))
11670 sec->sh_size = section->size;
11671 }
11672
11673 if (section->start == NULL)
11674 return 0;
11675
11676 if (debug_displays [debug].relocate)
11677 apply_relocations ((FILE *) file, sec, section->start);
11678
11679 return 1;
11680 }
11681
11682 /* If this is not NULL, load_debug_section will only look for sections
11683 within the list of sections given here. */
11684 unsigned int *section_subset = NULL;
11685
11686 int
11687 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11688 {
11689 struct dwarf_section * section = &debug_displays [debug].section;
11690 Elf_Internal_Shdr * sec;
11691
11692 /* Locate the debug section. */
11693 sec = find_section_in_set (section->uncompressed_name, section_subset);
11694 if (sec != NULL)
11695 section->name = section->uncompressed_name;
11696 else
11697 {
11698 sec = find_section_in_set (section->compressed_name, section_subset);
11699 if (sec != NULL)
11700 section->name = section->compressed_name;
11701 }
11702 if (sec == NULL)
11703 return 0;
11704
11705 /* If we're loading from a subset of sections, and we've loaded
11706 a section matching this name before, it's likely that it's a
11707 different one. */
11708 if (section_subset != NULL)
11709 free_debug_section (debug);
11710
11711 return load_specific_debug_section (debug, sec, (FILE *) file);
11712 }
11713
11714 void
11715 free_debug_section (enum dwarf_section_display_enum debug)
11716 {
11717 struct dwarf_section * section = &debug_displays [debug].section;
11718
11719 if (section->start == NULL)
11720 return;
11721
11722 free ((char *) section->start);
11723 section->start = NULL;
11724 section->address = 0;
11725 section->size = 0;
11726 }
11727
11728 static int
11729 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11730 {
11731 char * name = SECTION_NAME (section);
11732 const char * print_name = printable_section_name (section);
11733 bfd_size_type length;
11734 int result = 1;
11735 int i;
11736
11737 length = section->sh_size;
11738 if (length == 0)
11739 {
11740 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
11741 return 0;
11742 }
11743 if (section->sh_type == SHT_NOBITS)
11744 {
11745 /* There is no point in dumping the contents of a debugging section
11746 which has the NOBITS type - the bits in the file will be random.
11747 This can happen when a file containing a .eh_frame section is
11748 stripped with the --only-keep-debug command line option. */
11749 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
11750 print_name);
11751 return 0;
11752 }
11753
11754 if (const_strneq (name, ".gnu.linkonce.wi."))
11755 name = ".debug_info";
11756
11757 /* See if we know how to display the contents of this section. */
11758 for (i = 0; i < max; i++)
11759 if (streq (debug_displays[i].section.uncompressed_name, name)
11760 || (i == line && const_strneq (name, ".debug_line."))
11761 || streq (debug_displays[i].section.compressed_name, name))
11762 {
11763 struct dwarf_section * sec = &debug_displays [i].section;
11764 int secondary = (section != find_section (name));
11765
11766 if (secondary)
11767 free_debug_section ((enum dwarf_section_display_enum) i);
11768
11769 if (i == line && const_strneq (name, ".debug_line."))
11770 sec->name = name;
11771 else if (streq (sec->uncompressed_name, name))
11772 sec->name = sec->uncompressed_name;
11773 else
11774 sec->name = sec->compressed_name;
11775 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11776 section, file))
11777 {
11778 /* If this debug section is part of a CU/TU set in a .dwp file,
11779 restrict load_debug_section to the sections in that set. */
11780 section_subset = find_cu_tu_set (file, shndx);
11781
11782 result &= debug_displays[i].display (sec, file);
11783
11784 section_subset = NULL;
11785
11786 if (secondary || (i != info && i != abbrev))
11787 free_debug_section ((enum dwarf_section_display_enum) i);
11788 }
11789
11790 break;
11791 }
11792
11793 if (i == max)
11794 {
11795 printf (_("Unrecognized debug section: %s\n"), print_name);
11796 result = 0;
11797 }
11798
11799 return result;
11800 }
11801
11802 /* Set DUMP_SECTS for all sections where dumps were requested
11803 based on section name. */
11804
11805 static void
11806 initialise_dumps_byname (void)
11807 {
11808 struct dump_list_entry * cur;
11809
11810 for (cur = dump_sects_byname; cur; cur = cur->next)
11811 {
11812 unsigned int i;
11813 int any;
11814
11815 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11816 if (streq (SECTION_NAME (section_headers + i), cur->name))
11817 {
11818 request_dump_bynumber (i, cur->type);
11819 any = 1;
11820 }
11821
11822 if (!any)
11823 warn (_("Section '%s' was not dumped because it does not exist!\n"),
11824 cur->name);
11825 }
11826 }
11827
11828 static void
11829 process_section_contents (FILE * file)
11830 {
11831 Elf_Internal_Shdr * section;
11832 unsigned int i;
11833
11834 if (! do_dump)
11835 return;
11836
11837 initialise_dumps_byname ();
11838
11839 for (i = 0, section = section_headers;
11840 i < elf_header.e_shnum && i < num_dump_sects;
11841 i++, section++)
11842 {
11843 #ifdef SUPPORT_DISASSEMBLY
11844 if (dump_sects[i] & DISASS_DUMP)
11845 disassemble_section (section, file);
11846 #endif
11847 if (dump_sects[i] & HEX_DUMP)
11848 dump_section_as_bytes (section, file, FALSE);
11849
11850 if (dump_sects[i] & RELOC_DUMP)
11851 dump_section_as_bytes (section, file, TRUE);
11852
11853 if (dump_sects[i] & STRING_DUMP)
11854 dump_section_as_strings (section, file);
11855
11856 if (dump_sects[i] & DEBUG_DUMP)
11857 display_debug_section (i, section, file);
11858 }
11859
11860 /* Check to see if the user requested a
11861 dump of a section that does not exist. */
11862 while (i++ < num_dump_sects)
11863 if (dump_sects[i])
11864 warn (_("Section %d was not dumped because it does not exist!\n"), i);
11865 }
11866
11867 static void
11868 process_mips_fpe_exception (int mask)
11869 {
11870 if (mask)
11871 {
11872 int first = 1;
11873 if (mask & OEX_FPU_INEX)
11874 fputs ("INEX", stdout), first = 0;
11875 if (mask & OEX_FPU_UFLO)
11876 printf ("%sUFLO", first ? "" : "|"), first = 0;
11877 if (mask & OEX_FPU_OFLO)
11878 printf ("%sOFLO", first ? "" : "|"), first = 0;
11879 if (mask & OEX_FPU_DIV0)
11880 printf ("%sDIV0", first ? "" : "|"), first = 0;
11881 if (mask & OEX_FPU_INVAL)
11882 printf ("%sINVAL", first ? "" : "|");
11883 }
11884 else
11885 fputs ("0", stdout);
11886 }
11887
11888 /* Display's the value of TAG at location P. If TAG is
11889 greater than 0 it is assumed to be an unknown tag, and
11890 a message is printed to this effect. Otherwise it is
11891 assumed that a message has already been printed.
11892
11893 If the bottom bit of TAG is set it assumed to have a
11894 string value, otherwise it is assumed to have an integer
11895 value.
11896
11897 Returns an updated P pointing to the first unread byte
11898 beyond the end of TAG's value.
11899
11900 Reads at or beyond END will not be made. */
11901
11902 static unsigned char *
11903 display_tag_value (int tag,
11904 unsigned char * p,
11905 const unsigned char * const end)
11906 {
11907 unsigned long val;
11908
11909 if (tag > 0)
11910 printf (" Tag_unknown_%d: ", tag);
11911
11912 if (p >= end)
11913 {
11914 warn (_("<corrupt tag>\n"));
11915 }
11916 else if (tag & 1)
11917 {
11918 /* PR 17531 file: 027-19978-0.004. */
11919 size_t maxlen = (end - p) - 1;
11920
11921 putchar ('"');
11922 if (maxlen > 0)
11923 {
11924 print_symbol ((int) maxlen, (const char *) p);
11925 p += strnlen ((char *) p, maxlen) + 1;
11926 }
11927 else
11928 {
11929 printf (_("<corrupt string tag>"));
11930 p = (unsigned char *) end;
11931 }
11932 printf ("\"\n");
11933 }
11934 else
11935 {
11936 unsigned int len;
11937
11938 val = read_uleb128 (p, &len, end);
11939 p += len;
11940 printf ("%ld (0x%lx)\n", val, val);
11941 }
11942
11943 assert (p <= end);
11944 return p;
11945 }
11946
11947 /* ARM EABI attributes section. */
11948 typedef struct
11949 {
11950 unsigned int tag;
11951 const char * name;
11952 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
11953 unsigned int type;
11954 const char ** table;
11955 } arm_attr_public_tag;
11956
11957 static const char * arm_attr_tag_CPU_arch[] =
11958 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11959 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11960 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11961 static const char * arm_attr_tag_THUMB_ISA_use[] =
11962 {"No", "Thumb-1", "Thumb-2"};
11963 static const char * arm_attr_tag_FP_arch[] =
11964 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11965 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
11966 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11967 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11968 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11969 static const char * arm_attr_tag_PCS_config[] =
11970 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11971 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11972 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11973 {"V6", "SB", "TLS", "Unused"};
11974 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11975 {"Absolute", "PC-relative", "SB-relative", "None"};
11976 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11977 {"Absolute", "PC-relative", "None"};
11978 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11979 {"None", "direct", "GOT-indirect"};
11980 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11981 {"None", "??? 1", "2", "??? 3", "4"};
11982 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11983 static const char * arm_attr_tag_ABI_FP_denormal[] =
11984 {"Unused", "Needed", "Sign only"};
11985 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11986 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11987 static const char * arm_attr_tag_ABI_FP_number_model[] =
11988 {"Unused", "Finite", "RTABI", "IEEE 754"};
11989 static const char * arm_attr_tag_ABI_enum_size[] =
11990 {"Unused", "small", "int", "forced to int"};
11991 static const char * arm_attr_tag_ABI_HardFP_use[] =
11992 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11993 static const char * arm_attr_tag_ABI_VFP_args[] =
11994 {"AAPCS", "VFP registers", "custom"};
11995 static const char * arm_attr_tag_ABI_WMMX_args[] =
11996 {"AAPCS", "WMMX registers", "custom"};
11997 static const char * arm_attr_tag_ABI_optimization_goals[] =
11998 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11999 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12000 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12001 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12002 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12003 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12004 static const char * arm_attr_tag_FP_HP_extension[] =
12005 {"Not Allowed", "Allowed"};
12006 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12007 {"None", "IEEE 754", "Alternative Format"};
12008 static const char * arm_attr_tag_MPextension_use[] =
12009 {"Not Allowed", "Allowed"};
12010 static const char * arm_attr_tag_DIV_use[] =
12011 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12012 "Allowed in v7-A with integer division extension"};
12013 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12014 static const char * arm_attr_tag_Virtualization_use[] =
12015 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12016 "TrustZone and Virtualization Extensions"};
12017 static const char * arm_attr_tag_MPextension_use_legacy[] =
12018 {"Not Allowed", "Allowed"};
12019
12020 #define LOOKUP(id, name) \
12021 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12022 static arm_attr_public_tag arm_attr_public_tags[] =
12023 {
12024 {4, "CPU_raw_name", 1, NULL},
12025 {5, "CPU_name", 1, NULL},
12026 LOOKUP(6, CPU_arch),
12027 {7, "CPU_arch_profile", 0, NULL},
12028 LOOKUP(8, ARM_ISA_use),
12029 LOOKUP(9, THUMB_ISA_use),
12030 LOOKUP(10, FP_arch),
12031 LOOKUP(11, WMMX_arch),
12032 LOOKUP(12, Advanced_SIMD_arch),
12033 LOOKUP(13, PCS_config),
12034 LOOKUP(14, ABI_PCS_R9_use),
12035 LOOKUP(15, ABI_PCS_RW_data),
12036 LOOKUP(16, ABI_PCS_RO_data),
12037 LOOKUP(17, ABI_PCS_GOT_use),
12038 LOOKUP(18, ABI_PCS_wchar_t),
12039 LOOKUP(19, ABI_FP_rounding),
12040 LOOKUP(20, ABI_FP_denormal),
12041 LOOKUP(21, ABI_FP_exceptions),
12042 LOOKUP(22, ABI_FP_user_exceptions),
12043 LOOKUP(23, ABI_FP_number_model),
12044 {24, "ABI_align_needed", 0, NULL},
12045 {25, "ABI_align_preserved", 0, NULL},
12046 LOOKUP(26, ABI_enum_size),
12047 LOOKUP(27, ABI_HardFP_use),
12048 LOOKUP(28, ABI_VFP_args),
12049 LOOKUP(29, ABI_WMMX_args),
12050 LOOKUP(30, ABI_optimization_goals),
12051 LOOKUP(31, ABI_FP_optimization_goals),
12052 {32, "compatibility", 0, NULL},
12053 LOOKUP(34, CPU_unaligned_access),
12054 LOOKUP(36, FP_HP_extension),
12055 LOOKUP(38, ABI_FP_16bit_format),
12056 LOOKUP(42, MPextension_use),
12057 LOOKUP(44, DIV_use),
12058 {64, "nodefaults", 0, NULL},
12059 {65, "also_compatible_with", 0, NULL},
12060 LOOKUP(66, T2EE_use),
12061 {67, "conformance", 1, NULL},
12062 LOOKUP(68, Virtualization_use),
12063 LOOKUP(70, MPextension_use_legacy)
12064 };
12065 #undef LOOKUP
12066
12067 static unsigned char *
12068 display_arm_attribute (unsigned char * p,
12069 const unsigned char * const end)
12070 {
12071 unsigned int tag;
12072 unsigned int len;
12073 unsigned int val;
12074 arm_attr_public_tag * attr;
12075 unsigned i;
12076 unsigned int type;
12077
12078 tag = read_uleb128 (p, &len, end);
12079 p += len;
12080 attr = NULL;
12081 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12082 {
12083 if (arm_attr_public_tags[i].tag == tag)
12084 {
12085 attr = &arm_attr_public_tags[i];
12086 break;
12087 }
12088 }
12089
12090 if (attr)
12091 {
12092 printf (" Tag_%s: ", attr->name);
12093 switch (attr->type)
12094 {
12095 case 0:
12096 switch (tag)
12097 {
12098 case 7: /* Tag_CPU_arch_profile. */
12099 val = read_uleb128 (p, &len, end);
12100 p += len;
12101 switch (val)
12102 {
12103 case 0: printf (_("None\n")); break;
12104 case 'A': printf (_("Application\n")); break;
12105 case 'R': printf (_("Realtime\n")); break;
12106 case 'M': printf (_("Microcontroller\n")); break;
12107 case 'S': printf (_("Application or Realtime\n")); break;
12108 default: printf ("??? (%d)\n", val); break;
12109 }
12110 break;
12111
12112 case 24: /* Tag_align_needed. */
12113 val = read_uleb128 (p, &len, end);
12114 p += len;
12115 switch (val)
12116 {
12117 case 0: printf (_("None\n")); break;
12118 case 1: printf (_("8-byte\n")); break;
12119 case 2: printf (_("4-byte\n")); break;
12120 case 3: printf ("??? 3\n"); break;
12121 default:
12122 if (val <= 12)
12123 printf (_("8-byte and up to %d-byte extended\n"),
12124 1 << val);
12125 else
12126 printf ("??? (%d)\n", val);
12127 break;
12128 }
12129 break;
12130
12131 case 25: /* Tag_align_preserved. */
12132 val = read_uleb128 (p, &len, end);
12133 p += len;
12134 switch (val)
12135 {
12136 case 0: printf (_("None\n")); break;
12137 case 1: printf (_("8-byte, except leaf SP\n")); break;
12138 case 2: printf (_("8-byte\n")); break;
12139 case 3: printf ("??? 3\n"); break;
12140 default:
12141 if (val <= 12)
12142 printf (_("8-byte and up to %d-byte extended\n"),
12143 1 << val);
12144 else
12145 printf ("??? (%d)\n", val);
12146 break;
12147 }
12148 break;
12149
12150 case 32: /* Tag_compatibility. */
12151 {
12152 val = read_uleb128 (p, &len, end);
12153 p += len;
12154 printf (_("flag = %d, vendor = "), val);
12155 if (p < end - 1)
12156 {
12157 size_t maxlen = (end - p) - 1;
12158
12159 print_symbol ((int) maxlen, (const char *) p);
12160 p += strnlen ((char *) p, maxlen) + 1;
12161 }
12162 else
12163 {
12164 printf (_("<corrupt>"));
12165 p = (unsigned char *) end;
12166 }
12167 putchar ('\n');
12168 }
12169 break;
12170
12171 case 64: /* Tag_nodefaults. */
12172 /* PR 17531: file: 001-505008-0.01. */
12173 if (p < end)
12174 p++;
12175 printf (_("True\n"));
12176 break;
12177
12178 case 65: /* Tag_also_compatible_with. */
12179 val = read_uleb128 (p, &len, end);
12180 p += len;
12181 if (val == 6 /* Tag_CPU_arch. */)
12182 {
12183 val = read_uleb128 (p, &len, end);
12184 p += len;
12185 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12186 printf ("??? (%d)\n", val);
12187 else
12188 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12189 }
12190 else
12191 printf ("???\n");
12192 while (p < end && *(p++) != '\0' /* NUL terminator. */)
12193 ;
12194 break;
12195
12196 default:
12197 abort ();
12198 }
12199 return p;
12200
12201 case 1:
12202 return display_tag_value (-1, p, end);
12203 case 2:
12204 return display_tag_value (0, p, end);
12205
12206 default:
12207 assert (attr->type & 0x80);
12208 val = read_uleb128 (p, &len, end);
12209 p += len;
12210 type = attr->type & 0x7f;
12211 if (val >= type)
12212 printf ("??? (%d)\n", val);
12213 else
12214 printf ("%s\n", attr->table[val]);
12215 return p;
12216 }
12217 }
12218
12219 return display_tag_value (tag, p, end);
12220 }
12221
12222 static unsigned char *
12223 display_gnu_attribute (unsigned char * p,
12224 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12225 const unsigned char * const end)
12226 {
12227 int tag;
12228 unsigned int len;
12229 int val;
12230
12231 tag = read_uleb128 (p, &len, end);
12232 p += len;
12233
12234 /* Tag_compatibility is the only generic GNU attribute defined at
12235 present. */
12236 if (tag == 32)
12237 {
12238 val = read_uleb128 (p, &len, end);
12239 p += len;
12240
12241 printf (_("flag = %d, vendor = "), val);
12242 if (p == end)
12243 {
12244 printf (_("<corrupt>\n"));
12245 warn (_("corrupt vendor attribute\n"));
12246 }
12247 else
12248 {
12249 if (p < end - 1)
12250 {
12251 size_t maxlen = (end - p) - 1;
12252
12253 print_symbol ((int) maxlen, (const char *) p);
12254 p += strnlen ((char *) p, maxlen) + 1;
12255 }
12256 else
12257 {
12258 printf (_("<corrupt>"));
12259 p = (unsigned char *) end;
12260 }
12261 putchar ('\n');
12262 }
12263 return p;
12264 }
12265
12266 if ((tag & 2) == 0 && display_proc_gnu_attribute)
12267 return display_proc_gnu_attribute (p, tag, end);
12268
12269 return display_tag_value (tag, p, end);
12270 }
12271
12272 static unsigned char *
12273 display_power_gnu_attribute (unsigned char * p,
12274 int tag,
12275 const unsigned char * const end)
12276 {
12277 unsigned int len;
12278 int val;
12279
12280 if (tag == Tag_GNU_Power_ABI_FP)
12281 {
12282 val = read_uleb128 (p, &len, end);
12283 p += len;
12284 printf (" Tag_GNU_Power_ABI_FP: ");
12285
12286 switch (val)
12287 {
12288 case 0:
12289 printf (_("Hard or soft float\n"));
12290 break;
12291 case 1:
12292 printf (_("Hard float\n"));
12293 break;
12294 case 2:
12295 printf (_("Soft float\n"));
12296 break;
12297 case 3:
12298 printf (_("Single-precision hard float\n"));
12299 break;
12300 default:
12301 printf ("??? (%d)\n", val);
12302 break;
12303 }
12304 return p;
12305 }
12306
12307 if (tag == Tag_GNU_Power_ABI_Vector)
12308 {
12309 val = read_uleb128 (p, &len, end);
12310 p += len;
12311 printf (" Tag_GNU_Power_ABI_Vector: ");
12312 switch (val)
12313 {
12314 case 0:
12315 printf (_("Any\n"));
12316 break;
12317 case 1:
12318 printf (_("Generic\n"));
12319 break;
12320 case 2:
12321 printf ("AltiVec\n");
12322 break;
12323 case 3:
12324 printf ("SPE\n");
12325 break;
12326 default:
12327 printf ("??? (%d)\n", val);
12328 break;
12329 }
12330 return p;
12331 }
12332
12333 if (tag == Tag_GNU_Power_ABI_Struct_Return)
12334 {
12335 if (p == end)
12336 {
12337 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12338 return p;
12339 }
12340
12341 val = read_uleb128 (p, &len, end);
12342 p += len;
12343 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
12344 switch (val)
12345 {
12346 case 0:
12347 printf (_("Any\n"));
12348 break;
12349 case 1:
12350 printf ("r3/r4\n");
12351 break;
12352 case 2:
12353 printf (_("Memory\n"));
12354 break;
12355 default:
12356 printf ("??? (%d)\n", val);
12357 break;
12358 }
12359 return p;
12360 }
12361
12362 return display_tag_value (tag & 1, p, end);
12363 }
12364
12365 static void
12366 display_sparc_hwcaps (int mask)
12367 {
12368 if (mask)
12369 {
12370 int first = 1;
12371
12372 if (mask & ELF_SPARC_HWCAP_MUL32)
12373 fputs ("mul32", stdout), first = 0;
12374 if (mask & ELF_SPARC_HWCAP_DIV32)
12375 printf ("%sdiv32", first ? "" : "|"), first = 0;
12376 if (mask & ELF_SPARC_HWCAP_FSMULD)
12377 printf ("%sfsmuld", first ? "" : "|"), first = 0;
12378 if (mask & ELF_SPARC_HWCAP_V8PLUS)
12379 printf ("%sv8plus", first ? "" : "|"), first = 0;
12380 if (mask & ELF_SPARC_HWCAP_POPC)
12381 printf ("%spopc", first ? "" : "|"), first = 0;
12382 if (mask & ELF_SPARC_HWCAP_VIS)
12383 printf ("%svis", first ? "" : "|"), first = 0;
12384 if (mask & ELF_SPARC_HWCAP_VIS2)
12385 printf ("%svis2", first ? "" : "|"), first = 0;
12386 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12387 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12388 if (mask & ELF_SPARC_HWCAP_FMAF)
12389 printf ("%sfmaf", first ? "" : "|"), first = 0;
12390 if (mask & ELF_SPARC_HWCAP_VIS3)
12391 printf ("%svis3", first ? "" : "|"), first = 0;
12392 if (mask & ELF_SPARC_HWCAP_HPC)
12393 printf ("%shpc", first ? "" : "|"), first = 0;
12394 if (mask & ELF_SPARC_HWCAP_RANDOM)
12395 printf ("%srandom", first ? "" : "|"), first = 0;
12396 if (mask & ELF_SPARC_HWCAP_TRANS)
12397 printf ("%strans", first ? "" : "|"), first = 0;
12398 if (mask & ELF_SPARC_HWCAP_FJFMAU)
12399 printf ("%sfjfmau", first ? "" : "|"), first = 0;
12400 if (mask & ELF_SPARC_HWCAP_IMA)
12401 printf ("%sima", first ? "" : "|"), first = 0;
12402 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12403 printf ("%scspare", first ? "" : "|"), first = 0;
12404 }
12405 else
12406 fputc ('0', stdout);
12407 fputc ('\n', stdout);
12408 }
12409
12410 static void
12411 display_sparc_hwcaps2 (int mask)
12412 {
12413 if (mask)
12414 {
12415 int first = 1;
12416
12417 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12418 fputs ("fjathplus", stdout), first = 0;
12419 if (mask & ELF_SPARC_HWCAP2_VIS3B)
12420 printf ("%svis3b", first ? "" : "|"), first = 0;
12421 if (mask & ELF_SPARC_HWCAP2_ADP)
12422 printf ("%sadp", first ? "" : "|"), first = 0;
12423 if (mask & ELF_SPARC_HWCAP2_SPARC5)
12424 printf ("%ssparc5", first ? "" : "|"), first = 0;
12425 if (mask & ELF_SPARC_HWCAP2_MWAIT)
12426 printf ("%smwait", first ? "" : "|"), first = 0;
12427 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12428 printf ("%sxmpmul", first ? "" : "|"), first = 0;
12429 if (mask & ELF_SPARC_HWCAP2_XMONT)
12430 printf ("%sxmont2", first ? "" : "|"), first = 0;
12431 if (mask & ELF_SPARC_HWCAP2_NSEC)
12432 printf ("%snsec", first ? "" : "|"), first = 0;
12433 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12434 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12435 if (mask & ELF_SPARC_HWCAP2_FJDES)
12436 printf ("%sfjdes", first ? "" : "|"), first = 0;
12437 if (mask & ELF_SPARC_HWCAP2_FJAES)
12438 printf ("%sfjaes", first ? "" : "|"), first = 0;
12439 }
12440 else
12441 fputc ('0', stdout);
12442 fputc ('\n', stdout);
12443 }
12444
12445 static unsigned char *
12446 display_sparc_gnu_attribute (unsigned char * p,
12447 int tag,
12448 const unsigned char * const end)
12449 {
12450 unsigned int len;
12451 int val;
12452
12453 if (tag == Tag_GNU_Sparc_HWCAPS)
12454 {
12455 val = read_uleb128 (p, &len, end);
12456 p += len;
12457 printf (" Tag_GNU_Sparc_HWCAPS: ");
12458 display_sparc_hwcaps (val);
12459 return p;
12460 }
12461 if (tag == Tag_GNU_Sparc_HWCAPS2)
12462 {
12463 val = read_uleb128 (p, &len, end);
12464 p += len;
12465 printf (" Tag_GNU_Sparc_HWCAPS2: ");
12466 display_sparc_hwcaps2 (val);
12467 return p;
12468 }
12469
12470 return display_tag_value (tag, p, end);
12471 }
12472
12473 static void
12474 print_mips_fp_abi_value (int val)
12475 {
12476 switch (val)
12477 {
12478 case Val_GNU_MIPS_ABI_FP_ANY:
12479 printf (_("Hard or soft float\n"));
12480 break;
12481 case Val_GNU_MIPS_ABI_FP_DOUBLE:
12482 printf (_("Hard float (double precision)\n"));
12483 break;
12484 case Val_GNU_MIPS_ABI_FP_SINGLE:
12485 printf (_("Hard float (single precision)\n"));
12486 break;
12487 case Val_GNU_MIPS_ABI_FP_SOFT:
12488 printf (_("Soft float\n"));
12489 break;
12490 case Val_GNU_MIPS_ABI_FP_OLD_64:
12491 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12492 break;
12493 case Val_GNU_MIPS_ABI_FP_XX:
12494 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12495 break;
12496 case Val_GNU_MIPS_ABI_FP_64:
12497 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12498 break;
12499 case Val_GNU_MIPS_ABI_FP_64A:
12500 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12501 break;
12502 default:
12503 printf ("??? (%d)\n", val);
12504 break;
12505 }
12506 }
12507
12508 static unsigned char *
12509 display_mips_gnu_attribute (unsigned char * p,
12510 int tag,
12511 const unsigned char * const end)
12512 {
12513 if (tag == Tag_GNU_MIPS_ABI_FP)
12514 {
12515 unsigned int len;
12516 int val;
12517
12518 val = read_uleb128 (p, &len, end);
12519 p += len;
12520 printf (" Tag_GNU_MIPS_ABI_FP: ");
12521
12522 print_mips_fp_abi_value (val);
12523
12524 return p;
12525 }
12526
12527 if (tag == Tag_GNU_MIPS_ABI_MSA)
12528 {
12529 unsigned int len;
12530 int val;
12531
12532 val = read_uleb128 (p, &len, end);
12533 p += len;
12534 printf (" Tag_GNU_MIPS_ABI_MSA: ");
12535
12536 switch (val)
12537 {
12538 case Val_GNU_MIPS_ABI_MSA_ANY:
12539 printf (_("Any MSA or not\n"));
12540 break;
12541 case Val_GNU_MIPS_ABI_MSA_128:
12542 printf (_("128-bit MSA\n"));
12543 break;
12544 default:
12545 printf ("??? (%d)\n", val);
12546 break;
12547 }
12548 return p;
12549 }
12550
12551 return display_tag_value (tag & 1, p, end);
12552 }
12553
12554 static unsigned char *
12555 display_tic6x_attribute (unsigned char * p,
12556 const unsigned char * const end)
12557 {
12558 int tag;
12559 unsigned int len;
12560 int val;
12561
12562 tag = read_uleb128 (p, &len, end);
12563 p += len;
12564
12565 switch (tag)
12566 {
12567 case Tag_ISA:
12568 val = read_uleb128 (p, &len, end);
12569 p += len;
12570 printf (" Tag_ISA: ");
12571
12572 switch (val)
12573 {
12574 case C6XABI_Tag_ISA_none:
12575 printf (_("None\n"));
12576 break;
12577 case C6XABI_Tag_ISA_C62X:
12578 printf ("C62x\n");
12579 break;
12580 case C6XABI_Tag_ISA_C67X:
12581 printf ("C67x\n");
12582 break;
12583 case C6XABI_Tag_ISA_C67XP:
12584 printf ("C67x+\n");
12585 break;
12586 case C6XABI_Tag_ISA_C64X:
12587 printf ("C64x\n");
12588 break;
12589 case C6XABI_Tag_ISA_C64XP:
12590 printf ("C64x+\n");
12591 break;
12592 case C6XABI_Tag_ISA_C674X:
12593 printf ("C674x\n");
12594 break;
12595 default:
12596 printf ("??? (%d)\n", val);
12597 break;
12598 }
12599 return p;
12600
12601 case Tag_ABI_wchar_t:
12602 val = read_uleb128 (p, &len, end);
12603 p += len;
12604 printf (" Tag_ABI_wchar_t: ");
12605 switch (val)
12606 {
12607 case 0:
12608 printf (_("Not used\n"));
12609 break;
12610 case 1:
12611 printf (_("2 bytes\n"));
12612 break;
12613 case 2:
12614 printf (_("4 bytes\n"));
12615 break;
12616 default:
12617 printf ("??? (%d)\n", val);
12618 break;
12619 }
12620 return p;
12621
12622 case Tag_ABI_stack_align_needed:
12623 val = read_uleb128 (p, &len, end);
12624 p += len;
12625 printf (" Tag_ABI_stack_align_needed: ");
12626 switch (val)
12627 {
12628 case 0:
12629 printf (_("8-byte\n"));
12630 break;
12631 case 1:
12632 printf (_("16-byte\n"));
12633 break;
12634 default:
12635 printf ("??? (%d)\n", val);
12636 break;
12637 }
12638 return p;
12639
12640 case Tag_ABI_stack_align_preserved:
12641 val = read_uleb128 (p, &len, end);
12642 p += len;
12643 printf (" Tag_ABI_stack_align_preserved: ");
12644 switch (val)
12645 {
12646 case 0:
12647 printf (_("8-byte\n"));
12648 break;
12649 case 1:
12650 printf (_("16-byte\n"));
12651 break;
12652 default:
12653 printf ("??? (%d)\n", val);
12654 break;
12655 }
12656 return p;
12657
12658 case Tag_ABI_DSBT:
12659 val = read_uleb128 (p, &len, end);
12660 p += len;
12661 printf (" Tag_ABI_DSBT: ");
12662 switch (val)
12663 {
12664 case 0:
12665 printf (_("DSBT addressing not used\n"));
12666 break;
12667 case 1:
12668 printf (_("DSBT addressing used\n"));
12669 break;
12670 default:
12671 printf ("??? (%d)\n", val);
12672 break;
12673 }
12674 return p;
12675
12676 case Tag_ABI_PID:
12677 val = read_uleb128 (p, &len, end);
12678 p += len;
12679 printf (" Tag_ABI_PID: ");
12680 switch (val)
12681 {
12682 case 0:
12683 printf (_("Data addressing position-dependent\n"));
12684 break;
12685 case 1:
12686 printf (_("Data addressing position-independent, GOT near DP\n"));
12687 break;
12688 case 2:
12689 printf (_("Data addressing position-independent, GOT far from DP\n"));
12690 break;
12691 default:
12692 printf ("??? (%d)\n", val);
12693 break;
12694 }
12695 return p;
12696
12697 case Tag_ABI_PIC:
12698 val = read_uleb128 (p, &len, end);
12699 p += len;
12700 printf (" Tag_ABI_PIC: ");
12701 switch (val)
12702 {
12703 case 0:
12704 printf (_("Code addressing position-dependent\n"));
12705 break;
12706 case 1:
12707 printf (_("Code addressing position-independent\n"));
12708 break;
12709 default:
12710 printf ("??? (%d)\n", val);
12711 break;
12712 }
12713 return p;
12714
12715 case Tag_ABI_array_object_alignment:
12716 val = read_uleb128 (p, &len, end);
12717 p += len;
12718 printf (" Tag_ABI_array_object_alignment: ");
12719 switch (val)
12720 {
12721 case 0:
12722 printf (_("8-byte\n"));
12723 break;
12724 case 1:
12725 printf (_("4-byte\n"));
12726 break;
12727 case 2:
12728 printf (_("16-byte\n"));
12729 break;
12730 default:
12731 printf ("??? (%d)\n", val);
12732 break;
12733 }
12734 return p;
12735
12736 case Tag_ABI_array_object_align_expected:
12737 val = read_uleb128 (p, &len, end);
12738 p += len;
12739 printf (" Tag_ABI_array_object_align_expected: ");
12740 switch (val)
12741 {
12742 case 0:
12743 printf (_("8-byte\n"));
12744 break;
12745 case 1:
12746 printf (_("4-byte\n"));
12747 break;
12748 case 2:
12749 printf (_("16-byte\n"));
12750 break;
12751 default:
12752 printf ("??? (%d)\n", val);
12753 break;
12754 }
12755 return p;
12756
12757 case Tag_ABI_compatibility:
12758 {
12759 val = read_uleb128 (p, &len, end);
12760 p += len;
12761 printf (" Tag_ABI_compatibility: ");
12762 printf (_("flag = %d, vendor = "), val);
12763 if (p < end - 1)
12764 {
12765 size_t maxlen = (end - p) - 1;
12766
12767 print_symbol ((int) maxlen, (const char *) p);
12768 p += strnlen ((char *) p, maxlen) + 1;
12769 }
12770 else
12771 {
12772 printf (_("<corrupt>"));
12773 p = (unsigned char *) end;
12774 }
12775 putchar ('\n');
12776 return p;
12777 }
12778
12779 case Tag_ABI_conformance:
12780 {
12781 printf (" Tag_ABI_conformance: \"");
12782 if (p < end - 1)
12783 {
12784 size_t maxlen = (end - p) - 1;
12785
12786 print_symbol ((int) maxlen, (const char *) p);
12787 p += strnlen ((char *) p, maxlen) + 1;
12788 }
12789 else
12790 {
12791 printf (_("<corrupt>"));
12792 p = (unsigned char *) end;
12793 }
12794 printf ("\"\n");
12795 return p;
12796 }
12797 }
12798
12799 return display_tag_value (tag, p, end);
12800 }
12801
12802 static void
12803 display_raw_attribute (unsigned char * p, unsigned char * end)
12804 {
12805 unsigned long addr = 0;
12806 size_t bytes = end - p;
12807
12808 assert (end > p);
12809 while (bytes)
12810 {
12811 int j;
12812 int k;
12813 int lbytes = (bytes > 16 ? 16 : bytes);
12814
12815 printf (" 0x%8.8lx ", addr);
12816
12817 for (j = 0; j < 16; j++)
12818 {
12819 if (j < lbytes)
12820 printf ("%2.2x", p[j]);
12821 else
12822 printf (" ");
12823
12824 if ((j & 3) == 3)
12825 printf (" ");
12826 }
12827
12828 for (j = 0; j < lbytes; j++)
12829 {
12830 k = p[j];
12831 if (k >= ' ' && k < 0x7f)
12832 printf ("%c", k);
12833 else
12834 printf (".");
12835 }
12836
12837 putchar ('\n');
12838
12839 p += lbytes;
12840 bytes -= lbytes;
12841 addr += lbytes;
12842 }
12843
12844 putchar ('\n');
12845 }
12846
12847 static unsigned char *
12848 display_msp430x_attribute (unsigned char * p,
12849 const unsigned char * const end)
12850 {
12851 unsigned int len;
12852 int val;
12853 int tag;
12854
12855 tag = read_uleb128 (p, & len, end);
12856 p += len;
12857
12858 switch (tag)
12859 {
12860 case OFBA_MSPABI_Tag_ISA:
12861 val = read_uleb128 (p, &len, end);
12862 p += len;
12863 printf (" Tag_ISA: ");
12864 switch (val)
12865 {
12866 case 0: printf (_("None\n")); break;
12867 case 1: printf (_("MSP430\n")); break;
12868 case 2: printf (_("MSP430X\n")); break;
12869 default: printf ("??? (%d)\n", val); break;
12870 }
12871 break;
12872
12873 case OFBA_MSPABI_Tag_Code_Model:
12874 val = read_uleb128 (p, &len, end);
12875 p += len;
12876 printf (" Tag_Code_Model: ");
12877 switch (val)
12878 {
12879 case 0: printf (_("None\n")); break;
12880 case 1: printf (_("Small\n")); break;
12881 case 2: printf (_("Large\n")); break;
12882 default: printf ("??? (%d)\n", val); break;
12883 }
12884 break;
12885
12886 case OFBA_MSPABI_Tag_Data_Model:
12887 val = read_uleb128 (p, &len, end);
12888 p += len;
12889 printf (" Tag_Data_Model: ");
12890 switch (val)
12891 {
12892 case 0: printf (_("None\n")); break;
12893 case 1: printf (_("Small\n")); break;
12894 case 2: printf (_("Large\n")); break;
12895 case 3: printf (_("Restricted Large\n")); break;
12896 default: printf ("??? (%d)\n", val); break;
12897 }
12898 break;
12899
12900 default:
12901 printf (_(" <unknown tag %d>: "), tag);
12902
12903 if (tag & 1)
12904 {
12905 putchar ('"');
12906 if (p < end - 1)
12907 {
12908 size_t maxlen = (end - p) - 1;
12909
12910 print_symbol ((int) maxlen, (const char *) p);
12911 p += strnlen ((char *) p, maxlen) + 1;
12912 }
12913 else
12914 {
12915 printf (_("<corrupt>"));
12916 p = (unsigned char *) end;
12917 }
12918 printf ("\"\n");
12919 }
12920 else
12921 {
12922 val = read_uleb128 (p, &len, end);
12923 p += len;
12924 printf ("%d (0x%x)\n", val, val);
12925 }
12926 break;
12927 }
12928
12929 assert (p <= end);
12930 return p;
12931 }
12932
12933 static int
12934 process_attributes (FILE * file,
12935 const char * public_name,
12936 unsigned int proc_type,
12937 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12938 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12939 {
12940 Elf_Internal_Shdr * sect;
12941 unsigned i;
12942
12943 /* Find the section header so that we get the size. */
12944 for (i = 0, sect = section_headers;
12945 i < elf_header.e_shnum;
12946 i++, sect++)
12947 {
12948 unsigned char * contents;
12949 unsigned char * p;
12950
12951 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12952 continue;
12953
12954 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12955 sect->sh_size, _("attributes"));
12956 if (contents == NULL)
12957 continue;
12958
12959 p = contents;
12960 if (*p == 'A')
12961 {
12962 bfd_vma section_len;
12963
12964 section_len = sect->sh_size - 1;
12965 p++;
12966
12967 while (section_len > 0)
12968 {
12969 bfd_vma attr_len;
12970 unsigned int namelen;
12971 bfd_boolean public_section;
12972 bfd_boolean gnu_section;
12973
12974 if (section_len <= 4)
12975 {
12976 error (_("Tag section ends prematurely\n"));
12977 break;
12978 }
12979 attr_len = byte_get (p, 4);
12980 p += 4;
12981
12982 if (attr_len > section_len)
12983 {
12984 error (_("Bad attribute length (%u > %u)\n"),
12985 (unsigned) attr_len, (unsigned) section_len);
12986 attr_len = section_len;
12987 }
12988 /* PR 17531: file: 001-101425-0.004 */
12989 else if (attr_len < 5)
12990 {
12991 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
12992 break;
12993 }
12994
12995 section_len -= attr_len;
12996 attr_len -= 4;
12997
12998 namelen = strnlen ((char *) p, attr_len) + 1;
12999 if (namelen == 0 || namelen >= attr_len)
13000 {
13001 error (_("Corrupt attribute section name\n"));
13002 break;
13003 }
13004
13005 printf (_("Attribute Section: "));
13006 print_symbol (INT_MAX, (const char *) p);
13007 putchar ('\n');
13008
13009 if (public_name && streq ((char *) p, public_name))
13010 public_section = TRUE;
13011 else
13012 public_section = FALSE;
13013
13014 if (streq ((char *) p, "gnu"))
13015 gnu_section = TRUE;
13016 else
13017 gnu_section = FALSE;
13018
13019 p += namelen;
13020 attr_len -= namelen;
13021
13022 while (attr_len > 0 && p < contents + sect->sh_size)
13023 {
13024 int tag;
13025 int val;
13026 bfd_vma size;
13027 unsigned char * end;
13028
13029 /* PR binutils/17531: Safe handling of corrupt files. */
13030 if (attr_len < 6)
13031 {
13032 error (_("Unused bytes at end of section\n"));
13033 section_len = 0;
13034 break;
13035 }
13036
13037 tag = *(p++);
13038 size = byte_get (p, 4);
13039 if (size > attr_len)
13040 {
13041 error (_("Bad subsection length (%u > %u)\n"),
13042 (unsigned) size, (unsigned) attr_len);
13043 size = attr_len;
13044 }
13045 /* PR binutils/17531: Safe handling of corrupt files. */
13046 if (size < 6)
13047 {
13048 error (_("Bad subsection length (%u < 6)\n"),
13049 (unsigned) size);
13050 section_len = 0;
13051 break;
13052 }
13053
13054 attr_len -= size;
13055 end = p + size - 1;
13056 assert (end <= contents + sect->sh_size);
13057 p += 4;
13058
13059 switch (tag)
13060 {
13061 case 1:
13062 printf (_("File Attributes\n"));
13063 break;
13064 case 2:
13065 printf (_("Section Attributes:"));
13066 goto do_numlist;
13067 case 3:
13068 printf (_("Symbol Attributes:"));
13069 do_numlist:
13070 for (;;)
13071 {
13072 unsigned int j;
13073
13074 val = read_uleb128 (p, &j, end);
13075 p += j;
13076 if (val == 0)
13077 break;
13078 printf (" %d", val);
13079 }
13080 printf ("\n");
13081 break;
13082 default:
13083 printf (_("Unknown tag: %d\n"), tag);
13084 public_section = FALSE;
13085 break;
13086 }
13087
13088 if (public_section && display_pub_attribute != NULL)
13089 {
13090 while (p < end)
13091 p = display_pub_attribute (p, end);
13092 assert (p <= end);
13093 }
13094 else if (gnu_section && display_proc_gnu_attribute != NULL)
13095 {
13096 while (p < end)
13097 p = display_gnu_attribute (p,
13098 display_proc_gnu_attribute,
13099 end);
13100 assert (p <= end);
13101 }
13102 else if (p < end)
13103 {
13104 printf (_(" Unknown attribute:\n"));
13105 display_raw_attribute (p, end);
13106 p = end;
13107 }
13108 else
13109 attr_len = 0;
13110 }
13111 }
13112 }
13113 else
13114 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13115
13116 free (contents);
13117 }
13118 return 1;
13119 }
13120
13121 static int
13122 process_arm_specific (FILE * file)
13123 {
13124 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13125 display_arm_attribute, NULL);
13126 }
13127
13128 static int
13129 process_power_specific (FILE * file)
13130 {
13131 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13132 display_power_gnu_attribute);
13133 }
13134
13135 static int
13136 process_sparc_specific (FILE * file)
13137 {
13138 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13139 display_sparc_gnu_attribute);
13140 }
13141
13142 static int
13143 process_tic6x_specific (FILE * file)
13144 {
13145 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13146 display_tic6x_attribute, NULL);
13147 }
13148
13149 static int
13150 process_msp430x_specific (FILE * file)
13151 {
13152 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13153 display_msp430x_attribute, NULL);
13154 }
13155
13156 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13157 Print the Address, Access and Initial fields of an entry at VMA ADDR
13158 and return the VMA of the next entry. */
13159
13160 static bfd_vma
13161 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13162 {
13163 printf (" ");
13164 print_vma (addr, LONG_HEX);
13165 printf (" ");
13166 if (addr < pltgot + 0xfff0)
13167 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13168 else
13169 printf ("%10s", "");
13170 printf (" ");
13171 if (data == NULL)
13172 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13173 else
13174 {
13175 bfd_vma entry;
13176
13177 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13178 print_vma (entry, LONG_HEX);
13179 }
13180 return addr + (is_32bit_elf ? 4 : 8);
13181 }
13182
13183 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13184 PLTGOT. Print the Address and Initial fields of an entry at VMA
13185 ADDR and return the VMA of the next entry. */
13186
13187 static bfd_vma
13188 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13189 {
13190 printf (" ");
13191 print_vma (addr, LONG_HEX);
13192 printf (" ");
13193 if (data == NULL)
13194 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13195 else
13196 {
13197 bfd_vma entry;
13198
13199 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13200 print_vma (entry, LONG_HEX);
13201 }
13202 return addr + (is_32bit_elf ? 4 : 8);
13203 }
13204
13205 static void
13206 print_mips_ases (unsigned int mask)
13207 {
13208 if (mask & AFL_ASE_DSP)
13209 fputs ("\n\tDSP ASE", stdout);
13210 if (mask & AFL_ASE_DSPR2)
13211 fputs ("\n\tDSP R2 ASE", stdout);
13212 if (mask & AFL_ASE_EVA)
13213 fputs ("\n\tEnhanced VA Scheme", stdout);
13214 if (mask & AFL_ASE_MCU)
13215 fputs ("\n\tMCU (MicroController) ASE", stdout);
13216 if (mask & AFL_ASE_MDMX)
13217 fputs ("\n\tMDMX ASE", stdout);
13218 if (mask & AFL_ASE_MIPS3D)
13219 fputs ("\n\tMIPS-3D ASE", stdout);
13220 if (mask & AFL_ASE_MT)
13221 fputs ("\n\tMT ASE", stdout);
13222 if (mask & AFL_ASE_SMARTMIPS)
13223 fputs ("\n\tSmartMIPS ASE", stdout);
13224 if (mask & AFL_ASE_VIRT)
13225 fputs ("\n\tVZ ASE", stdout);
13226 if (mask & AFL_ASE_MSA)
13227 fputs ("\n\tMSA ASE", stdout);
13228 if (mask & AFL_ASE_MIPS16)
13229 fputs ("\n\tMIPS16 ASE", stdout);
13230 if (mask & AFL_ASE_MICROMIPS)
13231 fputs ("\n\tMICROMIPS ASE", stdout);
13232 if (mask & AFL_ASE_XPA)
13233 fputs ("\n\tXPA ASE", stdout);
13234 if (mask == 0)
13235 fprintf (stdout, "\n\t%s", _("None"));
13236 else if ((mask & ~AFL_ASE_MASK) != 0)
13237 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13238 }
13239
13240 static void
13241 print_mips_isa_ext (unsigned int isa_ext)
13242 {
13243 switch (isa_ext)
13244 {
13245 case 0:
13246 fputs (_("None"), stdout);
13247 break;
13248 case AFL_EXT_XLR:
13249 fputs ("RMI XLR", stdout);
13250 break;
13251 case AFL_EXT_OCTEON3:
13252 fputs ("Cavium Networks Octeon3", stdout);
13253 break;
13254 case AFL_EXT_OCTEON2:
13255 fputs ("Cavium Networks Octeon2", stdout);
13256 break;
13257 case AFL_EXT_OCTEONP:
13258 fputs ("Cavium Networks OcteonP", stdout);
13259 break;
13260 case AFL_EXT_LOONGSON_3A:
13261 fputs ("Loongson 3A", stdout);
13262 break;
13263 case AFL_EXT_OCTEON:
13264 fputs ("Cavium Networks Octeon", stdout);
13265 break;
13266 case AFL_EXT_5900:
13267 fputs ("Toshiba R5900", stdout);
13268 break;
13269 case AFL_EXT_4650:
13270 fputs ("MIPS R4650", stdout);
13271 break;
13272 case AFL_EXT_4010:
13273 fputs ("LSI R4010", stdout);
13274 break;
13275 case AFL_EXT_4100:
13276 fputs ("NEC VR4100", stdout);
13277 break;
13278 case AFL_EXT_3900:
13279 fputs ("Toshiba R3900", stdout);
13280 break;
13281 case AFL_EXT_10000:
13282 fputs ("MIPS R10000", stdout);
13283 break;
13284 case AFL_EXT_SB1:
13285 fputs ("Broadcom SB-1", stdout);
13286 break;
13287 case AFL_EXT_4111:
13288 fputs ("NEC VR4111/VR4181", stdout);
13289 break;
13290 case AFL_EXT_4120:
13291 fputs ("NEC VR4120", stdout);
13292 break;
13293 case AFL_EXT_5400:
13294 fputs ("NEC VR5400", stdout);
13295 break;
13296 case AFL_EXT_5500:
13297 fputs ("NEC VR5500", stdout);
13298 break;
13299 case AFL_EXT_LOONGSON_2E:
13300 fputs ("ST Microelectronics Loongson 2E", stdout);
13301 break;
13302 case AFL_EXT_LOONGSON_2F:
13303 fputs ("ST Microelectronics Loongson 2F", stdout);
13304 break;
13305 default:
13306 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13307 }
13308 }
13309
13310 static int
13311 get_mips_reg_size (int reg_size)
13312 {
13313 return (reg_size == AFL_REG_NONE) ? 0
13314 : (reg_size == AFL_REG_32) ? 32
13315 : (reg_size == AFL_REG_64) ? 64
13316 : (reg_size == AFL_REG_128) ? 128
13317 : -1;
13318 }
13319
13320 static int
13321 process_mips_specific (FILE * file)
13322 {
13323 Elf_Internal_Dyn * entry;
13324 Elf_Internal_Shdr *sect = NULL;
13325 size_t liblist_offset = 0;
13326 size_t liblistno = 0;
13327 size_t conflictsno = 0;
13328 size_t options_offset = 0;
13329 size_t conflicts_offset = 0;
13330 size_t pltrelsz = 0;
13331 size_t pltrel = 0;
13332 bfd_vma pltgot = 0;
13333 bfd_vma mips_pltgot = 0;
13334 bfd_vma jmprel = 0;
13335 bfd_vma local_gotno = 0;
13336 bfd_vma gotsym = 0;
13337 bfd_vma symtabno = 0;
13338
13339 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13340 display_mips_gnu_attribute);
13341
13342 sect = find_section (".MIPS.abiflags");
13343
13344 if (sect != NULL)
13345 {
13346 Elf_External_ABIFlags_v0 *abiflags_ext;
13347 Elf_Internal_ABIFlags_v0 abiflags_in;
13348
13349 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13350 fputs ("\nCorrupt ABI Flags section.\n", stdout);
13351 else
13352 {
13353 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13354 sect->sh_size, _("MIPS ABI Flags section"));
13355 if (abiflags_ext)
13356 {
13357 abiflags_in.version = BYTE_GET (abiflags_ext->version);
13358 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13359 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13360 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13361 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13362 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13363 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13364 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13365 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13366 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13367 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13368
13369 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13370 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13371 if (abiflags_in.isa_rev > 1)
13372 printf ("r%d", abiflags_in.isa_rev);
13373 printf ("\nGPR size: %d",
13374 get_mips_reg_size (abiflags_in.gpr_size));
13375 printf ("\nCPR1 size: %d",
13376 get_mips_reg_size (abiflags_in.cpr1_size));
13377 printf ("\nCPR2 size: %d",
13378 get_mips_reg_size (abiflags_in.cpr2_size));
13379 fputs ("\nFP ABI: ", stdout);
13380 print_mips_fp_abi_value (abiflags_in.fp_abi);
13381 fputs ("ISA Extension: ", stdout);
13382 print_mips_isa_ext (abiflags_in.isa_ext);
13383 fputs ("\nASEs:", stdout);
13384 print_mips_ases (abiflags_in.ases);
13385 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13386 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13387 fputc ('\n', stdout);
13388 free (abiflags_ext);
13389 }
13390 }
13391 }
13392
13393 /* We have a lot of special sections. Thanks SGI! */
13394 if (dynamic_section == NULL)
13395 /* No information available. */
13396 return 0;
13397
13398 for (entry = dynamic_section;
13399 /* PR 17531 file: 012-50589-0.004. */
13400 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13401 ++entry)
13402 switch (entry->d_tag)
13403 {
13404 case DT_MIPS_LIBLIST:
13405 liblist_offset
13406 = offset_from_vma (file, entry->d_un.d_val,
13407 liblistno * sizeof (Elf32_External_Lib));
13408 break;
13409 case DT_MIPS_LIBLISTNO:
13410 liblistno = entry->d_un.d_val;
13411 break;
13412 case DT_MIPS_OPTIONS:
13413 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13414 break;
13415 case DT_MIPS_CONFLICT:
13416 conflicts_offset
13417 = offset_from_vma (file, entry->d_un.d_val,
13418 conflictsno * sizeof (Elf32_External_Conflict));
13419 break;
13420 case DT_MIPS_CONFLICTNO:
13421 conflictsno = entry->d_un.d_val;
13422 break;
13423 case DT_PLTGOT:
13424 pltgot = entry->d_un.d_ptr;
13425 break;
13426 case DT_MIPS_LOCAL_GOTNO:
13427 local_gotno = entry->d_un.d_val;
13428 break;
13429 case DT_MIPS_GOTSYM:
13430 gotsym = entry->d_un.d_val;
13431 break;
13432 case DT_MIPS_SYMTABNO:
13433 symtabno = entry->d_un.d_val;
13434 break;
13435 case DT_MIPS_PLTGOT:
13436 mips_pltgot = entry->d_un.d_ptr;
13437 break;
13438 case DT_PLTREL:
13439 pltrel = entry->d_un.d_val;
13440 break;
13441 case DT_PLTRELSZ:
13442 pltrelsz = entry->d_un.d_val;
13443 break;
13444 case DT_JMPREL:
13445 jmprel = entry->d_un.d_ptr;
13446 break;
13447 default:
13448 break;
13449 }
13450
13451 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13452 {
13453 Elf32_External_Lib * elib;
13454 size_t cnt;
13455
13456 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13457 liblistno,
13458 sizeof (Elf32_External_Lib),
13459 _("liblist section data"));
13460 if (elib)
13461 {
13462 printf (_("\nSection '.liblist' contains %lu entries:\n"),
13463 (unsigned long) liblistno);
13464 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
13465 stdout);
13466
13467 for (cnt = 0; cnt < liblistno; ++cnt)
13468 {
13469 Elf32_Lib liblist;
13470 time_t atime;
13471 char timebuf[20];
13472 struct tm * tmp;
13473
13474 liblist.l_name = BYTE_GET (elib[cnt].l_name);
13475 atime = BYTE_GET (elib[cnt].l_time_stamp);
13476 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13477 liblist.l_version = BYTE_GET (elib[cnt].l_version);
13478 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13479
13480 tmp = gmtime (&atime);
13481 snprintf (timebuf, sizeof (timebuf),
13482 "%04u-%02u-%02uT%02u:%02u:%02u",
13483 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13484 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13485
13486 printf ("%3lu: ", (unsigned long) cnt);
13487 if (VALID_DYNAMIC_NAME (liblist.l_name))
13488 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13489 else
13490 printf (_("<corrupt: %9ld>"), liblist.l_name);
13491 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13492 liblist.l_version);
13493
13494 if (liblist.l_flags == 0)
13495 puts (_(" NONE"));
13496 else
13497 {
13498 static const struct
13499 {
13500 const char * name;
13501 int bit;
13502 }
13503 l_flags_vals[] =
13504 {
13505 { " EXACT_MATCH", LL_EXACT_MATCH },
13506 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13507 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13508 { " EXPORTS", LL_EXPORTS },
13509 { " DELAY_LOAD", LL_DELAY_LOAD },
13510 { " DELTA", LL_DELTA }
13511 };
13512 int flags = liblist.l_flags;
13513 size_t fcnt;
13514
13515 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13516 if ((flags & l_flags_vals[fcnt].bit) != 0)
13517 {
13518 fputs (l_flags_vals[fcnt].name, stdout);
13519 flags ^= l_flags_vals[fcnt].bit;
13520 }
13521 if (flags != 0)
13522 printf (" %#x", (unsigned int) flags);
13523
13524 puts ("");
13525 }
13526 }
13527
13528 free (elib);
13529 }
13530 }
13531
13532 if (options_offset != 0)
13533 {
13534 Elf_External_Options * eopt;
13535 Elf_Internal_Options * iopt;
13536 Elf_Internal_Options * option;
13537 size_t offset;
13538 int cnt;
13539 sect = section_headers;
13540
13541 /* Find the section header so that we get the size. */
13542 sect = find_section_by_type (SHT_MIPS_OPTIONS);
13543 /* PR 17533 file: 012-277276-0.004. */
13544 if (sect == NULL)
13545 {
13546 error (_("No MIPS_OPTIONS header found\n"));
13547 return 0;
13548 }
13549
13550 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13551 sect->sh_size, _("options"));
13552 if (eopt)
13553 {
13554 iopt = (Elf_Internal_Options *)
13555 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13556 if (iopt == NULL)
13557 {
13558 error (_("Out of memory allocatinf space for MIPS options\n"));
13559 return 0;
13560 }
13561
13562 offset = cnt = 0;
13563 option = iopt;
13564
13565 while (offset < sect->sh_size)
13566 {
13567 Elf_External_Options * eoption;
13568
13569 eoption = (Elf_External_Options *) ((char *) eopt + offset);
13570
13571 option->kind = BYTE_GET (eoption->kind);
13572 option->size = BYTE_GET (eoption->size);
13573 option->section = BYTE_GET (eoption->section);
13574 option->info = BYTE_GET (eoption->info);
13575
13576 offset += option->size;
13577
13578 ++option;
13579 ++cnt;
13580 }
13581
13582 printf (_("\nSection '%s' contains %d entries:\n"),
13583 printable_section_name (sect), cnt);
13584
13585 option = iopt;
13586
13587 while (cnt-- > 0)
13588 {
13589 size_t len;
13590
13591 switch (option->kind)
13592 {
13593 case ODK_NULL:
13594 /* This shouldn't happen. */
13595 printf (" NULL %d %lx", option->section, option->info);
13596 break;
13597 case ODK_REGINFO:
13598 printf (" REGINFO ");
13599 if (elf_header.e_machine == EM_MIPS)
13600 {
13601 /* 32bit form. */
13602 Elf32_External_RegInfo * ereg;
13603 Elf32_RegInfo reginfo;
13604
13605 ereg = (Elf32_External_RegInfo *) (option + 1);
13606 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13607 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13608 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13609 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13610 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13611 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13612
13613 printf ("GPR %08lx GP 0x%lx\n",
13614 reginfo.ri_gprmask,
13615 (unsigned long) reginfo.ri_gp_value);
13616 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
13617 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13618 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13619 }
13620 else
13621 {
13622 /* 64 bit form. */
13623 Elf64_External_RegInfo * ereg;
13624 Elf64_Internal_RegInfo reginfo;
13625
13626 ereg = (Elf64_External_RegInfo *) (option + 1);
13627 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13628 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13629 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13630 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13631 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13632 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13633
13634 printf ("GPR %08lx GP 0x",
13635 reginfo.ri_gprmask);
13636 printf_vma (reginfo.ri_gp_value);
13637 printf ("\n");
13638
13639 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
13640 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13641 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13642 }
13643 ++option;
13644 continue;
13645 case ODK_EXCEPTIONS:
13646 fputs (" EXCEPTIONS fpe_min(", stdout);
13647 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13648 fputs (") fpe_max(", stdout);
13649 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13650 fputs (")", stdout);
13651
13652 if (option->info & OEX_PAGE0)
13653 fputs (" PAGE0", stdout);
13654 if (option->info & OEX_SMM)
13655 fputs (" SMM", stdout);
13656 if (option->info & OEX_FPDBUG)
13657 fputs (" FPDBUG", stdout);
13658 if (option->info & OEX_DISMISS)
13659 fputs (" DISMISS", stdout);
13660 break;
13661 case ODK_PAD:
13662 fputs (" PAD ", stdout);
13663 if (option->info & OPAD_PREFIX)
13664 fputs (" PREFIX", stdout);
13665 if (option->info & OPAD_POSTFIX)
13666 fputs (" POSTFIX", stdout);
13667 if (option->info & OPAD_SYMBOL)
13668 fputs (" SYMBOL", stdout);
13669 break;
13670 case ODK_HWPATCH:
13671 fputs (" HWPATCH ", stdout);
13672 if (option->info & OHW_R4KEOP)
13673 fputs (" R4KEOP", stdout);
13674 if (option->info & OHW_R8KPFETCH)
13675 fputs (" R8KPFETCH", stdout);
13676 if (option->info & OHW_R5KEOP)
13677 fputs (" R5KEOP", stdout);
13678 if (option->info & OHW_R5KCVTL)
13679 fputs (" R5KCVTL", stdout);
13680 break;
13681 case ODK_FILL:
13682 fputs (" FILL ", stdout);
13683 /* XXX Print content of info word? */
13684 break;
13685 case ODK_TAGS:
13686 fputs (" TAGS ", stdout);
13687 /* XXX Print content of info word? */
13688 break;
13689 case ODK_HWAND:
13690 fputs (" HWAND ", stdout);
13691 if (option->info & OHWA0_R4KEOP_CHECKED)
13692 fputs (" R4KEOP_CHECKED", stdout);
13693 if (option->info & OHWA0_R4KEOP_CLEAN)
13694 fputs (" R4KEOP_CLEAN", stdout);
13695 break;
13696 case ODK_HWOR:
13697 fputs (" HWOR ", stdout);
13698 if (option->info & OHWA0_R4KEOP_CHECKED)
13699 fputs (" R4KEOP_CHECKED", stdout);
13700 if (option->info & OHWA0_R4KEOP_CLEAN)
13701 fputs (" R4KEOP_CLEAN", stdout);
13702 break;
13703 case ODK_GP_GROUP:
13704 printf (" GP_GROUP %#06lx self-contained %#06lx",
13705 option->info & OGP_GROUP,
13706 (option->info & OGP_SELF) >> 16);
13707 break;
13708 case ODK_IDENT:
13709 printf (" IDENT %#06lx self-contained %#06lx",
13710 option->info & OGP_GROUP,
13711 (option->info & OGP_SELF) >> 16);
13712 break;
13713 default:
13714 /* This shouldn't happen. */
13715 printf (" %3d ??? %d %lx",
13716 option->kind, option->section, option->info);
13717 break;
13718 }
13719
13720 len = sizeof (* eopt);
13721 while (len < option->size)
13722 if (((char *) option)[len] >= ' '
13723 && ((char *) option)[len] < 0x7f)
13724 printf ("%c", ((char *) option)[len++]);
13725 else
13726 printf ("\\%03o", ((char *) option)[len++]);
13727
13728 fputs ("\n", stdout);
13729 ++option;
13730 }
13731
13732 free (eopt);
13733 }
13734 }
13735
13736 if (conflicts_offset != 0 && conflictsno != 0)
13737 {
13738 Elf32_Conflict * iconf;
13739 size_t cnt;
13740
13741 if (dynamic_symbols == NULL)
13742 {
13743 error (_("conflict list found without a dynamic symbol table\n"));
13744 return 0;
13745 }
13746
13747 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13748 if (iconf == NULL)
13749 {
13750 error (_("Out of memory allocating space for dynamic conflicts\n"));
13751 return 0;
13752 }
13753
13754 if (is_32bit_elf)
13755 {
13756 Elf32_External_Conflict * econf32;
13757
13758 econf32 = (Elf32_External_Conflict *)
13759 get_data (NULL, file, conflicts_offset, conflictsno,
13760 sizeof (* econf32), _("conflict"));
13761 if (!econf32)
13762 return 0;
13763
13764 for (cnt = 0; cnt < conflictsno; ++cnt)
13765 iconf[cnt] = BYTE_GET (econf32[cnt]);
13766
13767 free (econf32);
13768 }
13769 else
13770 {
13771 Elf64_External_Conflict * econf64;
13772
13773 econf64 = (Elf64_External_Conflict *)
13774 get_data (NULL, file, conflicts_offset, conflictsno,
13775 sizeof (* econf64), _("conflict"));
13776 if (!econf64)
13777 return 0;
13778
13779 for (cnt = 0; cnt < conflictsno; ++cnt)
13780 iconf[cnt] = BYTE_GET (econf64[cnt]);
13781
13782 free (econf64);
13783 }
13784
13785 printf (_("\nSection '.conflict' contains %lu entries:\n"),
13786 (unsigned long) conflictsno);
13787 puts (_(" Num: Index Value Name"));
13788
13789 for (cnt = 0; cnt < conflictsno; ++cnt)
13790 {
13791 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
13792
13793 if (iconf[cnt] >= num_dynamic_syms)
13794 printf (_("<corrupt symbol index>"));
13795 else
13796 {
13797 Elf_Internal_Sym * psym;
13798
13799 psym = & dynamic_symbols[iconf[cnt]];
13800 print_vma (psym->st_value, FULL_HEX);
13801 putchar (' ');
13802 if (VALID_DYNAMIC_NAME (psym->st_name))
13803 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13804 else
13805 printf (_("<corrupt: %14ld>"), psym->st_name);
13806 }
13807 putchar ('\n');
13808 }
13809
13810 free (iconf);
13811 }
13812
13813 if (pltgot != 0 && local_gotno != 0)
13814 {
13815 bfd_vma ent, local_end, global_end;
13816 size_t i, offset;
13817 unsigned char * data;
13818 int addr_size;
13819
13820 ent = pltgot;
13821 addr_size = (is_32bit_elf ? 4 : 8);
13822 local_end = pltgot + local_gotno * addr_size;
13823
13824 /* PR binutils/17533 file: 012-111227-0.004 */
13825 if (symtabno < gotsym)
13826 {
13827 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
13828 (long) gotsym, (long) symtabno);
13829 return 0;
13830 }
13831
13832 global_end = local_end + (symtabno - gotsym) * addr_size;
13833 assert (global_end >= local_end);
13834 offset = offset_from_vma (file, pltgot, global_end - pltgot);
13835 data = (unsigned char *) get_data (NULL, file, offset,
13836 global_end - pltgot, 1,
13837 _("Global Offset Table data"));
13838 if (data == NULL)
13839 return 0;
13840
13841 printf (_("\nPrimary GOT:\n"));
13842 printf (_(" Canonical gp value: "));
13843 print_vma (pltgot + 0x7ff0, LONG_HEX);
13844 printf ("\n\n");
13845
13846 printf (_(" Reserved entries:\n"));
13847 printf (_(" %*s %10s %*s Purpose\n"),
13848 addr_size * 2, _("Address"), _("Access"),
13849 addr_size * 2, _("Initial"));
13850 ent = print_mips_got_entry (data, pltgot, ent);
13851 printf (_(" Lazy resolver\n"));
13852 if (data
13853 && (byte_get (data + ent - pltgot, addr_size)
13854 >> (addr_size * 8 - 1)) != 0)
13855 {
13856 ent = print_mips_got_entry (data, pltgot, ent);
13857 printf (_(" Module pointer (GNU extension)\n"));
13858 }
13859 printf ("\n");
13860
13861 if (ent < local_end)
13862 {
13863 printf (_(" Local entries:\n"));
13864 printf (" %*s %10s %*s\n",
13865 addr_size * 2, _("Address"), _("Access"),
13866 addr_size * 2, _("Initial"));
13867 while (ent < local_end)
13868 {
13869 ent = print_mips_got_entry (data, pltgot, ent);
13870 printf ("\n");
13871 }
13872 printf ("\n");
13873 }
13874
13875 if (gotsym < symtabno)
13876 {
13877 int sym_width;
13878
13879 printf (_(" Global entries:\n"));
13880 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
13881 addr_size * 2, _("Address"),
13882 _("Access"),
13883 addr_size * 2, _("Initial"),
13884 addr_size * 2, _("Sym.Val."),
13885 _("Type"),
13886 /* Note for translators: "Ndx" = abbreviated form of "Index". */
13887 _("Ndx"), _("Name"));
13888
13889 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13890
13891 for (i = gotsym; i < symtabno; i++)
13892 {
13893 ent = print_mips_got_entry (data, pltgot, ent);
13894 printf (" ");
13895
13896 if (dynamic_symbols == NULL)
13897 printf (_("<no dynamic symbols>"));
13898 else if (i < num_dynamic_syms)
13899 {
13900 Elf_Internal_Sym * psym = dynamic_symbols + i;
13901
13902 print_vma (psym->st_value, LONG_HEX);
13903 printf (" %-7s %3s ",
13904 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13905 get_symbol_index_type (psym->st_shndx));
13906
13907 if (VALID_DYNAMIC_NAME (psym->st_name))
13908 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13909 else
13910 printf (_("<corrupt: %14ld>"), psym->st_name);
13911 }
13912 else
13913 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
13914 (unsigned long) i);
13915
13916 printf ("\n");
13917 }
13918 printf ("\n");
13919 }
13920
13921 if (data)
13922 free (data);
13923 }
13924
13925 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13926 {
13927 bfd_vma ent, end;
13928 size_t offset, rel_offset;
13929 unsigned long count, i;
13930 unsigned char * data;
13931 int addr_size, sym_width;
13932 Elf_Internal_Rela * rels;
13933
13934 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13935 if (pltrel == DT_RELA)
13936 {
13937 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13938 return 0;
13939 }
13940 else
13941 {
13942 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13943 return 0;
13944 }
13945
13946 ent = mips_pltgot;
13947 addr_size = (is_32bit_elf ? 4 : 8);
13948 end = mips_pltgot + (2 + count) * addr_size;
13949
13950 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13951 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13952 1, _("Procedure Linkage Table data"));
13953 if (data == NULL)
13954 return 0;
13955
13956 printf ("\nPLT GOT:\n\n");
13957 printf (_(" Reserved entries:\n"));
13958 printf (_(" %*s %*s Purpose\n"),
13959 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13960 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13961 printf (_(" PLT lazy resolver\n"));
13962 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13963 printf (_(" Module pointer\n"));
13964 printf ("\n");
13965
13966 printf (_(" Entries:\n"));
13967 printf (" %*s %*s %*s %-7s %3s %s\n",
13968 addr_size * 2, _("Address"),
13969 addr_size * 2, _("Initial"),
13970 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13971 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13972 for (i = 0; i < count; i++)
13973 {
13974 unsigned long idx = get_reloc_symindex (rels[i].r_info);
13975
13976 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13977 printf (" ");
13978
13979 if (idx >= num_dynamic_syms)
13980 printf (_("<corrupt symbol index: %lu>"), idx);
13981 else
13982 {
13983 Elf_Internal_Sym * psym = dynamic_symbols + idx;
13984
13985 print_vma (psym->st_value, LONG_HEX);
13986 printf (" %-7s %3s ",
13987 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13988 get_symbol_index_type (psym->st_shndx));
13989 if (VALID_DYNAMIC_NAME (psym->st_name))
13990 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13991 else
13992 printf (_("<corrupt: %14ld>"), psym->st_name);
13993 }
13994 printf ("\n");
13995 }
13996 printf ("\n");
13997
13998 if (data)
13999 free (data);
14000 free (rels);
14001 }
14002
14003 return 1;
14004 }
14005
14006 static int
14007 process_nds32_specific (FILE * file)
14008 {
14009 Elf_Internal_Shdr *sect = NULL;
14010
14011 sect = find_section (".nds32_e_flags");
14012 if (sect != NULL)
14013 {
14014 unsigned int *flag;
14015
14016 printf ("\nNDS32 elf flags section:\n");
14017 flag = get_data (NULL, file, sect->sh_offset, 1,
14018 sect->sh_size, _("NDS32 elf flags section"));
14019
14020 switch ((*flag) & 0x3)
14021 {
14022 case 0:
14023 printf ("(VEC_SIZE):\tNo entry.\n");
14024 break;
14025 case 1:
14026 printf ("(VEC_SIZE):\t4 bytes\n");
14027 break;
14028 case 2:
14029 printf ("(VEC_SIZE):\t16 bytes\n");
14030 break;
14031 case 3:
14032 printf ("(VEC_SIZE):\treserved\n");
14033 break;
14034 }
14035 }
14036
14037 return TRUE;
14038 }
14039
14040 static int
14041 process_gnu_liblist (FILE * file)
14042 {
14043 Elf_Internal_Shdr * section;
14044 Elf_Internal_Shdr * string_sec;
14045 Elf32_External_Lib * elib;
14046 char * strtab;
14047 size_t strtab_size;
14048 size_t cnt;
14049 unsigned i;
14050
14051 if (! do_arch)
14052 return 0;
14053
14054 for (i = 0, section = section_headers;
14055 i < elf_header.e_shnum;
14056 i++, section++)
14057 {
14058 switch (section->sh_type)
14059 {
14060 case SHT_GNU_LIBLIST:
14061 if (section->sh_link >= elf_header.e_shnum)
14062 break;
14063
14064 elib = (Elf32_External_Lib *)
14065 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14066 _("liblist section data"));
14067
14068 if (elib == NULL)
14069 break;
14070 string_sec = section_headers + section->sh_link;
14071
14072 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14073 string_sec->sh_size,
14074 _("liblist string table"));
14075 if (strtab == NULL
14076 || section->sh_entsize != sizeof (Elf32_External_Lib))
14077 {
14078 free (elib);
14079 free (strtab);
14080 break;
14081 }
14082 strtab_size = string_sec->sh_size;
14083
14084 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14085 printable_section_name (section),
14086 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14087
14088 puts (_(" Library Time Stamp Checksum Version Flags"));
14089
14090 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14091 ++cnt)
14092 {
14093 Elf32_Lib liblist;
14094 time_t atime;
14095 char timebuf[20];
14096 struct tm * tmp;
14097
14098 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14099 atime = BYTE_GET (elib[cnt].l_time_stamp);
14100 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14101 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14102 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14103
14104 tmp = gmtime (&atime);
14105 snprintf (timebuf, sizeof (timebuf),
14106 "%04u-%02u-%02uT%02u:%02u:%02u",
14107 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14108 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14109
14110 printf ("%3lu: ", (unsigned long) cnt);
14111 if (do_wide)
14112 printf ("%-20s", liblist.l_name < strtab_size
14113 ? strtab + liblist.l_name : _("<corrupt>"));
14114 else
14115 printf ("%-20.20s", liblist.l_name < strtab_size
14116 ? strtab + liblist.l_name : _("<corrupt>"));
14117 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14118 liblist.l_version, liblist.l_flags);
14119 }
14120
14121 free (elib);
14122 free (strtab);
14123 }
14124 }
14125
14126 return 1;
14127 }
14128
14129 static const char *
14130 get_note_type (unsigned e_type)
14131 {
14132 static char buff[64];
14133
14134 if (elf_header.e_type == ET_CORE)
14135 switch (e_type)
14136 {
14137 case NT_AUXV:
14138 return _("NT_AUXV (auxiliary vector)");
14139 case NT_PRSTATUS:
14140 return _("NT_PRSTATUS (prstatus structure)");
14141 case NT_FPREGSET:
14142 return _("NT_FPREGSET (floating point registers)");
14143 case NT_PRPSINFO:
14144 return _("NT_PRPSINFO (prpsinfo structure)");
14145 case NT_TASKSTRUCT:
14146 return _("NT_TASKSTRUCT (task structure)");
14147 case NT_PRXFPREG:
14148 return _("NT_PRXFPREG (user_xfpregs structure)");
14149 case NT_PPC_VMX:
14150 return _("NT_PPC_VMX (ppc Altivec registers)");
14151 case NT_PPC_VSX:
14152 return _("NT_PPC_VSX (ppc VSX registers)");
14153 case NT_386_TLS:
14154 return _("NT_386_TLS (x86 TLS information)");
14155 case NT_386_IOPERM:
14156 return _("NT_386_IOPERM (x86 I/O permissions)");
14157 case NT_X86_XSTATE:
14158 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14159 case NT_S390_HIGH_GPRS:
14160 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14161 case NT_S390_TIMER:
14162 return _("NT_S390_TIMER (s390 timer register)");
14163 case NT_S390_TODCMP:
14164 return _("NT_S390_TODCMP (s390 TOD comparator register)");
14165 case NT_S390_TODPREG:
14166 return _("NT_S390_TODPREG (s390 TOD programmable register)");
14167 case NT_S390_CTRS:
14168 return _("NT_S390_CTRS (s390 control registers)");
14169 case NT_S390_PREFIX:
14170 return _("NT_S390_PREFIX (s390 prefix register)");
14171 case NT_S390_LAST_BREAK:
14172 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14173 case NT_S390_SYSTEM_CALL:
14174 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14175 case NT_S390_TDB:
14176 return _("NT_S390_TDB (s390 transaction diagnostic block)");
14177 case NT_ARM_VFP:
14178 return _("NT_ARM_VFP (arm VFP registers)");
14179 case NT_ARM_TLS:
14180 return _("NT_ARM_TLS (AArch TLS registers)");
14181 case NT_ARM_HW_BREAK:
14182 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14183 case NT_ARM_HW_WATCH:
14184 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14185 case NT_PSTATUS:
14186 return _("NT_PSTATUS (pstatus structure)");
14187 case NT_FPREGS:
14188 return _("NT_FPREGS (floating point registers)");
14189 case NT_PSINFO:
14190 return _("NT_PSINFO (psinfo structure)");
14191 case NT_LWPSTATUS:
14192 return _("NT_LWPSTATUS (lwpstatus_t structure)");
14193 case NT_LWPSINFO:
14194 return _("NT_LWPSINFO (lwpsinfo_t structure)");
14195 case NT_WIN32PSTATUS:
14196 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14197 case NT_SIGINFO:
14198 return _("NT_SIGINFO (siginfo_t data)");
14199 case NT_FILE:
14200 return _("NT_FILE (mapped files)");
14201 default:
14202 break;
14203 }
14204 else
14205 switch (e_type)
14206 {
14207 case NT_VERSION:
14208 return _("NT_VERSION (version)");
14209 case NT_ARCH:
14210 return _("NT_ARCH (architecture)");
14211 default:
14212 break;
14213 }
14214
14215 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14216 return buff;
14217 }
14218
14219 static int
14220 print_core_note (Elf_Internal_Note *pnote)
14221 {
14222 unsigned int addr_size = is_32bit_elf ? 4 : 8;
14223 bfd_vma count, page_size;
14224 unsigned char *descdata, *filenames, *descend;
14225
14226 if (pnote->type != NT_FILE)
14227 return 1;
14228
14229 #ifndef BFD64
14230 if (!is_32bit_elf)
14231 {
14232 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
14233 /* Still "successful". */
14234 return 1;
14235 }
14236 #endif
14237
14238 if (pnote->descsz < 2 * addr_size)
14239 {
14240 printf (_(" Malformed note - too short for header\n"));
14241 return 0;
14242 }
14243
14244 descdata = (unsigned char *) pnote->descdata;
14245 descend = descdata + pnote->descsz;
14246
14247 if (descdata[pnote->descsz - 1] != '\0')
14248 {
14249 printf (_(" Malformed note - does not end with \\0\n"));
14250 return 0;
14251 }
14252
14253 count = byte_get (descdata, addr_size);
14254 descdata += addr_size;
14255
14256 page_size = byte_get (descdata, addr_size);
14257 descdata += addr_size;
14258
14259 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14260 {
14261 printf (_(" Malformed note - too short for supplied file count\n"));
14262 return 0;
14263 }
14264
14265 printf (_(" Page size: "));
14266 print_vma (page_size, DEC);
14267 printf ("\n");
14268
14269 printf (_(" %*s%*s%*s\n"),
14270 (int) (2 + 2 * addr_size), _("Start"),
14271 (int) (4 + 2 * addr_size), _("End"),
14272 (int) (4 + 2 * addr_size), _("Page Offset"));
14273 filenames = descdata + count * 3 * addr_size;
14274 while (--count > 0)
14275 {
14276 bfd_vma start, end, file_ofs;
14277
14278 if (filenames == descend)
14279 {
14280 printf (_(" Malformed note - filenames end too early\n"));
14281 return 0;
14282 }
14283
14284 start = byte_get (descdata, addr_size);
14285 descdata += addr_size;
14286 end = byte_get (descdata, addr_size);
14287 descdata += addr_size;
14288 file_ofs = byte_get (descdata, addr_size);
14289 descdata += addr_size;
14290
14291 printf (" ");
14292 print_vma (start, FULL_HEX);
14293 printf (" ");
14294 print_vma (end, FULL_HEX);
14295 printf (" ");
14296 print_vma (file_ofs, FULL_HEX);
14297 printf ("\n %s\n", filenames);
14298
14299 filenames += 1 + strlen ((char *) filenames);
14300 }
14301
14302 return 1;
14303 }
14304
14305 static const char *
14306 get_gnu_elf_note_type (unsigned e_type)
14307 {
14308 static char buff[64];
14309
14310 switch (e_type)
14311 {
14312 case NT_GNU_ABI_TAG:
14313 return _("NT_GNU_ABI_TAG (ABI version tag)");
14314 case NT_GNU_HWCAP:
14315 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14316 case NT_GNU_BUILD_ID:
14317 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14318 case NT_GNU_GOLD_VERSION:
14319 return _("NT_GNU_GOLD_VERSION (gold version)");
14320 default:
14321 break;
14322 }
14323
14324 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14325 return buff;
14326 }
14327
14328 static int
14329 print_gnu_note (Elf_Internal_Note *pnote)
14330 {
14331 switch (pnote->type)
14332 {
14333 case NT_GNU_BUILD_ID:
14334 {
14335 unsigned long i;
14336
14337 printf (_(" Build ID: "));
14338 for (i = 0; i < pnote->descsz; ++i)
14339 printf ("%02x", pnote->descdata[i] & 0xff);
14340 printf ("\n");
14341 }
14342 break;
14343
14344 case NT_GNU_ABI_TAG:
14345 {
14346 unsigned long os, major, minor, subminor;
14347 const char *osname;
14348
14349 /* PR 17531: file: 030-599401-0.004. */
14350 if (pnote->descsz < 16)
14351 {
14352 printf (_(" <corrupt GNU_ABI_TAG>\n"));
14353 break;
14354 }
14355
14356 os = byte_get ((unsigned char *) pnote->descdata, 4);
14357 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14358 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14359 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14360
14361 switch (os)
14362 {
14363 case GNU_ABI_TAG_LINUX:
14364 osname = "Linux";
14365 break;
14366 case GNU_ABI_TAG_HURD:
14367 osname = "Hurd";
14368 break;
14369 case GNU_ABI_TAG_SOLARIS:
14370 osname = "Solaris";
14371 break;
14372 case GNU_ABI_TAG_FREEBSD:
14373 osname = "FreeBSD";
14374 break;
14375 case GNU_ABI_TAG_NETBSD:
14376 osname = "NetBSD";
14377 break;
14378 default:
14379 osname = "Unknown";
14380 break;
14381 }
14382
14383 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14384 major, minor, subminor);
14385 }
14386 break;
14387
14388 case NT_GNU_GOLD_VERSION:
14389 {
14390 unsigned long i;
14391
14392 printf (_(" Version: "));
14393 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14394 printf ("%c", pnote->descdata[i]);
14395 printf ("\n");
14396 }
14397 break;
14398 }
14399
14400 return 1;
14401 }
14402
14403 static const char *
14404 get_netbsd_elfcore_note_type (unsigned e_type)
14405 {
14406 static char buff[64];
14407
14408 if (e_type == NT_NETBSDCORE_PROCINFO)
14409 {
14410 /* NetBSD core "procinfo" structure. */
14411 return _("NetBSD procinfo structure");
14412 }
14413
14414 /* As of Jan 2002 there are no other machine-independent notes
14415 defined for NetBSD core files. If the note type is less
14416 than the start of the machine-dependent note types, we don't
14417 understand it. */
14418
14419 if (e_type < NT_NETBSDCORE_FIRSTMACH)
14420 {
14421 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14422 return buff;
14423 }
14424
14425 switch (elf_header.e_machine)
14426 {
14427 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14428 and PT_GETFPREGS == mach+2. */
14429
14430 case EM_OLD_ALPHA:
14431 case EM_ALPHA:
14432 case EM_SPARC:
14433 case EM_SPARC32PLUS:
14434 case EM_SPARCV9:
14435 switch (e_type)
14436 {
14437 case NT_NETBSDCORE_FIRSTMACH + 0:
14438 return _("PT_GETREGS (reg structure)");
14439 case NT_NETBSDCORE_FIRSTMACH + 2:
14440 return _("PT_GETFPREGS (fpreg structure)");
14441 default:
14442 break;
14443 }
14444 break;
14445
14446 /* On all other arch's, PT_GETREGS == mach+1 and
14447 PT_GETFPREGS == mach+3. */
14448 default:
14449 switch (e_type)
14450 {
14451 case NT_NETBSDCORE_FIRSTMACH + 1:
14452 return _("PT_GETREGS (reg structure)");
14453 case NT_NETBSDCORE_FIRSTMACH + 3:
14454 return _("PT_GETFPREGS (fpreg structure)");
14455 default:
14456 break;
14457 }
14458 }
14459
14460 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14461 e_type - NT_NETBSDCORE_FIRSTMACH);
14462 return buff;
14463 }
14464
14465 static const char *
14466 get_stapsdt_note_type (unsigned e_type)
14467 {
14468 static char buff[64];
14469
14470 switch (e_type)
14471 {
14472 case NT_STAPSDT:
14473 return _("NT_STAPSDT (SystemTap probe descriptors)");
14474
14475 default:
14476 break;
14477 }
14478
14479 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14480 return buff;
14481 }
14482
14483 static int
14484 print_stapsdt_note (Elf_Internal_Note *pnote)
14485 {
14486 int addr_size = is_32bit_elf ? 4 : 8;
14487 char *data = pnote->descdata;
14488 char *data_end = pnote->descdata + pnote->descsz;
14489 bfd_vma pc, base_addr, semaphore;
14490 char *provider, *probe, *arg_fmt;
14491
14492 pc = byte_get ((unsigned char *) data, addr_size);
14493 data += addr_size;
14494 base_addr = byte_get ((unsigned char *) data, addr_size);
14495 data += addr_size;
14496 semaphore = byte_get ((unsigned char *) data, addr_size);
14497 data += addr_size;
14498
14499 provider = data;
14500 data += strlen (data) + 1;
14501 probe = data;
14502 data += strlen (data) + 1;
14503 arg_fmt = data;
14504 data += strlen (data) + 1;
14505
14506 printf (_(" Provider: %s\n"), provider);
14507 printf (_(" Name: %s\n"), probe);
14508 printf (_(" Location: "));
14509 print_vma (pc, FULL_HEX);
14510 printf (_(", Base: "));
14511 print_vma (base_addr, FULL_HEX);
14512 printf (_(", Semaphore: "));
14513 print_vma (semaphore, FULL_HEX);
14514 printf ("\n");
14515 printf (_(" Arguments: %s\n"), arg_fmt);
14516
14517 return data == data_end;
14518 }
14519
14520 static const char *
14521 get_ia64_vms_note_type (unsigned e_type)
14522 {
14523 static char buff[64];
14524
14525 switch (e_type)
14526 {
14527 case NT_VMS_MHD:
14528 return _("NT_VMS_MHD (module header)");
14529 case NT_VMS_LNM:
14530 return _("NT_VMS_LNM (language name)");
14531 case NT_VMS_SRC:
14532 return _("NT_VMS_SRC (source files)");
14533 case NT_VMS_TITLE:
14534 return "NT_VMS_TITLE";
14535 case NT_VMS_EIDC:
14536 return _("NT_VMS_EIDC (consistency check)");
14537 case NT_VMS_FPMODE:
14538 return _("NT_VMS_FPMODE (FP mode)");
14539 case NT_VMS_LINKTIME:
14540 return "NT_VMS_LINKTIME";
14541 case NT_VMS_IMGNAM:
14542 return _("NT_VMS_IMGNAM (image name)");
14543 case NT_VMS_IMGID:
14544 return _("NT_VMS_IMGID (image id)");
14545 case NT_VMS_LINKID:
14546 return _("NT_VMS_LINKID (link id)");
14547 case NT_VMS_IMGBID:
14548 return _("NT_VMS_IMGBID (build id)");
14549 case NT_VMS_GSTNAM:
14550 return _("NT_VMS_GSTNAM (sym table name)");
14551 case NT_VMS_ORIG_DYN:
14552 return "NT_VMS_ORIG_DYN";
14553 case NT_VMS_PATCHTIME:
14554 return "NT_VMS_PATCHTIME";
14555 default:
14556 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14557 return buff;
14558 }
14559 }
14560
14561 static int
14562 print_ia64_vms_note (Elf_Internal_Note * pnote)
14563 {
14564 switch (pnote->type)
14565 {
14566 case NT_VMS_MHD:
14567 if (pnote->descsz > 36)
14568 {
14569 size_t l = strlen (pnote->descdata + 34);
14570 printf (_(" Creation date : %.17s\n"), pnote->descdata);
14571 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
14572 printf (_(" Module name : %s\n"), pnote->descdata + 34);
14573 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
14574 }
14575 else
14576 printf (_(" Invalid size\n"));
14577 break;
14578 case NT_VMS_LNM:
14579 printf (_(" Language: %s\n"), pnote->descdata);
14580 break;
14581 #ifdef BFD64
14582 case NT_VMS_FPMODE:
14583 printf (_(" Floating Point mode: "));
14584 printf ("0x%016" BFD_VMA_FMT "x\n",
14585 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14586 break;
14587 case NT_VMS_LINKTIME:
14588 printf (_(" Link time: "));
14589 print_vms_time
14590 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14591 printf ("\n");
14592 break;
14593 case NT_VMS_PATCHTIME:
14594 printf (_(" Patch time: "));
14595 print_vms_time
14596 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14597 printf ("\n");
14598 break;
14599 case NT_VMS_ORIG_DYN:
14600 printf (_(" Major id: %u, minor id: %u\n"),
14601 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14602 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14603 printf (_(" Last modified : "));
14604 print_vms_time
14605 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14606 printf (_("\n Link flags : "));
14607 printf ("0x%016" BFD_VMA_FMT "x\n",
14608 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14609 printf (_(" Header flags: 0x%08x\n"),
14610 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14611 printf (_(" Image id : %s\n"), pnote->descdata + 32);
14612 break;
14613 #endif
14614 case NT_VMS_IMGNAM:
14615 printf (_(" Image name: %s\n"), pnote->descdata);
14616 break;
14617 case NT_VMS_GSTNAM:
14618 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
14619 break;
14620 case NT_VMS_IMGID:
14621 printf (_(" Image id: %s\n"), pnote->descdata);
14622 break;
14623 case NT_VMS_LINKID:
14624 printf (_(" Linker id: %s\n"), pnote->descdata);
14625 break;
14626 default:
14627 break;
14628 }
14629 return 1;
14630 }
14631
14632 /* Note that by the ELF standard, the name field is already null byte
14633 terminated, and namesz includes the terminating null byte.
14634 I.E. the value of namesz for the name "FSF" is 4.
14635
14636 If the value of namesz is zero, there is no name present. */
14637 static int
14638 process_note (Elf_Internal_Note * pnote)
14639 {
14640 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14641 const char * nt;
14642
14643 if (pnote->namesz == 0)
14644 /* If there is no note name, then use the default set of
14645 note type strings. */
14646 nt = get_note_type (pnote->type);
14647
14648 else if (const_strneq (pnote->namedata, "GNU"))
14649 /* GNU-specific object file notes. */
14650 nt = get_gnu_elf_note_type (pnote->type);
14651
14652 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14653 /* NetBSD-specific core file notes. */
14654 nt = get_netbsd_elfcore_note_type (pnote->type);
14655
14656 else if (strneq (pnote->namedata, "SPU/", 4))
14657 {
14658 /* SPU-specific core file notes. */
14659 nt = pnote->namedata + 4;
14660 name = "SPU";
14661 }
14662
14663 else if (const_strneq (pnote->namedata, "IPF/VMS"))
14664 /* VMS/ia64-specific file notes. */
14665 nt = get_ia64_vms_note_type (pnote->type);
14666
14667 else if (const_strneq (pnote->namedata, "stapsdt"))
14668 nt = get_stapsdt_note_type (pnote->type);
14669
14670 else
14671 /* Don't recognize this note name; just use the default set of
14672 note type strings. */
14673 nt = get_note_type (pnote->type);
14674
14675 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14676
14677 if (const_strneq (pnote->namedata, "IPF/VMS"))
14678 return print_ia64_vms_note (pnote);
14679 else if (const_strneq (pnote->namedata, "GNU"))
14680 return print_gnu_note (pnote);
14681 else if (const_strneq (pnote->namedata, "stapsdt"))
14682 return print_stapsdt_note (pnote);
14683 else if (const_strneq (pnote->namedata, "CORE"))
14684 return print_core_note (pnote);
14685 else
14686 return 1;
14687 }
14688
14689
14690 static int
14691 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14692 {
14693 Elf_External_Note * pnotes;
14694 Elf_External_Note * external;
14695 int res = 1;
14696
14697 if (length <= 0)
14698 return 0;
14699
14700 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14701 _("notes"));
14702 if (pnotes == NULL)
14703 return 0;
14704
14705 external = pnotes;
14706
14707 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14708 (unsigned long) offset, (unsigned long) length);
14709 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14710
14711 while ((char *) external < (char *) pnotes + length)
14712 {
14713 Elf_Internal_Note inote;
14714 size_t min_notesz;
14715 char *next;
14716 char * temp = NULL;
14717 size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14718
14719 if (!is_ia64_vms ())
14720 {
14721 /* PR binutils/15191
14722 Make sure that there is enough data to read. */
14723 min_notesz = offsetof (Elf_External_Note, name);
14724 if (data_remaining < min_notesz)
14725 {
14726 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14727 (int) data_remaining);
14728 break;
14729 }
14730 inote.type = BYTE_GET (external->type);
14731 inote.namesz = BYTE_GET (external->namesz);
14732 inote.namedata = external->name;
14733 inote.descsz = BYTE_GET (external->descsz);
14734 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14735 inote.descpos = offset + (inote.descdata - (char *) pnotes);
14736 next = inote.descdata + align_power (inote.descsz, 2);
14737 }
14738 else
14739 {
14740 Elf64_External_VMS_Note *vms_external;
14741
14742 /* PR binutils/15191
14743 Make sure that there is enough data to read. */
14744 min_notesz = offsetof (Elf64_External_VMS_Note, name);
14745 if (data_remaining < min_notesz)
14746 {
14747 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14748 (int) data_remaining);
14749 break;
14750 }
14751
14752 vms_external = (Elf64_External_VMS_Note *) external;
14753 inote.type = BYTE_GET (vms_external->type);
14754 inote.namesz = BYTE_GET (vms_external->namesz);
14755 inote.namedata = vms_external->name;
14756 inote.descsz = BYTE_GET (vms_external->descsz);
14757 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14758 inote.descpos = offset + (inote.descdata - (char *) pnotes);
14759 next = inote.descdata + align_power (inote.descsz, 3);
14760 }
14761
14762 if (inote.descdata < (char *) external + min_notesz
14763 || next < (char *) external + min_notesz
14764 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
14765 || inote.namedata + inote.namesz < inote.namedata
14766 || inote.descdata + inote.descsz < inote.descdata
14767 || data_remaining < (size_t)(next - (char *) external))
14768 {
14769 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14770 (unsigned long) ((char *) external - (char *) pnotes));
14771 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14772 inote.type, inote.namesz, inote.descsz);
14773 break;
14774 }
14775
14776 external = (Elf_External_Note *) next;
14777
14778 /* Verify that name is null terminated. It appears that at least
14779 one version of Linux (RedHat 6.0) generates corefiles that don't
14780 comply with the ELF spec by failing to include the null byte in
14781 namesz. */
14782 if (inote.namedata[inote.namesz - 1] != '\0')
14783 {
14784 temp = (char *) malloc (inote.namesz + 1);
14785 if (temp == NULL)
14786 {
14787 error (_("Out of memory allocating space for inote name\n"));
14788 res = 0;
14789 break;
14790 }
14791
14792 strncpy (temp, inote.namedata, inote.namesz);
14793 temp[inote.namesz] = 0;
14794
14795 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
14796 inote.namedata = temp;
14797 }
14798
14799 res &= process_note (& inote);
14800
14801 if (temp != NULL)
14802 {
14803 free (temp);
14804 temp = NULL;
14805 }
14806 }
14807
14808 free (pnotes);
14809
14810 return res;
14811 }
14812
14813 static int
14814 process_corefile_note_segments (FILE * file)
14815 {
14816 Elf_Internal_Phdr * segment;
14817 unsigned int i;
14818 int res = 1;
14819
14820 if (! get_program_headers (file))
14821 return 0;
14822
14823 for (i = 0, segment = program_headers;
14824 i < elf_header.e_phnum;
14825 i++, segment++)
14826 {
14827 if (segment->p_type == PT_NOTE)
14828 res &= process_corefile_note_segment (file,
14829 (bfd_vma) segment->p_offset,
14830 (bfd_vma) segment->p_filesz);
14831 }
14832
14833 return res;
14834 }
14835
14836 static int
14837 process_note_sections (FILE * file)
14838 {
14839 Elf_Internal_Shdr * section;
14840 unsigned long i;
14841 int n = 0;
14842 int res = 1;
14843
14844 for (i = 0, section = section_headers;
14845 i < elf_header.e_shnum && section != NULL;
14846 i++, section++)
14847 if (section->sh_type == SHT_NOTE)
14848 {
14849 res &= process_corefile_note_segment (file,
14850 (bfd_vma) section->sh_offset,
14851 (bfd_vma) section->sh_size);
14852 n++;
14853 }
14854
14855 if (n == 0)
14856 /* Try processing NOTE segments instead. */
14857 return process_corefile_note_segments (file);
14858
14859 return res;
14860 }
14861
14862 static int
14863 process_notes (FILE * file)
14864 {
14865 /* If we have not been asked to display the notes then do nothing. */
14866 if (! do_notes)
14867 return 1;
14868
14869 if (elf_header.e_type != ET_CORE)
14870 return process_note_sections (file);
14871
14872 /* No program headers means no NOTE segment. */
14873 if (elf_header.e_phnum > 0)
14874 return process_corefile_note_segments (file);
14875
14876 printf (_("No note segments present in the core file.\n"));
14877 return 1;
14878 }
14879
14880 static int
14881 process_arch_specific (FILE * file)
14882 {
14883 if (! do_arch)
14884 return 1;
14885
14886 switch (elf_header.e_machine)
14887 {
14888 case EM_ARM:
14889 return process_arm_specific (file);
14890 case EM_MIPS:
14891 case EM_MIPS_RS3_LE:
14892 return process_mips_specific (file);
14893 break;
14894 case EM_NDS32:
14895 return process_nds32_specific (file);
14896 break;
14897 case EM_PPC:
14898 return process_power_specific (file);
14899 break;
14900 case EM_SPARC:
14901 case EM_SPARC32PLUS:
14902 case EM_SPARCV9:
14903 return process_sparc_specific (file);
14904 break;
14905 case EM_TI_C6000:
14906 return process_tic6x_specific (file);
14907 break;
14908 case EM_MSP430:
14909 return process_msp430x_specific (file);
14910 default:
14911 break;
14912 }
14913 return 1;
14914 }
14915
14916 static int
14917 get_file_header (FILE * file)
14918 {
14919 /* Read in the identity array. */
14920 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14921 return 0;
14922
14923 /* Determine how to read the rest of the header. */
14924 switch (elf_header.e_ident[EI_DATA])
14925 {
14926 default: /* fall through */
14927 case ELFDATANONE: /* fall through */
14928 case ELFDATA2LSB:
14929 byte_get = byte_get_little_endian;
14930 byte_put = byte_put_little_endian;
14931 break;
14932 case ELFDATA2MSB:
14933 byte_get = byte_get_big_endian;
14934 byte_put = byte_put_big_endian;
14935 break;
14936 }
14937
14938 /* For now we only support 32 bit and 64 bit ELF files. */
14939 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14940
14941 /* Read in the rest of the header. */
14942 if (is_32bit_elf)
14943 {
14944 Elf32_External_Ehdr ehdr32;
14945
14946 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14947 return 0;
14948
14949 elf_header.e_type = BYTE_GET (ehdr32.e_type);
14950 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
14951 elf_header.e_version = BYTE_GET (ehdr32.e_version);
14952 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
14953 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
14954 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
14955 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
14956 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
14957 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14958 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
14959 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14960 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
14961 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
14962 }
14963 else
14964 {
14965 Elf64_External_Ehdr ehdr64;
14966
14967 /* If we have been compiled with sizeof (bfd_vma) == 4, then
14968 we will not be able to cope with the 64bit data found in
14969 64 ELF files. Detect this now and abort before we start
14970 overwriting things. */
14971 if (sizeof (bfd_vma) < 8)
14972 {
14973 error (_("This instance of readelf has been built without support for a\n\
14974 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14975 return 0;
14976 }
14977
14978 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14979 return 0;
14980
14981 elf_header.e_type = BYTE_GET (ehdr64.e_type);
14982 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
14983 elf_header.e_version = BYTE_GET (ehdr64.e_version);
14984 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
14985 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
14986 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
14987 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
14988 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
14989 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14990 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
14991 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14992 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
14993 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
14994 }
14995
14996 if (elf_header.e_shoff)
14997 {
14998 /* There may be some extensions in the first section header. Don't
14999 bomb if we can't read it. */
15000 if (is_32bit_elf)
15001 get_32bit_section_headers (file, TRUE);
15002 else
15003 get_64bit_section_headers (file, TRUE);
15004 }
15005
15006 return 1;
15007 }
15008
15009 /* Process one ELF object file according to the command line options.
15010 This file may actually be stored in an archive. The file is
15011 positioned at the start of the ELF object. */
15012
15013 static int
15014 process_object (char * file_name, FILE * file)
15015 {
15016 unsigned int i;
15017
15018 if (! get_file_header (file))
15019 {
15020 error (_("%s: Failed to read file header\n"), file_name);
15021 return 1;
15022 }
15023
15024 /* Initialise per file variables. */
15025 for (i = ARRAY_SIZE (version_info); i--;)
15026 version_info[i] = 0;
15027
15028 for (i = ARRAY_SIZE (dynamic_info); i--;)
15029 dynamic_info[i] = 0;
15030 dynamic_info_DT_GNU_HASH = 0;
15031
15032 /* Process the file. */
15033 if (show_name)
15034 printf (_("\nFile: %s\n"), file_name);
15035
15036 /* Initialise the dump_sects array from the cmdline_dump_sects array.
15037 Note we do this even if cmdline_dump_sects is empty because we
15038 must make sure that the dump_sets array is zeroed out before each
15039 object file is processed. */
15040 if (num_dump_sects > num_cmdline_dump_sects)
15041 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15042
15043 if (num_cmdline_dump_sects > 0)
15044 {
15045 if (num_dump_sects == 0)
15046 /* A sneaky way of allocating the dump_sects array. */
15047 request_dump_bynumber (num_cmdline_dump_sects, 0);
15048
15049 assert (num_dump_sects >= num_cmdline_dump_sects);
15050 memcpy (dump_sects, cmdline_dump_sects,
15051 num_cmdline_dump_sects * sizeof (* dump_sects));
15052 }
15053
15054 if (! process_file_header ())
15055 return 1;
15056
15057 if (! process_section_headers (file))
15058 {
15059 /* Without loaded section headers we cannot process lots of
15060 things. */
15061 do_unwind = do_version = do_dump = do_arch = 0;
15062
15063 if (! do_using_dynamic)
15064 do_syms = do_dyn_syms = do_reloc = 0;
15065 }
15066
15067 if (! process_section_groups (file))
15068 {
15069 /* Without loaded section groups we cannot process unwind. */
15070 do_unwind = 0;
15071 }
15072
15073 if (process_program_headers (file))
15074 process_dynamic_section (file);
15075
15076 process_relocs (file);
15077
15078 process_unwind (file);
15079
15080 process_symbol_table (file);
15081
15082 process_syminfo (file);
15083
15084 process_version_sections (file);
15085
15086 process_section_contents (file);
15087
15088 process_notes (file);
15089
15090 process_gnu_liblist (file);
15091
15092 process_arch_specific (file);
15093
15094 if (program_headers)
15095 {
15096 free (program_headers);
15097 program_headers = NULL;
15098 }
15099
15100 if (section_headers)
15101 {
15102 free (section_headers);
15103 section_headers = NULL;
15104 }
15105
15106 if (string_table)
15107 {
15108 free (string_table);
15109 string_table = NULL;
15110 string_table_length = 0;
15111 }
15112
15113 if (dynamic_strings)
15114 {
15115 free (dynamic_strings);
15116 dynamic_strings = NULL;
15117 dynamic_strings_length = 0;
15118 }
15119
15120 if (dynamic_symbols)
15121 {
15122 free (dynamic_symbols);
15123 dynamic_symbols = NULL;
15124 num_dynamic_syms = 0;
15125 }
15126
15127 if (dynamic_syminfo)
15128 {
15129 free (dynamic_syminfo);
15130 dynamic_syminfo = NULL;
15131 }
15132
15133 if (dynamic_section)
15134 {
15135 free (dynamic_section);
15136 dynamic_section = NULL;
15137 }
15138
15139 if (section_headers_groups)
15140 {
15141 free (section_headers_groups);
15142 section_headers_groups = NULL;
15143 }
15144
15145 if (section_groups)
15146 {
15147 struct group_list * g;
15148 struct group_list * next;
15149
15150 for (i = 0; i < group_count; i++)
15151 {
15152 for (g = section_groups [i].root; g != NULL; g = next)
15153 {
15154 next = g->next;
15155 free (g);
15156 }
15157 }
15158
15159 free (section_groups);
15160 section_groups = NULL;
15161 }
15162
15163 free_debug_memory ();
15164
15165 return 0;
15166 }
15167
15168 /* Process an ELF archive.
15169 On entry the file is positioned just after the ARMAG string. */
15170
15171 static int
15172 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15173 {
15174 struct archive_info arch;
15175 struct archive_info nested_arch;
15176 size_t got;
15177 int ret;
15178
15179 show_name = 1;
15180
15181 /* The ARCH structure is used to hold information about this archive. */
15182 arch.file_name = NULL;
15183 arch.file = NULL;
15184 arch.index_array = NULL;
15185 arch.sym_table = NULL;
15186 arch.longnames = NULL;
15187
15188 /* The NESTED_ARCH structure is used as a single-item cache of information
15189 about a nested archive (when members of a thin archive reside within
15190 another regular archive file). */
15191 nested_arch.file_name = NULL;
15192 nested_arch.file = NULL;
15193 nested_arch.index_array = NULL;
15194 nested_arch.sym_table = NULL;
15195 nested_arch.longnames = NULL;
15196
15197 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15198 {
15199 ret = 1;
15200 goto out;
15201 }
15202
15203 if (do_archive_index)
15204 {
15205 if (arch.sym_table == NULL)
15206 error (_("%s: unable to dump the index as none was found\n"), file_name);
15207 else
15208 {
15209 unsigned int i, l;
15210 unsigned long current_pos;
15211
15212 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
15213 file_name, (long) arch.index_num, arch.sym_size);
15214 current_pos = ftell (file);
15215
15216 for (i = l = 0; i < arch.index_num; i++)
15217 {
15218 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15219 {
15220 char * member_name;
15221
15222 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15223
15224 if (member_name != NULL)
15225 {
15226 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15227
15228 if (qualified_name != NULL)
15229 {
15230 printf (_("Contents of binary %s at offset "), qualified_name);
15231 (void) print_vma (arch.index_array[i], PREFIX_HEX);
15232 putchar ('\n');
15233 free (qualified_name);
15234 }
15235 }
15236 }
15237
15238 if (l >= arch.sym_size)
15239 {
15240 error (_("%s: end of the symbol table reached before the end of the index\n"),
15241 file_name);
15242 break;
15243 }
15244 printf ("\t%s\n", arch.sym_table + l);
15245 l += strlen (arch.sym_table + l) + 1;
15246 }
15247
15248 if (arch.uses_64bit_indicies)
15249 l = (l + 7) & ~ 7;
15250 else
15251 l += l & 1;
15252
15253 if (l < arch.sym_size)
15254 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15255 file_name, arch.sym_size - l);
15256
15257 if (fseek (file, current_pos, SEEK_SET) != 0)
15258 {
15259 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15260 ret = 1;
15261 goto out;
15262 }
15263 }
15264
15265 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15266 && !do_segments && !do_header && !do_dump && !do_version
15267 && !do_histogram && !do_debugging && !do_arch && !do_notes
15268 && !do_section_groups && !do_dyn_syms)
15269 {
15270 ret = 0; /* Archive index only. */
15271 goto out;
15272 }
15273 }
15274
15275 ret = 0;
15276
15277 while (1)
15278 {
15279 char * name;
15280 size_t namelen;
15281 char * qualified_name;
15282
15283 /* Read the next archive header. */
15284 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15285 {
15286 error (_("%s: failed to seek to next archive header\n"), file_name);
15287 return 1;
15288 }
15289 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15290 if (got != sizeof arch.arhdr)
15291 {
15292 if (got == 0)
15293 break;
15294 error (_("%s: failed to read archive header\n"), file_name);
15295 ret = 1;
15296 break;
15297 }
15298 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15299 {
15300 error (_("%s: did not find a valid archive header\n"), arch.file_name);
15301 ret = 1;
15302 break;
15303 }
15304
15305 arch.next_arhdr_offset += sizeof arch.arhdr;
15306
15307 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15308 if (archive_file_size & 01)
15309 ++archive_file_size;
15310
15311 name = get_archive_member_name (&arch, &nested_arch);
15312 if (name == NULL)
15313 {
15314 error (_("%s: bad archive file name\n"), file_name);
15315 ret = 1;
15316 break;
15317 }
15318 namelen = strlen (name);
15319
15320 qualified_name = make_qualified_name (&arch, &nested_arch, name);
15321 if (qualified_name == NULL)
15322 {
15323 error (_("%s: bad archive file name\n"), file_name);
15324 ret = 1;
15325 break;
15326 }
15327
15328 if (is_thin_archive && arch.nested_member_origin == 0)
15329 {
15330 /* This is a proxy for an external member of a thin archive. */
15331 FILE * member_file;
15332 char * member_file_name = adjust_relative_path (file_name, name, namelen);
15333 if (member_file_name == NULL)
15334 {
15335 ret = 1;
15336 break;
15337 }
15338
15339 member_file = fopen (member_file_name, "rb");
15340 if (member_file == NULL)
15341 {
15342 error (_("Input file '%s' is not readable.\n"), member_file_name);
15343 free (member_file_name);
15344 ret = 1;
15345 break;
15346 }
15347
15348 archive_file_offset = arch.nested_member_origin;
15349
15350 ret |= process_object (qualified_name, member_file);
15351
15352 fclose (member_file);
15353 free (member_file_name);
15354 }
15355 else if (is_thin_archive)
15356 {
15357 /* PR 15140: Allow for corrupt thin archives. */
15358 if (nested_arch.file == NULL)
15359 {
15360 error (_("%s: contains corrupt thin archive: %s\n"),
15361 file_name, name);
15362 ret = 1;
15363 break;
15364 }
15365
15366 /* This is a proxy for a member of a nested archive. */
15367 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15368
15369 /* The nested archive file will have been opened and setup by
15370 get_archive_member_name. */
15371 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15372 {
15373 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15374 ret = 1;
15375 break;
15376 }
15377
15378 ret |= process_object (qualified_name, nested_arch.file);
15379 }
15380 else
15381 {
15382 archive_file_offset = arch.next_arhdr_offset;
15383 arch.next_arhdr_offset += archive_file_size;
15384
15385 ret |= process_object (qualified_name, file);
15386 }
15387
15388 if (dump_sects != NULL)
15389 {
15390 free (dump_sects);
15391 dump_sects = NULL;
15392 num_dump_sects = 0;
15393 }
15394
15395 free (qualified_name);
15396 }
15397
15398 out:
15399 if (nested_arch.file != NULL)
15400 fclose (nested_arch.file);
15401 release_archive (&nested_arch);
15402 release_archive (&arch);
15403
15404 return ret;
15405 }
15406
15407 static int
15408 process_file (char * file_name)
15409 {
15410 FILE * file;
15411 struct stat statbuf;
15412 char armag[SARMAG];
15413 int ret;
15414
15415 if (stat (file_name, &statbuf) < 0)
15416 {
15417 if (errno == ENOENT)
15418 error (_("'%s': No such file\n"), file_name);
15419 else
15420 error (_("Could not locate '%s'. System error message: %s\n"),
15421 file_name, strerror (errno));
15422 return 1;
15423 }
15424
15425 if (! S_ISREG (statbuf.st_mode))
15426 {
15427 error (_("'%s' is not an ordinary file\n"), file_name);
15428 return 1;
15429 }
15430
15431 file = fopen (file_name, "rb");
15432 if (file == NULL)
15433 {
15434 error (_("Input file '%s' is not readable.\n"), file_name);
15435 return 1;
15436 }
15437
15438 if (fread (armag, SARMAG, 1, file) != 1)
15439 {
15440 error (_("%s: Failed to read file's magic number\n"), file_name);
15441 fclose (file);
15442 return 1;
15443 }
15444
15445 current_file_size = (bfd_size_type) statbuf.st_size;
15446
15447 if (memcmp (armag, ARMAG, SARMAG) == 0)
15448 ret = process_archive (file_name, file, FALSE);
15449 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15450 ret = process_archive (file_name, file, TRUE);
15451 else
15452 {
15453 if (do_archive_index)
15454 error (_("File %s is not an archive so its index cannot be displayed.\n"),
15455 file_name);
15456
15457 rewind (file);
15458 archive_file_size = archive_file_offset = 0;
15459 ret = process_object (file_name, file);
15460 }
15461
15462 fclose (file);
15463
15464 current_file_size = 0;
15465 return ret;
15466 }
15467
15468 #ifdef SUPPORT_DISASSEMBLY
15469 /* Needed by the i386 disassembler. For extra credit, someone could
15470 fix this so that we insert symbolic addresses here, esp for GOT/PLT
15471 symbols. */
15472
15473 void
15474 print_address (unsigned int addr, FILE * outfile)
15475 {
15476 fprintf (outfile,"0x%8.8x", addr);
15477 }
15478
15479 /* Needed by the i386 disassembler. */
15480 void
15481 db_task_printsym (unsigned int addr)
15482 {
15483 print_address (addr, stderr);
15484 }
15485 #endif
15486
15487 int
15488 main (int argc, char ** argv)
15489 {
15490 int err;
15491
15492 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15493 setlocale (LC_MESSAGES, "");
15494 #endif
15495 #if defined (HAVE_SETLOCALE)
15496 setlocale (LC_CTYPE, "");
15497 #endif
15498 bindtextdomain (PACKAGE, LOCALEDIR);
15499 textdomain (PACKAGE);
15500
15501 expandargv (&argc, &argv);
15502
15503 parse_args (argc, argv);
15504
15505 if (num_dump_sects > 0)
15506 {
15507 /* Make a copy of the dump_sects array. */
15508 cmdline_dump_sects = (dump_type *)
15509 malloc (num_dump_sects * sizeof (* dump_sects));
15510 if (cmdline_dump_sects == NULL)
15511 error (_("Out of memory allocating dump request table.\n"));
15512 else
15513 {
15514 memcpy (cmdline_dump_sects, dump_sects,
15515 num_dump_sects * sizeof (* dump_sects));
15516 num_cmdline_dump_sects = num_dump_sects;
15517 }
15518 }
15519
15520 if (optind < (argc - 1))
15521 show_name = 1;
15522
15523 err = 0;
15524 while (optind < argc)
15525 err |= process_file (argv[optind++]);
15526
15527 if (dump_sects != NULL)
15528 free (dump_sects);
15529 if (cmdline_dump_sects != NULL)
15530 free (cmdline_dump_sects);
15531
15532 return err;
15533 }
This page took 0.441501 seconds and 4 git commands to generate.