Speed up the display of unwind tables by using a binary chop search to locate functio...
[binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2015 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/ft32.h"
110 #include "elf/h8.h"
111 #include "elf/hppa.h"
112 #include "elf/i386.h"
113 #include "elf/i370.h"
114 #include "elf/i860.h"
115 #include "elf/i960.h"
116 #include "elf/ia64.h"
117 #include "elf/ip2k.h"
118 #include "elf/lm32.h"
119 #include "elf/iq2000.h"
120 #include "elf/m32c.h"
121 #include "elf/m32r.h"
122 #include "elf/m68k.h"
123 #include "elf/m68hc11.h"
124 #include "elf/mcore.h"
125 #include "elf/mep.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
133 #include "elf/mt.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
136 #include "elf/nios2.h"
137 #include "elf/or1k.h"
138 #include "elf/pj.h"
139 #include "elf/ppc.h"
140 #include "elf/ppc64.h"
141 #include "elf/rl78.h"
142 #include "elf/rx.h"
143 #include "elf/s390.h"
144 #include "elf/score.h"
145 #include "elf/sh.h"
146 #include "elf/sparc.h"
147 #include "elf/spu.h"
148 #include "elf/tic6x.h"
149 #include "elf/tilegx.h"
150 #include "elf/tilepro.h"
151 #include "elf/v850.h"
152 #include "elf/vax.h"
153 #include "elf/visium.h"
154 #include "elf/x86-64.h"
155 #include "elf/xc16x.h"
156 #include "elf/xgate.h"
157 #include "elf/xstormy16.h"
158 #include "elf/xtensa.h"
159
160 #include "getopt.h"
161 #include "libiberty.h"
162 #include "safe-ctype.h"
163 #include "filenames.h"
164
165 #ifndef offsetof
166 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 #endif
168
169 char * program_name = "readelf";
170 static unsigned long archive_file_offset;
171 static unsigned long archive_file_size;
172 static bfd_size_type current_file_size;
173 static unsigned long dynamic_addr;
174 static bfd_size_type dynamic_size;
175 static size_t dynamic_nent;
176 static char * dynamic_strings;
177 static unsigned long dynamic_strings_length;
178 static char * string_table;
179 static unsigned long string_table_length;
180 static unsigned long num_dynamic_syms;
181 static Elf_Internal_Sym * dynamic_symbols;
182 static Elf_Internal_Syminfo * dynamic_syminfo;
183 static unsigned long dynamic_syminfo_offset;
184 static unsigned int dynamic_syminfo_nent;
185 static char program_interpreter[PATH_MAX];
186 static bfd_vma dynamic_info[DT_ENCODING];
187 static bfd_vma dynamic_info_DT_GNU_HASH;
188 static bfd_vma version_info[16];
189 static Elf_Internal_Ehdr elf_header;
190 static Elf_Internal_Shdr * section_headers;
191 static Elf_Internal_Phdr * program_headers;
192 static Elf_Internal_Dyn * dynamic_section;
193 static Elf_Internal_Shdr * symtab_shndx_hdr;
194 static int show_name;
195 static int do_dynamic;
196 static int do_syms;
197 static int do_dyn_syms;
198 static int do_reloc;
199 static int do_sections;
200 static int do_section_groups;
201 static int do_section_details;
202 static int do_segments;
203 static int do_unwind;
204 static int do_using_dynamic;
205 static int do_header;
206 static int do_dump;
207 static int do_version;
208 static int do_histogram;
209 static int do_debugging;
210 static int do_arch;
211 static int do_notes;
212 static int do_archive_index;
213 static int is_32bit_elf;
214
215 struct group_list
216 {
217 struct group_list * next;
218 unsigned int section_index;
219 };
220
221 struct group
222 {
223 struct group_list * root;
224 unsigned int group_index;
225 };
226
227 static size_t group_count;
228 static struct group * section_groups;
229 static struct group ** section_headers_groups;
230
231
232 /* Flag bits indicating particular types of dump. */
233 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
234 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
235 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
236 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
237 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
238
239 typedef unsigned char dump_type;
240
241 /* A linked list of the section names for which dumps were requested. */
242 struct dump_list_entry
243 {
244 char * name;
245 dump_type type;
246 struct dump_list_entry * next;
247 };
248 static struct dump_list_entry * dump_sects_byname;
249
250 /* A dynamic array of flags indicating for which sections a dump
251 has been requested via command line switches. */
252 static dump_type * cmdline_dump_sects = NULL;
253 static unsigned int num_cmdline_dump_sects = 0;
254
255 /* A dynamic array of flags indicating for which sections a dump of
256 some kind has been requested. It is reset on a per-object file
257 basis and then initialised from the cmdline_dump_sects array,
258 the results of interpreting the -w switch, and the
259 dump_sects_byname list. */
260 static dump_type * dump_sects = NULL;
261 static unsigned int num_dump_sects = 0;
262
263
264 /* How to print a vma value. */
265 typedef enum print_mode
266 {
267 HEX,
268 DEC,
269 DEC_5,
270 UNSIGNED,
271 PREFIX_HEX,
272 FULL_HEX,
273 LONG_HEX
274 }
275 print_mode;
276
277 /* Versioned symbol info. */
278 enum versioned_symbol_info
279 {
280 symbol_undefined,
281 symbol_hidden,
282 symbol_public
283 };
284
285 static const char *get_symbol_version_string
286 (FILE *file, int is_dynsym, const char *strtab,
287 unsigned long int strtab_size, unsigned int si,
288 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
289 unsigned short *vna_other);
290
291 #define UNKNOWN -1
292
293 #define SECTION_NAME(X) \
294 ((X) == NULL ? _("<none>") \
295 : string_table == NULL ? _("<no-name>") \
296 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
297 : string_table + (X)->sh_name))
298
299 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
300
301 #define GET_ELF_SYMBOLS(file, section, sym_count) \
302 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
303 : get_64bit_elf_symbols (file, section, sym_count))
304
305 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
306 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
307 already been called and verified that the string exists. */
308 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
309
310 #define REMOVE_ARCH_BITS(ADDR) \
311 do \
312 { \
313 if (elf_header.e_machine == EM_ARM) \
314 (ADDR) &= ~1; \
315 } \
316 while (0)
317 \f
318 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
319 the offset of the current archive member, if we are examining an archive.
320 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
321 using malloc and fill that. In either case return the pointer to the start of
322 the retrieved data or NULL if something went wrong. If something does go wrong
323 and REASON is not NULL then emit an error message using REASON as part of the
324 context. */
325
326 static void *
327 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
328 bfd_size_type nmemb, const char * reason)
329 {
330 void * mvar;
331 bfd_size_type amt = size * nmemb;
332
333 if (size == 0 || nmemb == 0)
334 return NULL;
335
336 /* If the size_t type is smaller than the bfd_size_type, eg because
337 you are building a 32-bit tool on a 64-bit host, then make sure
338 that when the sizes are cast to (size_t) no information is lost. */
339 if (sizeof (size_t) < sizeof (bfd_size_type)
340 && ( (bfd_size_type) ((size_t) size) != size
341 || (bfd_size_type) ((size_t) nmemb) != nmemb))
342 {
343 if (reason)
344 error (_("Size truncation prevents reading 0x%llx elements of size 0x%llx for %s\n"),
345 (unsigned long long) nmemb, (unsigned long long) size, reason);
346 return NULL;
347 }
348
349 /* Check for size overflow. */
350 if (amt < nmemb)
351 {
352 if (reason)
353 error (_("Size overflow prevents reading 0x%llx elements of size 0x%llx for %s\n"),
354 (unsigned long long) nmemb, (unsigned long long) size, reason);
355 return NULL;
356 }
357
358 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
359 attempting to allocate memory when the read is bound to fail. */
360 if (amt > current_file_size
361 || offset + archive_file_offset + amt > current_file_size)
362 {
363 if (reason)
364 error (_("Reading 0x%llx bytes extends past end of file for %s\n"),
365 (unsigned long long) amt, reason);
366 return NULL;
367 }
368
369 if (fseek (file, archive_file_offset + offset, SEEK_SET))
370 {
371 if (reason)
372 error (_("Unable to seek to 0x%lx for %s\n"),
373 (unsigned long) archive_file_offset + offset, reason);
374 return NULL;
375 }
376
377 mvar = var;
378 if (mvar == NULL)
379 {
380 /* Check for overflow. */
381 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
382 /* + 1 so that we can '\0' terminate invalid string table sections. */
383 mvar = malloc ((size_t) amt + 1);
384
385 if (mvar == NULL)
386 {
387 if (reason)
388 error (_("Out of memory allocating 0x%llx bytes for %s\n"),
389 (unsigned long long) amt, reason);
390 return NULL;
391 }
392
393 ((char *) mvar)[amt] = '\0';
394 }
395
396 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
397 {
398 if (reason)
399 error (_("Unable to read in 0x%llx bytes of %s\n"),
400 (unsigned long long) amt, reason);
401 if (mvar != var)
402 free (mvar);
403 return NULL;
404 }
405
406 return mvar;
407 }
408
409 /* Print a VMA value. */
410
411 static int
412 print_vma (bfd_vma vma, print_mode mode)
413 {
414 int nc = 0;
415
416 switch (mode)
417 {
418 case FULL_HEX:
419 nc = printf ("0x");
420 /* Drop through. */
421
422 case LONG_HEX:
423 #ifdef BFD64
424 if (is_32bit_elf)
425 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
426 #endif
427 printf_vma (vma);
428 return nc + 16;
429
430 case DEC_5:
431 if (vma <= 99999)
432 return printf ("%5" BFD_VMA_FMT "d", vma);
433 /* Drop through. */
434
435 case PREFIX_HEX:
436 nc = printf ("0x");
437 /* Drop through. */
438
439 case HEX:
440 return nc + printf ("%" BFD_VMA_FMT "x", vma);
441
442 case DEC:
443 return printf ("%" BFD_VMA_FMT "d", vma);
444
445 case UNSIGNED:
446 return printf ("%" BFD_VMA_FMT "u", vma);
447 }
448 return 0;
449 }
450
451 /* Display a symbol on stdout. Handles the display of control characters and
452 multibye characters (assuming the host environment supports them).
453
454 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
455
456 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
457 padding as necessary.
458
459 Returns the number of emitted characters. */
460
461 static unsigned int
462 print_symbol (int width, const char *symbol)
463 {
464 bfd_boolean extra_padding = FALSE;
465 int num_printed = 0;
466 #ifdef HAVE_MBSTATE_T
467 mbstate_t state;
468 #endif
469 int width_remaining;
470
471 if (width < 0)
472 {
473 /* Keep the width positive. This also helps. */
474 width = - width;
475 extra_padding = TRUE;
476 }
477 assert (width != 0);
478
479 if (do_wide)
480 /* Set the remaining width to a very large value.
481 This simplifies the code below. */
482 width_remaining = INT_MAX;
483 else
484 width_remaining = width;
485
486 #ifdef HAVE_MBSTATE_T
487 /* Initialise the multibyte conversion state. */
488 memset (& state, 0, sizeof (state));
489 #endif
490
491 while (width_remaining)
492 {
493 size_t n;
494 const char c = *symbol++;
495
496 if (c == 0)
497 break;
498
499 /* Do not print control characters directly as they can affect terminal
500 settings. Such characters usually appear in the names generated
501 by the assembler for local labels. */
502 if (ISCNTRL (c))
503 {
504 if (width_remaining < 2)
505 break;
506
507 printf ("^%c", c + 0x40);
508 width_remaining -= 2;
509 num_printed += 2;
510 }
511 else if (ISPRINT (c))
512 {
513 putchar (c);
514 width_remaining --;
515 num_printed ++;
516 }
517 else
518 {
519 #ifdef HAVE_MBSTATE_T
520 wchar_t w;
521 #endif
522 /* Let printf do the hard work of displaying multibyte characters. */
523 printf ("%.1s", symbol - 1);
524 width_remaining --;
525 num_printed ++;
526
527 #ifdef HAVE_MBSTATE_T
528 /* Try to find out how many bytes made up the character that was
529 just printed. Advance the symbol pointer past the bytes that
530 were displayed. */
531 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
532 #else
533 n = 1;
534 #endif
535 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
536 symbol += (n - 1);
537 }
538 }
539
540 if (extra_padding && num_printed < width)
541 {
542 /* Fill in the remaining spaces. */
543 printf ("%-*s", width - num_printed, " ");
544 num_printed = width;
545 }
546
547 return num_printed;
548 }
549
550 /* Returns a pointer to a static buffer containing a printable version of
551 the given section's name. Like print_symbol, except that it does not try
552 to print multibyte characters, it just interprets them as hex values. */
553
554 static const char *
555 printable_section_name (Elf_Internal_Shdr * sec)
556 {
557 #define MAX_PRINT_SEC_NAME_LEN 128
558 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
559 const char * name = SECTION_NAME (sec);
560 char * buf = sec_name_buf;
561 char c;
562 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
563
564 while ((c = * name ++) != 0)
565 {
566 if (ISCNTRL (c))
567 {
568 if (remaining < 2)
569 break;
570
571 * buf ++ = '^';
572 * buf ++ = c + 0x40;
573 remaining -= 2;
574 }
575 else if (ISPRINT (c))
576 {
577 * buf ++ = c;
578 remaining -= 1;
579 }
580 else
581 {
582 static char hex[17] = "0123456789ABCDEF";
583
584 if (remaining < 4)
585 break;
586 * buf ++ = '<';
587 * buf ++ = hex[(c & 0xf0) >> 4];
588 * buf ++ = hex[c & 0x0f];
589 * buf ++ = '>';
590 remaining -= 4;
591 }
592
593 if (remaining == 0)
594 break;
595 }
596
597 * buf = 0;
598 return sec_name_buf;
599 }
600
601 static const char *
602 printable_section_name_from_index (unsigned long ndx)
603 {
604 if (ndx >= elf_header.e_shnum)
605 return _("<corrupt>");
606
607 return printable_section_name (section_headers + ndx);
608 }
609
610 /* Return a pointer to section NAME, or NULL if no such section exists. */
611
612 static Elf_Internal_Shdr *
613 find_section (const char * name)
614 {
615 unsigned int i;
616
617 for (i = 0; i < elf_header.e_shnum; i++)
618 if (streq (SECTION_NAME (section_headers + i), name))
619 return section_headers + i;
620
621 return NULL;
622 }
623
624 /* Return a pointer to a section containing ADDR, or NULL if no such
625 section exists. */
626
627 static Elf_Internal_Shdr *
628 find_section_by_address (bfd_vma addr)
629 {
630 unsigned int i;
631
632 for (i = 0; i < elf_header.e_shnum; i++)
633 {
634 Elf_Internal_Shdr *sec = section_headers + i;
635 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
636 return sec;
637 }
638
639 return NULL;
640 }
641
642 static Elf_Internal_Shdr *
643 find_section_by_type (unsigned int type)
644 {
645 unsigned int i;
646
647 for (i = 0; i < elf_header.e_shnum; i++)
648 {
649 Elf_Internal_Shdr *sec = section_headers + i;
650 if (sec->sh_type == type)
651 return sec;
652 }
653
654 return NULL;
655 }
656
657 /* Return a pointer to section NAME, or NULL if no such section exists,
658 restricted to the list of sections given in SET. */
659
660 static Elf_Internal_Shdr *
661 find_section_in_set (const char * name, unsigned int * set)
662 {
663 unsigned int i;
664
665 if (set != NULL)
666 {
667 while ((i = *set++) > 0)
668 if (streq (SECTION_NAME (section_headers + i), name))
669 return section_headers + i;
670 }
671
672 return find_section (name);
673 }
674
675 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
676 bytes read. */
677
678 static inline unsigned long
679 read_uleb128 (unsigned char *data,
680 unsigned int *length_return,
681 const unsigned char * const end)
682 {
683 return read_leb128 (data, length_return, FALSE, end);
684 }
685
686 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
687 This OS has so many departures from the ELF standard that we test it at
688 many places. */
689
690 static inline int
691 is_ia64_vms (void)
692 {
693 return elf_header.e_machine == EM_IA_64
694 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
695 }
696
697 /* Guess the relocation size commonly used by the specific machines. */
698
699 static int
700 guess_is_rela (unsigned int e_machine)
701 {
702 switch (e_machine)
703 {
704 /* Targets that use REL relocations. */
705 case EM_386:
706 case EM_486:
707 case EM_960:
708 case EM_ARM:
709 case EM_D10V:
710 case EM_CYGNUS_D10V:
711 case EM_DLX:
712 case EM_MIPS:
713 case EM_MIPS_RS3_LE:
714 case EM_CYGNUS_M32R:
715 case EM_SCORE:
716 case EM_XGATE:
717 return FALSE;
718
719 /* Targets that use RELA relocations. */
720 case EM_68K:
721 case EM_860:
722 case EM_AARCH64:
723 case EM_ADAPTEVA_EPIPHANY:
724 case EM_ALPHA:
725 case EM_ALTERA_NIOS2:
726 case EM_AVR:
727 case EM_AVR_OLD:
728 case EM_BLACKFIN:
729 case EM_CR16:
730 case EM_CRIS:
731 case EM_CRX:
732 case EM_D30V:
733 case EM_CYGNUS_D30V:
734 case EM_FR30:
735 case EM_FT32:
736 case EM_CYGNUS_FR30:
737 case EM_CYGNUS_FRV:
738 case EM_H8S:
739 case EM_H8_300:
740 case EM_H8_300H:
741 case EM_IA_64:
742 case EM_IP2K:
743 case EM_IP2K_OLD:
744 case EM_IQ2000:
745 case EM_LATTICEMICO32:
746 case EM_M32C_OLD:
747 case EM_M32C:
748 case EM_M32R:
749 case EM_MCORE:
750 case EM_CYGNUS_MEP:
751 case EM_METAG:
752 case EM_MMIX:
753 case EM_MN10200:
754 case EM_CYGNUS_MN10200:
755 case EM_MN10300:
756 case EM_CYGNUS_MN10300:
757 case EM_MOXIE:
758 case EM_MSP430:
759 case EM_MSP430_OLD:
760 case EM_MT:
761 case EM_NDS32:
762 case EM_NIOS32:
763 case EM_OR1K:
764 case EM_PPC64:
765 case EM_PPC:
766 case EM_RL78:
767 case EM_RX:
768 case EM_S390:
769 case EM_S390_OLD:
770 case EM_SH:
771 case EM_SPARC:
772 case EM_SPARC32PLUS:
773 case EM_SPARCV9:
774 case EM_SPU:
775 case EM_TI_C6000:
776 case EM_TILEGX:
777 case EM_TILEPRO:
778 case EM_V800:
779 case EM_V850:
780 case EM_CYGNUS_V850:
781 case EM_VAX:
782 case EM_VISIUM:
783 case EM_X86_64:
784 case EM_L1OM:
785 case EM_K1OM:
786 case EM_XSTORMY16:
787 case EM_XTENSA:
788 case EM_XTENSA_OLD:
789 case EM_MICROBLAZE:
790 case EM_MICROBLAZE_OLD:
791 return TRUE;
792
793 case EM_68HC05:
794 case EM_68HC08:
795 case EM_68HC11:
796 case EM_68HC16:
797 case EM_FX66:
798 case EM_ME16:
799 case EM_MMA:
800 case EM_NCPU:
801 case EM_NDR1:
802 case EM_PCP:
803 case EM_ST100:
804 case EM_ST19:
805 case EM_ST7:
806 case EM_ST9PLUS:
807 case EM_STARCORE:
808 case EM_SVX:
809 case EM_TINYJ:
810 default:
811 warn (_("Don't know about relocations on this machine architecture\n"));
812 return FALSE;
813 }
814 }
815
816 static int
817 slurp_rela_relocs (FILE * file,
818 unsigned long rel_offset,
819 unsigned long rel_size,
820 Elf_Internal_Rela ** relasp,
821 unsigned long * nrelasp)
822 {
823 Elf_Internal_Rela * relas;
824 size_t nrelas;
825 unsigned int i;
826
827 if (is_32bit_elf)
828 {
829 Elf32_External_Rela * erelas;
830
831 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
832 rel_size, _("32-bit relocation data"));
833 if (!erelas)
834 return 0;
835
836 nrelas = rel_size / sizeof (Elf32_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
855 free (erelas);
856 }
857 else
858 {
859 Elf64_External_Rela * erelas;
860
861 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
862 rel_size, _("64-bit relocation data"));
863 if (!erelas)
864 return 0;
865
866 nrelas = rel_size / sizeof (Elf64_External_Rela);
867
868 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
869 sizeof (Elf_Internal_Rela));
870
871 if (relas == NULL)
872 {
873 free (erelas);
874 error (_("out of memory parsing relocs\n"));
875 return 0;
876 }
877
878 for (i = 0; i < nrelas; i++)
879 {
880 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
881 relas[i].r_info = BYTE_GET (erelas[i].r_info);
882 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
883
884 /* The #ifdef BFD64 below is to prevent a compile time
885 warning. We know that if we do not have a 64 bit data
886 type that we will never execute this code anyway. */
887 #ifdef BFD64
888 if (elf_header.e_machine == EM_MIPS
889 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
890 {
891 /* In little-endian objects, r_info isn't really a
892 64-bit little-endian value: it has a 32-bit
893 little-endian symbol index followed by four
894 individual byte fields. Reorder INFO
895 accordingly. */
896 bfd_vma inf = relas[i].r_info;
897 inf = (((inf & 0xffffffff) << 32)
898 | ((inf >> 56) & 0xff)
899 | ((inf >> 40) & 0xff00)
900 | ((inf >> 24) & 0xff0000)
901 | ((inf >> 8) & 0xff000000));
902 relas[i].r_info = inf;
903 }
904 #endif /* BFD64 */
905 }
906
907 free (erelas);
908 }
909 *relasp = relas;
910 *nrelasp = nrelas;
911 return 1;
912 }
913
914 static int
915 slurp_rel_relocs (FILE * file,
916 unsigned long rel_offset,
917 unsigned long rel_size,
918 Elf_Internal_Rela ** relsp,
919 unsigned long * nrelsp)
920 {
921 Elf_Internal_Rela * rels;
922 size_t nrels;
923 unsigned int i;
924
925 if (is_32bit_elf)
926 {
927 Elf32_External_Rel * erels;
928
929 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
930 rel_size, _("32-bit relocation data"));
931 if (!erels)
932 return 0;
933
934 nrels = rel_size / sizeof (Elf32_External_Rel);
935
936 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
937
938 if (rels == NULL)
939 {
940 free (erels);
941 error (_("out of memory parsing relocs\n"));
942 return 0;
943 }
944
945 for (i = 0; i < nrels; i++)
946 {
947 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
948 rels[i].r_info = BYTE_GET (erels[i].r_info);
949 rels[i].r_addend = 0;
950 }
951
952 free (erels);
953 }
954 else
955 {
956 Elf64_External_Rel * erels;
957
958 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
959 rel_size, _("64-bit relocation data"));
960 if (!erels)
961 return 0;
962
963 nrels = rel_size / sizeof (Elf64_External_Rel);
964
965 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
966
967 if (rels == NULL)
968 {
969 free (erels);
970 error (_("out of memory parsing relocs\n"));
971 return 0;
972 }
973
974 for (i = 0; i < nrels; i++)
975 {
976 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
977 rels[i].r_info = BYTE_GET (erels[i].r_info);
978 rels[i].r_addend = 0;
979
980 /* The #ifdef BFD64 below is to prevent a compile time
981 warning. We know that if we do not have a 64 bit data
982 type that we will never execute this code anyway. */
983 #ifdef BFD64
984 if (elf_header.e_machine == EM_MIPS
985 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
986 {
987 /* In little-endian objects, r_info isn't really a
988 64-bit little-endian value: it has a 32-bit
989 little-endian symbol index followed by four
990 individual byte fields. Reorder INFO
991 accordingly. */
992 bfd_vma inf = rels[i].r_info;
993 inf = (((inf & 0xffffffff) << 32)
994 | ((inf >> 56) & 0xff)
995 | ((inf >> 40) & 0xff00)
996 | ((inf >> 24) & 0xff0000)
997 | ((inf >> 8) & 0xff000000));
998 rels[i].r_info = inf;
999 }
1000 #endif /* BFD64 */
1001 }
1002
1003 free (erels);
1004 }
1005 *relsp = rels;
1006 *nrelsp = nrels;
1007 return 1;
1008 }
1009
1010 /* Returns the reloc type extracted from the reloc info field. */
1011
1012 static unsigned int
1013 get_reloc_type (bfd_vma reloc_info)
1014 {
1015 if (is_32bit_elf)
1016 return ELF32_R_TYPE (reloc_info);
1017
1018 switch (elf_header.e_machine)
1019 {
1020 case EM_MIPS:
1021 /* Note: We assume that reloc_info has already been adjusted for us. */
1022 return ELF64_MIPS_R_TYPE (reloc_info);
1023
1024 case EM_SPARCV9:
1025 return ELF64_R_TYPE_ID (reloc_info);
1026
1027 default:
1028 return ELF64_R_TYPE (reloc_info);
1029 }
1030 }
1031
1032 /* Return the symbol index extracted from the reloc info field. */
1033
1034 static bfd_vma
1035 get_reloc_symindex (bfd_vma reloc_info)
1036 {
1037 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1038 }
1039
1040 static inline bfd_boolean
1041 uses_msp430x_relocs (void)
1042 {
1043 return
1044 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1045 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1046 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1047 /* TI compiler uses ELFOSABI_NONE. */
1048 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1049 }
1050
1051 /* Display the contents of the relocation data found at the specified
1052 offset. */
1053
1054 static void
1055 dump_relocations (FILE * file,
1056 unsigned long rel_offset,
1057 unsigned long rel_size,
1058 Elf_Internal_Sym * symtab,
1059 unsigned long nsyms,
1060 char * strtab,
1061 unsigned long strtablen,
1062 int is_rela,
1063 int is_dynsym)
1064 {
1065 unsigned int i;
1066 Elf_Internal_Rela * rels;
1067
1068 if (is_rela == UNKNOWN)
1069 is_rela = guess_is_rela (elf_header.e_machine);
1070
1071 if (is_rela)
1072 {
1073 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1074 return;
1075 }
1076 else
1077 {
1078 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1079 return;
1080 }
1081
1082 if (is_32bit_elf)
1083 {
1084 if (is_rela)
1085 {
1086 if (do_wide)
1087 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1088 else
1089 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1090 }
1091 else
1092 {
1093 if (do_wide)
1094 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1095 else
1096 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1097 }
1098 }
1099 else
1100 {
1101 if (is_rela)
1102 {
1103 if (do_wide)
1104 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1105 else
1106 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1107 }
1108 else
1109 {
1110 if (do_wide)
1111 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1112 else
1113 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1114 }
1115 }
1116
1117 for (i = 0; i < rel_size; i++)
1118 {
1119 const char * rtype;
1120 bfd_vma offset;
1121 bfd_vma inf;
1122 bfd_vma symtab_index;
1123 bfd_vma type;
1124
1125 offset = rels[i].r_offset;
1126 inf = rels[i].r_info;
1127
1128 type = get_reloc_type (inf);
1129 symtab_index = get_reloc_symindex (inf);
1130
1131 if (is_32bit_elf)
1132 {
1133 printf ("%8.8lx %8.8lx ",
1134 (unsigned long) offset & 0xffffffff,
1135 (unsigned long) inf & 0xffffffff);
1136 }
1137 else
1138 {
1139 #if BFD_HOST_64BIT_LONG
1140 printf (do_wide
1141 ? "%16.16lx %16.16lx "
1142 : "%12.12lx %12.12lx ",
1143 offset, inf);
1144 #elif BFD_HOST_64BIT_LONG_LONG
1145 #ifndef __MSVCRT__
1146 printf (do_wide
1147 ? "%16.16llx %16.16llx "
1148 : "%12.12llx %12.12llx ",
1149 offset, inf);
1150 #else
1151 printf (do_wide
1152 ? "%16.16I64x %16.16I64x "
1153 : "%12.12I64x %12.12I64x ",
1154 offset, inf);
1155 #endif
1156 #else
1157 printf (do_wide
1158 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1159 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1160 _bfd_int64_high (offset),
1161 _bfd_int64_low (offset),
1162 _bfd_int64_high (inf),
1163 _bfd_int64_low (inf));
1164 #endif
1165 }
1166
1167 switch (elf_header.e_machine)
1168 {
1169 default:
1170 rtype = NULL;
1171 break;
1172
1173 case EM_AARCH64:
1174 rtype = elf_aarch64_reloc_type (type);
1175 break;
1176
1177 case EM_M32R:
1178 case EM_CYGNUS_M32R:
1179 rtype = elf_m32r_reloc_type (type);
1180 break;
1181
1182 case EM_386:
1183 case EM_486:
1184 rtype = elf_i386_reloc_type (type);
1185 break;
1186
1187 case EM_68HC11:
1188 case EM_68HC12:
1189 rtype = elf_m68hc11_reloc_type (type);
1190 break;
1191
1192 case EM_68K:
1193 rtype = elf_m68k_reloc_type (type);
1194 break;
1195
1196 case EM_960:
1197 rtype = elf_i960_reloc_type (type);
1198 break;
1199
1200 case EM_AVR:
1201 case EM_AVR_OLD:
1202 rtype = elf_avr_reloc_type (type);
1203 break;
1204
1205 case EM_OLD_SPARCV9:
1206 case EM_SPARC32PLUS:
1207 case EM_SPARCV9:
1208 case EM_SPARC:
1209 rtype = elf_sparc_reloc_type (type);
1210 break;
1211
1212 case EM_SPU:
1213 rtype = elf_spu_reloc_type (type);
1214 break;
1215
1216 case EM_V800:
1217 rtype = v800_reloc_type (type);
1218 break;
1219 case EM_V850:
1220 case EM_CYGNUS_V850:
1221 rtype = v850_reloc_type (type);
1222 break;
1223
1224 case EM_D10V:
1225 case EM_CYGNUS_D10V:
1226 rtype = elf_d10v_reloc_type (type);
1227 break;
1228
1229 case EM_D30V:
1230 case EM_CYGNUS_D30V:
1231 rtype = elf_d30v_reloc_type (type);
1232 break;
1233
1234 case EM_DLX:
1235 rtype = elf_dlx_reloc_type (type);
1236 break;
1237
1238 case EM_SH:
1239 rtype = elf_sh_reloc_type (type);
1240 break;
1241
1242 case EM_MN10300:
1243 case EM_CYGNUS_MN10300:
1244 rtype = elf_mn10300_reloc_type (type);
1245 break;
1246
1247 case EM_MN10200:
1248 case EM_CYGNUS_MN10200:
1249 rtype = elf_mn10200_reloc_type (type);
1250 break;
1251
1252 case EM_FR30:
1253 case EM_CYGNUS_FR30:
1254 rtype = elf_fr30_reloc_type (type);
1255 break;
1256
1257 case EM_CYGNUS_FRV:
1258 rtype = elf_frv_reloc_type (type);
1259 break;
1260
1261 case EM_FT32:
1262 rtype = elf_ft32_reloc_type (type);
1263 break;
1264
1265 case EM_MCORE:
1266 rtype = elf_mcore_reloc_type (type);
1267 break;
1268
1269 case EM_MMIX:
1270 rtype = elf_mmix_reloc_type (type);
1271 break;
1272
1273 case EM_MOXIE:
1274 rtype = elf_moxie_reloc_type (type);
1275 break;
1276
1277 case EM_MSP430:
1278 if (uses_msp430x_relocs ())
1279 {
1280 rtype = elf_msp430x_reloc_type (type);
1281 break;
1282 }
1283 case EM_MSP430_OLD:
1284 rtype = elf_msp430_reloc_type (type);
1285 break;
1286
1287 case EM_NDS32:
1288 rtype = elf_nds32_reloc_type (type);
1289 break;
1290
1291 case EM_PPC:
1292 rtype = elf_ppc_reloc_type (type);
1293 break;
1294
1295 case EM_PPC64:
1296 rtype = elf_ppc64_reloc_type (type);
1297 break;
1298
1299 case EM_MIPS:
1300 case EM_MIPS_RS3_LE:
1301 rtype = elf_mips_reloc_type (type);
1302 break;
1303
1304 case EM_ALPHA:
1305 rtype = elf_alpha_reloc_type (type);
1306 break;
1307
1308 case EM_ARM:
1309 rtype = elf_arm_reloc_type (type);
1310 break;
1311
1312 case EM_ARC:
1313 rtype = elf_arc_reloc_type (type);
1314 break;
1315
1316 case EM_PARISC:
1317 rtype = elf_hppa_reloc_type (type);
1318 break;
1319
1320 case EM_H8_300:
1321 case EM_H8_300H:
1322 case EM_H8S:
1323 rtype = elf_h8_reloc_type (type);
1324 break;
1325
1326 case EM_OR1K:
1327 rtype = elf_or1k_reloc_type (type);
1328 break;
1329
1330 case EM_PJ:
1331 case EM_PJ_OLD:
1332 rtype = elf_pj_reloc_type (type);
1333 break;
1334 case EM_IA_64:
1335 rtype = elf_ia64_reloc_type (type);
1336 break;
1337
1338 case EM_CRIS:
1339 rtype = elf_cris_reloc_type (type);
1340 break;
1341
1342 case EM_860:
1343 rtype = elf_i860_reloc_type (type);
1344 break;
1345
1346 case EM_X86_64:
1347 case EM_L1OM:
1348 case EM_K1OM:
1349 rtype = elf_x86_64_reloc_type (type);
1350 break;
1351
1352 case EM_S370:
1353 rtype = i370_reloc_type (type);
1354 break;
1355
1356 case EM_S390_OLD:
1357 case EM_S390:
1358 rtype = elf_s390_reloc_type (type);
1359 break;
1360
1361 case EM_SCORE:
1362 rtype = elf_score_reloc_type (type);
1363 break;
1364
1365 case EM_XSTORMY16:
1366 rtype = elf_xstormy16_reloc_type (type);
1367 break;
1368
1369 case EM_CRX:
1370 rtype = elf_crx_reloc_type (type);
1371 break;
1372
1373 case EM_VAX:
1374 rtype = elf_vax_reloc_type (type);
1375 break;
1376
1377 case EM_VISIUM:
1378 rtype = elf_visium_reloc_type (type);
1379 break;
1380
1381 case EM_ADAPTEVA_EPIPHANY:
1382 rtype = elf_epiphany_reloc_type (type);
1383 break;
1384
1385 case EM_IP2K:
1386 case EM_IP2K_OLD:
1387 rtype = elf_ip2k_reloc_type (type);
1388 break;
1389
1390 case EM_IQ2000:
1391 rtype = elf_iq2000_reloc_type (type);
1392 break;
1393
1394 case EM_XTENSA_OLD:
1395 case EM_XTENSA:
1396 rtype = elf_xtensa_reloc_type (type);
1397 break;
1398
1399 case EM_LATTICEMICO32:
1400 rtype = elf_lm32_reloc_type (type);
1401 break;
1402
1403 case EM_M32C_OLD:
1404 case EM_M32C:
1405 rtype = elf_m32c_reloc_type (type);
1406 break;
1407
1408 case EM_MT:
1409 rtype = elf_mt_reloc_type (type);
1410 break;
1411
1412 case EM_BLACKFIN:
1413 rtype = elf_bfin_reloc_type (type);
1414 break;
1415
1416 case EM_CYGNUS_MEP:
1417 rtype = elf_mep_reloc_type (type);
1418 break;
1419
1420 case EM_CR16:
1421 rtype = elf_cr16_reloc_type (type);
1422 break;
1423
1424 case EM_MICROBLAZE:
1425 case EM_MICROBLAZE_OLD:
1426 rtype = elf_microblaze_reloc_type (type);
1427 break;
1428
1429 case EM_RL78:
1430 rtype = elf_rl78_reloc_type (type);
1431 break;
1432
1433 case EM_RX:
1434 rtype = elf_rx_reloc_type (type);
1435 break;
1436
1437 case EM_METAG:
1438 rtype = elf_metag_reloc_type (type);
1439 break;
1440
1441 case EM_XC16X:
1442 case EM_C166:
1443 rtype = elf_xc16x_reloc_type (type);
1444 break;
1445
1446 case EM_TI_C6000:
1447 rtype = elf_tic6x_reloc_type (type);
1448 break;
1449
1450 case EM_TILEGX:
1451 rtype = elf_tilegx_reloc_type (type);
1452 break;
1453
1454 case EM_TILEPRO:
1455 rtype = elf_tilepro_reloc_type (type);
1456 break;
1457
1458 case EM_XGATE:
1459 rtype = elf_xgate_reloc_type (type);
1460 break;
1461
1462 case EM_ALTERA_NIOS2:
1463 rtype = elf_nios2_reloc_type (type);
1464 break;
1465 }
1466
1467 if (rtype == NULL)
1468 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1469 else
1470 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1471
1472 if (elf_header.e_machine == EM_ALPHA
1473 && rtype != NULL
1474 && streq (rtype, "R_ALPHA_LITUSE")
1475 && is_rela)
1476 {
1477 switch (rels[i].r_addend)
1478 {
1479 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1480 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1481 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1482 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1483 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1484 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1485 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1486 default: rtype = NULL;
1487 }
1488 if (rtype)
1489 printf (" (%s)", rtype);
1490 else
1491 {
1492 putchar (' ');
1493 printf (_("<unknown addend: %lx>"),
1494 (unsigned long) rels[i].r_addend);
1495 }
1496 }
1497 else if (symtab_index)
1498 {
1499 if (symtab == NULL || symtab_index >= nsyms)
1500 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1501 else
1502 {
1503 Elf_Internal_Sym * psym;
1504 const char * version_string;
1505 enum versioned_symbol_info sym_info;
1506 unsigned short vna_other;
1507
1508 psym = symtab + symtab_index;
1509
1510 version_string
1511 = get_symbol_version_string (file, is_dynsym,
1512 strtab, strtablen,
1513 symtab_index,
1514 psym,
1515 &sym_info,
1516 &vna_other);
1517
1518 printf (" ");
1519
1520 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1521 {
1522 const char * name;
1523 unsigned int len;
1524 unsigned int width = is_32bit_elf ? 8 : 14;
1525
1526 /* Relocations against GNU_IFUNC symbols do not use the value
1527 of the symbol as the address to relocate against. Instead
1528 they invoke the function named by the symbol and use its
1529 result as the address for relocation.
1530
1531 To indicate this to the user, do not display the value of
1532 the symbol in the "Symbols's Value" field. Instead show
1533 its name followed by () as a hint that the symbol is
1534 invoked. */
1535
1536 if (strtab == NULL
1537 || psym->st_name == 0
1538 || psym->st_name >= strtablen)
1539 name = "??";
1540 else
1541 name = strtab + psym->st_name;
1542
1543 len = print_symbol (width, name);
1544 if (version_string)
1545 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1546 version_string);
1547 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1548 }
1549 else
1550 {
1551 print_vma (psym->st_value, LONG_HEX);
1552
1553 printf (is_32bit_elf ? " " : " ");
1554 }
1555
1556 if (psym->st_name == 0)
1557 {
1558 const char * sec_name = "<null>";
1559 char name_buf[40];
1560
1561 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1562 {
1563 if (psym->st_shndx < elf_header.e_shnum)
1564 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1565 else if (psym->st_shndx == SHN_ABS)
1566 sec_name = "ABS";
1567 else if (psym->st_shndx == SHN_COMMON)
1568 sec_name = "COMMON";
1569 else if ((elf_header.e_machine == EM_MIPS
1570 && psym->st_shndx == SHN_MIPS_SCOMMON)
1571 || (elf_header.e_machine == EM_TI_C6000
1572 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1573 sec_name = "SCOMMON";
1574 else if (elf_header.e_machine == EM_MIPS
1575 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1576 sec_name = "SUNDEF";
1577 else if ((elf_header.e_machine == EM_X86_64
1578 || elf_header.e_machine == EM_L1OM
1579 || elf_header.e_machine == EM_K1OM)
1580 && psym->st_shndx == SHN_X86_64_LCOMMON)
1581 sec_name = "LARGE_COMMON";
1582 else if (elf_header.e_machine == EM_IA_64
1583 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1584 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1585 sec_name = "ANSI_COM";
1586 else if (is_ia64_vms ()
1587 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1588 sec_name = "VMS_SYMVEC";
1589 else
1590 {
1591 sprintf (name_buf, "<section 0x%x>",
1592 (unsigned int) psym->st_shndx);
1593 sec_name = name_buf;
1594 }
1595 }
1596 print_symbol (22, sec_name);
1597 }
1598 else if (strtab == NULL)
1599 printf (_("<string table index: %3ld>"), psym->st_name);
1600 else if (psym->st_name >= strtablen)
1601 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1602 else
1603 {
1604 print_symbol (22, strtab + psym->st_name);
1605 if (version_string)
1606 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1607 version_string);
1608 }
1609
1610 if (is_rela)
1611 {
1612 bfd_signed_vma off = rels[i].r_addend;
1613
1614 /* PR 17531: file: 2e63226f. */
1615 if (off == ((bfd_signed_vma) 1) << ((sizeof (bfd_signed_vma) * 8) - 1))
1616 printf (" + %" BFD_VMA_FMT "x", off);
1617 else if (off < 0)
1618 printf (" - %" BFD_VMA_FMT "x", - off);
1619 else
1620 printf (" + %" BFD_VMA_FMT "x", off);
1621 }
1622 }
1623 }
1624 else if (is_rela)
1625 {
1626 bfd_signed_vma off = rels[i].r_addend;
1627
1628 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1629 /* PR 17531: file: 2e63226f. */
1630 if (off == ((bfd_signed_vma) 1) << ((sizeof (bfd_signed_vma) * 8) - 1))
1631 printf ("%" BFD_VMA_FMT "x", off);
1632 else if (off < 0)
1633 printf ("-%" BFD_VMA_FMT "x", - off);
1634 else
1635 printf ("%" BFD_VMA_FMT "x", off);
1636 }
1637
1638 if (elf_header.e_machine == EM_SPARCV9
1639 && rtype != NULL
1640 && streq (rtype, "R_SPARC_OLO10"))
1641 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1642
1643 putchar ('\n');
1644
1645 #ifdef BFD64
1646 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1647 {
1648 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1649 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1650 const char * rtype2 = elf_mips_reloc_type (type2);
1651 const char * rtype3 = elf_mips_reloc_type (type3);
1652
1653 printf (" Type2: ");
1654
1655 if (rtype2 == NULL)
1656 printf (_("unrecognized: %-7lx"),
1657 (unsigned long) type2 & 0xffffffff);
1658 else
1659 printf ("%-17.17s", rtype2);
1660
1661 printf ("\n Type3: ");
1662
1663 if (rtype3 == NULL)
1664 printf (_("unrecognized: %-7lx"),
1665 (unsigned long) type3 & 0xffffffff);
1666 else
1667 printf ("%-17.17s", rtype3);
1668
1669 putchar ('\n');
1670 }
1671 #endif /* BFD64 */
1672 }
1673
1674 free (rels);
1675 }
1676
1677 static const char *
1678 get_mips_dynamic_type (unsigned long type)
1679 {
1680 switch (type)
1681 {
1682 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1683 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1684 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1685 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1686 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1687 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1688 case DT_MIPS_MSYM: return "MIPS_MSYM";
1689 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1690 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1691 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1692 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1693 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1694 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1695 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1696 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1697 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1698 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1699 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1700 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1701 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1702 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1703 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1704 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1705 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1706 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1707 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1708 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1709 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1710 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1711 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1712 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1713 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1714 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1715 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1716 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1717 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1718 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1719 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1720 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1721 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1722 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1723 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1724 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1725 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1726 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1727 default:
1728 return NULL;
1729 }
1730 }
1731
1732 static const char *
1733 get_sparc64_dynamic_type (unsigned long type)
1734 {
1735 switch (type)
1736 {
1737 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1738 default:
1739 return NULL;
1740 }
1741 }
1742
1743 static const char *
1744 get_ppc_dynamic_type (unsigned long type)
1745 {
1746 switch (type)
1747 {
1748 case DT_PPC_GOT: return "PPC_GOT";
1749 case DT_PPC_OPT: return "PPC_OPT";
1750 default:
1751 return NULL;
1752 }
1753 }
1754
1755 static const char *
1756 get_ppc64_dynamic_type (unsigned long type)
1757 {
1758 switch (type)
1759 {
1760 case DT_PPC64_GLINK: return "PPC64_GLINK";
1761 case DT_PPC64_OPD: return "PPC64_OPD";
1762 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1763 case DT_PPC64_OPT: return "PPC64_OPT";
1764 default:
1765 return NULL;
1766 }
1767 }
1768
1769 static const char *
1770 get_parisc_dynamic_type (unsigned long type)
1771 {
1772 switch (type)
1773 {
1774 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1775 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1776 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1777 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1778 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1779 case DT_HP_PREINIT: return "HP_PREINIT";
1780 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1781 case DT_HP_NEEDED: return "HP_NEEDED";
1782 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1783 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1784 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1785 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1786 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1787 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1788 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1789 case DT_HP_FILTERED: return "HP_FILTERED";
1790 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1791 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1792 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1793 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1794 case DT_PLT: return "PLT";
1795 case DT_PLT_SIZE: return "PLT_SIZE";
1796 case DT_DLT: return "DLT";
1797 case DT_DLT_SIZE: return "DLT_SIZE";
1798 default:
1799 return NULL;
1800 }
1801 }
1802
1803 static const char *
1804 get_ia64_dynamic_type (unsigned long type)
1805 {
1806 switch (type)
1807 {
1808 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1809 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1810 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1811 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1812 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1813 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1814 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1815 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1816 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1817 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1818 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1819 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1820 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1821 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1822 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1823 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1824 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1825 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1826 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1827 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1828 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1829 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1830 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1831 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1832 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1833 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1834 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1835 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1836 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1837 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1838 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1839 default:
1840 return NULL;
1841 }
1842 }
1843
1844 static const char *
1845 get_alpha_dynamic_type (unsigned long type)
1846 {
1847 switch (type)
1848 {
1849 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1850 default:
1851 return NULL;
1852 }
1853 }
1854
1855 static const char *
1856 get_score_dynamic_type (unsigned long type)
1857 {
1858 switch (type)
1859 {
1860 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1861 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1862 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1863 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1864 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1865 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1866 default:
1867 return NULL;
1868 }
1869 }
1870
1871 static const char *
1872 get_tic6x_dynamic_type (unsigned long type)
1873 {
1874 switch (type)
1875 {
1876 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1877 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1878 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1879 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1880 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1881 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1882 default:
1883 return NULL;
1884 }
1885 }
1886
1887 static const char *
1888 get_nios2_dynamic_type (unsigned long type)
1889 {
1890 switch (type)
1891 {
1892 case DT_NIOS2_GP: return "NIOS2_GP";
1893 default:
1894 return NULL;
1895 }
1896 }
1897
1898 static const char *
1899 get_dynamic_type (unsigned long type)
1900 {
1901 static char buff[64];
1902
1903 switch (type)
1904 {
1905 case DT_NULL: return "NULL";
1906 case DT_NEEDED: return "NEEDED";
1907 case DT_PLTRELSZ: return "PLTRELSZ";
1908 case DT_PLTGOT: return "PLTGOT";
1909 case DT_HASH: return "HASH";
1910 case DT_STRTAB: return "STRTAB";
1911 case DT_SYMTAB: return "SYMTAB";
1912 case DT_RELA: return "RELA";
1913 case DT_RELASZ: return "RELASZ";
1914 case DT_RELAENT: return "RELAENT";
1915 case DT_STRSZ: return "STRSZ";
1916 case DT_SYMENT: return "SYMENT";
1917 case DT_INIT: return "INIT";
1918 case DT_FINI: return "FINI";
1919 case DT_SONAME: return "SONAME";
1920 case DT_RPATH: return "RPATH";
1921 case DT_SYMBOLIC: return "SYMBOLIC";
1922 case DT_REL: return "REL";
1923 case DT_RELSZ: return "RELSZ";
1924 case DT_RELENT: return "RELENT";
1925 case DT_PLTREL: return "PLTREL";
1926 case DT_DEBUG: return "DEBUG";
1927 case DT_TEXTREL: return "TEXTREL";
1928 case DT_JMPREL: return "JMPREL";
1929 case DT_BIND_NOW: return "BIND_NOW";
1930 case DT_INIT_ARRAY: return "INIT_ARRAY";
1931 case DT_FINI_ARRAY: return "FINI_ARRAY";
1932 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1933 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1934 case DT_RUNPATH: return "RUNPATH";
1935 case DT_FLAGS: return "FLAGS";
1936
1937 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1938 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1939
1940 case DT_CHECKSUM: return "CHECKSUM";
1941 case DT_PLTPADSZ: return "PLTPADSZ";
1942 case DT_MOVEENT: return "MOVEENT";
1943 case DT_MOVESZ: return "MOVESZ";
1944 case DT_FEATURE: return "FEATURE";
1945 case DT_POSFLAG_1: return "POSFLAG_1";
1946 case DT_SYMINSZ: return "SYMINSZ";
1947 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1948
1949 case DT_ADDRRNGLO: return "ADDRRNGLO";
1950 case DT_CONFIG: return "CONFIG";
1951 case DT_DEPAUDIT: return "DEPAUDIT";
1952 case DT_AUDIT: return "AUDIT";
1953 case DT_PLTPAD: return "PLTPAD";
1954 case DT_MOVETAB: return "MOVETAB";
1955 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1956
1957 case DT_VERSYM: return "VERSYM";
1958
1959 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1960 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1961 case DT_RELACOUNT: return "RELACOUNT";
1962 case DT_RELCOUNT: return "RELCOUNT";
1963 case DT_FLAGS_1: return "FLAGS_1";
1964 case DT_VERDEF: return "VERDEF";
1965 case DT_VERDEFNUM: return "VERDEFNUM";
1966 case DT_VERNEED: return "VERNEED";
1967 case DT_VERNEEDNUM: return "VERNEEDNUM";
1968
1969 case DT_AUXILIARY: return "AUXILIARY";
1970 case DT_USED: return "USED";
1971 case DT_FILTER: return "FILTER";
1972
1973 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1974 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1975 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1976 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1977 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1978 case DT_GNU_HASH: return "GNU_HASH";
1979
1980 default:
1981 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1982 {
1983 const char * result;
1984
1985 switch (elf_header.e_machine)
1986 {
1987 case EM_MIPS:
1988 case EM_MIPS_RS3_LE:
1989 result = get_mips_dynamic_type (type);
1990 break;
1991 case EM_SPARCV9:
1992 result = get_sparc64_dynamic_type (type);
1993 break;
1994 case EM_PPC:
1995 result = get_ppc_dynamic_type (type);
1996 break;
1997 case EM_PPC64:
1998 result = get_ppc64_dynamic_type (type);
1999 break;
2000 case EM_IA_64:
2001 result = get_ia64_dynamic_type (type);
2002 break;
2003 case EM_ALPHA:
2004 result = get_alpha_dynamic_type (type);
2005 break;
2006 case EM_SCORE:
2007 result = get_score_dynamic_type (type);
2008 break;
2009 case EM_TI_C6000:
2010 result = get_tic6x_dynamic_type (type);
2011 break;
2012 case EM_ALTERA_NIOS2:
2013 result = get_nios2_dynamic_type (type);
2014 break;
2015 default:
2016 result = NULL;
2017 break;
2018 }
2019
2020 if (result != NULL)
2021 return result;
2022
2023 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2024 }
2025 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2026 || (elf_header.e_machine == EM_PARISC
2027 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2028 {
2029 const char * result;
2030
2031 switch (elf_header.e_machine)
2032 {
2033 case EM_PARISC:
2034 result = get_parisc_dynamic_type (type);
2035 break;
2036 case EM_IA_64:
2037 result = get_ia64_dynamic_type (type);
2038 break;
2039 default:
2040 result = NULL;
2041 break;
2042 }
2043
2044 if (result != NULL)
2045 return result;
2046
2047 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2048 type);
2049 }
2050 else
2051 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2052
2053 return buff;
2054 }
2055 }
2056
2057 static char *
2058 get_file_type (unsigned e_type)
2059 {
2060 static char buff[32];
2061
2062 switch (e_type)
2063 {
2064 case ET_NONE: return _("NONE (None)");
2065 case ET_REL: return _("REL (Relocatable file)");
2066 case ET_EXEC: return _("EXEC (Executable file)");
2067 case ET_DYN: return _("DYN (Shared object file)");
2068 case ET_CORE: return _("CORE (Core file)");
2069
2070 default:
2071 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2072 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2073 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2074 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2075 else
2076 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2077 return buff;
2078 }
2079 }
2080
2081 static char *
2082 get_machine_name (unsigned e_machine)
2083 {
2084 static char buff[64]; /* XXX */
2085
2086 switch (e_machine)
2087 {
2088 case EM_NONE: return _("None");
2089 case EM_AARCH64: return "AArch64";
2090 case EM_M32: return "WE32100";
2091 case EM_SPARC: return "Sparc";
2092 case EM_SPU: return "SPU";
2093 case EM_386: return "Intel 80386";
2094 case EM_68K: return "MC68000";
2095 case EM_88K: return "MC88000";
2096 case EM_486: return "Intel 80486";
2097 case EM_860: return "Intel 80860";
2098 case EM_MIPS: return "MIPS R3000";
2099 case EM_S370: return "IBM System/370";
2100 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2101 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2102 case EM_PARISC: return "HPPA";
2103 case EM_PPC_OLD: return "Power PC (old)";
2104 case EM_SPARC32PLUS: return "Sparc v8+" ;
2105 case EM_960: return "Intel 90860";
2106 case EM_PPC: return "PowerPC";
2107 case EM_PPC64: return "PowerPC64";
2108 case EM_FR20: return "Fujitsu FR20";
2109 case EM_FT32: return "FTDI FT32";
2110 case EM_RH32: return "TRW RH32";
2111 case EM_MCORE: return "MCORE";
2112 case EM_ARM: return "ARM";
2113 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2114 case EM_SH: return "Renesas / SuperH SH";
2115 case EM_SPARCV9: return "Sparc v9";
2116 case EM_TRICORE: return "Siemens Tricore";
2117 case EM_ARC: return "ARC";
2118 case EM_H8_300: return "Renesas H8/300";
2119 case EM_H8_300H: return "Renesas H8/300H";
2120 case EM_H8S: return "Renesas H8S";
2121 case EM_H8_500: return "Renesas H8/500";
2122 case EM_IA_64: return "Intel IA-64";
2123 case EM_MIPS_X: return "Stanford MIPS-X";
2124 case EM_COLDFIRE: return "Motorola Coldfire";
2125 case EM_ALPHA: return "Alpha";
2126 case EM_CYGNUS_D10V:
2127 case EM_D10V: return "d10v";
2128 case EM_CYGNUS_D30V:
2129 case EM_D30V: return "d30v";
2130 case EM_CYGNUS_M32R:
2131 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2132 case EM_CYGNUS_V850:
2133 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2134 case EM_V850: return "Renesas V850";
2135 case EM_CYGNUS_MN10300:
2136 case EM_MN10300: return "mn10300";
2137 case EM_CYGNUS_MN10200:
2138 case EM_MN10200: return "mn10200";
2139 case EM_MOXIE: return "Moxie";
2140 case EM_CYGNUS_FR30:
2141 case EM_FR30: return "Fujitsu FR30";
2142 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2143 case EM_PJ_OLD:
2144 case EM_PJ: return "picoJava";
2145 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2146 case EM_PCP: return "Siemens PCP";
2147 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2148 case EM_NDR1: return "Denso NDR1 microprocesspr";
2149 case EM_STARCORE: return "Motorola Star*Core processor";
2150 case EM_ME16: return "Toyota ME16 processor";
2151 case EM_ST100: return "STMicroelectronics ST100 processor";
2152 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2153 case EM_PDSP: return "Sony DSP processor";
2154 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2155 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2156 case EM_FX66: return "Siemens FX66 microcontroller";
2157 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2158 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2159 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2160 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2161 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2162 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2163 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2164 case EM_SVX: return "Silicon Graphics SVx";
2165 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2166 case EM_VAX: return "Digital VAX";
2167 case EM_VISIUM: return "CDS VISIUMcore processor";
2168 case EM_AVR_OLD:
2169 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2170 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2171 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2172 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2173 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2174 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2175 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2176 case EM_PRISM: return "Vitesse Prism";
2177 case EM_X86_64: return "Advanced Micro Devices X86-64";
2178 case EM_L1OM: return "Intel L1OM";
2179 case EM_K1OM: return "Intel K1OM";
2180 case EM_S390_OLD:
2181 case EM_S390: return "IBM S/390";
2182 case EM_SCORE: return "SUNPLUS S+Core";
2183 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2184 case EM_OR1K: return "OpenRISC 1000";
2185 case EM_ARC_A5: return "ARC International ARCompact processor";
2186 case EM_CRX: return "National Semiconductor CRX microprocessor";
2187 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2188 case EM_DLX: return "OpenDLX";
2189 case EM_IP2K_OLD:
2190 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2191 case EM_IQ2000: return "Vitesse IQ2000";
2192 case EM_XTENSA_OLD:
2193 case EM_XTENSA: return "Tensilica Xtensa Processor";
2194 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2195 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2196 case EM_NS32K: return "National Semiconductor 32000 series";
2197 case EM_TPC: return "Tenor Network TPC processor";
2198 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2199 case EM_MAX: return "MAX Processor";
2200 case EM_CR: return "National Semiconductor CompactRISC";
2201 case EM_F2MC16: return "Fujitsu F2MC16";
2202 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2203 case EM_LATTICEMICO32: return "Lattice Mico32";
2204 case EM_M32C_OLD:
2205 case EM_M32C: return "Renesas M32c";
2206 case EM_MT: return "Morpho Techologies MT processor";
2207 case EM_BLACKFIN: return "Analog Devices Blackfin";
2208 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2209 case EM_SEP: return "Sharp embedded microprocessor";
2210 case EM_ARCA: return "Arca RISC microprocessor";
2211 case EM_UNICORE: return "Unicore";
2212 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2213 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2214 case EM_NIOS32: return "Altera Nios";
2215 case EM_ALTERA_NIOS2: return "Altera Nios II";
2216 case EM_C166:
2217 case EM_XC16X: return "Infineon Technologies xc16x";
2218 case EM_M16C: return "Renesas M16C series microprocessors";
2219 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2220 case EM_CE: return "Freescale Communication Engine RISC core";
2221 case EM_TSK3000: return "Altium TSK3000 core";
2222 case EM_RS08: return "Freescale RS08 embedded processor";
2223 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2224 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2225 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2226 case EM_SE_C17: return "Seiko Epson C17 family";
2227 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2228 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2229 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2230 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2231 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2232 case EM_R32C: return "Renesas R32C series microprocessors";
2233 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2234 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2235 case EM_8051: return "Intel 8051 and variants";
2236 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2237 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2238 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2239 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2240 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2241 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2242 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2243 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2244 case EM_CR16:
2245 case EM_MICROBLAZE:
2246 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2247 case EM_RL78: return "Renesas RL78";
2248 case EM_RX: return "Renesas RX";
2249 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2250 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2251 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2252 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2253 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2254 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2255 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2256 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2257 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2258 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2259 case EM_CUDA: return "NVIDIA CUDA architecture";
2260 case EM_XGATE: return "Motorola XGATE embedded processor";
2261 default:
2262 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2263 return buff;
2264 }
2265 }
2266
2267 static void
2268 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2269 {
2270 unsigned eabi;
2271 int unknown = 0;
2272
2273 eabi = EF_ARM_EABI_VERSION (e_flags);
2274 e_flags &= ~ EF_ARM_EABIMASK;
2275
2276 /* Handle "generic" ARM flags. */
2277 if (e_flags & EF_ARM_RELEXEC)
2278 {
2279 strcat (buf, ", relocatable executable");
2280 e_flags &= ~ EF_ARM_RELEXEC;
2281 }
2282
2283 if (e_flags & EF_ARM_HASENTRY)
2284 {
2285 strcat (buf, ", has entry point");
2286 e_flags &= ~ EF_ARM_HASENTRY;
2287 }
2288
2289 /* Now handle EABI specific flags. */
2290 switch (eabi)
2291 {
2292 default:
2293 strcat (buf, ", <unrecognized EABI>");
2294 if (e_flags)
2295 unknown = 1;
2296 break;
2297
2298 case EF_ARM_EABI_VER1:
2299 strcat (buf, ", Version1 EABI");
2300 while (e_flags)
2301 {
2302 unsigned flag;
2303
2304 /* Process flags one bit at a time. */
2305 flag = e_flags & - e_flags;
2306 e_flags &= ~ flag;
2307
2308 switch (flag)
2309 {
2310 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2311 strcat (buf, ", sorted symbol tables");
2312 break;
2313
2314 default:
2315 unknown = 1;
2316 break;
2317 }
2318 }
2319 break;
2320
2321 case EF_ARM_EABI_VER2:
2322 strcat (buf, ", Version2 EABI");
2323 while (e_flags)
2324 {
2325 unsigned flag;
2326
2327 /* Process flags one bit at a time. */
2328 flag = e_flags & - e_flags;
2329 e_flags &= ~ flag;
2330
2331 switch (flag)
2332 {
2333 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2334 strcat (buf, ", sorted symbol tables");
2335 break;
2336
2337 case EF_ARM_DYNSYMSUSESEGIDX:
2338 strcat (buf, ", dynamic symbols use segment index");
2339 break;
2340
2341 case EF_ARM_MAPSYMSFIRST:
2342 strcat (buf, ", mapping symbols precede others");
2343 break;
2344
2345 default:
2346 unknown = 1;
2347 break;
2348 }
2349 }
2350 break;
2351
2352 case EF_ARM_EABI_VER3:
2353 strcat (buf, ", Version3 EABI");
2354 break;
2355
2356 case EF_ARM_EABI_VER4:
2357 strcat (buf, ", Version4 EABI");
2358 while (e_flags)
2359 {
2360 unsigned flag;
2361
2362 /* Process flags one bit at a time. */
2363 flag = e_flags & - e_flags;
2364 e_flags &= ~ flag;
2365
2366 switch (flag)
2367 {
2368 case EF_ARM_BE8:
2369 strcat (buf, ", BE8");
2370 break;
2371
2372 case EF_ARM_LE8:
2373 strcat (buf, ", LE8");
2374 break;
2375
2376 default:
2377 unknown = 1;
2378 break;
2379 }
2380 break;
2381 }
2382 break;
2383
2384 case EF_ARM_EABI_VER5:
2385 strcat (buf, ", Version5 EABI");
2386 while (e_flags)
2387 {
2388 unsigned flag;
2389
2390 /* Process flags one bit at a time. */
2391 flag = e_flags & - e_flags;
2392 e_flags &= ~ flag;
2393
2394 switch (flag)
2395 {
2396 case EF_ARM_BE8:
2397 strcat (buf, ", BE8");
2398 break;
2399
2400 case EF_ARM_LE8:
2401 strcat (buf, ", LE8");
2402 break;
2403
2404 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2405 strcat (buf, ", soft-float ABI");
2406 break;
2407
2408 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2409 strcat (buf, ", hard-float ABI");
2410 break;
2411
2412 default:
2413 unknown = 1;
2414 break;
2415 }
2416 }
2417 break;
2418
2419 case EF_ARM_EABI_UNKNOWN:
2420 strcat (buf, ", GNU EABI");
2421 while (e_flags)
2422 {
2423 unsigned flag;
2424
2425 /* Process flags one bit at a time. */
2426 flag = e_flags & - e_flags;
2427 e_flags &= ~ flag;
2428
2429 switch (flag)
2430 {
2431 case EF_ARM_INTERWORK:
2432 strcat (buf, ", interworking enabled");
2433 break;
2434
2435 case EF_ARM_APCS_26:
2436 strcat (buf, ", uses APCS/26");
2437 break;
2438
2439 case EF_ARM_APCS_FLOAT:
2440 strcat (buf, ", uses APCS/float");
2441 break;
2442
2443 case EF_ARM_PIC:
2444 strcat (buf, ", position independent");
2445 break;
2446
2447 case EF_ARM_ALIGN8:
2448 strcat (buf, ", 8 bit structure alignment");
2449 break;
2450
2451 case EF_ARM_NEW_ABI:
2452 strcat (buf, ", uses new ABI");
2453 break;
2454
2455 case EF_ARM_OLD_ABI:
2456 strcat (buf, ", uses old ABI");
2457 break;
2458
2459 case EF_ARM_SOFT_FLOAT:
2460 strcat (buf, ", software FP");
2461 break;
2462
2463 case EF_ARM_VFP_FLOAT:
2464 strcat (buf, ", VFP");
2465 break;
2466
2467 case EF_ARM_MAVERICK_FLOAT:
2468 strcat (buf, ", Maverick FP");
2469 break;
2470
2471 default:
2472 unknown = 1;
2473 break;
2474 }
2475 }
2476 }
2477
2478 if (unknown)
2479 strcat (buf,_(", <unknown>"));
2480 }
2481
2482 static void
2483 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2484 {
2485 --size; /* Leave space for null terminator. */
2486
2487 switch (e_flags & EF_AVR_MACH)
2488 {
2489 case E_AVR_MACH_AVR1:
2490 strncat (buf, ", avr:1", size);
2491 break;
2492 case E_AVR_MACH_AVR2:
2493 strncat (buf, ", avr:2", size);
2494 break;
2495 case E_AVR_MACH_AVR25:
2496 strncat (buf, ", avr:25", size);
2497 break;
2498 case E_AVR_MACH_AVR3:
2499 strncat (buf, ", avr:3", size);
2500 break;
2501 case E_AVR_MACH_AVR31:
2502 strncat (buf, ", avr:31", size);
2503 break;
2504 case E_AVR_MACH_AVR35:
2505 strncat (buf, ", avr:35", size);
2506 break;
2507 case E_AVR_MACH_AVR4:
2508 strncat (buf, ", avr:4", size);
2509 break;
2510 case E_AVR_MACH_AVR5:
2511 strncat (buf, ", avr:5", size);
2512 break;
2513 case E_AVR_MACH_AVR51:
2514 strncat (buf, ", avr:51", size);
2515 break;
2516 case E_AVR_MACH_AVR6:
2517 strncat (buf, ", avr:6", size);
2518 break;
2519 case E_AVR_MACH_AVRTINY:
2520 strncat (buf, ", avr:100", size);
2521 break;
2522 case E_AVR_MACH_XMEGA1:
2523 strncat (buf, ", avr:101", size);
2524 break;
2525 case E_AVR_MACH_XMEGA2:
2526 strncat (buf, ", avr:102", size);
2527 break;
2528 case E_AVR_MACH_XMEGA3:
2529 strncat (buf, ", avr:103", size);
2530 break;
2531 case E_AVR_MACH_XMEGA4:
2532 strncat (buf, ", avr:104", size);
2533 break;
2534 case E_AVR_MACH_XMEGA5:
2535 strncat (buf, ", avr:105", size);
2536 break;
2537 case E_AVR_MACH_XMEGA6:
2538 strncat (buf, ", avr:106", size);
2539 break;
2540 case E_AVR_MACH_XMEGA7:
2541 strncat (buf, ", avr:107", size);
2542 break;
2543 default:
2544 strncat (buf, ", avr:<unknown>", size);
2545 break;
2546 }
2547
2548 size -= strlen (buf);
2549 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2550 strncat (buf, ", link-relax", size);
2551 }
2552
2553 static void
2554 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2555 {
2556 unsigned abi;
2557 unsigned arch;
2558 unsigned config;
2559 unsigned version;
2560 int has_fpu = 0;
2561 int r = 0;
2562
2563 static const char *ABI_STRINGS[] =
2564 {
2565 "ABI v0", /* use r5 as return register; only used in N1213HC */
2566 "ABI v1", /* use r0 as return register */
2567 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2568 "ABI v2fp", /* for FPU */
2569 "AABI",
2570 "ABI2 FP+"
2571 };
2572 static const char *VER_STRINGS[] =
2573 {
2574 "Andes ELF V1.3 or older",
2575 "Andes ELF V1.3.1",
2576 "Andes ELF V1.4"
2577 };
2578 static const char *ARCH_STRINGS[] =
2579 {
2580 "",
2581 "Andes Star v1.0",
2582 "Andes Star v2.0",
2583 "Andes Star v3.0",
2584 "Andes Star v3.0m"
2585 };
2586
2587 abi = EF_NDS_ABI & e_flags;
2588 arch = EF_NDS_ARCH & e_flags;
2589 config = EF_NDS_INST & e_flags;
2590 version = EF_NDS32_ELF_VERSION & e_flags;
2591
2592 memset (buf, 0, size);
2593
2594 switch (abi)
2595 {
2596 case E_NDS_ABI_V0:
2597 case E_NDS_ABI_V1:
2598 case E_NDS_ABI_V2:
2599 case E_NDS_ABI_V2FP:
2600 case E_NDS_ABI_AABI:
2601 case E_NDS_ABI_V2FP_PLUS:
2602 /* In case there are holes in the array. */
2603 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2604 break;
2605
2606 default:
2607 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2608 break;
2609 }
2610
2611 switch (version)
2612 {
2613 case E_NDS32_ELF_VER_1_2:
2614 case E_NDS32_ELF_VER_1_3:
2615 case E_NDS32_ELF_VER_1_4:
2616 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2617 break;
2618
2619 default:
2620 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2621 break;
2622 }
2623
2624 if (E_NDS_ABI_V0 == abi)
2625 {
2626 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2627 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2628 if (arch == E_NDS_ARCH_STAR_V1_0)
2629 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2630 return;
2631 }
2632
2633 switch (arch)
2634 {
2635 case E_NDS_ARCH_STAR_V1_0:
2636 case E_NDS_ARCH_STAR_V2_0:
2637 case E_NDS_ARCH_STAR_V3_0:
2638 case E_NDS_ARCH_STAR_V3_M:
2639 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2640 break;
2641
2642 default:
2643 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2644 /* ARCH version determines how the e_flags are interpreted.
2645 If it is unknown, we cannot proceed. */
2646 return;
2647 }
2648
2649 /* Newer ABI; Now handle architecture specific flags. */
2650 if (arch == E_NDS_ARCH_STAR_V1_0)
2651 {
2652 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2653 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2654
2655 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2656 r += snprintf (buf + r, size -r, ", MAC");
2657
2658 if (config & E_NDS32_HAS_DIV_INST)
2659 r += snprintf (buf + r, size -r, ", DIV");
2660
2661 if (config & E_NDS32_HAS_16BIT_INST)
2662 r += snprintf (buf + r, size -r, ", 16b");
2663 }
2664 else
2665 {
2666 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2667 {
2668 if (version <= E_NDS32_ELF_VER_1_3)
2669 r += snprintf (buf + r, size -r, ", [B8]");
2670 else
2671 r += snprintf (buf + r, size -r, ", EX9");
2672 }
2673
2674 if (config & E_NDS32_HAS_MAC_DX_INST)
2675 r += snprintf (buf + r, size -r, ", MAC_DX");
2676
2677 if (config & E_NDS32_HAS_DIV_DX_INST)
2678 r += snprintf (buf + r, size -r, ", DIV_DX");
2679
2680 if (config & E_NDS32_HAS_16BIT_INST)
2681 {
2682 if (version <= E_NDS32_ELF_VER_1_3)
2683 r += snprintf (buf + r, size -r, ", 16b");
2684 else
2685 r += snprintf (buf + r, size -r, ", IFC");
2686 }
2687 }
2688
2689 if (config & E_NDS32_HAS_EXT_INST)
2690 r += snprintf (buf + r, size -r, ", PERF1");
2691
2692 if (config & E_NDS32_HAS_EXT2_INST)
2693 r += snprintf (buf + r, size -r, ", PERF2");
2694
2695 if (config & E_NDS32_HAS_FPU_INST)
2696 {
2697 has_fpu = 1;
2698 r += snprintf (buf + r, size -r, ", FPU_SP");
2699 }
2700
2701 if (config & E_NDS32_HAS_FPU_DP_INST)
2702 {
2703 has_fpu = 1;
2704 r += snprintf (buf + r, size -r, ", FPU_DP");
2705 }
2706
2707 if (config & E_NDS32_HAS_FPU_MAC_INST)
2708 {
2709 has_fpu = 1;
2710 r += snprintf (buf + r, size -r, ", FPU_MAC");
2711 }
2712
2713 if (has_fpu)
2714 {
2715 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2716 {
2717 case E_NDS32_FPU_REG_8SP_4DP:
2718 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2719 break;
2720 case E_NDS32_FPU_REG_16SP_8DP:
2721 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2722 break;
2723 case E_NDS32_FPU_REG_32SP_16DP:
2724 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2725 break;
2726 case E_NDS32_FPU_REG_32SP_32DP:
2727 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2728 break;
2729 }
2730 }
2731
2732 if (config & E_NDS32_HAS_AUDIO_INST)
2733 r += snprintf (buf + r, size -r, ", AUDIO");
2734
2735 if (config & E_NDS32_HAS_STRING_INST)
2736 r += snprintf (buf + r, size -r, ", STR");
2737
2738 if (config & E_NDS32_HAS_REDUCED_REGS)
2739 r += snprintf (buf + r, size -r, ", 16REG");
2740
2741 if (config & E_NDS32_HAS_VIDEO_INST)
2742 {
2743 if (version <= E_NDS32_ELF_VER_1_3)
2744 r += snprintf (buf + r, size -r, ", VIDEO");
2745 else
2746 r += snprintf (buf + r, size -r, ", SATURATION");
2747 }
2748
2749 if (config & E_NDS32_HAS_ENCRIPT_INST)
2750 r += snprintf (buf + r, size -r, ", ENCRP");
2751
2752 if (config & E_NDS32_HAS_L2C_INST)
2753 r += snprintf (buf + r, size -r, ", L2C");
2754 }
2755
2756 static char *
2757 get_machine_flags (unsigned e_flags, unsigned e_machine)
2758 {
2759 static char buf[1024];
2760
2761 buf[0] = '\0';
2762
2763 if (e_flags)
2764 {
2765 switch (e_machine)
2766 {
2767 default:
2768 break;
2769
2770 case EM_ARM:
2771 decode_ARM_machine_flags (e_flags, buf);
2772 break;
2773
2774 case EM_AVR:
2775 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2776 break;
2777
2778 case EM_BLACKFIN:
2779 if (e_flags & EF_BFIN_PIC)
2780 strcat (buf, ", PIC");
2781
2782 if (e_flags & EF_BFIN_FDPIC)
2783 strcat (buf, ", FDPIC");
2784
2785 if (e_flags & EF_BFIN_CODE_IN_L1)
2786 strcat (buf, ", code in L1");
2787
2788 if (e_flags & EF_BFIN_DATA_IN_L1)
2789 strcat (buf, ", data in L1");
2790
2791 break;
2792
2793 case EM_CYGNUS_FRV:
2794 switch (e_flags & EF_FRV_CPU_MASK)
2795 {
2796 case EF_FRV_CPU_GENERIC:
2797 break;
2798
2799 default:
2800 strcat (buf, ", fr???");
2801 break;
2802
2803 case EF_FRV_CPU_FR300:
2804 strcat (buf, ", fr300");
2805 break;
2806
2807 case EF_FRV_CPU_FR400:
2808 strcat (buf, ", fr400");
2809 break;
2810 case EF_FRV_CPU_FR405:
2811 strcat (buf, ", fr405");
2812 break;
2813
2814 case EF_FRV_CPU_FR450:
2815 strcat (buf, ", fr450");
2816 break;
2817
2818 case EF_FRV_CPU_FR500:
2819 strcat (buf, ", fr500");
2820 break;
2821 case EF_FRV_CPU_FR550:
2822 strcat (buf, ", fr550");
2823 break;
2824
2825 case EF_FRV_CPU_SIMPLE:
2826 strcat (buf, ", simple");
2827 break;
2828 case EF_FRV_CPU_TOMCAT:
2829 strcat (buf, ", tomcat");
2830 break;
2831 }
2832 break;
2833
2834 case EM_68K:
2835 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2836 strcat (buf, ", m68000");
2837 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2838 strcat (buf, ", cpu32");
2839 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2840 strcat (buf, ", fido_a");
2841 else
2842 {
2843 char const * isa = _("unknown");
2844 char const * mac = _("unknown mac");
2845 char const * additional = NULL;
2846
2847 switch (e_flags & EF_M68K_CF_ISA_MASK)
2848 {
2849 case EF_M68K_CF_ISA_A_NODIV:
2850 isa = "A";
2851 additional = ", nodiv";
2852 break;
2853 case EF_M68K_CF_ISA_A:
2854 isa = "A";
2855 break;
2856 case EF_M68K_CF_ISA_A_PLUS:
2857 isa = "A+";
2858 break;
2859 case EF_M68K_CF_ISA_B_NOUSP:
2860 isa = "B";
2861 additional = ", nousp";
2862 break;
2863 case EF_M68K_CF_ISA_B:
2864 isa = "B";
2865 break;
2866 case EF_M68K_CF_ISA_C:
2867 isa = "C";
2868 break;
2869 case EF_M68K_CF_ISA_C_NODIV:
2870 isa = "C";
2871 additional = ", nodiv";
2872 break;
2873 }
2874 strcat (buf, ", cf, isa ");
2875 strcat (buf, isa);
2876 if (additional)
2877 strcat (buf, additional);
2878 if (e_flags & EF_M68K_CF_FLOAT)
2879 strcat (buf, ", float");
2880 switch (e_flags & EF_M68K_CF_MAC_MASK)
2881 {
2882 case 0:
2883 mac = NULL;
2884 break;
2885 case EF_M68K_CF_MAC:
2886 mac = "mac";
2887 break;
2888 case EF_M68K_CF_EMAC:
2889 mac = "emac";
2890 break;
2891 case EF_M68K_CF_EMAC_B:
2892 mac = "emac_b";
2893 break;
2894 }
2895 if (mac)
2896 {
2897 strcat (buf, ", ");
2898 strcat (buf, mac);
2899 }
2900 }
2901 break;
2902
2903 case EM_PPC:
2904 if (e_flags & EF_PPC_EMB)
2905 strcat (buf, ", emb");
2906
2907 if (e_flags & EF_PPC_RELOCATABLE)
2908 strcat (buf, _(", relocatable"));
2909
2910 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2911 strcat (buf, _(", relocatable-lib"));
2912 break;
2913
2914 case EM_PPC64:
2915 if (e_flags & EF_PPC64_ABI)
2916 {
2917 char abi[] = ", abiv0";
2918
2919 abi[6] += e_flags & EF_PPC64_ABI;
2920 strcat (buf, abi);
2921 }
2922 break;
2923
2924 case EM_V800:
2925 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2926 strcat (buf, ", RH850 ABI");
2927
2928 if (e_flags & EF_V800_850E3)
2929 strcat (buf, ", V3 architecture");
2930
2931 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2932 strcat (buf, ", FPU not used");
2933
2934 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2935 strcat (buf, ", regmode: COMMON");
2936
2937 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2938 strcat (buf, ", r4 not used");
2939
2940 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2941 strcat (buf, ", r30 not used");
2942
2943 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2944 strcat (buf, ", r5 not used");
2945
2946 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2947 strcat (buf, ", r2 not used");
2948
2949 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2950 {
2951 switch (e_flags & - e_flags)
2952 {
2953 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2954 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2955 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2956 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2957 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2958 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2959 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2960 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2961 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2962 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2963 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2964 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2965 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2966 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2967 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2968 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2969 default: break;
2970 }
2971 }
2972 break;
2973
2974 case EM_V850:
2975 case EM_CYGNUS_V850:
2976 switch (e_flags & EF_V850_ARCH)
2977 {
2978 case E_V850E3V5_ARCH:
2979 strcat (buf, ", v850e3v5");
2980 break;
2981 case E_V850E2V3_ARCH:
2982 strcat (buf, ", v850e2v3");
2983 break;
2984 case E_V850E2_ARCH:
2985 strcat (buf, ", v850e2");
2986 break;
2987 case E_V850E1_ARCH:
2988 strcat (buf, ", v850e1");
2989 break;
2990 case E_V850E_ARCH:
2991 strcat (buf, ", v850e");
2992 break;
2993 case E_V850_ARCH:
2994 strcat (buf, ", v850");
2995 break;
2996 default:
2997 strcat (buf, _(", unknown v850 architecture variant"));
2998 break;
2999 }
3000 break;
3001
3002 case EM_M32R:
3003 case EM_CYGNUS_M32R:
3004 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3005 strcat (buf, ", m32r");
3006 break;
3007
3008 case EM_MIPS:
3009 case EM_MIPS_RS3_LE:
3010 if (e_flags & EF_MIPS_NOREORDER)
3011 strcat (buf, ", noreorder");
3012
3013 if (e_flags & EF_MIPS_PIC)
3014 strcat (buf, ", pic");
3015
3016 if (e_flags & EF_MIPS_CPIC)
3017 strcat (buf, ", cpic");
3018
3019 if (e_flags & EF_MIPS_UCODE)
3020 strcat (buf, ", ugen_reserved");
3021
3022 if (e_flags & EF_MIPS_ABI2)
3023 strcat (buf, ", abi2");
3024
3025 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3026 strcat (buf, ", odk first");
3027
3028 if (e_flags & EF_MIPS_32BITMODE)
3029 strcat (buf, ", 32bitmode");
3030
3031 if (e_flags & EF_MIPS_NAN2008)
3032 strcat (buf, ", nan2008");
3033
3034 if (e_flags & EF_MIPS_FP64)
3035 strcat (buf, ", fp64");
3036
3037 switch ((e_flags & EF_MIPS_MACH))
3038 {
3039 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3040 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3041 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3042 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3043 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3044 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3045 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3046 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3047 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3048 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3049 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3050 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3051 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3052 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3053 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3054 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3055 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3056 case 0:
3057 /* We simply ignore the field in this case to avoid confusion:
3058 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3059 extension. */
3060 break;
3061 default: strcat (buf, _(", unknown CPU")); break;
3062 }
3063
3064 switch ((e_flags & EF_MIPS_ABI))
3065 {
3066 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3067 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3068 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3069 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3070 case 0:
3071 /* We simply ignore the field in this case to avoid confusion:
3072 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3073 This means it is likely to be an o32 file, but not for
3074 sure. */
3075 break;
3076 default: strcat (buf, _(", unknown ABI")); break;
3077 }
3078
3079 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3080 strcat (buf, ", mdmx");
3081
3082 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3083 strcat (buf, ", mips16");
3084
3085 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3086 strcat (buf, ", micromips");
3087
3088 switch ((e_flags & EF_MIPS_ARCH))
3089 {
3090 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3091 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3092 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3093 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3094 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3095 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3096 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3097 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3098 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3099 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3100 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3101 default: strcat (buf, _(", unknown ISA")); break;
3102 }
3103 break;
3104
3105 case EM_NDS32:
3106 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3107 break;
3108
3109 case EM_SH:
3110 switch ((e_flags & EF_SH_MACH_MASK))
3111 {
3112 case EF_SH1: strcat (buf, ", sh1"); break;
3113 case EF_SH2: strcat (buf, ", sh2"); break;
3114 case EF_SH3: strcat (buf, ", sh3"); break;
3115 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3116 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3117 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3118 case EF_SH3E: strcat (buf, ", sh3e"); break;
3119 case EF_SH4: strcat (buf, ", sh4"); break;
3120 case EF_SH5: strcat (buf, ", sh5"); break;
3121 case EF_SH2E: strcat (buf, ", sh2e"); break;
3122 case EF_SH4A: strcat (buf, ", sh4a"); break;
3123 case EF_SH2A: strcat (buf, ", sh2a"); break;
3124 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3125 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3126 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3127 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3128 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3129 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3130 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3131 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3132 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3133 default: strcat (buf, _(", unknown ISA")); break;
3134 }
3135
3136 if (e_flags & EF_SH_PIC)
3137 strcat (buf, ", pic");
3138
3139 if (e_flags & EF_SH_FDPIC)
3140 strcat (buf, ", fdpic");
3141 break;
3142
3143 case EM_OR1K:
3144 if (e_flags & EF_OR1K_NODELAY)
3145 strcat (buf, ", no delay");
3146 break;
3147
3148 case EM_SPARCV9:
3149 if (e_flags & EF_SPARC_32PLUS)
3150 strcat (buf, ", v8+");
3151
3152 if (e_flags & EF_SPARC_SUN_US1)
3153 strcat (buf, ", ultrasparcI");
3154
3155 if (e_flags & EF_SPARC_SUN_US3)
3156 strcat (buf, ", ultrasparcIII");
3157
3158 if (e_flags & EF_SPARC_HAL_R1)
3159 strcat (buf, ", halr1");
3160
3161 if (e_flags & EF_SPARC_LEDATA)
3162 strcat (buf, ", ledata");
3163
3164 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3165 strcat (buf, ", tso");
3166
3167 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3168 strcat (buf, ", pso");
3169
3170 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3171 strcat (buf, ", rmo");
3172 break;
3173
3174 case EM_PARISC:
3175 switch (e_flags & EF_PARISC_ARCH)
3176 {
3177 case EFA_PARISC_1_0:
3178 strcpy (buf, ", PA-RISC 1.0");
3179 break;
3180 case EFA_PARISC_1_1:
3181 strcpy (buf, ", PA-RISC 1.1");
3182 break;
3183 case EFA_PARISC_2_0:
3184 strcpy (buf, ", PA-RISC 2.0");
3185 break;
3186 default:
3187 break;
3188 }
3189 if (e_flags & EF_PARISC_TRAPNIL)
3190 strcat (buf, ", trapnil");
3191 if (e_flags & EF_PARISC_EXT)
3192 strcat (buf, ", ext");
3193 if (e_flags & EF_PARISC_LSB)
3194 strcat (buf, ", lsb");
3195 if (e_flags & EF_PARISC_WIDE)
3196 strcat (buf, ", wide");
3197 if (e_flags & EF_PARISC_NO_KABP)
3198 strcat (buf, ", no kabp");
3199 if (e_flags & EF_PARISC_LAZYSWAP)
3200 strcat (buf, ", lazyswap");
3201 break;
3202
3203 case EM_PJ:
3204 case EM_PJ_OLD:
3205 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3206 strcat (buf, ", new calling convention");
3207
3208 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3209 strcat (buf, ", gnu calling convention");
3210 break;
3211
3212 case EM_IA_64:
3213 if ((e_flags & EF_IA_64_ABI64))
3214 strcat (buf, ", 64-bit");
3215 else
3216 strcat (buf, ", 32-bit");
3217 if ((e_flags & EF_IA_64_REDUCEDFP))
3218 strcat (buf, ", reduced fp model");
3219 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3220 strcat (buf, ", no function descriptors, constant gp");
3221 else if ((e_flags & EF_IA_64_CONS_GP))
3222 strcat (buf, ", constant gp");
3223 if ((e_flags & EF_IA_64_ABSOLUTE))
3224 strcat (buf, ", absolute");
3225 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3226 {
3227 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3228 strcat (buf, ", vms_linkages");
3229 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3230 {
3231 case EF_IA_64_VMS_COMCOD_SUCCESS:
3232 break;
3233 case EF_IA_64_VMS_COMCOD_WARNING:
3234 strcat (buf, ", warning");
3235 break;
3236 case EF_IA_64_VMS_COMCOD_ERROR:
3237 strcat (buf, ", error");
3238 break;
3239 case EF_IA_64_VMS_COMCOD_ABORT:
3240 strcat (buf, ", abort");
3241 break;
3242 default:
3243 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3244 e_flags & EF_IA_64_VMS_COMCOD);
3245 strcat (buf, ", <unknown>");
3246 }
3247 }
3248 break;
3249
3250 case EM_VAX:
3251 if ((e_flags & EF_VAX_NONPIC))
3252 strcat (buf, ", non-PIC");
3253 if ((e_flags & EF_VAX_DFLOAT))
3254 strcat (buf, ", D-Float");
3255 if ((e_flags & EF_VAX_GFLOAT))
3256 strcat (buf, ", G-Float");
3257 break;
3258
3259 case EM_VISIUM:
3260 if (e_flags & EF_VISIUM_ARCH_MCM)
3261 strcat (buf, ", mcm");
3262 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3263 strcat (buf, ", mcm24");
3264 if (e_flags & EF_VISIUM_ARCH_GR6)
3265 strcat (buf, ", gr6");
3266 break;
3267
3268 case EM_RL78:
3269 if (e_flags & E_FLAG_RL78_G10)
3270 strcat (buf, ", G10");
3271 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3272 strcat (buf, ", 64-bit doubles");
3273 break;
3274
3275 case EM_RX:
3276 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3277 strcat (buf, ", 64-bit doubles");
3278 if (e_flags & E_FLAG_RX_DSP)
3279 strcat (buf, ", dsp");
3280 if (e_flags & E_FLAG_RX_PID)
3281 strcat (buf, ", pid");
3282 if (e_flags & E_FLAG_RX_ABI)
3283 strcat (buf, ", RX ABI");
3284 break;
3285
3286 case EM_S390:
3287 if (e_flags & EF_S390_HIGH_GPRS)
3288 strcat (buf, ", highgprs");
3289 break;
3290
3291 case EM_TI_C6000:
3292 if ((e_flags & EF_C6000_REL))
3293 strcat (buf, ", relocatable module");
3294 break;
3295
3296 case EM_MSP430:
3297 strcat (buf, _(": architecture variant: "));
3298 switch (e_flags & EF_MSP430_MACH)
3299 {
3300 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3301 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3302 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3303 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3304 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3305 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3306 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3307 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3308 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3309 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3310 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3311 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3312 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3313 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3314 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3315 default:
3316 strcat (buf, _(": unknown")); break;
3317 }
3318
3319 if (e_flags & ~ EF_MSP430_MACH)
3320 strcat (buf, _(": unknown extra flag bits also present"));
3321 }
3322 }
3323
3324 return buf;
3325 }
3326
3327 static const char *
3328 get_osabi_name (unsigned int osabi)
3329 {
3330 static char buff[32];
3331
3332 switch (osabi)
3333 {
3334 case ELFOSABI_NONE: return "UNIX - System V";
3335 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3336 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3337 case ELFOSABI_GNU: return "UNIX - GNU";
3338 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3339 case ELFOSABI_AIX: return "UNIX - AIX";
3340 case ELFOSABI_IRIX: return "UNIX - IRIX";
3341 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3342 case ELFOSABI_TRU64: return "UNIX - TRU64";
3343 case ELFOSABI_MODESTO: return "Novell - Modesto";
3344 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3345 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3346 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3347 case ELFOSABI_AROS: return "AROS";
3348 case ELFOSABI_FENIXOS: return "FenixOS";
3349 default:
3350 if (osabi >= 64)
3351 switch (elf_header.e_machine)
3352 {
3353 case EM_ARM:
3354 switch (osabi)
3355 {
3356 case ELFOSABI_ARM: return "ARM";
3357 default:
3358 break;
3359 }
3360 break;
3361
3362 case EM_MSP430:
3363 case EM_MSP430_OLD:
3364 case EM_VISIUM:
3365 switch (osabi)
3366 {
3367 case ELFOSABI_STANDALONE: return _("Standalone App");
3368 default:
3369 break;
3370 }
3371 break;
3372
3373 case EM_TI_C6000:
3374 switch (osabi)
3375 {
3376 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3377 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3378 default:
3379 break;
3380 }
3381 break;
3382
3383 default:
3384 break;
3385 }
3386 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3387 return buff;
3388 }
3389 }
3390
3391 static const char *
3392 get_aarch64_segment_type (unsigned long type)
3393 {
3394 switch (type)
3395 {
3396 case PT_AARCH64_ARCHEXT:
3397 return "AARCH64_ARCHEXT";
3398 default:
3399 break;
3400 }
3401
3402 return NULL;
3403 }
3404
3405 static const char *
3406 get_arm_segment_type (unsigned long type)
3407 {
3408 switch (type)
3409 {
3410 case PT_ARM_EXIDX:
3411 return "EXIDX";
3412 default:
3413 break;
3414 }
3415
3416 return NULL;
3417 }
3418
3419 static const char *
3420 get_mips_segment_type (unsigned long type)
3421 {
3422 switch (type)
3423 {
3424 case PT_MIPS_REGINFO:
3425 return "REGINFO";
3426 case PT_MIPS_RTPROC:
3427 return "RTPROC";
3428 case PT_MIPS_OPTIONS:
3429 return "OPTIONS";
3430 case PT_MIPS_ABIFLAGS:
3431 return "ABIFLAGS";
3432 default:
3433 break;
3434 }
3435
3436 return NULL;
3437 }
3438
3439 static const char *
3440 get_parisc_segment_type (unsigned long type)
3441 {
3442 switch (type)
3443 {
3444 case PT_HP_TLS: return "HP_TLS";
3445 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3446 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3447 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3448 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3449 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3450 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3451 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3452 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3453 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3454 case PT_HP_PARALLEL: return "HP_PARALLEL";
3455 case PT_HP_FASTBIND: return "HP_FASTBIND";
3456 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3457 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3458 case PT_HP_STACK: return "HP_STACK";
3459 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3460 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3461 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3462 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3463 default:
3464 break;
3465 }
3466
3467 return NULL;
3468 }
3469
3470 static const char *
3471 get_ia64_segment_type (unsigned long type)
3472 {
3473 switch (type)
3474 {
3475 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3476 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3477 case PT_HP_TLS: return "HP_TLS";
3478 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3479 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3480 case PT_IA_64_HP_STACK: return "HP_STACK";
3481 default:
3482 break;
3483 }
3484
3485 return NULL;
3486 }
3487
3488 static const char *
3489 get_tic6x_segment_type (unsigned long type)
3490 {
3491 switch (type)
3492 {
3493 case PT_C6000_PHATTR: return "C6000_PHATTR";
3494 default:
3495 break;
3496 }
3497
3498 return NULL;
3499 }
3500
3501 static const char *
3502 get_segment_type (unsigned long p_type)
3503 {
3504 static char buff[32];
3505
3506 switch (p_type)
3507 {
3508 case PT_NULL: return "NULL";
3509 case PT_LOAD: return "LOAD";
3510 case PT_DYNAMIC: return "DYNAMIC";
3511 case PT_INTERP: return "INTERP";
3512 case PT_NOTE: return "NOTE";
3513 case PT_SHLIB: return "SHLIB";
3514 case PT_PHDR: return "PHDR";
3515 case PT_TLS: return "TLS";
3516
3517 case PT_GNU_EH_FRAME:
3518 return "GNU_EH_FRAME";
3519 case PT_GNU_STACK: return "GNU_STACK";
3520 case PT_GNU_RELRO: return "GNU_RELRO";
3521
3522 default:
3523 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3524 {
3525 const char * result;
3526
3527 switch (elf_header.e_machine)
3528 {
3529 case EM_AARCH64:
3530 result = get_aarch64_segment_type (p_type);
3531 break;
3532 case EM_ARM:
3533 result = get_arm_segment_type (p_type);
3534 break;
3535 case EM_MIPS:
3536 case EM_MIPS_RS3_LE:
3537 result = get_mips_segment_type (p_type);
3538 break;
3539 case EM_PARISC:
3540 result = get_parisc_segment_type (p_type);
3541 break;
3542 case EM_IA_64:
3543 result = get_ia64_segment_type (p_type);
3544 break;
3545 case EM_TI_C6000:
3546 result = get_tic6x_segment_type (p_type);
3547 break;
3548 default:
3549 result = NULL;
3550 break;
3551 }
3552
3553 if (result != NULL)
3554 return result;
3555
3556 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3557 }
3558 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3559 {
3560 const char * result;
3561
3562 switch (elf_header.e_machine)
3563 {
3564 case EM_PARISC:
3565 result = get_parisc_segment_type (p_type);
3566 break;
3567 case EM_IA_64:
3568 result = get_ia64_segment_type (p_type);
3569 break;
3570 default:
3571 result = NULL;
3572 break;
3573 }
3574
3575 if (result != NULL)
3576 return result;
3577
3578 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3579 }
3580 else
3581 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3582
3583 return buff;
3584 }
3585 }
3586
3587 static const char *
3588 get_mips_section_type_name (unsigned int sh_type)
3589 {
3590 switch (sh_type)
3591 {
3592 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3593 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3594 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3595 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3596 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3597 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3598 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3599 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3600 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3601 case SHT_MIPS_RELD: return "MIPS_RELD";
3602 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3603 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3604 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3605 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3606 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3607 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3608 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3609 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3610 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3611 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3612 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3613 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3614 case SHT_MIPS_LINE: return "MIPS_LINE";
3615 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3616 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3617 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3618 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3619 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3620 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3621 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3622 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3623 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3624 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3625 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3626 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3627 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3628 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3629 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3630 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3631 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3632 default:
3633 break;
3634 }
3635 return NULL;
3636 }
3637
3638 static const char *
3639 get_parisc_section_type_name (unsigned int sh_type)
3640 {
3641 switch (sh_type)
3642 {
3643 case SHT_PARISC_EXT: return "PARISC_EXT";
3644 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3645 case SHT_PARISC_DOC: return "PARISC_DOC";
3646 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3647 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3648 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3649 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3650 default:
3651 break;
3652 }
3653 return NULL;
3654 }
3655
3656 static const char *
3657 get_ia64_section_type_name (unsigned int sh_type)
3658 {
3659 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3660 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3661 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3662
3663 switch (sh_type)
3664 {
3665 case SHT_IA_64_EXT: return "IA_64_EXT";
3666 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3667 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3668 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3669 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3670 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3671 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3672 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3673 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3674 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3675 default:
3676 break;
3677 }
3678 return NULL;
3679 }
3680
3681 static const char *
3682 get_x86_64_section_type_name (unsigned int sh_type)
3683 {
3684 switch (sh_type)
3685 {
3686 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3687 default:
3688 break;
3689 }
3690 return NULL;
3691 }
3692
3693 static const char *
3694 get_aarch64_section_type_name (unsigned int sh_type)
3695 {
3696 switch (sh_type)
3697 {
3698 case SHT_AARCH64_ATTRIBUTES:
3699 return "AARCH64_ATTRIBUTES";
3700 default:
3701 break;
3702 }
3703 return NULL;
3704 }
3705
3706 static const char *
3707 get_arm_section_type_name (unsigned int sh_type)
3708 {
3709 switch (sh_type)
3710 {
3711 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3712 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3713 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3714 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3715 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3716 default:
3717 break;
3718 }
3719 return NULL;
3720 }
3721
3722 static const char *
3723 get_tic6x_section_type_name (unsigned int sh_type)
3724 {
3725 switch (sh_type)
3726 {
3727 case SHT_C6000_UNWIND:
3728 return "C6000_UNWIND";
3729 case SHT_C6000_PREEMPTMAP:
3730 return "C6000_PREEMPTMAP";
3731 case SHT_C6000_ATTRIBUTES:
3732 return "C6000_ATTRIBUTES";
3733 case SHT_TI_ICODE:
3734 return "TI_ICODE";
3735 case SHT_TI_XREF:
3736 return "TI_XREF";
3737 case SHT_TI_HANDLER:
3738 return "TI_HANDLER";
3739 case SHT_TI_INITINFO:
3740 return "TI_INITINFO";
3741 case SHT_TI_PHATTRS:
3742 return "TI_PHATTRS";
3743 default:
3744 break;
3745 }
3746 return NULL;
3747 }
3748
3749 static const char *
3750 get_msp430x_section_type_name (unsigned int sh_type)
3751 {
3752 switch (sh_type)
3753 {
3754 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3755 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3756 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3757 default: return NULL;
3758 }
3759 }
3760
3761 static const char *
3762 get_section_type_name (unsigned int sh_type)
3763 {
3764 static char buff[32];
3765
3766 switch (sh_type)
3767 {
3768 case SHT_NULL: return "NULL";
3769 case SHT_PROGBITS: return "PROGBITS";
3770 case SHT_SYMTAB: return "SYMTAB";
3771 case SHT_STRTAB: return "STRTAB";
3772 case SHT_RELA: return "RELA";
3773 case SHT_HASH: return "HASH";
3774 case SHT_DYNAMIC: return "DYNAMIC";
3775 case SHT_NOTE: return "NOTE";
3776 case SHT_NOBITS: return "NOBITS";
3777 case SHT_REL: return "REL";
3778 case SHT_SHLIB: return "SHLIB";
3779 case SHT_DYNSYM: return "DYNSYM";
3780 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3781 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3782 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3783 case SHT_GNU_HASH: return "GNU_HASH";
3784 case SHT_GROUP: return "GROUP";
3785 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3786 case SHT_GNU_verdef: return "VERDEF";
3787 case SHT_GNU_verneed: return "VERNEED";
3788 case SHT_GNU_versym: return "VERSYM";
3789 case 0x6ffffff0: return "VERSYM";
3790 case 0x6ffffffc: return "VERDEF";
3791 case 0x7ffffffd: return "AUXILIARY";
3792 case 0x7fffffff: return "FILTER";
3793 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3794
3795 default:
3796 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3797 {
3798 const char * result;
3799
3800 switch (elf_header.e_machine)
3801 {
3802 case EM_MIPS:
3803 case EM_MIPS_RS3_LE:
3804 result = get_mips_section_type_name (sh_type);
3805 break;
3806 case EM_PARISC:
3807 result = get_parisc_section_type_name (sh_type);
3808 break;
3809 case EM_IA_64:
3810 result = get_ia64_section_type_name (sh_type);
3811 break;
3812 case EM_X86_64:
3813 case EM_L1OM:
3814 case EM_K1OM:
3815 result = get_x86_64_section_type_name (sh_type);
3816 break;
3817 case EM_AARCH64:
3818 result = get_aarch64_section_type_name (sh_type);
3819 break;
3820 case EM_ARM:
3821 result = get_arm_section_type_name (sh_type);
3822 break;
3823 case EM_TI_C6000:
3824 result = get_tic6x_section_type_name (sh_type);
3825 break;
3826 case EM_MSP430:
3827 result = get_msp430x_section_type_name (sh_type);
3828 break;
3829 default:
3830 result = NULL;
3831 break;
3832 }
3833
3834 if (result != NULL)
3835 return result;
3836
3837 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3838 }
3839 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3840 {
3841 const char * result;
3842
3843 switch (elf_header.e_machine)
3844 {
3845 case EM_IA_64:
3846 result = get_ia64_section_type_name (sh_type);
3847 break;
3848 default:
3849 result = NULL;
3850 break;
3851 }
3852
3853 if (result != NULL)
3854 return result;
3855
3856 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3857 }
3858 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3859 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3860 else
3861 /* This message is probably going to be displayed in a 15
3862 character wide field, so put the hex value first. */
3863 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3864
3865 return buff;
3866 }
3867 }
3868
3869 #define OPTION_DEBUG_DUMP 512
3870 #define OPTION_DYN_SYMS 513
3871 #define OPTION_DWARF_DEPTH 514
3872 #define OPTION_DWARF_START 515
3873 #define OPTION_DWARF_CHECK 516
3874
3875 static struct option options[] =
3876 {
3877 {"all", no_argument, 0, 'a'},
3878 {"file-header", no_argument, 0, 'h'},
3879 {"program-headers", no_argument, 0, 'l'},
3880 {"headers", no_argument, 0, 'e'},
3881 {"histogram", no_argument, 0, 'I'},
3882 {"segments", no_argument, 0, 'l'},
3883 {"sections", no_argument, 0, 'S'},
3884 {"section-headers", no_argument, 0, 'S'},
3885 {"section-groups", no_argument, 0, 'g'},
3886 {"section-details", no_argument, 0, 't'},
3887 {"full-section-name",no_argument, 0, 'N'},
3888 {"symbols", no_argument, 0, 's'},
3889 {"syms", no_argument, 0, 's'},
3890 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3891 {"relocs", no_argument, 0, 'r'},
3892 {"notes", no_argument, 0, 'n'},
3893 {"dynamic", no_argument, 0, 'd'},
3894 {"arch-specific", no_argument, 0, 'A'},
3895 {"version-info", no_argument, 0, 'V'},
3896 {"use-dynamic", no_argument, 0, 'D'},
3897 {"unwind", no_argument, 0, 'u'},
3898 {"archive-index", no_argument, 0, 'c'},
3899 {"hex-dump", required_argument, 0, 'x'},
3900 {"relocated-dump", required_argument, 0, 'R'},
3901 {"string-dump", required_argument, 0, 'p'},
3902 #ifdef SUPPORT_DISASSEMBLY
3903 {"instruction-dump", required_argument, 0, 'i'},
3904 #endif
3905 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3906
3907 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3908 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3909 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3910
3911 {"version", no_argument, 0, 'v'},
3912 {"wide", no_argument, 0, 'W'},
3913 {"help", no_argument, 0, 'H'},
3914 {0, no_argument, 0, 0}
3915 };
3916
3917 static void
3918 usage (FILE * stream)
3919 {
3920 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3921 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3922 fprintf (stream, _(" Options are:\n\
3923 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3924 -h --file-header Display the ELF file header\n\
3925 -l --program-headers Display the program headers\n\
3926 --segments An alias for --program-headers\n\
3927 -S --section-headers Display the sections' header\n\
3928 --sections An alias for --section-headers\n\
3929 -g --section-groups Display the section groups\n\
3930 -t --section-details Display the section details\n\
3931 -e --headers Equivalent to: -h -l -S\n\
3932 -s --syms Display the symbol table\n\
3933 --symbols An alias for --syms\n\
3934 --dyn-syms Display the dynamic symbol table\n\
3935 -n --notes Display the core notes (if present)\n\
3936 -r --relocs Display the relocations (if present)\n\
3937 -u --unwind Display the unwind info (if present)\n\
3938 -d --dynamic Display the dynamic section (if present)\n\
3939 -V --version-info Display the version sections (if present)\n\
3940 -A --arch-specific Display architecture specific information (if any)\n\
3941 -c --archive-index Display the symbol/file index in an archive\n\
3942 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3943 -x --hex-dump=<number|name>\n\
3944 Dump the contents of section <number|name> as bytes\n\
3945 -p --string-dump=<number|name>\n\
3946 Dump the contents of section <number|name> as strings\n\
3947 -R --relocated-dump=<number|name>\n\
3948 Dump the contents of section <number|name> as relocated bytes\n\
3949 -w[lLiaprmfFsoRt] or\n\
3950 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3951 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3952 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3953 =addr,=cu_index]\n\
3954 Display the contents of DWARF2 debug sections\n"));
3955 fprintf (stream, _("\
3956 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3957 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3958 or deeper\n"));
3959 #ifdef SUPPORT_DISASSEMBLY
3960 fprintf (stream, _("\
3961 -i --instruction-dump=<number|name>\n\
3962 Disassemble the contents of section <number|name>\n"));
3963 #endif
3964 fprintf (stream, _("\
3965 -I --histogram Display histogram of bucket list lengths\n\
3966 -W --wide Allow output width to exceed 80 characters\n\
3967 @<file> Read options from <file>\n\
3968 -H --help Display this information\n\
3969 -v --version Display the version number of readelf\n"));
3970
3971 if (REPORT_BUGS_TO[0] && stream == stdout)
3972 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3973
3974 exit (stream == stdout ? 0 : 1);
3975 }
3976
3977 /* Record the fact that the user wants the contents of section number
3978 SECTION to be displayed using the method(s) encoded as flags bits
3979 in TYPE. Note, TYPE can be zero if we are creating the array for
3980 the first time. */
3981
3982 static void
3983 request_dump_bynumber (unsigned int section, dump_type type)
3984 {
3985 if (section >= num_dump_sects)
3986 {
3987 dump_type * new_dump_sects;
3988
3989 new_dump_sects = (dump_type *) calloc (section + 1,
3990 sizeof (* dump_sects));
3991
3992 if (new_dump_sects == NULL)
3993 error (_("Out of memory allocating dump request table.\n"));
3994 else
3995 {
3996 /* Copy current flag settings. */
3997 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3998
3999 free (dump_sects);
4000
4001 dump_sects = new_dump_sects;
4002 num_dump_sects = section + 1;
4003 }
4004 }
4005
4006 if (dump_sects)
4007 dump_sects[section] |= type;
4008
4009 return;
4010 }
4011
4012 /* Request a dump by section name. */
4013
4014 static void
4015 request_dump_byname (const char * section, dump_type type)
4016 {
4017 struct dump_list_entry * new_request;
4018
4019 new_request = (struct dump_list_entry *)
4020 malloc (sizeof (struct dump_list_entry));
4021 if (!new_request)
4022 error (_("Out of memory allocating dump request table.\n"));
4023
4024 new_request->name = strdup (section);
4025 if (!new_request->name)
4026 error (_("Out of memory allocating dump request table.\n"));
4027
4028 new_request->type = type;
4029
4030 new_request->next = dump_sects_byname;
4031 dump_sects_byname = new_request;
4032 }
4033
4034 static inline void
4035 request_dump (dump_type type)
4036 {
4037 int section;
4038 char * cp;
4039
4040 do_dump++;
4041 section = strtoul (optarg, & cp, 0);
4042
4043 if (! *cp && section >= 0)
4044 request_dump_bynumber (section, type);
4045 else
4046 request_dump_byname (optarg, type);
4047 }
4048
4049
4050 static void
4051 parse_args (int argc, char ** argv)
4052 {
4053 int c;
4054
4055 if (argc < 2)
4056 usage (stderr);
4057
4058 while ((c = getopt_long
4059 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
4060 {
4061 switch (c)
4062 {
4063 case 0:
4064 /* Long options. */
4065 break;
4066 case 'H':
4067 usage (stdout);
4068 break;
4069
4070 case 'a':
4071 do_syms++;
4072 do_reloc++;
4073 do_unwind++;
4074 do_dynamic++;
4075 do_header++;
4076 do_sections++;
4077 do_section_groups++;
4078 do_segments++;
4079 do_version++;
4080 do_histogram++;
4081 do_arch++;
4082 do_notes++;
4083 break;
4084 case 'g':
4085 do_section_groups++;
4086 break;
4087 case 't':
4088 case 'N':
4089 do_sections++;
4090 do_section_details++;
4091 break;
4092 case 'e':
4093 do_header++;
4094 do_sections++;
4095 do_segments++;
4096 break;
4097 case 'A':
4098 do_arch++;
4099 break;
4100 case 'D':
4101 do_using_dynamic++;
4102 break;
4103 case 'r':
4104 do_reloc++;
4105 break;
4106 case 'u':
4107 do_unwind++;
4108 break;
4109 case 'h':
4110 do_header++;
4111 break;
4112 case 'l':
4113 do_segments++;
4114 break;
4115 case 's':
4116 do_syms++;
4117 break;
4118 case 'S':
4119 do_sections++;
4120 break;
4121 case 'd':
4122 do_dynamic++;
4123 break;
4124 case 'I':
4125 do_histogram++;
4126 break;
4127 case 'n':
4128 do_notes++;
4129 break;
4130 case 'c':
4131 do_archive_index++;
4132 break;
4133 case 'x':
4134 request_dump (HEX_DUMP);
4135 break;
4136 case 'p':
4137 request_dump (STRING_DUMP);
4138 break;
4139 case 'R':
4140 request_dump (RELOC_DUMP);
4141 break;
4142 case 'w':
4143 do_dump++;
4144 if (optarg == 0)
4145 {
4146 do_debugging = 1;
4147 dwarf_select_sections_all ();
4148 }
4149 else
4150 {
4151 do_debugging = 0;
4152 dwarf_select_sections_by_letters (optarg);
4153 }
4154 break;
4155 case OPTION_DEBUG_DUMP:
4156 do_dump++;
4157 if (optarg == 0)
4158 do_debugging = 1;
4159 else
4160 {
4161 do_debugging = 0;
4162 dwarf_select_sections_by_names (optarg);
4163 }
4164 break;
4165 case OPTION_DWARF_DEPTH:
4166 {
4167 char *cp;
4168
4169 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4170 }
4171 break;
4172 case OPTION_DWARF_START:
4173 {
4174 char *cp;
4175
4176 dwarf_start_die = strtoul (optarg, & cp, 0);
4177 }
4178 break;
4179 case OPTION_DWARF_CHECK:
4180 dwarf_check = 1;
4181 break;
4182 case OPTION_DYN_SYMS:
4183 do_dyn_syms++;
4184 break;
4185 #ifdef SUPPORT_DISASSEMBLY
4186 case 'i':
4187 request_dump (DISASS_DUMP);
4188 break;
4189 #endif
4190 case 'v':
4191 print_version (program_name);
4192 break;
4193 case 'V':
4194 do_version++;
4195 break;
4196 case 'W':
4197 do_wide++;
4198 break;
4199 default:
4200 /* xgettext:c-format */
4201 error (_("Invalid option '-%c'\n"), c);
4202 /* Drop through. */
4203 case '?':
4204 usage (stderr);
4205 }
4206 }
4207
4208 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4209 && !do_segments && !do_header && !do_dump && !do_version
4210 && !do_histogram && !do_debugging && !do_arch && !do_notes
4211 && !do_section_groups && !do_archive_index
4212 && !do_dyn_syms)
4213 usage (stderr);
4214 else if (argc < 3)
4215 {
4216 warn (_("Nothing to do.\n"));
4217 usage (stderr);
4218 }
4219 }
4220
4221 static const char *
4222 get_elf_class (unsigned int elf_class)
4223 {
4224 static char buff[32];
4225
4226 switch (elf_class)
4227 {
4228 case ELFCLASSNONE: return _("none");
4229 case ELFCLASS32: return "ELF32";
4230 case ELFCLASS64: return "ELF64";
4231 default:
4232 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4233 return buff;
4234 }
4235 }
4236
4237 static const char *
4238 get_data_encoding (unsigned int encoding)
4239 {
4240 static char buff[32];
4241
4242 switch (encoding)
4243 {
4244 case ELFDATANONE: return _("none");
4245 case ELFDATA2LSB: return _("2's complement, little endian");
4246 case ELFDATA2MSB: return _("2's complement, big endian");
4247 default:
4248 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4249 return buff;
4250 }
4251 }
4252
4253 /* Decode the data held in 'elf_header'. */
4254
4255 static int
4256 process_file_header (void)
4257 {
4258 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4259 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4260 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4261 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4262 {
4263 error
4264 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4265 return 0;
4266 }
4267
4268 init_dwarf_regnames (elf_header.e_machine);
4269
4270 if (do_header)
4271 {
4272 int i;
4273
4274 printf (_("ELF Header:\n"));
4275 printf (_(" Magic: "));
4276 for (i = 0; i < EI_NIDENT; i++)
4277 printf ("%2.2x ", elf_header.e_ident[i]);
4278 printf ("\n");
4279 printf (_(" Class: %s\n"),
4280 get_elf_class (elf_header.e_ident[EI_CLASS]));
4281 printf (_(" Data: %s\n"),
4282 get_data_encoding (elf_header.e_ident[EI_DATA]));
4283 printf (_(" Version: %d %s\n"),
4284 elf_header.e_ident[EI_VERSION],
4285 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4286 ? "(current)"
4287 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4288 ? _("<unknown: %lx>")
4289 : "")));
4290 printf (_(" OS/ABI: %s\n"),
4291 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4292 printf (_(" ABI Version: %d\n"),
4293 elf_header.e_ident[EI_ABIVERSION]);
4294 printf (_(" Type: %s\n"),
4295 get_file_type (elf_header.e_type));
4296 printf (_(" Machine: %s\n"),
4297 get_machine_name (elf_header.e_machine));
4298 printf (_(" Version: 0x%lx\n"),
4299 (unsigned long) elf_header.e_version);
4300
4301 printf (_(" Entry point address: "));
4302 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4303 printf (_("\n Start of program headers: "));
4304 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4305 printf (_(" (bytes into file)\n Start of section headers: "));
4306 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4307 printf (_(" (bytes into file)\n"));
4308
4309 printf (_(" Flags: 0x%lx%s\n"),
4310 (unsigned long) elf_header.e_flags,
4311 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4312 printf (_(" Size of this header: %ld (bytes)\n"),
4313 (long) elf_header.e_ehsize);
4314 printf (_(" Size of program headers: %ld (bytes)\n"),
4315 (long) elf_header.e_phentsize);
4316 printf (_(" Number of program headers: %ld"),
4317 (long) elf_header.e_phnum);
4318 if (section_headers != NULL
4319 && elf_header.e_phnum == PN_XNUM
4320 && section_headers[0].sh_info != 0)
4321 printf (" (%ld)", (long) section_headers[0].sh_info);
4322 putc ('\n', stdout);
4323 printf (_(" Size of section headers: %ld (bytes)\n"),
4324 (long) elf_header.e_shentsize);
4325 printf (_(" Number of section headers: %ld"),
4326 (long) elf_header.e_shnum);
4327 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4328 printf (" (%ld)", (long) section_headers[0].sh_size);
4329 putc ('\n', stdout);
4330 printf (_(" Section header string table index: %ld"),
4331 (long) elf_header.e_shstrndx);
4332 if (section_headers != NULL
4333 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4334 printf (" (%u)", section_headers[0].sh_link);
4335 else if (elf_header.e_shstrndx != SHN_UNDEF
4336 && elf_header.e_shstrndx >= elf_header.e_shnum)
4337 printf (_(" <corrupt: out of range>"));
4338 putc ('\n', stdout);
4339 }
4340
4341 if (section_headers != NULL)
4342 {
4343 if (elf_header.e_phnum == PN_XNUM
4344 && section_headers[0].sh_info != 0)
4345 elf_header.e_phnum = section_headers[0].sh_info;
4346 if (elf_header.e_shnum == SHN_UNDEF)
4347 elf_header.e_shnum = section_headers[0].sh_size;
4348 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4349 elf_header.e_shstrndx = section_headers[0].sh_link;
4350 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4351 elf_header.e_shstrndx = SHN_UNDEF;
4352 free (section_headers);
4353 section_headers = NULL;
4354 }
4355
4356 return 1;
4357 }
4358
4359 static bfd_boolean
4360 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4361 {
4362 Elf32_External_Phdr * phdrs;
4363 Elf32_External_Phdr * external;
4364 Elf_Internal_Phdr * internal;
4365 unsigned int i;
4366 unsigned int size = elf_header.e_phentsize;
4367 unsigned int num = elf_header.e_phnum;
4368
4369 /* PR binutils/17531: Cope with unexpected section header sizes. */
4370 if (size == 0 || num == 0)
4371 return FALSE;
4372 if (size < sizeof * phdrs)
4373 {
4374 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4375 return FALSE;
4376 }
4377 if (size > sizeof * phdrs)
4378 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4379
4380 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4381 size, num, _("program headers"));
4382 if (phdrs == NULL)
4383 return FALSE;
4384
4385 for (i = 0, internal = pheaders, external = phdrs;
4386 i < elf_header.e_phnum;
4387 i++, internal++, external++)
4388 {
4389 internal->p_type = BYTE_GET (external->p_type);
4390 internal->p_offset = BYTE_GET (external->p_offset);
4391 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4392 internal->p_paddr = BYTE_GET (external->p_paddr);
4393 internal->p_filesz = BYTE_GET (external->p_filesz);
4394 internal->p_memsz = BYTE_GET (external->p_memsz);
4395 internal->p_flags = BYTE_GET (external->p_flags);
4396 internal->p_align = BYTE_GET (external->p_align);
4397 }
4398
4399 free (phdrs);
4400 return TRUE;
4401 }
4402
4403 static bfd_boolean
4404 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4405 {
4406 Elf64_External_Phdr * phdrs;
4407 Elf64_External_Phdr * external;
4408 Elf_Internal_Phdr * internal;
4409 unsigned int i;
4410 unsigned int size = elf_header.e_phentsize;
4411 unsigned int num = elf_header.e_phnum;
4412
4413 /* PR binutils/17531: Cope with unexpected section header sizes. */
4414 if (size == 0 || num == 0)
4415 return FALSE;
4416 if (size < sizeof * phdrs)
4417 {
4418 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4419 return FALSE;
4420 }
4421 if (size > sizeof * phdrs)
4422 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4423
4424 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4425 size, num, _("program headers"));
4426 if (!phdrs)
4427 return FALSE;
4428
4429 for (i = 0, internal = pheaders, external = phdrs;
4430 i < elf_header.e_phnum;
4431 i++, internal++, external++)
4432 {
4433 internal->p_type = BYTE_GET (external->p_type);
4434 internal->p_flags = BYTE_GET (external->p_flags);
4435 internal->p_offset = BYTE_GET (external->p_offset);
4436 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4437 internal->p_paddr = BYTE_GET (external->p_paddr);
4438 internal->p_filesz = BYTE_GET (external->p_filesz);
4439 internal->p_memsz = BYTE_GET (external->p_memsz);
4440 internal->p_align = BYTE_GET (external->p_align);
4441 }
4442
4443 free (phdrs);
4444 return TRUE;
4445 }
4446
4447 /* Returns 1 if the program headers were read into `program_headers'. */
4448
4449 static int
4450 get_program_headers (FILE * file)
4451 {
4452 Elf_Internal_Phdr * phdrs;
4453
4454 /* Check cache of prior read. */
4455 if (program_headers != NULL)
4456 return 1;
4457
4458 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4459 sizeof (Elf_Internal_Phdr));
4460
4461 if (phdrs == NULL)
4462 {
4463 error (_("Out of memory reading %u program headers\n"),
4464 elf_header.e_phnum);
4465 return 0;
4466 }
4467
4468 if (is_32bit_elf
4469 ? get_32bit_program_headers (file, phdrs)
4470 : get_64bit_program_headers (file, phdrs))
4471 {
4472 program_headers = phdrs;
4473 return 1;
4474 }
4475
4476 free (phdrs);
4477 return 0;
4478 }
4479
4480 /* Returns 1 if the program headers were loaded. */
4481
4482 static int
4483 process_program_headers (FILE * file)
4484 {
4485 Elf_Internal_Phdr * segment;
4486 unsigned int i;
4487
4488 if (elf_header.e_phnum == 0)
4489 {
4490 /* PR binutils/12467. */
4491 if (elf_header.e_phoff != 0)
4492 warn (_("possibly corrupt ELF header - it has a non-zero program"
4493 " header offset, but no program headers\n"));
4494 else if (do_segments)
4495 printf (_("\nThere are no program headers in this file.\n"));
4496 return 0;
4497 }
4498
4499 if (do_segments && !do_header)
4500 {
4501 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4502 printf (_("Entry point "));
4503 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4504 printf (_("\nThere are %d program headers, starting at offset "),
4505 elf_header.e_phnum);
4506 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4507 printf ("\n");
4508 }
4509
4510 if (! get_program_headers (file))
4511 return 0;
4512
4513 if (do_segments)
4514 {
4515 if (elf_header.e_phnum > 1)
4516 printf (_("\nProgram Headers:\n"));
4517 else
4518 printf (_("\nProgram Headers:\n"));
4519
4520 if (is_32bit_elf)
4521 printf
4522 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4523 else if (do_wide)
4524 printf
4525 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4526 else
4527 {
4528 printf
4529 (_(" Type Offset VirtAddr PhysAddr\n"));
4530 printf
4531 (_(" FileSiz MemSiz Flags Align\n"));
4532 }
4533 }
4534
4535 dynamic_addr = 0;
4536 dynamic_size = 0;
4537
4538 for (i = 0, segment = program_headers;
4539 i < elf_header.e_phnum;
4540 i++, segment++)
4541 {
4542 if (do_segments)
4543 {
4544 printf (" %-14.14s ", get_segment_type (segment->p_type));
4545
4546 if (is_32bit_elf)
4547 {
4548 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4549 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4550 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4551 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4552 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4553 printf ("%c%c%c ",
4554 (segment->p_flags & PF_R ? 'R' : ' '),
4555 (segment->p_flags & PF_W ? 'W' : ' '),
4556 (segment->p_flags & PF_X ? 'E' : ' '));
4557 printf ("%#lx", (unsigned long) segment->p_align);
4558 }
4559 else if (do_wide)
4560 {
4561 if ((unsigned long) segment->p_offset == segment->p_offset)
4562 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4563 else
4564 {
4565 print_vma (segment->p_offset, FULL_HEX);
4566 putchar (' ');
4567 }
4568
4569 print_vma (segment->p_vaddr, FULL_HEX);
4570 putchar (' ');
4571 print_vma (segment->p_paddr, FULL_HEX);
4572 putchar (' ');
4573
4574 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4575 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4576 else
4577 {
4578 print_vma (segment->p_filesz, FULL_HEX);
4579 putchar (' ');
4580 }
4581
4582 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4583 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4584 else
4585 {
4586 print_vma (segment->p_memsz, FULL_HEX);
4587 }
4588
4589 printf (" %c%c%c ",
4590 (segment->p_flags & PF_R ? 'R' : ' '),
4591 (segment->p_flags & PF_W ? 'W' : ' '),
4592 (segment->p_flags & PF_X ? 'E' : ' '));
4593
4594 if ((unsigned long) segment->p_align == segment->p_align)
4595 printf ("%#lx", (unsigned long) segment->p_align);
4596 else
4597 {
4598 print_vma (segment->p_align, PREFIX_HEX);
4599 }
4600 }
4601 else
4602 {
4603 print_vma (segment->p_offset, FULL_HEX);
4604 putchar (' ');
4605 print_vma (segment->p_vaddr, FULL_HEX);
4606 putchar (' ');
4607 print_vma (segment->p_paddr, FULL_HEX);
4608 printf ("\n ");
4609 print_vma (segment->p_filesz, FULL_HEX);
4610 putchar (' ');
4611 print_vma (segment->p_memsz, FULL_HEX);
4612 printf (" %c%c%c ",
4613 (segment->p_flags & PF_R ? 'R' : ' '),
4614 (segment->p_flags & PF_W ? 'W' : ' '),
4615 (segment->p_flags & PF_X ? 'E' : ' '));
4616 print_vma (segment->p_align, HEX);
4617 }
4618 }
4619
4620 if (do_segments)
4621 putc ('\n', stdout);
4622
4623 switch (segment->p_type)
4624 {
4625 case PT_DYNAMIC:
4626 if (dynamic_addr)
4627 error (_("more than one dynamic segment\n"));
4628
4629 /* By default, assume that the .dynamic section is the first
4630 section in the DYNAMIC segment. */
4631 dynamic_addr = segment->p_offset;
4632 dynamic_size = segment->p_filesz;
4633 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4634 if (dynamic_addr + dynamic_size >= current_file_size)
4635 {
4636 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4637 dynamic_addr = dynamic_size = 0;
4638 }
4639
4640 /* Try to locate the .dynamic section. If there is
4641 a section header table, we can easily locate it. */
4642 if (section_headers != NULL)
4643 {
4644 Elf_Internal_Shdr * sec;
4645
4646 sec = find_section (".dynamic");
4647 if (sec == NULL || sec->sh_size == 0)
4648 {
4649 /* A corresponding .dynamic section is expected, but on
4650 IA-64/OpenVMS it is OK for it to be missing. */
4651 if (!is_ia64_vms ())
4652 error (_("no .dynamic section in the dynamic segment\n"));
4653 break;
4654 }
4655
4656 if (sec->sh_type == SHT_NOBITS)
4657 {
4658 dynamic_size = 0;
4659 break;
4660 }
4661
4662 dynamic_addr = sec->sh_offset;
4663 dynamic_size = sec->sh_size;
4664
4665 if (dynamic_addr < segment->p_offset
4666 || dynamic_addr > segment->p_offset + segment->p_filesz)
4667 warn (_("the .dynamic section is not contained"
4668 " within the dynamic segment\n"));
4669 else if (dynamic_addr > segment->p_offset)
4670 warn (_("the .dynamic section is not the first section"
4671 " in the dynamic segment.\n"));
4672 }
4673 break;
4674
4675 case PT_INTERP:
4676 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4677 SEEK_SET))
4678 error (_("Unable to find program interpreter name\n"));
4679 else
4680 {
4681 char fmt [32];
4682 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4683
4684 if (ret >= (int) sizeof (fmt) || ret < 0)
4685 error (_("Internal error: failed to create format string to display program interpreter\n"));
4686
4687 program_interpreter[0] = 0;
4688 if (fscanf (file, fmt, program_interpreter) <= 0)
4689 error (_("Unable to read program interpreter name\n"));
4690
4691 if (do_segments)
4692 printf (_(" [Requesting program interpreter: %s]\n"),
4693 program_interpreter);
4694 }
4695 break;
4696 }
4697 }
4698
4699 if (do_segments && section_headers != NULL && string_table != NULL)
4700 {
4701 printf (_("\n Section to Segment mapping:\n"));
4702 printf (_(" Segment Sections...\n"));
4703
4704 for (i = 0; i < elf_header.e_phnum; i++)
4705 {
4706 unsigned int j;
4707 Elf_Internal_Shdr * section;
4708
4709 segment = program_headers + i;
4710 section = section_headers + 1;
4711
4712 printf (" %2.2d ", i);
4713
4714 for (j = 1; j < elf_header.e_shnum; j++, section++)
4715 {
4716 if (!ELF_TBSS_SPECIAL (section, segment)
4717 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4718 printf ("%s ", printable_section_name (section));
4719 }
4720
4721 putc ('\n',stdout);
4722 }
4723 }
4724
4725 return 1;
4726 }
4727
4728
4729 /* Find the file offset corresponding to VMA by using the program headers. */
4730
4731 static long
4732 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4733 {
4734 Elf_Internal_Phdr * seg;
4735
4736 if (! get_program_headers (file))
4737 {
4738 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4739 return (long) vma;
4740 }
4741
4742 for (seg = program_headers;
4743 seg < program_headers + elf_header.e_phnum;
4744 ++seg)
4745 {
4746 if (seg->p_type != PT_LOAD)
4747 continue;
4748
4749 if (vma >= (seg->p_vaddr & -seg->p_align)
4750 && vma + size <= seg->p_vaddr + seg->p_filesz)
4751 return vma - seg->p_vaddr + seg->p_offset;
4752 }
4753
4754 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4755 (unsigned long) vma);
4756 return (long) vma;
4757 }
4758
4759
4760 /* Allocate memory and load the sections headers into the global pointer
4761 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4762 generate any error messages if the load fails. */
4763
4764 static bfd_boolean
4765 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4766 {
4767 Elf32_External_Shdr * shdrs;
4768 Elf_Internal_Shdr * internal;
4769 unsigned int i;
4770 unsigned int size = elf_header.e_shentsize;
4771 unsigned int num = probe ? 1 : elf_header.e_shnum;
4772
4773 /* PR binutils/17531: Cope with unexpected section header sizes. */
4774 if (size == 0 || num == 0)
4775 return FALSE;
4776 if (size < sizeof * shdrs)
4777 {
4778 if (! probe)
4779 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4780 return FALSE;
4781 }
4782 if (!probe && size > sizeof * shdrs)
4783 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4784
4785 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4786 size, num,
4787 probe ? NULL : _("section headers"));
4788 if (shdrs == NULL)
4789 return FALSE;
4790
4791 if (section_headers != NULL)
4792 free (section_headers);
4793 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4794 sizeof (Elf_Internal_Shdr));
4795 if (section_headers == NULL)
4796 {
4797 if (!probe)
4798 error (_("Out of memory reading %u section headers\n"), num);
4799 return FALSE;
4800 }
4801
4802 for (i = 0, internal = section_headers;
4803 i < num;
4804 i++, internal++)
4805 {
4806 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4807 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4808 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4809 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4810 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4811 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4812 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4813 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4814 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4815 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4816 }
4817
4818 free (shdrs);
4819 return TRUE;
4820 }
4821
4822 static bfd_boolean
4823 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4824 {
4825 Elf64_External_Shdr * shdrs;
4826 Elf_Internal_Shdr * internal;
4827 unsigned int i;
4828 unsigned int size = elf_header.e_shentsize;
4829 unsigned int num = probe ? 1 : elf_header.e_shnum;
4830
4831 /* PR binutils/17531: Cope with unexpected section header sizes. */
4832 if (size == 0 || num == 0)
4833 return FALSE;
4834 if (size < sizeof * shdrs)
4835 {
4836 if (! probe)
4837 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4838 return FALSE;
4839 }
4840 if (! probe && size > sizeof * shdrs)
4841 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4842
4843 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4844 size, num,
4845 probe ? NULL : _("section headers"));
4846 if (shdrs == NULL)
4847 return FALSE;
4848
4849 if (section_headers != NULL)
4850 free (section_headers);
4851 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4852 sizeof (Elf_Internal_Shdr));
4853 if (section_headers == NULL)
4854 {
4855 if (! probe)
4856 error (_("Out of memory reading %u section headers\n"), num);
4857 return FALSE;
4858 }
4859
4860 for (i = 0, internal = section_headers;
4861 i < num;
4862 i++, internal++)
4863 {
4864 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4865 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4866 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4867 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4868 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4869 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4870 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4871 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4872 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4873 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4874 }
4875
4876 free (shdrs);
4877 return TRUE;
4878 }
4879
4880 static Elf_Internal_Sym *
4881 get_32bit_elf_symbols (FILE * file,
4882 Elf_Internal_Shdr * section,
4883 unsigned long * num_syms_return)
4884 {
4885 unsigned long number = 0;
4886 Elf32_External_Sym * esyms = NULL;
4887 Elf_External_Sym_Shndx * shndx = NULL;
4888 Elf_Internal_Sym * isyms = NULL;
4889 Elf_Internal_Sym * psym;
4890 unsigned int j;
4891
4892 if (section->sh_size == 0)
4893 {
4894 if (num_syms_return != NULL)
4895 * num_syms_return = 0;
4896 return NULL;
4897 }
4898
4899 /* Run some sanity checks first. */
4900 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4901 {
4902 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4903 printable_section_name (section), (unsigned long) section->sh_entsize);
4904 goto exit_point;
4905 }
4906
4907 if (section->sh_size > current_file_size)
4908 {
4909 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4910 printable_section_name (section), (unsigned long) section->sh_size);
4911 goto exit_point;
4912 }
4913
4914 number = section->sh_size / section->sh_entsize;
4915
4916 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4917 {
4918 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4919 (unsigned long) section->sh_size,
4920 printable_section_name (section),
4921 (unsigned long) section->sh_entsize);
4922 goto exit_point;
4923 }
4924
4925 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4926 section->sh_size, _("symbols"));
4927 if (esyms == NULL)
4928 goto exit_point;
4929
4930 shndx = NULL;
4931 if (symtab_shndx_hdr != NULL
4932 && (symtab_shndx_hdr->sh_link
4933 == (unsigned long) (section - section_headers)))
4934 {
4935 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4936 symtab_shndx_hdr->sh_offset,
4937 1, symtab_shndx_hdr->sh_size,
4938 _("symbol table section indicies"));
4939 if (shndx == NULL)
4940 goto exit_point;
4941 /* PR17531: file: heap-buffer-overflow */
4942 else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
4943 {
4944 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
4945 printable_section_name (symtab_shndx_hdr),
4946 (unsigned long) symtab_shndx_hdr->sh_size,
4947 (unsigned long) section->sh_size);
4948 goto exit_point;
4949 }
4950 }
4951
4952 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4953
4954 if (isyms == NULL)
4955 {
4956 error (_("Out of memory reading %lu symbols\n"),
4957 (unsigned long) number);
4958 goto exit_point;
4959 }
4960
4961 for (j = 0, psym = isyms; j < number; j++, psym++)
4962 {
4963 psym->st_name = BYTE_GET (esyms[j].st_name);
4964 psym->st_value = BYTE_GET (esyms[j].st_value);
4965 psym->st_size = BYTE_GET (esyms[j].st_size);
4966 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4967 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4968 psym->st_shndx
4969 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4970 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4971 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4972 psym->st_info = BYTE_GET (esyms[j].st_info);
4973 psym->st_other = BYTE_GET (esyms[j].st_other);
4974 }
4975
4976 exit_point:
4977 if (shndx != NULL)
4978 free (shndx);
4979 if (esyms != NULL)
4980 free (esyms);
4981
4982 if (num_syms_return != NULL)
4983 * num_syms_return = isyms == NULL ? 0 : number;
4984
4985 return isyms;
4986 }
4987
4988 static Elf_Internal_Sym *
4989 get_64bit_elf_symbols (FILE * file,
4990 Elf_Internal_Shdr * section,
4991 unsigned long * num_syms_return)
4992 {
4993 unsigned long number = 0;
4994 Elf64_External_Sym * esyms = NULL;
4995 Elf_External_Sym_Shndx * shndx = NULL;
4996 Elf_Internal_Sym * isyms = NULL;
4997 Elf_Internal_Sym * psym;
4998 unsigned int j;
4999
5000 if (section->sh_size == 0)
5001 {
5002 if (num_syms_return != NULL)
5003 * num_syms_return = 0;
5004 return NULL;
5005 }
5006
5007 /* Run some sanity checks first. */
5008 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5009 {
5010 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5011 printable_section_name (section),
5012 (unsigned long) section->sh_entsize);
5013 goto exit_point;
5014 }
5015
5016 if (section->sh_size > current_file_size)
5017 {
5018 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5019 printable_section_name (section),
5020 (unsigned long) section->sh_size);
5021 goto exit_point;
5022 }
5023
5024 number = section->sh_size / section->sh_entsize;
5025
5026 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5027 {
5028 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5029 (unsigned long) section->sh_size,
5030 printable_section_name (section),
5031 (unsigned long) section->sh_entsize);
5032 goto exit_point;
5033 }
5034
5035 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5036 section->sh_size, _("symbols"));
5037 if (!esyms)
5038 goto exit_point;
5039
5040 if (symtab_shndx_hdr != NULL
5041 && (symtab_shndx_hdr->sh_link
5042 == (unsigned long) (section - section_headers)))
5043 {
5044 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5045 symtab_shndx_hdr->sh_offset,
5046 1, symtab_shndx_hdr->sh_size,
5047 _("symbol table section indicies"));
5048 if (shndx == NULL)
5049 goto exit_point;
5050 else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5051 {
5052 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5053 printable_section_name (symtab_shndx_hdr),
5054 (unsigned long) symtab_shndx_hdr->sh_size,
5055 (unsigned long) section->sh_size);
5056 goto exit_point;
5057 }
5058 }
5059
5060 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5061
5062 if (isyms == NULL)
5063 {
5064 error (_("Out of memory reading %lu symbols\n"),
5065 (unsigned long) number);
5066 goto exit_point;
5067 }
5068
5069 for (j = 0, psym = isyms; j < number; j++, psym++)
5070 {
5071 psym->st_name = BYTE_GET (esyms[j].st_name);
5072 psym->st_info = BYTE_GET (esyms[j].st_info);
5073 psym->st_other = BYTE_GET (esyms[j].st_other);
5074 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5075
5076 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5077 psym->st_shndx
5078 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5079 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5080 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5081
5082 psym->st_value = BYTE_GET (esyms[j].st_value);
5083 psym->st_size = BYTE_GET (esyms[j].st_size);
5084 }
5085
5086 exit_point:
5087 if (shndx != NULL)
5088 free (shndx);
5089 if (esyms != NULL)
5090 free (esyms);
5091
5092 if (num_syms_return != NULL)
5093 * num_syms_return = isyms == NULL ? 0 : number;
5094
5095 return isyms;
5096 }
5097
5098 static const char *
5099 get_elf_section_flags (bfd_vma sh_flags)
5100 {
5101 static char buff[1024];
5102 char * p = buff;
5103 int field_size = is_32bit_elf ? 8 : 16;
5104 int sindex;
5105 int size = sizeof (buff) - (field_size + 4 + 1);
5106 bfd_vma os_flags = 0;
5107 bfd_vma proc_flags = 0;
5108 bfd_vma unknown_flags = 0;
5109 static const struct
5110 {
5111 const char * str;
5112 int len;
5113 }
5114 flags [] =
5115 {
5116 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5117 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5118 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5119 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5120 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5121 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5122 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5123 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5124 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5125 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5126 /* IA-64 specific. */
5127 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5128 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5129 /* IA-64 OpenVMS specific. */
5130 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5131 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5132 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5133 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5134 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5135 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5136 /* Generic. */
5137 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5138 /* SPARC specific. */
5139 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
5140 };
5141
5142 if (do_section_details)
5143 {
5144 sprintf (buff, "[%*.*lx]: ",
5145 field_size, field_size, (unsigned long) sh_flags);
5146 p += field_size + 4;
5147 }
5148
5149 while (sh_flags)
5150 {
5151 bfd_vma flag;
5152
5153 flag = sh_flags & - sh_flags;
5154 sh_flags &= ~ flag;
5155
5156 if (do_section_details)
5157 {
5158 switch (flag)
5159 {
5160 case SHF_WRITE: sindex = 0; break;
5161 case SHF_ALLOC: sindex = 1; break;
5162 case SHF_EXECINSTR: sindex = 2; break;
5163 case SHF_MERGE: sindex = 3; break;
5164 case SHF_STRINGS: sindex = 4; break;
5165 case SHF_INFO_LINK: sindex = 5; break;
5166 case SHF_LINK_ORDER: sindex = 6; break;
5167 case SHF_OS_NONCONFORMING: sindex = 7; break;
5168 case SHF_GROUP: sindex = 8; break;
5169 case SHF_TLS: sindex = 9; break;
5170 case SHF_EXCLUDE: sindex = 18; break;
5171
5172 default:
5173 sindex = -1;
5174 switch (elf_header.e_machine)
5175 {
5176 case EM_IA_64:
5177 if (flag == SHF_IA_64_SHORT)
5178 sindex = 10;
5179 else if (flag == SHF_IA_64_NORECOV)
5180 sindex = 11;
5181 #ifdef BFD64
5182 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5183 switch (flag)
5184 {
5185 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5186 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5187 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5188 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5189 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5190 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5191 default: break;
5192 }
5193 #endif
5194 break;
5195
5196 case EM_386:
5197 case EM_486:
5198 case EM_X86_64:
5199 case EM_L1OM:
5200 case EM_K1OM:
5201 case EM_OLD_SPARCV9:
5202 case EM_SPARC32PLUS:
5203 case EM_SPARCV9:
5204 case EM_SPARC:
5205 if (flag == SHF_ORDERED)
5206 sindex = 19;
5207 break;
5208 default:
5209 break;
5210 }
5211 }
5212
5213 if (sindex != -1)
5214 {
5215 if (p != buff + field_size + 4)
5216 {
5217 if (size < (10 + 2))
5218 {
5219 warn (_("Internal error: not enough buffer room for section flag info"));
5220 return _("<unknown>");
5221 }
5222 size -= 2;
5223 *p++ = ',';
5224 *p++ = ' ';
5225 }
5226
5227 size -= flags [sindex].len;
5228 p = stpcpy (p, flags [sindex].str);
5229 }
5230 else if (flag & SHF_MASKOS)
5231 os_flags |= flag;
5232 else if (flag & SHF_MASKPROC)
5233 proc_flags |= flag;
5234 else
5235 unknown_flags |= flag;
5236 }
5237 else
5238 {
5239 switch (flag)
5240 {
5241 case SHF_WRITE: *p = 'W'; break;
5242 case SHF_ALLOC: *p = 'A'; break;
5243 case SHF_EXECINSTR: *p = 'X'; break;
5244 case SHF_MERGE: *p = 'M'; break;
5245 case SHF_STRINGS: *p = 'S'; break;
5246 case SHF_INFO_LINK: *p = 'I'; break;
5247 case SHF_LINK_ORDER: *p = 'L'; break;
5248 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5249 case SHF_GROUP: *p = 'G'; break;
5250 case SHF_TLS: *p = 'T'; break;
5251 case SHF_EXCLUDE: *p = 'E'; break;
5252
5253 default:
5254 if ((elf_header.e_machine == EM_X86_64
5255 || elf_header.e_machine == EM_L1OM
5256 || elf_header.e_machine == EM_K1OM)
5257 && flag == SHF_X86_64_LARGE)
5258 *p = 'l';
5259 else if (flag & SHF_MASKOS)
5260 {
5261 *p = 'o';
5262 sh_flags &= ~ SHF_MASKOS;
5263 }
5264 else if (flag & SHF_MASKPROC)
5265 {
5266 *p = 'p';
5267 sh_flags &= ~ SHF_MASKPROC;
5268 }
5269 else
5270 *p = 'x';
5271 break;
5272 }
5273 p++;
5274 }
5275 }
5276
5277 if (do_section_details)
5278 {
5279 if (os_flags)
5280 {
5281 size -= 5 + field_size;
5282 if (p != buff + field_size + 4)
5283 {
5284 if (size < (2 + 1))
5285 {
5286 warn (_("Internal error: not enough buffer room for section flag info"));
5287 return _("<unknown>");
5288 }
5289 size -= 2;
5290 *p++ = ',';
5291 *p++ = ' ';
5292 }
5293 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5294 (unsigned long) os_flags);
5295 p += 5 + field_size;
5296 }
5297 if (proc_flags)
5298 {
5299 size -= 7 + field_size;
5300 if (p != buff + field_size + 4)
5301 {
5302 if (size < (2 + 1))
5303 {
5304 warn (_("Internal error: not enough buffer room for section flag info"));
5305 return _("<unknown>");
5306 }
5307 size -= 2;
5308 *p++ = ',';
5309 *p++ = ' ';
5310 }
5311 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5312 (unsigned long) proc_flags);
5313 p += 7 + field_size;
5314 }
5315 if (unknown_flags)
5316 {
5317 size -= 10 + field_size;
5318 if (p != buff + field_size + 4)
5319 {
5320 if (size < (2 + 1))
5321 {
5322 warn (_("Internal error: not enough buffer room for section flag info"));
5323 return _("<unknown>");
5324 }
5325 size -= 2;
5326 *p++ = ',';
5327 *p++ = ' ';
5328 }
5329 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5330 (unsigned long) unknown_flags);
5331 p += 10 + field_size;
5332 }
5333 }
5334
5335 *p = '\0';
5336 return buff;
5337 }
5338
5339 static int
5340 process_section_headers (FILE * file)
5341 {
5342 Elf_Internal_Shdr * section;
5343 unsigned int i;
5344
5345 section_headers = NULL;
5346
5347 if (elf_header.e_shnum == 0)
5348 {
5349 /* PR binutils/12467. */
5350 if (elf_header.e_shoff != 0)
5351 warn (_("possibly corrupt ELF file header - it has a non-zero"
5352 " section header offset, but no section headers\n"));
5353 else if (do_sections)
5354 printf (_("\nThere are no sections in this file.\n"));
5355
5356 return 1;
5357 }
5358
5359 if (do_sections && !do_header)
5360 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5361 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5362
5363 if (is_32bit_elf)
5364 {
5365 if (! get_32bit_section_headers (file, FALSE))
5366 return 0;
5367 }
5368 else if (! get_64bit_section_headers (file, FALSE))
5369 return 0;
5370
5371 /* Read in the string table, so that we have names to display. */
5372 if (elf_header.e_shstrndx != SHN_UNDEF
5373 && elf_header.e_shstrndx < elf_header.e_shnum)
5374 {
5375 section = section_headers + elf_header.e_shstrndx;
5376
5377 if (section->sh_size != 0)
5378 {
5379 string_table = (char *) get_data (NULL, file, section->sh_offset,
5380 1, section->sh_size,
5381 _("string table"));
5382
5383 string_table_length = string_table != NULL ? section->sh_size : 0;
5384 }
5385 }
5386
5387 /* Scan the sections for the dynamic symbol table
5388 and dynamic string table and debug sections. */
5389 dynamic_symbols = NULL;
5390 dynamic_strings = NULL;
5391 dynamic_syminfo = NULL;
5392 symtab_shndx_hdr = NULL;
5393
5394 eh_addr_size = is_32bit_elf ? 4 : 8;
5395 switch (elf_header.e_machine)
5396 {
5397 case EM_MIPS:
5398 case EM_MIPS_RS3_LE:
5399 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5400 FDE addresses. However, the ABI also has a semi-official ILP32
5401 variant for which the normal FDE address size rules apply.
5402
5403 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5404 section, where XX is the size of longs in bits. Unfortunately,
5405 earlier compilers provided no way of distinguishing ILP32 objects
5406 from LP64 objects, so if there's any doubt, we should assume that
5407 the official LP64 form is being used. */
5408 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5409 && find_section (".gcc_compiled_long32") == NULL)
5410 eh_addr_size = 8;
5411 break;
5412
5413 case EM_H8_300:
5414 case EM_H8_300H:
5415 switch (elf_header.e_flags & EF_H8_MACH)
5416 {
5417 case E_H8_MACH_H8300:
5418 case E_H8_MACH_H8300HN:
5419 case E_H8_MACH_H8300SN:
5420 case E_H8_MACH_H8300SXN:
5421 eh_addr_size = 2;
5422 break;
5423 case E_H8_MACH_H8300H:
5424 case E_H8_MACH_H8300S:
5425 case E_H8_MACH_H8300SX:
5426 eh_addr_size = 4;
5427 break;
5428 }
5429 break;
5430
5431 case EM_M32C_OLD:
5432 case EM_M32C:
5433 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5434 {
5435 case EF_M32C_CPU_M16C:
5436 eh_addr_size = 2;
5437 break;
5438 }
5439 break;
5440 }
5441
5442 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5443 do \
5444 { \
5445 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5446 if (section->sh_entsize != expected_entsize) \
5447 { \
5448 char buf[40]; \
5449 sprintf_vma (buf, section->sh_entsize); \
5450 /* Note: coded this way so that there is a single string for \
5451 translation. */ \
5452 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5453 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5454 (unsigned) expected_entsize); \
5455 section->sh_entsize = expected_entsize; \
5456 } \
5457 } \
5458 while (0)
5459
5460 #define CHECK_ENTSIZE(section, i, type) \
5461 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5462 sizeof (Elf64_External_##type))
5463
5464 for (i = 0, section = section_headers;
5465 i < elf_header.e_shnum;
5466 i++, section++)
5467 {
5468 char * name = SECTION_NAME (section);
5469
5470 if (section->sh_type == SHT_DYNSYM)
5471 {
5472 if (dynamic_symbols != NULL)
5473 {
5474 error (_("File contains multiple dynamic symbol tables\n"));
5475 continue;
5476 }
5477
5478 CHECK_ENTSIZE (section, i, Sym);
5479 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5480 }
5481 else if (section->sh_type == SHT_STRTAB
5482 && streq (name, ".dynstr"))
5483 {
5484 if (dynamic_strings != NULL)
5485 {
5486 error (_("File contains multiple dynamic string tables\n"));
5487 continue;
5488 }
5489
5490 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5491 1, section->sh_size,
5492 _("dynamic strings"));
5493 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5494 }
5495 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5496 {
5497 if (symtab_shndx_hdr != NULL)
5498 {
5499 error (_("File contains multiple symtab shndx tables\n"));
5500 continue;
5501 }
5502 symtab_shndx_hdr = section;
5503 }
5504 else if (section->sh_type == SHT_SYMTAB)
5505 CHECK_ENTSIZE (section, i, Sym);
5506 else if (section->sh_type == SHT_GROUP)
5507 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5508 else if (section->sh_type == SHT_REL)
5509 CHECK_ENTSIZE (section, i, Rel);
5510 else if (section->sh_type == SHT_RELA)
5511 CHECK_ENTSIZE (section, i, Rela);
5512 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5513 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5514 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5515 || do_debug_str || do_debug_loc || do_debug_ranges
5516 || do_debug_addr || do_debug_cu_index)
5517 && (const_strneq (name, ".debug_")
5518 || const_strneq (name, ".zdebug_")))
5519 {
5520 if (name[1] == 'z')
5521 name += sizeof (".zdebug_") - 1;
5522 else
5523 name += sizeof (".debug_") - 1;
5524
5525 if (do_debugging
5526 || (do_debug_info && const_strneq (name, "info"))
5527 || (do_debug_info && const_strneq (name, "types"))
5528 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5529 || (do_debug_lines && strcmp (name, "line") == 0)
5530 || (do_debug_lines && const_strneq (name, "line."))
5531 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5532 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5533 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5534 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5535 || (do_debug_aranges && const_strneq (name, "aranges"))
5536 || (do_debug_ranges && const_strneq (name, "ranges"))
5537 || (do_debug_frames && const_strneq (name, "frame"))
5538 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5539 || (do_debug_macinfo && const_strneq (name, "macro"))
5540 || (do_debug_str && const_strneq (name, "str"))
5541 || (do_debug_loc && const_strneq (name, "loc"))
5542 || (do_debug_addr && const_strneq (name, "addr"))
5543 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5544 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5545 )
5546 request_dump_bynumber (i, DEBUG_DUMP);
5547 }
5548 /* Linkonce section to be combined with .debug_info at link time. */
5549 else if ((do_debugging || do_debug_info)
5550 && const_strneq (name, ".gnu.linkonce.wi."))
5551 request_dump_bynumber (i, DEBUG_DUMP);
5552 else if (do_debug_frames && streq (name, ".eh_frame"))
5553 request_dump_bynumber (i, DEBUG_DUMP);
5554 else if (do_gdb_index && streq (name, ".gdb_index"))
5555 request_dump_bynumber (i, DEBUG_DUMP);
5556 /* Trace sections for Itanium VMS. */
5557 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5558 || do_trace_aranges)
5559 && const_strneq (name, ".trace_"))
5560 {
5561 name += sizeof (".trace_") - 1;
5562
5563 if (do_debugging
5564 || (do_trace_info && streq (name, "info"))
5565 || (do_trace_abbrevs && streq (name, "abbrev"))
5566 || (do_trace_aranges && streq (name, "aranges"))
5567 )
5568 request_dump_bynumber (i, DEBUG_DUMP);
5569 }
5570 }
5571
5572 if (! do_sections)
5573 return 1;
5574
5575 if (elf_header.e_shnum > 1)
5576 printf (_("\nSection Headers:\n"));
5577 else
5578 printf (_("\nSection Header:\n"));
5579
5580 if (is_32bit_elf)
5581 {
5582 if (do_section_details)
5583 {
5584 printf (_(" [Nr] Name\n"));
5585 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5586 }
5587 else
5588 printf
5589 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5590 }
5591 else if (do_wide)
5592 {
5593 if (do_section_details)
5594 {
5595 printf (_(" [Nr] Name\n"));
5596 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5597 }
5598 else
5599 printf
5600 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5601 }
5602 else
5603 {
5604 if (do_section_details)
5605 {
5606 printf (_(" [Nr] Name\n"));
5607 printf (_(" Type Address Offset Link\n"));
5608 printf (_(" Size EntSize Info Align\n"));
5609 }
5610 else
5611 {
5612 printf (_(" [Nr] Name Type Address Offset\n"));
5613 printf (_(" Size EntSize Flags Link Info Align\n"));
5614 }
5615 }
5616
5617 if (do_section_details)
5618 printf (_(" Flags\n"));
5619
5620 for (i = 0, section = section_headers;
5621 i < elf_header.e_shnum;
5622 i++, section++)
5623 {
5624 printf (" [%2u] ", i);
5625 if (do_section_details)
5626 printf ("%s\n ", printable_section_name (section));
5627 else
5628 print_symbol (-17, SECTION_NAME (section));
5629
5630 printf (do_wide ? " %-15s " : " %-15.15s ",
5631 get_section_type_name (section->sh_type));
5632
5633 if (is_32bit_elf)
5634 {
5635 const char * link_too_big = NULL;
5636
5637 print_vma (section->sh_addr, LONG_HEX);
5638
5639 printf ( " %6.6lx %6.6lx %2.2lx",
5640 (unsigned long) section->sh_offset,
5641 (unsigned long) section->sh_size,
5642 (unsigned long) section->sh_entsize);
5643
5644 if (do_section_details)
5645 fputs (" ", stdout);
5646 else
5647 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5648
5649 if (section->sh_link >= elf_header.e_shnum)
5650 {
5651 link_too_big = "";
5652 /* The sh_link value is out of range. Normally this indicates
5653 an error but it can have special values in Solaris binaries. */
5654 switch (elf_header.e_machine)
5655 {
5656 case EM_386:
5657 case EM_486:
5658 case EM_X86_64:
5659 case EM_L1OM:
5660 case EM_K1OM:
5661 case EM_OLD_SPARCV9:
5662 case EM_SPARC32PLUS:
5663 case EM_SPARCV9:
5664 case EM_SPARC:
5665 if (section->sh_link == (SHN_BEFORE & 0xffff))
5666 link_too_big = "BEFORE";
5667 else if (section->sh_link == (SHN_AFTER & 0xffff))
5668 link_too_big = "AFTER";
5669 break;
5670 default:
5671 break;
5672 }
5673 }
5674
5675 if (do_section_details)
5676 {
5677 if (link_too_big != NULL && * link_too_big)
5678 printf ("<%s> ", link_too_big);
5679 else
5680 printf ("%2u ", section->sh_link);
5681 printf ("%3u %2lu\n", section->sh_info,
5682 (unsigned long) section->sh_addralign);
5683 }
5684 else
5685 printf ("%2u %3u %2lu\n",
5686 section->sh_link,
5687 section->sh_info,
5688 (unsigned long) section->sh_addralign);
5689
5690 if (link_too_big && ! * link_too_big)
5691 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5692 i, section->sh_link);
5693 }
5694 else if (do_wide)
5695 {
5696 print_vma (section->sh_addr, LONG_HEX);
5697
5698 if ((long) section->sh_offset == section->sh_offset)
5699 printf (" %6.6lx", (unsigned long) section->sh_offset);
5700 else
5701 {
5702 putchar (' ');
5703 print_vma (section->sh_offset, LONG_HEX);
5704 }
5705
5706 if ((unsigned long) section->sh_size == section->sh_size)
5707 printf (" %6.6lx", (unsigned long) section->sh_size);
5708 else
5709 {
5710 putchar (' ');
5711 print_vma (section->sh_size, LONG_HEX);
5712 }
5713
5714 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5715 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5716 else
5717 {
5718 putchar (' ');
5719 print_vma (section->sh_entsize, LONG_HEX);
5720 }
5721
5722 if (do_section_details)
5723 fputs (" ", stdout);
5724 else
5725 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5726
5727 printf ("%2u %3u ", section->sh_link, section->sh_info);
5728
5729 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5730 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5731 else
5732 {
5733 print_vma (section->sh_addralign, DEC);
5734 putchar ('\n');
5735 }
5736 }
5737 else if (do_section_details)
5738 {
5739 printf (" %-15.15s ",
5740 get_section_type_name (section->sh_type));
5741 print_vma (section->sh_addr, LONG_HEX);
5742 if ((long) section->sh_offset == section->sh_offset)
5743 printf (" %16.16lx", (unsigned long) section->sh_offset);
5744 else
5745 {
5746 printf (" ");
5747 print_vma (section->sh_offset, LONG_HEX);
5748 }
5749 printf (" %u\n ", section->sh_link);
5750 print_vma (section->sh_size, LONG_HEX);
5751 putchar (' ');
5752 print_vma (section->sh_entsize, LONG_HEX);
5753
5754 printf (" %-16u %lu\n",
5755 section->sh_info,
5756 (unsigned long) section->sh_addralign);
5757 }
5758 else
5759 {
5760 putchar (' ');
5761 print_vma (section->sh_addr, LONG_HEX);
5762 if ((long) section->sh_offset == section->sh_offset)
5763 printf (" %8.8lx", (unsigned long) section->sh_offset);
5764 else
5765 {
5766 printf (" ");
5767 print_vma (section->sh_offset, LONG_HEX);
5768 }
5769 printf ("\n ");
5770 print_vma (section->sh_size, LONG_HEX);
5771 printf (" ");
5772 print_vma (section->sh_entsize, LONG_HEX);
5773
5774 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5775
5776 printf (" %2u %3u %lu\n",
5777 section->sh_link,
5778 section->sh_info,
5779 (unsigned long) section->sh_addralign);
5780 }
5781
5782 if (do_section_details)
5783 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5784 }
5785
5786 if (!do_section_details)
5787 {
5788 if (elf_header.e_machine == EM_X86_64
5789 || elf_header.e_machine == EM_L1OM
5790 || elf_header.e_machine == EM_K1OM)
5791 printf (_("Key to Flags:\n\
5792 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5793 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5794 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5795 else
5796 printf (_("Key to Flags:\n\
5797 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5798 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5799 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5800 }
5801
5802 return 1;
5803 }
5804
5805 static const char *
5806 get_group_flags (unsigned int flags)
5807 {
5808 static char buff[32];
5809 switch (flags)
5810 {
5811 case 0:
5812 return "";
5813
5814 case GRP_COMDAT:
5815 return "COMDAT ";
5816
5817 default:
5818 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5819 break;
5820 }
5821 return buff;
5822 }
5823
5824 static int
5825 process_section_groups (FILE * file)
5826 {
5827 Elf_Internal_Shdr * section;
5828 unsigned int i;
5829 struct group * group;
5830 Elf_Internal_Shdr * symtab_sec;
5831 Elf_Internal_Shdr * strtab_sec;
5832 Elf_Internal_Sym * symtab;
5833 unsigned long num_syms;
5834 char * strtab;
5835 size_t strtab_size;
5836
5837 /* Don't process section groups unless needed. */
5838 if (!do_unwind && !do_section_groups)
5839 return 1;
5840
5841 if (elf_header.e_shnum == 0)
5842 {
5843 if (do_section_groups)
5844 printf (_("\nThere are no sections to group in this file.\n"));
5845
5846 return 1;
5847 }
5848
5849 if (section_headers == NULL)
5850 {
5851 error (_("Section headers are not available!\n"));
5852 /* PR 13622: This can happen with a corrupt ELF header. */
5853 return 0;
5854 }
5855
5856 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5857 sizeof (struct group *));
5858
5859 if (section_headers_groups == NULL)
5860 {
5861 error (_("Out of memory reading %u section group headers\n"),
5862 elf_header.e_shnum);
5863 return 0;
5864 }
5865
5866 /* Scan the sections for the group section. */
5867 group_count = 0;
5868 for (i = 0, section = section_headers;
5869 i < elf_header.e_shnum;
5870 i++, section++)
5871 if (section->sh_type == SHT_GROUP)
5872 group_count++;
5873
5874 if (group_count == 0)
5875 {
5876 if (do_section_groups)
5877 printf (_("\nThere are no section groups in this file.\n"));
5878
5879 return 1;
5880 }
5881
5882 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5883
5884 if (section_groups == NULL)
5885 {
5886 error (_("Out of memory reading %lu groups\n"),
5887 (unsigned long) group_count);
5888 return 0;
5889 }
5890
5891 symtab_sec = NULL;
5892 strtab_sec = NULL;
5893 symtab = NULL;
5894 num_syms = 0;
5895 strtab = NULL;
5896 strtab_size = 0;
5897 for (i = 0, section = section_headers, group = section_groups;
5898 i < elf_header.e_shnum;
5899 i++, section++)
5900 {
5901 if (section->sh_type == SHT_GROUP)
5902 {
5903 const char * name = printable_section_name (section);
5904 const char * group_name;
5905 unsigned char * start;
5906 unsigned char * indices;
5907 unsigned int entry, j, size;
5908 Elf_Internal_Shdr * sec;
5909 Elf_Internal_Sym * sym;
5910
5911 /* Get the symbol table. */
5912 if (section->sh_link >= elf_header.e_shnum
5913 || ((sec = section_headers + section->sh_link)->sh_type
5914 != SHT_SYMTAB))
5915 {
5916 error (_("Bad sh_link in group section `%s'\n"), name);
5917 continue;
5918 }
5919
5920 if (symtab_sec != sec)
5921 {
5922 symtab_sec = sec;
5923 if (symtab)
5924 free (symtab);
5925 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5926 }
5927
5928 if (symtab == NULL)
5929 {
5930 error (_("Corrupt header in group section `%s'\n"), name);
5931 continue;
5932 }
5933
5934 if (section->sh_info >= num_syms)
5935 {
5936 error (_("Bad sh_info in group section `%s'\n"), name);
5937 continue;
5938 }
5939
5940 sym = symtab + section->sh_info;
5941
5942 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5943 {
5944 if (sym->st_shndx == 0
5945 || sym->st_shndx >= elf_header.e_shnum)
5946 {
5947 error (_("Bad sh_info in group section `%s'\n"), name);
5948 continue;
5949 }
5950
5951 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5952 strtab_sec = NULL;
5953 if (strtab)
5954 free (strtab);
5955 strtab = NULL;
5956 strtab_size = 0;
5957 }
5958 else
5959 {
5960 /* Get the string table. */
5961 if (symtab_sec->sh_link >= elf_header.e_shnum)
5962 {
5963 strtab_sec = NULL;
5964 if (strtab)
5965 free (strtab);
5966 strtab = NULL;
5967 strtab_size = 0;
5968 }
5969 else if (strtab_sec
5970 != (sec = section_headers + symtab_sec->sh_link))
5971 {
5972 strtab_sec = sec;
5973 if (strtab)
5974 free (strtab);
5975
5976 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5977 1, strtab_sec->sh_size,
5978 _("string table"));
5979 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5980 }
5981 group_name = sym->st_name < strtab_size
5982 ? strtab + sym->st_name : _("<corrupt>");
5983 }
5984
5985 /* PR 17531: file: loop. */
5986 if (section->sh_entsize > section->sh_size)
5987 {
5988 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
5989 printable_section_name (section),
5990 (unsigned long) section->sh_entsize,
5991 (unsigned long) section->sh_size);
5992 break;
5993 }
5994
5995 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5996 1, section->sh_size,
5997 _("section data"));
5998 if (start == NULL)
5999 continue;
6000
6001 indices = start;
6002 size = (section->sh_size / section->sh_entsize) - 1;
6003 entry = byte_get (indices, 4);
6004 indices += 4;
6005
6006 if (do_section_groups)
6007 {
6008 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6009 get_group_flags (entry), i, name, group_name, size);
6010
6011 printf (_(" [Index] Name\n"));
6012 }
6013
6014 group->group_index = i;
6015
6016 for (j = 0; j < size; j++)
6017 {
6018 struct group_list * g;
6019
6020 entry = byte_get (indices, 4);
6021 indices += 4;
6022
6023 if (entry >= elf_header.e_shnum)
6024 {
6025 static unsigned num_group_errors = 0;
6026
6027 if (num_group_errors ++ < 10)
6028 {
6029 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6030 entry, i, elf_header.e_shnum - 1);
6031 if (num_group_errors == 10)
6032 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6033 }
6034 continue;
6035 }
6036
6037 if (section_headers_groups [entry] != NULL)
6038 {
6039 if (entry)
6040 {
6041 static unsigned num_errs = 0;
6042
6043 if (num_errs ++ < 10)
6044 {
6045 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6046 entry, i,
6047 section_headers_groups [entry]->group_index);
6048 if (num_errs == 10)
6049 warn (_("Further error messages about already contained group sections suppressed\n"));
6050 }
6051 continue;
6052 }
6053 else
6054 {
6055 /* Intel C/C++ compiler may put section 0 in a
6056 section group. We just warn it the first time
6057 and ignore it afterwards. */
6058 static int warned = 0;
6059 if (!warned)
6060 {
6061 error (_("section 0 in group section [%5u]\n"),
6062 section_headers_groups [entry]->group_index);
6063 warned++;
6064 }
6065 }
6066 }
6067
6068 section_headers_groups [entry] = group;
6069
6070 if (do_section_groups)
6071 {
6072 sec = section_headers + entry;
6073 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6074 }
6075
6076 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6077 g->section_index = entry;
6078 g->next = group->root;
6079 group->root = g;
6080 }
6081
6082 if (start)
6083 free (start);
6084
6085 group++;
6086 }
6087 }
6088
6089 if (symtab)
6090 free (symtab);
6091 if (strtab)
6092 free (strtab);
6093 return 1;
6094 }
6095
6096 /* Data used to display dynamic fixups. */
6097
6098 struct ia64_vms_dynfixup
6099 {
6100 bfd_vma needed_ident; /* Library ident number. */
6101 bfd_vma needed; /* Index in the dstrtab of the library name. */
6102 bfd_vma fixup_needed; /* Index of the library. */
6103 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6104 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6105 };
6106
6107 /* Data used to display dynamic relocations. */
6108
6109 struct ia64_vms_dynimgrela
6110 {
6111 bfd_vma img_rela_cnt; /* Number of relocations. */
6112 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6113 };
6114
6115 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6116 library). */
6117
6118 static void
6119 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6120 const char *strtab, unsigned int strtab_sz)
6121 {
6122 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6123 long i;
6124 const char *lib_name;
6125
6126 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6127 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6128 _("dynamic section image fixups"));
6129 if (!imfs)
6130 return;
6131
6132 if (fixup->needed < strtab_sz)
6133 lib_name = strtab + fixup->needed;
6134 else
6135 {
6136 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6137 (unsigned long) fixup->needed);
6138 lib_name = "???";
6139 }
6140 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6141 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6142 printf
6143 (_("Seg Offset Type SymVec DataType\n"));
6144
6145 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6146 {
6147 unsigned int type;
6148 const char *rtype;
6149
6150 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6151 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6152 type = BYTE_GET (imfs [i].type);
6153 rtype = elf_ia64_reloc_type (type);
6154 if (rtype == NULL)
6155 printf (" 0x%08x ", type);
6156 else
6157 printf (" %-32s ", rtype);
6158 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6159 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6160 }
6161
6162 free (imfs);
6163 }
6164
6165 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6166
6167 static void
6168 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6169 {
6170 Elf64_External_VMS_IMAGE_RELA *imrs;
6171 long i;
6172
6173 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6174 1, imgrela->img_rela_cnt * sizeof (*imrs),
6175 _("dynamic section image relocations"));
6176 if (!imrs)
6177 return;
6178
6179 printf (_("\nImage relocs\n"));
6180 printf
6181 (_("Seg Offset Type Addend Seg Sym Off\n"));
6182
6183 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6184 {
6185 unsigned int type;
6186 const char *rtype;
6187
6188 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6189 printf ("%08" BFD_VMA_FMT "x ",
6190 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6191 type = BYTE_GET (imrs [i].type);
6192 rtype = elf_ia64_reloc_type (type);
6193 if (rtype == NULL)
6194 printf ("0x%08x ", type);
6195 else
6196 printf ("%-31s ", rtype);
6197 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6198 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6199 printf ("%08" BFD_VMA_FMT "x\n",
6200 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6201 }
6202
6203 free (imrs);
6204 }
6205
6206 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6207
6208 static int
6209 process_ia64_vms_dynamic_relocs (FILE *file)
6210 {
6211 struct ia64_vms_dynfixup fixup;
6212 struct ia64_vms_dynimgrela imgrela;
6213 Elf_Internal_Dyn *entry;
6214 int res = 0;
6215 bfd_vma strtab_off = 0;
6216 bfd_vma strtab_sz = 0;
6217 char *strtab = NULL;
6218
6219 memset (&fixup, 0, sizeof (fixup));
6220 memset (&imgrela, 0, sizeof (imgrela));
6221
6222 /* Note: the order of the entries is specified by the OpenVMS specs. */
6223 for (entry = dynamic_section;
6224 entry < dynamic_section + dynamic_nent;
6225 entry++)
6226 {
6227 switch (entry->d_tag)
6228 {
6229 case DT_IA_64_VMS_STRTAB_OFFSET:
6230 strtab_off = entry->d_un.d_val;
6231 break;
6232 case DT_STRSZ:
6233 strtab_sz = entry->d_un.d_val;
6234 if (strtab == NULL)
6235 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6236 1, strtab_sz, _("dynamic string section"));
6237 break;
6238
6239 case DT_IA_64_VMS_NEEDED_IDENT:
6240 fixup.needed_ident = entry->d_un.d_val;
6241 break;
6242 case DT_NEEDED:
6243 fixup.needed = entry->d_un.d_val;
6244 break;
6245 case DT_IA_64_VMS_FIXUP_NEEDED:
6246 fixup.fixup_needed = entry->d_un.d_val;
6247 break;
6248 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6249 fixup.fixup_rela_cnt = entry->d_un.d_val;
6250 break;
6251 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6252 fixup.fixup_rela_off = entry->d_un.d_val;
6253 res++;
6254 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6255 break;
6256
6257 case DT_IA_64_VMS_IMG_RELA_CNT:
6258 imgrela.img_rela_cnt = entry->d_un.d_val;
6259 break;
6260 case DT_IA_64_VMS_IMG_RELA_OFF:
6261 imgrela.img_rela_off = entry->d_un.d_val;
6262 res++;
6263 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6264 break;
6265
6266 default:
6267 break;
6268 }
6269 }
6270
6271 if (strtab != NULL)
6272 free (strtab);
6273
6274 return res;
6275 }
6276
6277 static struct
6278 {
6279 const char * name;
6280 int reloc;
6281 int size;
6282 int rela;
6283 } dynamic_relocations [] =
6284 {
6285 { "REL", DT_REL, DT_RELSZ, FALSE },
6286 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6287 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6288 };
6289
6290 /* Process the reloc section. */
6291
6292 static int
6293 process_relocs (FILE * file)
6294 {
6295 unsigned long rel_size;
6296 unsigned long rel_offset;
6297
6298
6299 if (!do_reloc)
6300 return 1;
6301
6302 if (do_using_dynamic)
6303 {
6304 int is_rela;
6305 const char * name;
6306 int has_dynamic_reloc;
6307 unsigned int i;
6308
6309 has_dynamic_reloc = 0;
6310
6311 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6312 {
6313 is_rela = dynamic_relocations [i].rela;
6314 name = dynamic_relocations [i].name;
6315 rel_size = dynamic_info [dynamic_relocations [i].size];
6316 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6317
6318 has_dynamic_reloc |= rel_size;
6319
6320 if (is_rela == UNKNOWN)
6321 {
6322 if (dynamic_relocations [i].reloc == DT_JMPREL)
6323 switch (dynamic_info[DT_PLTREL])
6324 {
6325 case DT_REL:
6326 is_rela = FALSE;
6327 break;
6328 case DT_RELA:
6329 is_rela = TRUE;
6330 break;
6331 }
6332 }
6333
6334 if (rel_size)
6335 {
6336 printf
6337 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6338 name, rel_offset, rel_size);
6339
6340 dump_relocations (file,
6341 offset_from_vma (file, rel_offset, rel_size),
6342 rel_size,
6343 dynamic_symbols, num_dynamic_syms,
6344 dynamic_strings, dynamic_strings_length,
6345 is_rela, 1);
6346 }
6347 }
6348
6349 if (is_ia64_vms ())
6350 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6351
6352 if (! has_dynamic_reloc)
6353 printf (_("\nThere are no dynamic relocations in this file.\n"));
6354 }
6355 else
6356 {
6357 Elf_Internal_Shdr * section;
6358 unsigned long i;
6359 int found = 0;
6360
6361 for (i = 0, section = section_headers;
6362 i < elf_header.e_shnum;
6363 i++, section++)
6364 {
6365 if ( section->sh_type != SHT_RELA
6366 && section->sh_type != SHT_REL)
6367 continue;
6368
6369 rel_offset = section->sh_offset;
6370 rel_size = section->sh_size;
6371
6372 if (rel_size)
6373 {
6374 Elf_Internal_Shdr * strsec;
6375 int is_rela;
6376
6377 printf (_("\nRelocation section "));
6378
6379 if (string_table == NULL)
6380 printf ("%d", section->sh_name);
6381 else
6382 printf ("'%s'", printable_section_name (section));
6383
6384 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6385 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6386
6387 is_rela = section->sh_type == SHT_RELA;
6388
6389 if (section->sh_link != 0
6390 && section->sh_link < elf_header.e_shnum)
6391 {
6392 Elf_Internal_Shdr * symsec;
6393 Elf_Internal_Sym * symtab;
6394 unsigned long nsyms;
6395 unsigned long strtablen = 0;
6396 char * strtab = NULL;
6397
6398 symsec = section_headers + section->sh_link;
6399 if (symsec->sh_type != SHT_SYMTAB
6400 && symsec->sh_type != SHT_DYNSYM)
6401 continue;
6402
6403 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6404
6405 if (symtab == NULL)
6406 continue;
6407
6408 if (symsec->sh_link != 0
6409 && symsec->sh_link < elf_header.e_shnum)
6410 {
6411 strsec = section_headers + symsec->sh_link;
6412
6413 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6414 1, strsec->sh_size,
6415 _("string table"));
6416 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6417 }
6418
6419 dump_relocations (file, rel_offset, rel_size,
6420 symtab, nsyms, strtab, strtablen,
6421 is_rela,
6422 symsec->sh_type == SHT_DYNSYM);
6423 if (strtab)
6424 free (strtab);
6425 free (symtab);
6426 }
6427 else
6428 dump_relocations (file, rel_offset, rel_size,
6429 NULL, 0, NULL, 0, is_rela, 0);
6430
6431 found = 1;
6432 }
6433 }
6434
6435 if (! found)
6436 printf (_("\nThere are no relocations in this file.\n"));
6437 }
6438
6439 return 1;
6440 }
6441
6442 /* An absolute address consists of a section and an offset. If the
6443 section is NULL, the offset itself is the address, otherwise, the
6444 address equals to LOAD_ADDRESS(section) + offset. */
6445
6446 struct absaddr
6447 {
6448 unsigned short section;
6449 bfd_vma offset;
6450 };
6451
6452 #define ABSADDR(a) \
6453 ((a).section \
6454 ? section_headers [(a).section].sh_addr + (a).offset \
6455 : (a).offset)
6456
6457 /* Find the nearest symbol at or below ADDR. Returns the symbol
6458 name, if found, and the offset from the symbol to ADDR. */
6459
6460 static void
6461 find_symbol_for_address (Elf_Internal_Sym * symtab,
6462 unsigned long nsyms,
6463 const char * strtab,
6464 unsigned long strtab_size,
6465 struct absaddr addr,
6466 const char ** symname,
6467 bfd_vma * offset)
6468 {
6469 bfd_vma dist = 0x100000;
6470 Elf_Internal_Sym * sym;
6471 Elf_Internal_Sym * beg;
6472 Elf_Internal_Sym * end;
6473 Elf_Internal_Sym * best = NULL;
6474
6475 REMOVE_ARCH_BITS (addr.offset);
6476 beg = symtab;
6477 end = symtab + nsyms;
6478
6479 while (beg < end)
6480 {
6481 bfd_vma value;
6482
6483 sym = beg + (end - beg) / 2;
6484
6485 value = sym->st_value;
6486 REMOVE_ARCH_BITS (value);
6487
6488 if (sym->st_name != 0
6489 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6490 && addr.offset >= value
6491 && addr.offset - value < dist)
6492 {
6493 best = sym;
6494 dist = addr.offset - value;
6495 if (!dist)
6496 break;
6497 }
6498
6499 if (addr.offset < value)
6500 end = sym;
6501 else
6502 beg = sym + 1;
6503 }
6504
6505 if (best)
6506 {
6507 *symname = (best->st_name >= strtab_size
6508 ? _("<corrupt>") : strtab + best->st_name);
6509 *offset = dist;
6510 return;
6511 }
6512
6513 *symname = NULL;
6514 *offset = addr.offset;
6515 }
6516
6517 static int
6518 symcmp (const void *p, const void *q)
6519 {
6520 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6521 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6522
6523 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6524 }
6525
6526 /* Process the unwind section. */
6527
6528 #include "unwind-ia64.h"
6529
6530 struct ia64_unw_table_entry
6531 {
6532 struct absaddr start;
6533 struct absaddr end;
6534 struct absaddr info;
6535 };
6536
6537 struct ia64_unw_aux_info
6538 {
6539 struct ia64_unw_table_entry *table; /* Unwind table. */
6540 unsigned long table_len; /* Length of unwind table. */
6541 unsigned char * info; /* Unwind info. */
6542 unsigned long info_size; /* Size of unwind info. */
6543 bfd_vma info_addr; /* Starting address of unwind info. */
6544 bfd_vma seg_base; /* Starting address of segment. */
6545 Elf_Internal_Sym * symtab; /* The symbol table. */
6546 unsigned long nsyms; /* Number of symbols. */
6547 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6548 unsigned long nfuns; /* Number of entries in funtab. */
6549 char * strtab; /* The string table. */
6550 unsigned long strtab_size; /* Size of string table. */
6551 };
6552
6553 static void
6554 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6555 {
6556 struct ia64_unw_table_entry * tp;
6557 unsigned long j, nfuns;
6558 int in_body;
6559
6560 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6561 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6562 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6563 aux->funtab[nfuns++] = aux->symtab[j];
6564 aux->nfuns = nfuns;
6565 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6566
6567 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6568 {
6569 bfd_vma stamp;
6570 bfd_vma offset;
6571 const unsigned char * dp;
6572 const unsigned char * head;
6573 const unsigned char * end;
6574 const char * procname;
6575
6576 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6577 aux->strtab_size, tp->start, &procname, &offset);
6578
6579 fputs ("\n<", stdout);
6580
6581 if (procname)
6582 {
6583 fputs (procname, stdout);
6584
6585 if (offset)
6586 printf ("+%lx", (unsigned long) offset);
6587 }
6588
6589 fputs (">: [", stdout);
6590 print_vma (tp->start.offset, PREFIX_HEX);
6591 fputc ('-', stdout);
6592 print_vma (tp->end.offset, PREFIX_HEX);
6593 printf ("], info at +0x%lx\n",
6594 (unsigned long) (tp->info.offset - aux->seg_base));
6595
6596 /* PR 17531: file: 86232b32. */
6597 if (aux->info == NULL)
6598 continue;
6599
6600 /* PR 17531: file: 0997b4d1. */
6601 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6602 {
6603 warn (_("Invalid offset %lx in table entry %ld\n"),
6604 (long) tp->info.offset, (long) (tp - aux->table));
6605 continue;
6606 }
6607
6608 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6609 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6610
6611 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6612 (unsigned) UNW_VER (stamp),
6613 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6614 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6615 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6616 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6617
6618 if (UNW_VER (stamp) != 1)
6619 {
6620 printf (_("\tUnknown version.\n"));
6621 continue;
6622 }
6623
6624 in_body = 0;
6625 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6626 /* PR 17531: file: 16ceda89. */
6627 if (end > aux->info + aux->info_size)
6628 end = aux->info + aux->info_size;
6629 for (dp = head + 8; dp < end;)
6630 dp = unw_decode (dp, in_body, & in_body);
6631 }
6632
6633 free (aux->funtab);
6634 }
6635
6636 static bfd_boolean
6637 slurp_ia64_unwind_table (FILE * file,
6638 struct ia64_unw_aux_info * aux,
6639 Elf_Internal_Shdr * sec)
6640 {
6641 unsigned long size, nrelas, i;
6642 Elf_Internal_Phdr * seg;
6643 struct ia64_unw_table_entry * tep;
6644 Elf_Internal_Shdr * relsec;
6645 Elf_Internal_Rela * rela;
6646 Elf_Internal_Rela * rp;
6647 unsigned char * table;
6648 unsigned char * tp;
6649 Elf_Internal_Sym * sym;
6650 const char * relname;
6651
6652 aux->table_len = 0;
6653
6654 /* First, find the starting address of the segment that includes
6655 this section: */
6656
6657 if (elf_header.e_phnum)
6658 {
6659 if (! get_program_headers (file))
6660 return FALSE;
6661
6662 for (seg = program_headers;
6663 seg < program_headers + elf_header.e_phnum;
6664 ++seg)
6665 {
6666 if (seg->p_type != PT_LOAD)
6667 continue;
6668
6669 if (sec->sh_addr >= seg->p_vaddr
6670 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6671 {
6672 aux->seg_base = seg->p_vaddr;
6673 break;
6674 }
6675 }
6676 }
6677
6678 /* Second, build the unwind table from the contents of the unwind section: */
6679 size = sec->sh_size;
6680 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6681 _("unwind table"));
6682 if (!table)
6683 return FALSE;
6684
6685 aux->table_len = size / (3 * eh_addr_size);
6686 aux->table = (struct ia64_unw_table_entry *)
6687 xcmalloc (aux->table_len, sizeof (aux->table[0]));
6688 tep = aux->table;
6689
6690 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6691 {
6692 tep->start.section = SHN_UNDEF;
6693 tep->end.section = SHN_UNDEF;
6694 tep->info.section = SHN_UNDEF;
6695 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6696 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6697 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6698 tep->start.offset += aux->seg_base;
6699 tep->end.offset += aux->seg_base;
6700 tep->info.offset += aux->seg_base;
6701 }
6702 free (table);
6703
6704 /* Third, apply any relocations to the unwind table: */
6705 for (relsec = section_headers;
6706 relsec < section_headers + elf_header.e_shnum;
6707 ++relsec)
6708 {
6709 if (relsec->sh_type != SHT_RELA
6710 || relsec->sh_info >= elf_header.e_shnum
6711 || section_headers + relsec->sh_info != sec)
6712 continue;
6713
6714 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6715 & rela, & nrelas))
6716 {
6717 free (aux->table);
6718 aux->table = NULL;
6719 aux->table_len = 0;
6720 return FALSE;
6721 }
6722
6723 for (rp = rela; rp < rela + nrelas; ++rp)
6724 {
6725 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6726 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6727
6728 /* PR 17531: file: 9fa67536. */
6729 if (relname == NULL)
6730 {
6731 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6732 continue;
6733 }
6734
6735 if (! const_strneq (relname, "R_IA64_SEGREL"))
6736 {
6737 warn (_("Skipping unexpected relocation type: %s\n"), relname);
6738 continue;
6739 }
6740
6741 i = rp->r_offset / (3 * eh_addr_size);
6742
6743 /* PR 17531: file: 5bc8d9bf. */
6744 if (i >= aux->table_len)
6745 {
6746 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6747 continue;
6748 }
6749
6750 switch (rp->r_offset / eh_addr_size % 3)
6751 {
6752 case 0:
6753 aux->table[i].start.section = sym->st_shndx;
6754 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6755 break;
6756 case 1:
6757 aux->table[i].end.section = sym->st_shndx;
6758 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6759 break;
6760 case 2:
6761 aux->table[i].info.section = sym->st_shndx;
6762 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6763 break;
6764 default:
6765 break;
6766 }
6767 }
6768
6769 free (rela);
6770 }
6771
6772 return TRUE;
6773 }
6774
6775 static void
6776 ia64_process_unwind (FILE * file)
6777 {
6778 Elf_Internal_Shdr * sec;
6779 Elf_Internal_Shdr * unwsec = NULL;
6780 Elf_Internal_Shdr * strsec;
6781 unsigned long i, unwcount = 0, unwstart = 0;
6782 struct ia64_unw_aux_info aux;
6783
6784 memset (& aux, 0, sizeof (aux));
6785
6786 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6787 {
6788 if (sec->sh_type == SHT_SYMTAB
6789 && sec->sh_link < elf_header.e_shnum)
6790 {
6791 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6792
6793 strsec = section_headers + sec->sh_link;
6794 if (aux.strtab != NULL)
6795 {
6796 error (_("Multiple auxillary string tables encountered\n"));
6797 free (aux.strtab);
6798 }
6799 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6800 1, strsec->sh_size,
6801 _("string table"));
6802 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6803 }
6804 else if (sec->sh_type == SHT_IA_64_UNWIND)
6805 unwcount++;
6806 }
6807
6808 if (!unwcount)
6809 printf (_("\nThere are no unwind sections in this file.\n"));
6810
6811 while (unwcount-- > 0)
6812 {
6813 char * suffix;
6814 size_t len, len2;
6815
6816 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6817 i < elf_header.e_shnum; ++i, ++sec)
6818 if (sec->sh_type == SHT_IA_64_UNWIND)
6819 {
6820 unwsec = sec;
6821 break;
6822 }
6823 /* We have already counted the number of SHT_IA64_UNWIND
6824 sections so the loop above should never fail. */
6825 assert (unwsec != NULL);
6826
6827 unwstart = i + 1;
6828 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6829
6830 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6831 {
6832 /* We need to find which section group it is in. */
6833 struct group_list * g;
6834
6835 if (section_headers_groups == NULL
6836 || section_headers_groups [i] == NULL)
6837 i = elf_header.e_shnum;
6838 else
6839 {
6840 g = section_headers_groups [i]->root;
6841
6842 for (; g != NULL; g = g->next)
6843 {
6844 sec = section_headers + g->section_index;
6845
6846 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6847 break;
6848 }
6849
6850 if (g == NULL)
6851 i = elf_header.e_shnum;
6852 }
6853 }
6854 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6855 {
6856 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6857 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6858 suffix = SECTION_NAME (unwsec) + len;
6859 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6860 ++i, ++sec)
6861 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6862 && streq (SECTION_NAME (sec) + len2, suffix))
6863 break;
6864 }
6865 else
6866 {
6867 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6868 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6869 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6870 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6871 suffix = "";
6872 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6873 suffix = SECTION_NAME (unwsec) + len;
6874 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6875 ++i, ++sec)
6876 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6877 && streq (SECTION_NAME (sec) + len2, suffix))
6878 break;
6879 }
6880
6881 if (i == elf_header.e_shnum)
6882 {
6883 printf (_("\nCould not find unwind info section for "));
6884
6885 if (string_table == NULL)
6886 printf ("%d", unwsec->sh_name);
6887 else
6888 printf ("'%s'", printable_section_name (unwsec));
6889 }
6890 else
6891 {
6892 aux.info_addr = sec->sh_addr;
6893 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6894 sec->sh_size,
6895 _("unwind info"));
6896 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6897
6898 printf (_("\nUnwind section "));
6899
6900 if (string_table == NULL)
6901 printf ("%d", unwsec->sh_name);
6902 else
6903 printf ("'%s'", printable_section_name (unwsec));
6904
6905 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6906 (unsigned long) unwsec->sh_offset,
6907 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6908
6909 if (slurp_ia64_unwind_table (file, & aux, unwsec)
6910 && aux.table_len > 0)
6911 dump_ia64_unwind (& aux);
6912
6913 if (aux.table)
6914 free ((char *) aux.table);
6915 if (aux.info)
6916 free ((char *) aux.info);
6917 aux.table = NULL;
6918 aux.info = NULL;
6919 }
6920 }
6921
6922 if (aux.symtab)
6923 free (aux.symtab);
6924 if (aux.strtab)
6925 free ((char *) aux.strtab);
6926 }
6927
6928 struct hppa_unw_table_entry
6929 {
6930 struct absaddr start;
6931 struct absaddr end;
6932 unsigned int Cannot_unwind:1; /* 0 */
6933 unsigned int Millicode:1; /* 1 */
6934 unsigned int Millicode_save_sr0:1; /* 2 */
6935 unsigned int Region_description:2; /* 3..4 */
6936 unsigned int reserved1:1; /* 5 */
6937 unsigned int Entry_SR:1; /* 6 */
6938 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6939 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6940 unsigned int Args_stored:1; /* 16 */
6941 unsigned int Variable_Frame:1; /* 17 */
6942 unsigned int Separate_Package_Body:1; /* 18 */
6943 unsigned int Frame_Extension_Millicode:1; /* 19 */
6944 unsigned int Stack_Overflow_Check:1; /* 20 */
6945 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
6946 unsigned int Ada_Region:1; /* 22 */
6947 unsigned int cxx_info:1; /* 23 */
6948 unsigned int cxx_try_catch:1; /* 24 */
6949 unsigned int sched_entry_seq:1; /* 25 */
6950 unsigned int reserved2:1; /* 26 */
6951 unsigned int Save_SP:1; /* 27 */
6952 unsigned int Save_RP:1; /* 28 */
6953 unsigned int Save_MRP_in_frame:1; /* 29 */
6954 unsigned int extn_ptr_defined:1; /* 30 */
6955 unsigned int Cleanup_defined:1; /* 31 */
6956
6957 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6958 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6959 unsigned int Large_frame:1; /* 2 */
6960 unsigned int Pseudo_SP_Set:1; /* 3 */
6961 unsigned int reserved4:1; /* 4 */
6962 unsigned int Total_frame_size:27; /* 5..31 */
6963 };
6964
6965 struct hppa_unw_aux_info
6966 {
6967 struct hppa_unw_table_entry * table; /* Unwind table. */
6968 unsigned long table_len; /* Length of unwind table. */
6969 bfd_vma seg_base; /* Starting address of segment. */
6970 Elf_Internal_Sym * symtab; /* The symbol table. */
6971 unsigned long nsyms; /* Number of symbols. */
6972 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6973 unsigned long nfuns; /* Number of entries in funtab. */
6974 char * strtab; /* The string table. */
6975 unsigned long strtab_size; /* Size of string table. */
6976 };
6977
6978 static void
6979 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6980 {
6981 struct hppa_unw_table_entry * tp;
6982 unsigned long j, nfuns;
6983
6984 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6985 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6986 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6987 aux->funtab[nfuns++] = aux->symtab[j];
6988 aux->nfuns = nfuns;
6989 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6990
6991 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6992 {
6993 bfd_vma offset;
6994 const char * procname;
6995
6996 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6997 aux->strtab_size, tp->start, &procname,
6998 &offset);
6999
7000 fputs ("\n<", stdout);
7001
7002 if (procname)
7003 {
7004 fputs (procname, stdout);
7005
7006 if (offset)
7007 printf ("+%lx", (unsigned long) offset);
7008 }
7009
7010 fputs (">: [", stdout);
7011 print_vma (tp->start.offset, PREFIX_HEX);
7012 fputc ('-', stdout);
7013 print_vma (tp->end.offset, PREFIX_HEX);
7014 printf ("]\n\t");
7015
7016 #define PF(_m) if (tp->_m) printf (#_m " ");
7017 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7018 PF(Cannot_unwind);
7019 PF(Millicode);
7020 PF(Millicode_save_sr0);
7021 /* PV(Region_description); */
7022 PF(Entry_SR);
7023 PV(Entry_FR);
7024 PV(Entry_GR);
7025 PF(Args_stored);
7026 PF(Variable_Frame);
7027 PF(Separate_Package_Body);
7028 PF(Frame_Extension_Millicode);
7029 PF(Stack_Overflow_Check);
7030 PF(Two_Instruction_SP_Increment);
7031 PF(Ada_Region);
7032 PF(cxx_info);
7033 PF(cxx_try_catch);
7034 PF(sched_entry_seq);
7035 PF(Save_SP);
7036 PF(Save_RP);
7037 PF(Save_MRP_in_frame);
7038 PF(extn_ptr_defined);
7039 PF(Cleanup_defined);
7040 PF(MPE_XL_interrupt_marker);
7041 PF(HP_UX_interrupt_marker);
7042 PF(Large_frame);
7043 PF(Pseudo_SP_Set);
7044 PV(Total_frame_size);
7045 #undef PF
7046 #undef PV
7047 }
7048
7049 printf ("\n");
7050
7051 free (aux->funtab);
7052 }
7053
7054 static int
7055 slurp_hppa_unwind_table (FILE * file,
7056 struct hppa_unw_aux_info * aux,
7057 Elf_Internal_Shdr * sec)
7058 {
7059 unsigned long size, unw_ent_size, nentries, nrelas, i;
7060 Elf_Internal_Phdr * seg;
7061 struct hppa_unw_table_entry * tep;
7062 Elf_Internal_Shdr * relsec;
7063 Elf_Internal_Rela * rela;
7064 Elf_Internal_Rela * rp;
7065 unsigned char * table;
7066 unsigned char * tp;
7067 Elf_Internal_Sym * sym;
7068 const char * relname;
7069
7070 /* First, find the starting address of the segment that includes
7071 this section. */
7072
7073 if (elf_header.e_phnum)
7074 {
7075 if (! get_program_headers (file))
7076 return 0;
7077
7078 for (seg = program_headers;
7079 seg < program_headers + elf_header.e_phnum;
7080 ++seg)
7081 {
7082 if (seg->p_type != PT_LOAD)
7083 continue;
7084
7085 if (sec->sh_addr >= seg->p_vaddr
7086 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7087 {
7088 aux->seg_base = seg->p_vaddr;
7089 break;
7090 }
7091 }
7092 }
7093
7094 /* Second, build the unwind table from the contents of the unwind
7095 section. */
7096 size = sec->sh_size;
7097 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7098 _("unwind table"));
7099 if (!table)
7100 return 0;
7101
7102 unw_ent_size = 16;
7103 nentries = size / unw_ent_size;
7104 size = unw_ent_size * nentries;
7105
7106 tep = aux->table = (struct hppa_unw_table_entry *)
7107 xcmalloc (nentries, sizeof (aux->table[0]));
7108
7109 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7110 {
7111 unsigned int tmp1, tmp2;
7112
7113 tep->start.section = SHN_UNDEF;
7114 tep->end.section = SHN_UNDEF;
7115
7116 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7117 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7118 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7119 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7120
7121 tep->start.offset += aux->seg_base;
7122 tep->end.offset += aux->seg_base;
7123
7124 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7125 tep->Millicode = (tmp1 >> 30) & 0x1;
7126 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7127 tep->Region_description = (tmp1 >> 27) & 0x3;
7128 tep->reserved1 = (tmp1 >> 26) & 0x1;
7129 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7130 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7131 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7132 tep->Args_stored = (tmp1 >> 15) & 0x1;
7133 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7134 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7135 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7136 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7137 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7138 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7139 tep->cxx_info = (tmp1 >> 8) & 0x1;
7140 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7141 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7142 tep->reserved2 = (tmp1 >> 5) & 0x1;
7143 tep->Save_SP = (tmp1 >> 4) & 0x1;
7144 tep->Save_RP = (tmp1 >> 3) & 0x1;
7145 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7146 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7147 tep->Cleanup_defined = tmp1 & 0x1;
7148
7149 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7150 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7151 tep->Large_frame = (tmp2 >> 29) & 0x1;
7152 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7153 tep->reserved4 = (tmp2 >> 27) & 0x1;
7154 tep->Total_frame_size = tmp2 & 0x7ffffff;
7155 }
7156 free (table);
7157
7158 /* Third, apply any relocations to the unwind table. */
7159 for (relsec = section_headers;
7160 relsec < section_headers + elf_header.e_shnum;
7161 ++relsec)
7162 {
7163 if (relsec->sh_type != SHT_RELA
7164 || relsec->sh_info >= elf_header.e_shnum
7165 || section_headers + relsec->sh_info != sec)
7166 continue;
7167
7168 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7169 & rela, & nrelas))
7170 return 0;
7171
7172 for (rp = rela; rp < rela + nrelas; ++rp)
7173 {
7174 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7175 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7176
7177 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7178 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7179 {
7180 warn (_("Skipping unexpected relocation type %s\n"), relname);
7181 continue;
7182 }
7183
7184 i = rp->r_offset / unw_ent_size;
7185
7186 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7187 {
7188 case 0:
7189 aux->table[i].start.section = sym->st_shndx;
7190 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7191 break;
7192 case 1:
7193 aux->table[i].end.section = sym->st_shndx;
7194 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7195 break;
7196 default:
7197 break;
7198 }
7199 }
7200
7201 free (rela);
7202 }
7203
7204 aux->table_len = nentries;
7205
7206 return 1;
7207 }
7208
7209 static void
7210 hppa_process_unwind (FILE * file)
7211 {
7212 struct hppa_unw_aux_info aux;
7213 Elf_Internal_Shdr * unwsec = NULL;
7214 Elf_Internal_Shdr * strsec;
7215 Elf_Internal_Shdr * sec;
7216 unsigned long i;
7217
7218 if (string_table == NULL)
7219 return;
7220
7221 memset (& aux, 0, sizeof (aux));
7222
7223 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7224 {
7225 if (sec->sh_type == SHT_SYMTAB
7226 && sec->sh_link < elf_header.e_shnum)
7227 {
7228 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7229
7230 strsec = section_headers + sec->sh_link;
7231 if (aux.strtab != NULL)
7232 {
7233 error (_("Multiple auxillary string tables encountered\n"));
7234 free (aux.strtab);
7235 }
7236 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7237 1, strsec->sh_size,
7238 _("string table"));
7239 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7240 }
7241 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7242 unwsec = sec;
7243 }
7244
7245 if (!unwsec)
7246 printf (_("\nThere are no unwind sections in this file.\n"));
7247
7248 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7249 {
7250 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7251 {
7252 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7253 printable_section_name (sec),
7254 (unsigned long) sec->sh_offset,
7255 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7256
7257 slurp_hppa_unwind_table (file, &aux, sec);
7258 if (aux.table_len > 0)
7259 dump_hppa_unwind (&aux);
7260
7261 if (aux.table)
7262 free ((char *) aux.table);
7263 aux.table = NULL;
7264 }
7265 }
7266
7267 if (aux.symtab)
7268 free (aux.symtab);
7269 if (aux.strtab)
7270 free ((char *) aux.strtab);
7271 }
7272
7273 struct arm_section
7274 {
7275 unsigned char * data; /* The unwind data. */
7276 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7277 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7278 unsigned long nrelas; /* The number of relocations. */
7279 unsigned int rel_type; /* REL or RELA ? */
7280 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7281 };
7282
7283 struct arm_unw_aux_info
7284 {
7285 FILE * file; /* The file containing the unwind sections. */
7286 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7287 unsigned long nsyms; /* Number of symbols. */
7288 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7289 unsigned long nfuns; /* Number of these symbols. */
7290 char * strtab; /* The file's string table. */
7291 unsigned long strtab_size; /* Size of string table. */
7292 };
7293
7294 static const char *
7295 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7296 bfd_vma fn, struct absaddr addr)
7297 {
7298 const char *procname;
7299 bfd_vma sym_offset;
7300
7301 if (addr.section == SHN_UNDEF)
7302 addr.offset = fn;
7303
7304 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7305 aux->strtab_size, addr, &procname,
7306 &sym_offset);
7307
7308 print_vma (fn, PREFIX_HEX);
7309
7310 if (procname)
7311 {
7312 fputs (" <", stdout);
7313 fputs (procname, stdout);
7314
7315 if (sym_offset)
7316 printf ("+0x%lx", (unsigned long) sym_offset);
7317 fputc ('>', stdout);
7318 }
7319
7320 return procname;
7321 }
7322
7323 static void
7324 arm_free_section (struct arm_section *arm_sec)
7325 {
7326 if (arm_sec->data != NULL)
7327 free (arm_sec->data);
7328
7329 if (arm_sec->rela != NULL)
7330 free (arm_sec->rela);
7331 }
7332
7333 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7334 cached section and install SEC instead.
7335 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7336 and return its valued in * WORDP, relocating if necessary.
7337 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7338 relocation's offset in ADDR.
7339 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7340 into the string table of the symbol associated with the reloc. If no
7341 reloc was applied store -1 there.
7342 5) Return TRUE upon success, FALSE otherwise. */
7343
7344 static bfd_boolean
7345 get_unwind_section_word (struct arm_unw_aux_info * aux,
7346 struct arm_section * arm_sec,
7347 Elf_Internal_Shdr * sec,
7348 bfd_vma word_offset,
7349 unsigned int * wordp,
7350 struct absaddr * addr,
7351 bfd_vma * sym_name)
7352 {
7353 Elf_Internal_Rela *rp;
7354 Elf_Internal_Sym *sym;
7355 const char * relname;
7356 unsigned int word;
7357 bfd_boolean wrapped;
7358
7359 if (sec == NULL || arm_sec == NULL)
7360 return FALSE;
7361
7362 addr->section = SHN_UNDEF;
7363 addr->offset = 0;
7364
7365 if (sym_name != NULL)
7366 *sym_name = (bfd_vma) -1;
7367
7368 /* If necessary, update the section cache. */
7369 if (sec != arm_sec->sec)
7370 {
7371 Elf_Internal_Shdr *relsec;
7372
7373 arm_free_section (arm_sec);
7374
7375 arm_sec->sec = sec;
7376 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7377 sec->sh_size, _("unwind data"));
7378 arm_sec->rela = NULL;
7379 arm_sec->nrelas = 0;
7380
7381 for (relsec = section_headers;
7382 relsec < section_headers + elf_header.e_shnum;
7383 ++relsec)
7384 {
7385 if (relsec->sh_info >= elf_header.e_shnum
7386 || section_headers + relsec->sh_info != sec
7387 /* PR 15745: Check the section type as well. */
7388 || (relsec->sh_type != SHT_REL
7389 && relsec->sh_type != SHT_RELA))
7390 continue;
7391
7392 arm_sec->rel_type = relsec->sh_type;
7393 if (relsec->sh_type == SHT_REL)
7394 {
7395 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7396 relsec->sh_size,
7397 & arm_sec->rela, & arm_sec->nrelas))
7398 return FALSE;
7399 }
7400 else /* relsec->sh_type == SHT_RELA */
7401 {
7402 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7403 relsec->sh_size,
7404 & arm_sec->rela, & arm_sec->nrelas))
7405 return FALSE;
7406 }
7407 break;
7408 }
7409
7410 arm_sec->next_rela = arm_sec->rela;
7411 }
7412
7413 /* If there is no unwind data we can do nothing. */
7414 if (arm_sec->data == NULL)
7415 return FALSE;
7416
7417 /* If the offset is invalid then fail. */
7418 if (word_offset > sec->sh_size - 4)
7419 return FALSE;
7420
7421 /* Get the word at the required offset. */
7422 word = byte_get (arm_sec->data + word_offset, 4);
7423
7424 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7425 if (arm_sec->rela == NULL)
7426 {
7427 * wordp = word;
7428 return TRUE;
7429 }
7430
7431 /* Look through the relocs to find the one that applies to the provided offset. */
7432 wrapped = FALSE;
7433 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7434 {
7435 bfd_vma prelval, offset;
7436
7437 if (rp->r_offset > word_offset && !wrapped)
7438 {
7439 rp = arm_sec->rela;
7440 wrapped = TRUE;
7441 }
7442 if (rp->r_offset > word_offset)
7443 break;
7444
7445 if (rp->r_offset & 3)
7446 {
7447 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7448 (unsigned long) rp->r_offset);
7449 continue;
7450 }
7451
7452 if (rp->r_offset < word_offset)
7453 continue;
7454
7455 /* PR 17531: file: 027-161405-0.004 */
7456 if (aux->symtab == NULL)
7457 continue;
7458
7459 if (arm_sec->rel_type == SHT_REL)
7460 {
7461 offset = word & 0x7fffffff;
7462 if (offset & 0x40000000)
7463 offset |= ~ (bfd_vma) 0x7fffffff;
7464 }
7465 else if (arm_sec->rel_type == SHT_RELA)
7466 offset = rp->r_addend;
7467 else
7468 {
7469 error (_("Unknown section relocation type %d encountered\n"),
7470 arm_sec->rel_type);
7471 break;
7472 }
7473
7474 /* PR 17531 file: 027-1241568-0.004. */
7475 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7476 {
7477 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7478 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7479 break;
7480 }
7481
7482 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7483 offset += sym->st_value;
7484 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7485
7486 /* Check that we are processing the expected reloc type. */
7487 if (elf_header.e_machine == EM_ARM)
7488 {
7489 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7490 if (relname == NULL)
7491 {
7492 warn (_("Skipping unknown ARM relocation type: %d\n"),
7493 (int) ELF32_R_TYPE (rp->r_info));
7494 continue;
7495 }
7496
7497 if (streq (relname, "R_ARM_NONE"))
7498 continue;
7499
7500 if (! streq (relname, "R_ARM_PREL31"))
7501 {
7502 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7503 continue;
7504 }
7505 }
7506 else if (elf_header.e_machine == EM_TI_C6000)
7507 {
7508 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7509 if (relname == NULL)
7510 {
7511 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7512 (int) ELF32_R_TYPE (rp->r_info));
7513 continue;
7514 }
7515
7516 if (streq (relname, "R_C6000_NONE"))
7517 continue;
7518
7519 if (! streq (relname, "R_C6000_PREL31"))
7520 {
7521 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7522 continue;
7523 }
7524
7525 prelval >>= 1;
7526 }
7527 else
7528 {
7529 /* This function currently only supports ARM and TI unwinders. */
7530 warn (_("Only TI and ARM unwinders are currently supported\n"));
7531 break;
7532 }
7533
7534 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7535 addr->section = sym->st_shndx;
7536 addr->offset = offset;
7537
7538 if (sym_name)
7539 * sym_name = sym->st_name;
7540 break;
7541 }
7542
7543 *wordp = word;
7544 arm_sec->next_rela = rp;
7545
7546 return TRUE;
7547 }
7548
7549 static const char *tic6x_unwind_regnames[16] =
7550 {
7551 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7552 "A14", "A13", "A12", "A11", "A10",
7553 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7554 };
7555
7556 static void
7557 decode_tic6x_unwind_regmask (unsigned int mask)
7558 {
7559 int i;
7560
7561 for (i = 12; mask; mask >>= 1, i--)
7562 {
7563 if (mask & 1)
7564 {
7565 fputs (tic6x_unwind_regnames[i], stdout);
7566 if (mask > 1)
7567 fputs (", ", stdout);
7568 }
7569 }
7570 }
7571
7572 #define ADVANCE \
7573 if (remaining == 0 && more_words) \
7574 { \
7575 data_offset += 4; \
7576 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7577 data_offset, & word, & addr, NULL)) \
7578 return; \
7579 remaining = 4; \
7580 more_words--; \
7581 } \
7582
7583 #define GET_OP(OP) \
7584 ADVANCE; \
7585 if (remaining) \
7586 { \
7587 remaining--; \
7588 (OP) = word >> 24; \
7589 word <<= 8; \
7590 } \
7591 else \
7592 { \
7593 printf (_("[Truncated opcode]\n")); \
7594 return; \
7595 } \
7596 printf ("0x%02x ", OP)
7597
7598 static void
7599 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7600 unsigned int word,
7601 unsigned int remaining,
7602 unsigned int more_words,
7603 bfd_vma data_offset,
7604 Elf_Internal_Shdr * data_sec,
7605 struct arm_section * data_arm_sec)
7606 {
7607 struct absaddr addr;
7608
7609 /* Decode the unwinding instructions. */
7610 while (1)
7611 {
7612 unsigned int op, op2;
7613
7614 ADVANCE;
7615 if (remaining == 0)
7616 break;
7617 remaining--;
7618 op = word >> 24;
7619 word <<= 8;
7620
7621 printf (" 0x%02x ", op);
7622
7623 if ((op & 0xc0) == 0x00)
7624 {
7625 int offset = ((op & 0x3f) << 2) + 4;
7626
7627 printf (" vsp = vsp + %d", offset);
7628 }
7629 else if ((op & 0xc0) == 0x40)
7630 {
7631 int offset = ((op & 0x3f) << 2) + 4;
7632
7633 printf (" vsp = vsp - %d", offset);
7634 }
7635 else if ((op & 0xf0) == 0x80)
7636 {
7637 GET_OP (op2);
7638 if (op == 0x80 && op2 == 0)
7639 printf (_("Refuse to unwind"));
7640 else
7641 {
7642 unsigned int mask = ((op & 0x0f) << 8) | op2;
7643 int first = 1;
7644 int i;
7645
7646 printf ("pop {");
7647 for (i = 0; i < 12; i++)
7648 if (mask & (1 << i))
7649 {
7650 if (first)
7651 first = 0;
7652 else
7653 printf (", ");
7654 printf ("r%d", 4 + i);
7655 }
7656 printf ("}");
7657 }
7658 }
7659 else if ((op & 0xf0) == 0x90)
7660 {
7661 if (op == 0x9d || op == 0x9f)
7662 printf (_(" [Reserved]"));
7663 else
7664 printf (" vsp = r%d", op & 0x0f);
7665 }
7666 else if ((op & 0xf0) == 0xa0)
7667 {
7668 int end = 4 + (op & 0x07);
7669 int first = 1;
7670 int i;
7671
7672 printf (" pop {");
7673 for (i = 4; i <= end; i++)
7674 {
7675 if (first)
7676 first = 0;
7677 else
7678 printf (", ");
7679 printf ("r%d", i);
7680 }
7681 if (op & 0x08)
7682 {
7683 if (!first)
7684 printf (", ");
7685 printf ("r14");
7686 }
7687 printf ("}");
7688 }
7689 else if (op == 0xb0)
7690 printf (_(" finish"));
7691 else if (op == 0xb1)
7692 {
7693 GET_OP (op2);
7694 if (op2 == 0 || (op2 & 0xf0) != 0)
7695 printf (_("[Spare]"));
7696 else
7697 {
7698 unsigned int mask = op2 & 0x0f;
7699 int first = 1;
7700 int i;
7701
7702 printf ("pop {");
7703 for (i = 0; i < 12; i++)
7704 if (mask & (1 << i))
7705 {
7706 if (first)
7707 first = 0;
7708 else
7709 printf (", ");
7710 printf ("r%d", i);
7711 }
7712 printf ("}");
7713 }
7714 }
7715 else if (op == 0xb2)
7716 {
7717 unsigned char buf[9];
7718 unsigned int i, len;
7719 unsigned long offset;
7720
7721 for (i = 0; i < sizeof (buf); i++)
7722 {
7723 GET_OP (buf[i]);
7724 if ((buf[i] & 0x80) == 0)
7725 break;
7726 }
7727 if (i == sizeof (buf))
7728 printf (_("corrupt change to vsp"));
7729 else
7730 {
7731 offset = read_uleb128 (buf, &len, buf + i + 1);
7732 assert (len == i + 1);
7733 offset = offset * 4 + 0x204;
7734 printf ("vsp = vsp + %ld", offset);
7735 }
7736 }
7737 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7738 {
7739 unsigned int first, last;
7740
7741 GET_OP (op2);
7742 first = op2 >> 4;
7743 last = op2 & 0x0f;
7744 if (op == 0xc8)
7745 first = first + 16;
7746 printf ("pop {D%d", first);
7747 if (last)
7748 printf ("-D%d", first + last);
7749 printf ("}");
7750 }
7751 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7752 {
7753 unsigned int count = op & 0x07;
7754
7755 printf ("pop {D8");
7756 if (count)
7757 printf ("-D%d", 8 + count);
7758 printf ("}");
7759 }
7760 else if (op >= 0xc0 && op <= 0xc5)
7761 {
7762 unsigned int count = op & 0x07;
7763
7764 printf (" pop {wR10");
7765 if (count)
7766 printf ("-wR%d", 10 + count);
7767 printf ("}");
7768 }
7769 else if (op == 0xc6)
7770 {
7771 unsigned int first, last;
7772
7773 GET_OP (op2);
7774 first = op2 >> 4;
7775 last = op2 & 0x0f;
7776 printf ("pop {wR%d", first);
7777 if (last)
7778 printf ("-wR%d", first + last);
7779 printf ("}");
7780 }
7781 else if (op == 0xc7)
7782 {
7783 GET_OP (op2);
7784 if (op2 == 0 || (op2 & 0xf0) != 0)
7785 printf (_("[Spare]"));
7786 else
7787 {
7788 unsigned int mask = op2 & 0x0f;
7789 int first = 1;
7790 int i;
7791
7792 printf ("pop {");
7793 for (i = 0; i < 4; i++)
7794 if (mask & (1 << i))
7795 {
7796 if (first)
7797 first = 0;
7798 else
7799 printf (", ");
7800 printf ("wCGR%d", i);
7801 }
7802 printf ("}");
7803 }
7804 }
7805 else
7806 printf (_(" [unsupported opcode]"));
7807 printf ("\n");
7808 }
7809 }
7810
7811 static void
7812 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
7813 unsigned int word,
7814 unsigned int remaining,
7815 unsigned int more_words,
7816 bfd_vma data_offset,
7817 Elf_Internal_Shdr * data_sec,
7818 struct arm_section * data_arm_sec)
7819 {
7820 struct absaddr addr;
7821
7822 /* Decode the unwinding instructions. */
7823 while (1)
7824 {
7825 unsigned int op, op2;
7826
7827 ADVANCE;
7828 if (remaining == 0)
7829 break;
7830 remaining--;
7831 op = word >> 24;
7832 word <<= 8;
7833
7834 printf (" 0x%02x ", op);
7835
7836 if ((op & 0xc0) == 0x00)
7837 {
7838 int offset = ((op & 0x3f) << 3) + 8;
7839 printf (" sp = sp + %d", offset);
7840 }
7841 else if ((op & 0xc0) == 0x80)
7842 {
7843 GET_OP (op2);
7844 if (op == 0x80 && op2 == 0)
7845 printf (_("Refuse to unwind"));
7846 else
7847 {
7848 unsigned int mask = ((op & 0x1f) << 8) | op2;
7849 if (op & 0x20)
7850 printf ("pop compact {");
7851 else
7852 printf ("pop {");
7853
7854 decode_tic6x_unwind_regmask (mask);
7855 printf("}");
7856 }
7857 }
7858 else if ((op & 0xf0) == 0xc0)
7859 {
7860 unsigned int reg;
7861 unsigned int nregs;
7862 unsigned int i;
7863 const char *name;
7864 struct
7865 {
7866 unsigned int offset;
7867 unsigned int reg;
7868 } regpos[16];
7869
7870 /* Scan entire instruction first so that GET_OP output is not
7871 interleaved with disassembly. */
7872 nregs = 0;
7873 for (i = 0; nregs < (op & 0xf); i++)
7874 {
7875 GET_OP (op2);
7876 reg = op2 >> 4;
7877 if (reg != 0xf)
7878 {
7879 regpos[nregs].offset = i * 2;
7880 regpos[nregs].reg = reg;
7881 nregs++;
7882 }
7883
7884 reg = op2 & 0xf;
7885 if (reg != 0xf)
7886 {
7887 regpos[nregs].offset = i * 2 + 1;
7888 regpos[nregs].reg = reg;
7889 nregs++;
7890 }
7891 }
7892
7893 printf (_("pop frame {"));
7894 reg = nregs - 1;
7895 for (i = i * 2; i > 0; i--)
7896 {
7897 if (regpos[reg].offset == i - 1)
7898 {
7899 name = tic6x_unwind_regnames[regpos[reg].reg];
7900 if (reg > 0)
7901 reg--;
7902 }
7903 else
7904 name = _("[pad]");
7905
7906 fputs (name, stdout);
7907 if (i > 1)
7908 printf (", ");
7909 }
7910
7911 printf ("}");
7912 }
7913 else if (op == 0xd0)
7914 printf (" MOV FP, SP");
7915 else if (op == 0xd1)
7916 printf (" __c6xabi_pop_rts");
7917 else if (op == 0xd2)
7918 {
7919 unsigned char buf[9];
7920 unsigned int i, len;
7921 unsigned long offset;
7922
7923 for (i = 0; i < sizeof (buf); i++)
7924 {
7925 GET_OP (buf[i]);
7926 if ((buf[i] & 0x80) == 0)
7927 break;
7928 }
7929 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
7930 if (i == sizeof (buf))
7931 {
7932 printf ("<corrupt sp adjust>\n");
7933 warn (_("Corrupt stack pointer adjustment detected\n"));
7934 return;
7935 }
7936
7937 offset = read_uleb128 (buf, &len, buf + i + 1);
7938 assert (len == i + 1);
7939 offset = offset * 8 + 0x408;
7940 printf (_("sp = sp + %ld"), offset);
7941 }
7942 else if ((op & 0xf0) == 0xe0)
7943 {
7944 if ((op & 0x0f) == 7)
7945 printf (" RETURN");
7946 else
7947 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7948 }
7949 else
7950 {
7951 printf (_(" [unsupported opcode]"));
7952 }
7953 putchar ('\n');
7954 }
7955 }
7956
7957 static bfd_vma
7958 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7959 {
7960 bfd_vma offset;
7961
7962 offset = word & 0x7fffffff;
7963 if (offset & 0x40000000)
7964 offset |= ~ (bfd_vma) 0x7fffffff;
7965
7966 if (elf_header.e_machine == EM_TI_C6000)
7967 offset <<= 1;
7968
7969 return offset + where;
7970 }
7971
7972 static void
7973 decode_arm_unwind (struct arm_unw_aux_info * aux,
7974 unsigned int word,
7975 unsigned int remaining,
7976 bfd_vma data_offset,
7977 Elf_Internal_Shdr * data_sec,
7978 struct arm_section * data_arm_sec)
7979 {
7980 int per_index;
7981 unsigned int more_words = 0;
7982 struct absaddr addr;
7983 bfd_vma sym_name = (bfd_vma) -1;
7984
7985 if (remaining == 0)
7986 {
7987 /* Fetch the first word.
7988 Note - when decoding an object file the address extracted
7989 here will always be 0. So we also pass in the sym_name
7990 parameter so that we can find the symbol associated with
7991 the personality routine. */
7992 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7993 & word, & addr, & sym_name))
7994 return;
7995
7996 remaining = 4;
7997 }
7998
7999 if ((word & 0x80000000) == 0)
8000 {
8001 /* Expand prel31 for personality routine. */
8002 bfd_vma fn;
8003 const char *procname;
8004
8005 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8006 printf (_(" Personality routine: "));
8007 if (fn == 0
8008 && addr.section == SHN_UNDEF && addr.offset == 0
8009 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8010 {
8011 procname = aux->strtab + sym_name;
8012 print_vma (fn, PREFIX_HEX);
8013 if (procname)
8014 {
8015 fputs (" <", stdout);
8016 fputs (procname, stdout);
8017 fputc ('>', stdout);
8018 }
8019 }
8020 else
8021 procname = arm_print_vma_and_name (aux, fn, addr);
8022 fputc ('\n', stdout);
8023
8024 /* The GCC personality routines use the standard compact
8025 encoding, starting with one byte giving the number of
8026 words. */
8027 if (procname != NULL
8028 && (const_strneq (procname, "__gcc_personality_v0")
8029 || const_strneq (procname, "__gxx_personality_v0")
8030 || const_strneq (procname, "__gcj_personality_v0")
8031 || const_strneq (procname, "__gnu_objc_personality_v0")))
8032 {
8033 remaining = 0;
8034 more_words = 1;
8035 ADVANCE;
8036 if (!remaining)
8037 {
8038 printf (_(" [Truncated data]\n"));
8039 return;
8040 }
8041 more_words = word >> 24;
8042 word <<= 8;
8043 remaining--;
8044 per_index = -1;
8045 }
8046 else
8047 return;
8048 }
8049 else
8050 {
8051 /* ARM EHABI Section 6.3:
8052
8053 An exception-handling table entry for the compact model looks like:
8054
8055 31 30-28 27-24 23-0
8056 -- ----- ----- ----
8057 1 0 index Data for personalityRoutine[index] */
8058
8059 if (elf_header.e_machine == EM_ARM
8060 && (word & 0x70000000))
8061 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8062
8063 per_index = (word >> 24) & 0x7f;
8064 printf (_(" Compact model index: %d\n"), per_index);
8065 if (per_index == 0)
8066 {
8067 more_words = 0;
8068 word <<= 8;
8069 remaining--;
8070 }
8071 else if (per_index < 3)
8072 {
8073 more_words = (word >> 16) & 0xff;
8074 word <<= 16;
8075 remaining -= 2;
8076 }
8077 }
8078
8079 switch (elf_header.e_machine)
8080 {
8081 case EM_ARM:
8082 if (per_index < 3)
8083 {
8084 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8085 data_offset, data_sec, data_arm_sec);
8086 }
8087 else
8088 {
8089 warn (_("Unknown ARM compact model index encountered\n"));
8090 printf (_(" [reserved]\n"));
8091 }
8092 break;
8093
8094 case EM_TI_C6000:
8095 if (per_index < 3)
8096 {
8097 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8098 data_offset, data_sec, data_arm_sec);
8099 }
8100 else if (per_index < 5)
8101 {
8102 if (((word >> 17) & 0x7f) == 0x7f)
8103 printf (_(" Restore stack from frame pointer\n"));
8104 else
8105 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8106 printf (_(" Registers restored: "));
8107 if (per_index == 4)
8108 printf (" (compact) ");
8109 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8110 putchar ('\n');
8111 printf (_(" Return register: %s\n"),
8112 tic6x_unwind_regnames[word & 0xf]);
8113 }
8114 else
8115 printf (_(" [reserved (%d)]\n"), per_index);
8116 break;
8117
8118 default:
8119 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8120 elf_header.e_machine);
8121 }
8122
8123 /* Decode the descriptors. Not implemented. */
8124 }
8125
8126 static void
8127 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8128 {
8129 struct arm_section exidx_arm_sec, extab_arm_sec;
8130 unsigned int i, exidx_len;
8131 unsigned long j, nfuns;
8132
8133 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8134 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8135 exidx_len = exidx_sec->sh_size / 8;
8136
8137 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8138 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8139 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8140 aux->funtab[nfuns++] = aux->symtab[j];
8141 aux->nfuns = nfuns;
8142 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8143
8144 for (i = 0; i < exidx_len; i++)
8145 {
8146 unsigned int exidx_fn, exidx_entry;
8147 struct absaddr fn_addr, entry_addr;
8148 bfd_vma fn;
8149
8150 fputc ('\n', stdout);
8151
8152 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8153 8 * i, & exidx_fn, & fn_addr, NULL)
8154 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8155 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8156 {
8157 free (aux->funtab);
8158 arm_free_section (& exidx_arm_sec);
8159 arm_free_section (& extab_arm_sec);
8160 return;
8161 }
8162
8163 /* ARM EHABI, Section 5:
8164 An index table entry consists of 2 words.
8165 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8166 if (exidx_fn & 0x80000000)
8167 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8168
8169 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8170
8171 arm_print_vma_and_name (aux, fn, fn_addr);
8172 fputs (": ", stdout);
8173
8174 if (exidx_entry == 1)
8175 {
8176 print_vma (exidx_entry, PREFIX_HEX);
8177 fputs (" [cantunwind]\n", stdout);
8178 }
8179 else if (exidx_entry & 0x80000000)
8180 {
8181 print_vma (exidx_entry, PREFIX_HEX);
8182 fputc ('\n', stdout);
8183 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8184 }
8185 else
8186 {
8187 bfd_vma table, table_offset = 0;
8188 Elf_Internal_Shdr *table_sec;
8189
8190 fputs ("@", stdout);
8191 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8192 print_vma (table, PREFIX_HEX);
8193 printf ("\n");
8194
8195 /* Locate the matching .ARM.extab. */
8196 if (entry_addr.section != SHN_UNDEF
8197 && entry_addr.section < elf_header.e_shnum)
8198 {
8199 table_sec = section_headers + entry_addr.section;
8200 table_offset = entry_addr.offset;
8201 }
8202 else
8203 {
8204 table_sec = find_section_by_address (table);
8205 if (table_sec != NULL)
8206 table_offset = table - table_sec->sh_addr;
8207 }
8208 if (table_sec == NULL)
8209 {
8210 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8211 (unsigned long) table);
8212 continue;
8213 }
8214 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8215 &extab_arm_sec);
8216 }
8217 }
8218
8219 printf ("\n");
8220
8221 free (aux->funtab);
8222 arm_free_section (&exidx_arm_sec);
8223 arm_free_section (&extab_arm_sec);
8224 }
8225
8226 /* Used for both ARM and C6X unwinding tables. */
8227
8228 static void
8229 arm_process_unwind (FILE *file)
8230 {
8231 struct arm_unw_aux_info aux;
8232 Elf_Internal_Shdr *unwsec = NULL;
8233 Elf_Internal_Shdr *strsec;
8234 Elf_Internal_Shdr *sec;
8235 unsigned long i;
8236 unsigned int sec_type;
8237
8238 switch (elf_header.e_machine)
8239 {
8240 case EM_ARM:
8241 sec_type = SHT_ARM_EXIDX;
8242 break;
8243
8244 case EM_TI_C6000:
8245 sec_type = SHT_C6000_UNWIND;
8246 break;
8247
8248 default:
8249 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8250 elf_header.e_machine);
8251 return;
8252 }
8253
8254 if (string_table == NULL)
8255 return;
8256
8257 memset (& aux, 0, sizeof (aux));
8258 aux.file = file;
8259
8260 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8261 {
8262 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8263 {
8264 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8265
8266 strsec = section_headers + sec->sh_link;
8267
8268 /* PR binutils/17531 file: 011-12666-0.004. */
8269 if (aux.strtab != NULL)
8270 {
8271 error (_("Multiple string tables found in file.\n"));
8272 free (aux.strtab);
8273 }
8274 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8275 1, strsec->sh_size, _("string table"));
8276 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8277 }
8278 else if (sec->sh_type == sec_type)
8279 unwsec = sec;
8280 }
8281
8282 if (unwsec == NULL)
8283 printf (_("\nThere are no unwind sections in this file.\n"));
8284 else
8285 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8286 {
8287 if (sec->sh_type == sec_type)
8288 {
8289 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8290 printable_section_name (sec),
8291 (unsigned long) sec->sh_offset,
8292 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8293
8294 dump_arm_unwind (&aux, sec);
8295 }
8296 }
8297
8298 if (aux.symtab)
8299 free (aux.symtab);
8300 if (aux.strtab)
8301 free ((char *) aux.strtab);
8302 }
8303
8304 static void
8305 process_unwind (FILE * file)
8306 {
8307 struct unwind_handler
8308 {
8309 int machtype;
8310 void (* handler)(FILE *);
8311 } handlers[] =
8312 {
8313 { EM_ARM, arm_process_unwind },
8314 { EM_IA_64, ia64_process_unwind },
8315 { EM_PARISC, hppa_process_unwind },
8316 { EM_TI_C6000, arm_process_unwind },
8317 { 0, 0 }
8318 };
8319 int i;
8320
8321 if (!do_unwind)
8322 return;
8323
8324 for (i = 0; handlers[i].handler != NULL; i++)
8325 if (elf_header.e_machine == handlers[i].machtype)
8326 {
8327 handlers[i].handler (file);
8328 return;
8329 }
8330
8331 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8332 get_machine_name (elf_header.e_machine));
8333 }
8334
8335 static void
8336 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8337 {
8338 switch (entry->d_tag)
8339 {
8340 case DT_MIPS_FLAGS:
8341 if (entry->d_un.d_val == 0)
8342 printf (_("NONE"));
8343 else
8344 {
8345 static const char * opts[] =
8346 {
8347 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8348 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8349 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8350 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8351 "RLD_ORDER_SAFE"
8352 };
8353 unsigned int cnt;
8354 int first = 1;
8355
8356 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8357 if (entry->d_un.d_val & (1 << cnt))
8358 {
8359 printf ("%s%s", first ? "" : " ", opts[cnt]);
8360 first = 0;
8361 }
8362 }
8363 break;
8364
8365 case DT_MIPS_IVERSION:
8366 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8367 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8368 else
8369 {
8370 char buf[40];
8371 sprintf_vma (buf, entry->d_un.d_ptr);
8372 /* Note: coded this way so that there is a single string for translation. */
8373 printf (_("<corrupt: %s>"), buf);
8374 }
8375 break;
8376
8377 case DT_MIPS_TIME_STAMP:
8378 {
8379 char timebuf[20];
8380 struct tm * tmp;
8381 time_t atime = entry->d_un.d_val;
8382
8383 tmp = gmtime (&atime);
8384 /* PR 17531: file: 6accc532. */
8385 if (tmp == NULL)
8386 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8387 else
8388 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8389 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8390 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8391 printf (_("Time Stamp: %s"), timebuf);
8392 }
8393 break;
8394
8395 case DT_MIPS_RLD_VERSION:
8396 case DT_MIPS_LOCAL_GOTNO:
8397 case DT_MIPS_CONFLICTNO:
8398 case DT_MIPS_LIBLISTNO:
8399 case DT_MIPS_SYMTABNO:
8400 case DT_MIPS_UNREFEXTNO:
8401 case DT_MIPS_HIPAGENO:
8402 case DT_MIPS_DELTA_CLASS_NO:
8403 case DT_MIPS_DELTA_INSTANCE_NO:
8404 case DT_MIPS_DELTA_RELOC_NO:
8405 case DT_MIPS_DELTA_SYM_NO:
8406 case DT_MIPS_DELTA_CLASSSYM_NO:
8407 case DT_MIPS_COMPACT_SIZE:
8408 print_vma (entry->d_un.d_ptr, DEC);
8409 break;
8410
8411 default:
8412 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8413 }
8414 putchar ('\n');
8415 }
8416
8417 static void
8418 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8419 {
8420 switch (entry->d_tag)
8421 {
8422 case DT_HP_DLD_FLAGS:
8423 {
8424 static struct
8425 {
8426 long int bit;
8427 const char * str;
8428 }
8429 flags[] =
8430 {
8431 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8432 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8433 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8434 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8435 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8436 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8437 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8438 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8439 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8440 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8441 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8442 { DT_HP_GST, "HP_GST" },
8443 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8444 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8445 { DT_HP_NODELETE, "HP_NODELETE" },
8446 { DT_HP_GROUP, "HP_GROUP" },
8447 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8448 };
8449 int first = 1;
8450 size_t cnt;
8451 bfd_vma val = entry->d_un.d_val;
8452
8453 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8454 if (val & flags[cnt].bit)
8455 {
8456 if (! first)
8457 putchar (' ');
8458 fputs (flags[cnt].str, stdout);
8459 first = 0;
8460 val ^= flags[cnt].bit;
8461 }
8462
8463 if (val != 0 || first)
8464 {
8465 if (! first)
8466 putchar (' ');
8467 print_vma (val, HEX);
8468 }
8469 }
8470 break;
8471
8472 default:
8473 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8474 break;
8475 }
8476 putchar ('\n');
8477 }
8478
8479 #ifdef BFD64
8480
8481 /* VMS vs Unix time offset and factor. */
8482
8483 #define VMS_EPOCH_OFFSET 35067168000000000LL
8484 #define VMS_GRANULARITY_FACTOR 10000000
8485
8486 /* Display a VMS time in a human readable format. */
8487
8488 static void
8489 print_vms_time (bfd_int64_t vmstime)
8490 {
8491 struct tm *tm;
8492 time_t unxtime;
8493
8494 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8495 tm = gmtime (&unxtime);
8496 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8497 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8498 tm->tm_hour, tm->tm_min, tm->tm_sec);
8499 }
8500 #endif /* BFD64 */
8501
8502 static void
8503 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8504 {
8505 switch (entry->d_tag)
8506 {
8507 case DT_IA_64_PLT_RESERVE:
8508 /* First 3 slots reserved. */
8509 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8510 printf (" -- ");
8511 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8512 break;
8513
8514 case DT_IA_64_VMS_LINKTIME:
8515 #ifdef BFD64
8516 print_vms_time (entry->d_un.d_val);
8517 #endif
8518 break;
8519
8520 case DT_IA_64_VMS_LNKFLAGS:
8521 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8522 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8523 printf (" CALL_DEBUG");
8524 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8525 printf (" NOP0BUFS");
8526 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8527 printf (" P0IMAGE");
8528 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8529 printf (" MKTHREADS");
8530 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8531 printf (" UPCALLS");
8532 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8533 printf (" IMGSTA");
8534 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8535 printf (" INITIALIZE");
8536 if (entry->d_un.d_val & VMS_LF_MAIN)
8537 printf (" MAIN");
8538 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8539 printf (" EXE_INIT");
8540 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8541 printf (" TBK_IN_IMG");
8542 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8543 printf (" DBG_IN_IMG");
8544 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8545 printf (" TBK_IN_DSF");
8546 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8547 printf (" DBG_IN_DSF");
8548 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8549 printf (" SIGNATURES");
8550 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8551 printf (" REL_SEG_OFF");
8552 break;
8553
8554 default:
8555 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8556 break;
8557 }
8558 putchar ('\n');
8559 }
8560
8561 static int
8562 get_32bit_dynamic_section (FILE * file)
8563 {
8564 Elf32_External_Dyn * edyn;
8565 Elf32_External_Dyn * ext;
8566 Elf_Internal_Dyn * entry;
8567
8568 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8569 dynamic_size, _("dynamic section"));
8570 if (!edyn)
8571 return 0;
8572
8573 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8574 might not have the luxury of section headers. Look for the DT_NULL
8575 terminator to determine the number of entries. */
8576 for (ext = edyn, dynamic_nent = 0;
8577 (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8578 ext++)
8579 {
8580 dynamic_nent++;
8581 if (BYTE_GET (ext->d_tag) == DT_NULL)
8582 break;
8583 }
8584
8585 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8586 sizeof (* entry));
8587 if (dynamic_section == NULL)
8588 {
8589 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8590 (unsigned long) dynamic_nent);
8591 free (edyn);
8592 return 0;
8593 }
8594
8595 for (ext = edyn, entry = dynamic_section;
8596 entry < dynamic_section + dynamic_nent;
8597 ext++, entry++)
8598 {
8599 entry->d_tag = BYTE_GET (ext->d_tag);
8600 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8601 }
8602
8603 free (edyn);
8604
8605 return 1;
8606 }
8607
8608 static int
8609 get_64bit_dynamic_section (FILE * file)
8610 {
8611 Elf64_External_Dyn * edyn;
8612 Elf64_External_Dyn * ext;
8613 Elf_Internal_Dyn * entry;
8614
8615 /* Read in the data. */
8616 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8617 dynamic_size, _("dynamic section"));
8618 if (!edyn)
8619 return 0;
8620
8621 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8622 might not have the luxury of section headers. Look for the DT_NULL
8623 terminator to determine the number of entries. */
8624 for (ext = edyn, dynamic_nent = 0;
8625 /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer. */
8626 (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8627 ext++)
8628 {
8629 dynamic_nent++;
8630 if (BYTE_GET (ext->d_tag) == DT_NULL)
8631 break;
8632 }
8633
8634 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8635 sizeof (* entry));
8636 if (dynamic_section == NULL)
8637 {
8638 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8639 (unsigned long) dynamic_nent);
8640 free (edyn);
8641 return 0;
8642 }
8643
8644 /* Convert from external to internal formats. */
8645 for (ext = edyn, entry = dynamic_section;
8646 entry < dynamic_section + dynamic_nent;
8647 ext++, entry++)
8648 {
8649 entry->d_tag = BYTE_GET (ext->d_tag);
8650 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8651 }
8652
8653 free (edyn);
8654
8655 return 1;
8656 }
8657
8658 static void
8659 print_dynamic_flags (bfd_vma flags)
8660 {
8661 int first = 1;
8662
8663 while (flags)
8664 {
8665 bfd_vma flag;
8666
8667 flag = flags & - flags;
8668 flags &= ~ flag;
8669
8670 if (first)
8671 first = 0;
8672 else
8673 putc (' ', stdout);
8674
8675 switch (flag)
8676 {
8677 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8678 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8679 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8680 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8681 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8682 default: fputs (_("unknown"), stdout); break;
8683 }
8684 }
8685 puts ("");
8686 }
8687
8688 /* Parse and display the contents of the dynamic section. */
8689
8690 static int
8691 process_dynamic_section (FILE * file)
8692 {
8693 Elf_Internal_Dyn * entry;
8694
8695 if (dynamic_size == 0)
8696 {
8697 if (do_dynamic)
8698 printf (_("\nThere is no dynamic section in this file.\n"));
8699
8700 return 1;
8701 }
8702
8703 if (is_32bit_elf)
8704 {
8705 if (! get_32bit_dynamic_section (file))
8706 return 0;
8707 }
8708 else if (! get_64bit_dynamic_section (file))
8709 return 0;
8710
8711 /* Find the appropriate symbol table. */
8712 if (dynamic_symbols == NULL)
8713 {
8714 for (entry = dynamic_section;
8715 entry < dynamic_section + dynamic_nent;
8716 ++entry)
8717 {
8718 Elf_Internal_Shdr section;
8719
8720 if (entry->d_tag != DT_SYMTAB)
8721 continue;
8722
8723 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8724
8725 /* Since we do not know how big the symbol table is,
8726 we default to reading in the entire file (!) and
8727 processing that. This is overkill, I know, but it
8728 should work. */
8729 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8730
8731 if (archive_file_offset != 0)
8732 section.sh_size = archive_file_size - section.sh_offset;
8733 else
8734 {
8735 if (fseek (file, 0, SEEK_END))
8736 error (_("Unable to seek to end of file!\n"));
8737
8738 section.sh_size = ftell (file) - section.sh_offset;
8739 }
8740
8741 if (is_32bit_elf)
8742 section.sh_entsize = sizeof (Elf32_External_Sym);
8743 else
8744 section.sh_entsize = sizeof (Elf64_External_Sym);
8745 section.sh_name = string_table_length;
8746
8747 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8748 if (num_dynamic_syms < 1)
8749 {
8750 error (_("Unable to determine the number of symbols to load\n"));
8751 continue;
8752 }
8753 }
8754 }
8755
8756 /* Similarly find a string table. */
8757 if (dynamic_strings == NULL)
8758 {
8759 for (entry = dynamic_section;
8760 entry < dynamic_section + dynamic_nent;
8761 ++entry)
8762 {
8763 unsigned long offset;
8764 long str_tab_len;
8765
8766 if (entry->d_tag != DT_STRTAB)
8767 continue;
8768
8769 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8770
8771 /* Since we do not know how big the string table is,
8772 we default to reading in the entire file (!) and
8773 processing that. This is overkill, I know, but it
8774 should work. */
8775
8776 offset = offset_from_vma (file, entry->d_un.d_val, 0);
8777
8778 if (archive_file_offset != 0)
8779 str_tab_len = archive_file_size - offset;
8780 else
8781 {
8782 if (fseek (file, 0, SEEK_END))
8783 error (_("Unable to seek to end of file\n"));
8784 str_tab_len = ftell (file) - offset;
8785 }
8786
8787 if (str_tab_len < 1)
8788 {
8789 error
8790 (_("Unable to determine the length of the dynamic string table\n"));
8791 continue;
8792 }
8793
8794 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8795 str_tab_len,
8796 _("dynamic string table"));
8797 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8798 break;
8799 }
8800 }
8801
8802 /* And find the syminfo section if available. */
8803 if (dynamic_syminfo == NULL)
8804 {
8805 unsigned long syminsz = 0;
8806
8807 for (entry = dynamic_section;
8808 entry < dynamic_section + dynamic_nent;
8809 ++entry)
8810 {
8811 if (entry->d_tag == DT_SYMINENT)
8812 {
8813 /* Note: these braces are necessary to avoid a syntax
8814 error from the SunOS4 C compiler. */
8815 /* PR binutils/17531: A corrupt file can trigger this test.
8816 So do not use an assert, instead generate an error message. */
8817 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8818 error (_("Bad value (%d) for SYMINENT entry\n"),
8819 (int) entry->d_un.d_val);
8820 }
8821 else if (entry->d_tag == DT_SYMINSZ)
8822 syminsz = entry->d_un.d_val;
8823 else if (entry->d_tag == DT_SYMINFO)
8824 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8825 syminsz);
8826 }
8827
8828 if (dynamic_syminfo_offset != 0 && syminsz != 0)
8829 {
8830 Elf_External_Syminfo * extsyminfo;
8831 Elf_External_Syminfo * extsym;
8832 Elf_Internal_Syminfo * syminfo;
8833
8834 /* There is a syminfo section. Read the data. */
8835 extsyminfo = (Elf_External_Syminfo *)
8836 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8837 _("symbol information"));
8838 if (!extsyminfo)
8839 return 0;
8840
8841 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8842 if (dynamic_syminfo == NULL)
8843 {
8844 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8845 (unsigned long) syminsz);
8846 return 0;
8847 }
8848
8849 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8850 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8851 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8852 ++syminfo, ++extsym)
8853 {
8854 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8855 syminfo->si_flags = BYTE_GET (extsym->si_flags);
8856 }
8857
8858 free (extsyminfo);
8859 }
8860 }
8861
8862 if (do_dynamic && dynamic_addr)
8863 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8864 dynamic_addr, (unsigned long) dynamic_nent);
8865 if (do_dynamic)
8866 printf (_(" Tag Type Name/Value\n"));
8867
8868 for (entry = dynamic_section;
8869 entry < dynamic_section + dynamic_nent;
8870 entry++)
8871 {
8872 if (do_dynamic)
8873 {
8874 const char * dtype;
8875
8876 putchar (' ');
8877 print_vma (entry->d_tag, FULL_HEX);
8878 dtype = get_dynamic_type (entry->d_tag);
8879 printf (" (%s)%*s", dtype,
8880 ((is_32bit_elf ? 27 : 19)
8881 - (int) strlen (dtype)),
8882 " ");
8883 }
8884
8885 switch (entry->d_tag)
8886 {
8887 case DT_FLAGS:
8888 if (do_dynamic)
8889 print_dynamic_flags (entry->d_un.d_val);
8890 break;
8891
8892 case DT_AUXILIARY:
8893 case DT_FILTER:
8894 case DT_CONFIG:
8895 case DT_DEPAUDIT:
8896 case DT_AUDIT:
8897 if (do_dynamic)
8898 {
8899 switch (entry->d_tag)
8900 {
8901 case DT_AUXILIARY:
8902 printf (_("Auxiliary library"));
8903 break;
8904
8905 case DT_FILTER:
8906 printf (_("Filter library"));
8907 break;
8908
8909 case DT_CONFIG:
8910 printf (_("Configuration file"));
8911 break;
8912
8913 case DT_DEPAUDIT:
8914 printf (_("Dependency audit library"));
8915 break;
8916
8917 case DT_AUDIT:
8918 printf (_("Audit library"));
8919 break;
8920 }
8921
8922 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8923 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8924 else
8925 {
8926 printf (": ");
8927 print_vma (entry->d_un.d_val, PREFIX_HEX);
8928 putchar ('\n');
8929 }
8930 }
8931 break;
8932
8933 case DT_FEATURE:
8934 if (do_dynamic)
8935 {
8936 printf (_("Flags:"));
8937
8938 if (entry->d_un.d_val == 0)
8939 printf (_(" None\n"));
8940 else
8941 {
8942 unsigned long int val = entry->d_un.d_val;
8943
8944 if (val & DTF_1_PARINIT)
8945 {
8946 printf (" PARINIT");
8947 val ^= DTF_1_PARINIT;
8948 }
8949 if (val & DTF_1_CONFEXP)
8950 {
8951 printf (" CONFEXP");
8952 val ^= DTF_1_CONFEXP;
8953 }
8954 if (val != 0)
8955 printf (" %lx", val);
8956 puts ("");
8957 }
8958 }
8959 break;
8960
8961 case DT_POSFLAG_1:
8962 if (do_dynamic)
8963 {
8964 printf (_("Flags:"));
8965
8966 if (entry->d_un.d_val == 0)
8967 printf (_(" None\n"));
8968 else
8969 {
8970 unsigned long int val = entry->d_un.d_val;
8971
8972 if (val & DF_P1_LAZYLOAD)
8973 {
8974 printf (" LAZYLOAD");
8975 val ^= DF_P1_LAZYLOAD;
8976 }
8977 if (val & DF_P1_GROUPPERM)
8978 {
8979 printf (" GROUPPERM");
8980 val ^= DF_P1_GROUPPERM;
8981 }
8982 if (val != 0)
8983 printf (" %lx", val);
8984 puts ("");
8985 }
8986 }
8987 break;
8988
8989 case DT_FLAGS_1:
8990 if (do_dynamic)
8991 {
8992 printf (_("Flags:"));
8993 if (entry->d_un.d_val == 0)
8994 printf (_(" None\n"));
8995 else
8996 {
8997 unsigned long int val = entry->d_un.d_val;
8998
8999 if (val & DF_1_NOW)
9000 {
9001 printf (" NOW");
9002 val ^= DF_1_NOW;
9003 }
9004 if (val & DF_1_GLOBAL)
9005 {
9006 printf (" GLOBAL");
9007 val ^= DF_1_GLOBAL;
9008 }
9009 if (val & DF_1_GROUP)
9010 {
9011 printf (" GROUP");
9012 val ^= DF_1_GROUP;
9013 }
9014 if (val & DF_1_NODELETE)
9015 {
9016 printf (" NODELETE");
9017 val ^= DF_1_NODELETE;
9018 }
9019 if (val & DF_1_LOADFLTR)
9020 {
9021 printf (" LOADFLTR");
9022 val ^= DF_1_LOADFLTR;
9023 }
9024 if (val & DF_1_INITFIRST)
9025 {
9026 printf (" INITFIRST");
9027 val ^= DF_1_INITFIRST;
9028 }
9029 if (val & DF_1_NOOPEN)
9030 {
9031 printf (" NOOPEN");
9032 val ^= DF_1_NOOPEN;
9033 }
9034 if (val & DF_1_ORIGIN)
9035 {
9036 printf (" ORIGIN");
9037 val ^= DF_1_ORIGIN;
9038 }
9039 if (val & DF_1_DIRECT)
9040 {
9041 printf (" DIRECT");
9042 val ^= DF_1_DIRECT;
9043 }
9044 if (val & DF_1_TRANS)
9045 {
9046 printf (" TRANS");
9047 val ^= DF_1_TRANS;
9048 }
9049 if (val & DF_1_INTERPOSE)
9050 {
9051 printf (" INTERPOSE");
9052 val ^= DF_1_INTERPOSE;
9053 }
9054 if (val & DF_1_NODEFLIB)
9055 {
9056 printf (" NODEFLIB");
9057 val ^= DF_1_NODEFLIB;
9058 }
9059 if (val & DF_1_NODUMP)
9060 {
9061 printf (" NODUMP");
9062 val ^= DF_1_NODUMP;
9063 }
9064 if (val & DF_1_CONFALT)
9065 {
9066 printf (" CONFALT");
9067 val ^= DF_1_CONFALT;
9068 }
9069 if (val & DF_1_ENDFILTEE)
9070 {
9071 printf (" ENDFILTEE");
9072 val ^= DF_1_ENDFILTEE;
9073 }
9074 if (val & DF_1_DISPRELDNE)
9075 {
9076 printf (" DISPRELDNE");
9077 val ^= DF_1_DISPRELDNE;
9078 }
9079 if (val & DF_1_DISPRELPND)
9080 {
9081 printf (" DISPRELPND");
9082 val ^= DF_1_DISPRELPND;
9083 }
9084 if (val & DF_1_NODIRECT)
9085 {
9086 printf (" NODIRECT");
9087 val ^= DF_1_NODIRECT;
9088 }
9089 if (val & DF_1_IGNMULDEF)
9090 {
9091 printf (" IGNMULDEF");
9092 val ^= DF_1_IGNMULDEF;
9093 }
9094 if (val & DF_1_NOKSYMS)
9095 {
9096 printf (" NOKSYMS");
9097 val ^= DF_1_NOKSYMS;
9098 }
9099 if (val & DF_1_NOHDR)
9100 {
9101 printf (" NOHDR");
9102 val ^= DF_1_NOHDR;
9103 }
9104 if (val & DF_1_EDITED)
9105 {
9106 printf (" EDITED");
9107 val ^= DF_1_EDITED;
9108 }
9109 if (val & DF_1_NORELOC)
9110 {
9111 printf (" NORELOC");
9112 val ^= DF_1_NORELOC;
9113 }
9114 if (val & DF_1_SYMINTPOSE)
9115 {
9116 printf (" SYMINTPOSE");
9117 val ^= DF_1_SYMINTPOSE;
9118 }
9119 if (val & DF_1_GLOBAUDIT)
9120 {
9121 printf (" GLOBAUDIT");
9122 val ^= DF_1_GLOBAUDIT;
9123 }
9124 if (val & DF_1_SINGLETON)
9125 {
9126 printf (" SINGLETON");
9127 val ^= DF_1_SINGLETON;
9128 }
9129 if (val != 0)
9130 printf (" %lx", val);
9131 puts ("");
9132 }
9133 }
9134 break;
9135
9136 case DT_PLTREL:
9137 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9138 if (do_dynamic)
9139 puts (get_dynamic_type (entry->d_un.d_val));
9140 break;
9141
9142 case DT_NULL :
9143 case DT_NEEDED :
9144 case DT_PLTGOT :
9145 case DT_HASH :
9146 case DT_STRTAB :
9147 case DT_SYMTAB :
9148 case DT_RELA :
9149 case DT_INIT :
9150 case DT_FINI :
9151 case DT_SONAME :
9152 case DT_RPATH :
9153 case DT_SYMBOLIC:
9154 case DT_REL :
9155 case DT_DEBUG :
9156 case DT_TEXTREL :
9157 case DT_JMPREL :
9158 case DT_RUNPATH :
9159 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9160
9161 if (do_dynamic)
9162 {
9163 char * name;
9164
9165 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9166 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9167 else
9168 name = NULL;
9169
9170 if (name)
9171 {
9172 switch (entry->d_tag)
9173 {
9174 case DT_NEEDED:
9175 printf (_("Shared library: [%s]"), name);
9176
9177 if (streq (name, program_interpreter))
9178 printf (_(" program interpreter"));
9179 break;
9180
9181 case DT_SONAME:
9182 printf (_("Library soname: [%s]"), name);
9183 break;
9184
9185 case DT_RPATH:
9186 printf (_("Library rpath: [%s]"), name);
9187 break;
9188
9189 case DT_RUNPATH:
9190 printf (_("Library runpath: [%s]"), name);
9191 break;
9192
9193 default:
9194 print_vma (entry->d_un.d_val, PREFIX_HEX);
9195 break;
9196 }
9197 }
9198 else
9199 print_vma (entry->d_un.d_val, PREFIX_HEX);
9200
9201 putchar ('\n');
9202 }
9203 break;
9204
9205 case DT_PLTRELSZ:
9206 case DT_RELASZ :
9207 case DT_STRSZ :
9208 case DT_RELSZ :
9209 case DT_RELAENT :
9210 case DT_SYMENT :
9211 case DT_RELENT :
9212 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9213 case DT_PLTPADSZ:
9214 case DT_MOVEENT :
9215 case DT_MOVESZ :
9216 case DT_INIT_ARRAYSZ:
9217 case DT_FINI_ARRAYSZ:
9218 case DT_GNU_CONFLICTSZ:
9219 case DT_GNU_LIBLISTSZ:
9220 if (do_dynamic)
9221 {
9222 print_vma (entry->d_un.d_val, UNSIGNED);
9223 printf (_(" (bytes)\n"));
9224 }
9225 break;
9226
9227 case DT_VERDEFNUM:
9228 case DT_VERNEEDNUM:
9229 case DT_RELACOUNT:
9230 case DT_RELCOUNT:
9231 if (do_dynamic)
9232 {
9233 print_vma (entry->d_un.d_val, UNSIGNED);
9234 putchar ('\n');
9235 }
9236 break;
9237
9238 case DT_SYMINSZ:
9239 case DT_SYMINENT:
9240 case DT_SYMINFO:
9241 case DT_USED:
9242 case DT_INIT_ARRAY:
9243 case DT_FINI_ARRAY:
9244 if (do_dynamic)
9245 {
9246 if (entry->d_tag == DT_USED
9247 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9248 {
9249 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9250
9251 if (*name)
9252 {
9253 printf (_("Not needed object: [%s]\n"), name);
9254 break;
9255 }
9256 }
9257
9258 print_vma (entry->d_un.d_val, PREFIX_HEX);
9259 putchar ('\n');
9260 }
9261 break;
9262
9263 case DT_BIND_NOW:
9264 /* The value of this entry is ignored. */
9265 if (do_dynamic)
9266 putchar ('\n');
9267 break;
9268
9269 case DT_GNU_PRELINKED:
9270 if (do_dynamic)
9271 {
9272 struct tm * tmp;
9273 time_t atime = entry->d_un.d_val;
9274
9275 tmp = gmtime (&atime);
9276 /* PR 17533 file: 041-1244816-0.004. */
9277 if (tmp == NULL)
9278 printf (_("<corrupt time val: %lx"),
9279 (unsigned long) atime);
9280 else
9281 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9282 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9283 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9284
9285 }
9286 break;
9287
9288 case DT_GNU_HASH:
9289 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9290 if (do_dynamic)
9291 {
9292 print_vma (entry->d_un.d_val, PREFIX_HEX);
9293 putchar ('\n');
9294 }
9295 break;
9296
9297 default:
9298 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9299 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9300 entry->d_un.d_val;
9301
9302 if (do_dynamic)
9303 {
9304 switch (elf_header.e_machine)
9305 {
9306 case EM_MIPS:
9307 case EM_MIPS_RS3_LE:
9308 dynamic_section_mips_val (entry);
9309 break;
9310 case EM_PARISC:
9311 dynamic_section_parisc_val (entry);
9312 break;
9313 case EM_IA_64:
9314 dynamic_section_ia64_val (entry);
9315 break;
9316 default:
9317 print_vma (entry->d_un.d_val, PREFIX_HEX);
9318 putchar ('\n');
9319 }
9320 }
9321 break;
9322 }
9323 }
9324
9325 return 1;
9326 }
9327
9328 static char *
9329 get_ver_flags (unsigned int flags)
9330 {
9331 static char buff[32];
9332
9333 buff[0] = 0;
9334
9335 if (flags == 0)
9336 return _("none");
9337
9338 if (flags & VER_FLG_BASE)
9339 strcat (buff, "BASE ");
9340
9341 if (flags & VER_FLG_WEAK)
9342 {
9343 if (flags & VER_FLG_BASE)
9344 strcat (buff, "| ");
9345
9346 strcat (buff, "WEAK ");
9347 }
9348
9349 if (flags & VER_FLG_INFO)
9350 {
9351 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9352 strcat (buff, "| ");
9353
9354 strcat (buff, "INFO ");
9355 }
9356
9357 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9358 strcat (buff, _("| <unknown>"));
9359
9360 return buff;
9361 }
9362
9363 /* Display the contents of the version sections. */
9364
9365 static int
9366 process_version_sections (FILE * file)
9367 {
9368 Elf_Internal_Shdr * section;
9369 unsigned i;
9370 int found = 0;
9371
9372 if (! do_version)
9373 return 1;
9374
9375 for (i = 0, section = section_headers;
9376 i < elf_header.e_shnum;
9377 i++, section++)
9378 {
9379 switch (section->sh_type)
9380 {
9381 case SHT_GNU_verdef:
9382 {
9383 Elf_External_Verdef * edefs;
9384 unsigned int idx;
9385 unsigned int cnt;
9386 char * endbuf;
9387
9388 found = 1;
9389
9390 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9391 printable_section_name (section),
9392 section->sh_info);
9393
9394 printf (_(" Addr: 0x"));
9395 printf_vma (section->sh_addr);
9396 printf (_(" Offset: %#08lx Link: %u (%s)"),
9397 (unsigned long) section->sh_offset, section->sh_link,
9398 printable_section_name_from_index (section->sh_link));
9399
9400 edefs = (Elf_External_Verdef *)
9401 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9402 _("version definition section"));
9403 if (!edefs)
9404 break;
9405 endbuf = (char *) edefs + section->sh_size;
9406
9407 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9408 {
9409 char * vstart;
9410 Elf_External_Verdef * edef;
9411 Elf_Internal_Verdef ent;
9412 Elf_External_Verdaux * eaux;
9413 Elf_Internal_Verdaux aux;
9414 int j;
9415 int isum;
9416
9417 /* Check for very large indicies. */
9418 if (idx > (size_t) (endbuf - (char *) edefs))
9419 break;
9420
9421 vstart = ((char *) edefs) + idx;
9422 if (vstart + sizeof (*edef) > endbuf)
9423 break;
9424
9425 edef = (Elf_External_Verdef *) vstart;
9426
9427 ent.vd_version = BYTE_GET (edef->vd_version);
9428 ent.vd_flags = BYTE_GET (edef->vd_flags);
9429 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9430 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9431 ent.vd_hash = BYTE_GET (edef->vd_hash);
9432 ent.vd_aux = BYTE_GET (edef->vd_aux);
9433 ent.vd_next = BYTE_GET (edef->vd_next);
9434
9435 printf (_(" %#06x: Rev: %d Flags: %s"),
9436 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9437
9438 printf (_(" Index: %d Cnt: %d "),
9439 ent.vd_ndx, ent.vd_cnt);
9440
9441 /* Check for overflow. */
9442 if (ent.vd_aux > (size_t) (endbuf - vstart))
9443 break;
9444
9445 vstart += ent.vd_aux;
9446
9447 eaux = (Elf_External_Verdaux *) vstart;
9448
9449 aux.vda_name = BYTE_GET (eaux->vda_name);
9450 aux.vda_next = BYTE_GET (eaux->vda_next);
9451
9452 if (VALID_DYNAMIC_NAME (aux.vda_name))
9453 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9454 else
9455 printf (_("Name index: %ld\n"), aux.vda_name);
9456
9457 isum = idx + ent.vd_aux;
9458
9459 for (j = 1; j < ent.vd_cnt; j++)
9460 {
9461 /* Check for overflow. */
9462 if (aux.vda_next > (size_t) (endbuf - vstart))
9463 break;
9464
9465 isum += aux.vda_next;
9466 vstart += aux.vda_next;
9467
9468 eaux = (Elf_External_Verdaux *) vstart;
9469 if (vstart + sizeof (*eaux) > endbuf)
9470 break;
9471
9472 aux.vda_name = BYTE_GET (eaux->vda_name);
9473 aux.vda_next = BYTE_GET (eaux->vda_next);
9474
9475 if (VALID_DYNAMIC_NAME (aux.vda_name))
9476 printf (_(" %#06x: Parent %d: %s\n"),
9477 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9478 else
9479 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9480 isum, j, aux.vda_name);
9481 }
9482
9483 if (j < ent.vd_cnt)
9484 printf (_(" Version def aux past end of section\n"));
9485
9486 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9487 if (idx + ent.vd_next <= idx)
9488 break;
9489
9490 idx += ent.vd_next;
9491 }
9492
9493 if (cnt < section->sh_info)
9494 printf (_(" Version definition past end of section\n"));
9495
9496 free (edefs);
9497 }
9498 break;
9499
9500 case SHT_GNU_verneed:
9501 {
9502 Elf_External_Verneed * eneed;
9503 unsigned int idx;
9504 unsigned int cnt;
9505 char * endbuf;
9506
9507 found = 1;
9508
9509 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9510 printable_section_name (section), section->sh_info);
9511
9512 printf (_(" Addr: 0x"));
9513 printf_vma (section->sh_addr);
9514 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9515 (unsigned long) section->sh_offset, section->sh_link,
9516 printable_section_name_from_index (section->sh_link));
9517
9518 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9519 section->sh_offset, 1,
9520 section->sh_size,
9521 _("Version Needs section"));
9522 if (!eneed)
9523 break;
9524 endbuf = (char *) eneed + section->sh_size;
9525
9526 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9527 {
9528 Elf_External_Verneed * entry;
9529 Elf_Internal_Verneed ent;
9530 int j;
9531 int isum;
9532 char * vstart;
9533
9534 if (idx > (size_t) (endbuf - (char *) eneed))
9535 break;
9536
9537 vstart = ((char *) eneed) + idx;
9538 if (vstart + sizeof (*entry) > endbuf)
9539 break;
9540
9541 entry = (Elf_External_Verneed *) vstart;
9542
9543 ent.vn_version = BYTE_GET (entry->vn_version);
9544 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9545 ent.vn_file = BYTE_GET (entry->vn_file);
9546 ent.vn_aux = BYTE_GET (entry->vn_aux);
9547 ent.vn_next = BYTE_GET (entry->vn_next);
9548
9549 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9550
9551 if (VALID_DYNAMIC_NAME (ent.vn_file))
9552 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9553 else
9554 printf (_(" File: %lx"), ent.vn_file);
9555
9556 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9557
9558 /* Check for overflow. */
9559 if (ent.vn_aux > (size_t) (endbuf - vstart))
9560 break;
9561 vstart += ent.vn_aux;
9562
9563 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9564 {
9565 Elf_External_Vernaux * eaux;
9566 Elf_Internal_Vernaux aux;
9567
9568 if (vstart + sizeof (*eaux) > endbuf)
9569 break;
9570 eaux = (Elf_External_Vernaux *) vstart;
9571
9572 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9573 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9574 aux.vna_other = BYTE_GET (eaux->vna_other);
9575 aux.vna_name = BYTE_GET (eaux->vna_name);
9576 aux.vna_next = BYTE_GET (eaux->vna_next);
9577
9578 if (VALID_DYNAMIC_NAME (aux.vna_name))
9579 printf (_(" %#06x: Name: %s"),
9580 isum, GET_DYNAMIC_NAME (aux.vna_name));
9581 else
9582 printf (_(" %#06x: Name index: %lx"),
9583 isum, aux.vna_name);
9584
9585 printf (_(" Flags: %s Version: %d\n"),
9586 get_ver_flags (aux.vna_flags), aux.vna_other);
9587
9588 /* Check for overflow. */
9589 if (aux.vna_next > (size_t) (endbuf - vstart)
9590 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9591 {
9592 warn (_("Invalid vna_next field of %lx\n"),
9593 aux.vna_next);
9594 j = ent.vn_cnt;
9595 break;
9596 }
9597 isum += aux.vna_next;
9598 vstart += aux.vna_next;
9599 }
9600
9601 if (j < ent.vn_cnt)
9602 warn (_("Missing Version Needs auxillary information\n"));
9603
9604 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9605 {
9606 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9607 cnt = section->sh_info;
9608 break;
9609 }
9610 idx += ent.vn_next;
9611 }
9612
9613 if (cnt < section->sh_info)
9614 warn (_("Missing Version Needs information\n"));
9615
9616 free (eneed);
9617 }
9618 break;
9619
9620 case SHT_GNU_versym:
9621 {
9622 Elf_Internal_Shdr * link_section;
9623 size_t total;
9624 unsigned int cnt;
9625 unsigned char * edata;
9626 unsigned short * data;
9627 char * strtab;
9628 Elf_Internal_Sym * symbols;
9629 Elf_Internal_Shdr * string_sec;
9630 unsigned long num_syms;
9631 long off;
9632
9633 if (section->sh_link >= elf_header.e_shnum)
9634 break;
9635
9636 link_section = section_headers + section->sh_link;
9637 total = section->sh_size / sizeof (Elf_External_Versym);
9638
9639 if (link_section->sh_link >= elf_header.e_shnum)
9640 break;
9641
9642 found = 1;
9643
9644 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9645 if (symbols == NULL)
9646 break;
9647
9648 string_sec = section_headers + link_section->sh_link;
9649
9650 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9651 string_sec->sh_size,
9652 _("version string table"));
9653 if (!strtab)
9654 {
9655 free (symbols);
9656 break;
9657 }
9658
9659 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9660 printable_section_name (section), (unsigned long) total);
9661
9662 printf (_(" Addr: "));
9663 printf_vma (section->sh_addr);
9664 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9665 (unsigned long) section->sh_offset, section->sh_link,
9666 printable_section_name (link_section));
9667
9668 off = offset_from_vma (file,
9669 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9670 total * sizeof (short));
9671 edata = (unsigned char *) get_data (NULL, file, off, total,
9672 sizeof (short),
9673 _("version symbol data"));
9674 if (!edata)
9675 {
9676 free (strtab);
9677 free (symbols);
9678 break;
9679 }
9680
9681 data = (short unsigned int *) cmalloc (total, sizeof (short));
9682
9683 for (cnt = total; cnt --;)
9684 data[cnt] = byte_get (edata + cnt * sizeof (short),
9685 sizeof (short));
9686
9687 free (edata);
9688
9689 for (cnt = 0; cnt < total; cnt += 4)
9690 {
9691 int j, nn;
9692 int check_def, check_need;
9693 char * name;
9694
9695 printf (" %03x:", cnt);
9696
9697 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9698 switch (data[cnt + j])
9699 {
9700 case 0:
9701 fputs (_(" 0 (*local*) "), stdout);
9702 break;
9703
9704 case 1:
9705 fputs (_(" 1 (*global*) "), stdout);
9706 break;
9707
9708 default:
9709 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9710 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9711
9712 /* If this index value is greater than the size of the symbols
9713 array, break to avoid an out-of-bounds read. */
9714 if ((unsigned long)(cnt + j) >= num_syms)
9715 {
9716 warn (_("invalid index into symbol array\n"));
9717 break;
9718 }
9719
9720 check_def = 1;
9721 check_need = 1;
9722 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9723 || section_headers[symbols[cnt + j].st_shndx].sh_type
9724 != SHT_NOBITS)
9725 {
9726 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9727 check_def = 0;
9728 else
9729 check_need = 0;
9730 }
9731
9732 if (check_need
9733 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9734 {
9735 Elf_Internal_Verneed ivn;
9736 unsigned long offset;
9737
9738 offset = offset_from_vma
9739 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9740 sizeof (Elf_External_Verneed));
9741
9742 do
9743 {
9744 Elf_Internal_Vernaux ivna;
9745 Elf_External_Verneed evn;
9746 Elf_External_Vernaux evna;
9747 unsigned long a_off;
9748
9749 if (get_data (&evn, file, offset, sizeof (evn), 1,
9750 _("version need")) == NULL)
9751 break;
9752
9753 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9754 ivn.vn_next = BYTE_GET (evn.vn_next);
9755
9756 a_off = offset + ivn.vn_aux;
9757
9758 do
9759 {
9760 if (get_data (&evna, file, a_off, sizeof (evna),
9761 1, _("version need aux (2)")) == NULL)
9762 {
9763 ivna.vna_next = 0;
9764 ivna.vna_other = 0;
9765 }
9766 else
9767 {
9768 ivna.vna_next = BYTE_GET (evna.vna_next);
9769 ivna.vna_other = BYTE_GET (evna.vna_other);
9770 }
9771
9772 a_off += ivna.vna_next;
9773 }
9774 while (ivna.vna_other != data[cnt + j]
9775 && ivna.vna_next != 0);
9776
9777 if (ivna.vna_other == data[cnt + j])
9778 {
9779 ivna.vna_name = BYTE_GET (evna.vna_name);
9780
9781 if (ivna.vna_name >= string_sec->sh_size)
9782 name = _("*invalid*");
9783 else
9784 name = strtab + ivna.vna_name;
9785 nn += printf ("(%s%-*s",
9786 name,
9787 12 - (int) strlen (name),
9788 ")");
9789 check_def = 0;
9790 break;
9791 }
9792
9793 offset += ivn.vn_next;
9794 }
9795 while (ivn.vn_next);
9796 }
9797
9798 if (check_def && data[cnt + j] != 0x8001
9799 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9800 {
9801 Elf_Internal_Verdef ivd;
9802 Elf_External_Verdef evd;
9803 unsigned long offset;
9804
9805 offset = offset_from_vma
9806 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9807 sizeof evd);
9808
9809 do
9810 {
9811 if (get_data (&evd, file, offset, sizeof (evd), 1,
9812 _("version def")) == NULL)
9813 {
9814 ivd.vd_next = 0;
9815 /* PR 17531: file: 046-1082287-0.004. */
9816 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
9817 break;
9818 }
9819 else
9820 {
9821 ivd.vd_next = BYTE_GET (evd.vd_next);
9822 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9823 }
9824
9825 offset += ivd.vd_next;
9826 }
9827 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9828 && ivd.vd_next != 0);
9829
9830 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9831 {
9832 Elf_External_Verdaux evda;
9833 Elf_Internal_Verdaux ivda;
9834
9835 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9836
9837 if (get_data (&evda, file,
9838 offset - ivd.vd_next + ivd.vd_aux,
9839 sizeof (evda), 1,
9840 _("version def aux")) == NULL)
9841 break;
9842
9843 ivda.vda_name = BYTE_GET (evda.vda_name);
9844
9845 if (ivda.vda_name >= string_sec->sh_size)
9846 name = _("*invalid*");
9847 else
9848 name = strtab + ivda.vda_name;
9849 nn += printf ("(%s%-*s",
9850 name,
9851 12 - (int) strlen (name),
9852 ")");
9853 }
9854 }
9855
9856 if (nn < 18)
9857 printf ("%*c", 18 - nn, ' ');
9858 }
9859
9860 putchar ('\n');
9861 }
9862
9863 free (data);
9864 free (strtab);
9865 free (symbols);
9866 }
9867 break;
9868
9869 default:
9870 break;
9871 }
9872 }
9873
9874 if (! found)
9875 printf (_("\nNo version information found in this file.\n"));
9876
9877 return 1;
9878 }
9879
9880 static const char *
9881 get_symbol_binding (unsigned int binding)
9882 {
9883 static char buff[32];
9884
9885 switch (binding)
9886 {
9887 case STB_LOCAL: return "LOCAL";
9888 case STB_GLOBAL: return "GLOBAL";
9889 case STB_WEAK: return "WEAK";
9890 default:
9891 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9892 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9893 binding);
9894 else if (binding >= STB_LOOS && binding <= STB_HIOS)
9895 {
9896 if (binding == STB_GNU_UNIQUE
9897 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9898 /* GNU is still using the default value 0. */
9899 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9900 return "UNIQUE";
9901 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9902 }
9903 else
9904 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9905 return buff;
9906 }
9907 }
9908
9909 static const char *
9910 get_symbol_type (unsigned int type)
9911 {
9912 static char buff[32];
9913
9914 switch (type)
9915 {
9916 case STT_NOTYPE: return "NOTYPE";
9917 case STT_OBJECT: return "OBJECT";
9918 case STT_FUNC: return "FUNC";
9919 case STT_SECTION: return "SECTION";
9920 case STT_FILE: return "FILE";
9921 case STT_COMMON: return "COMMON";
9922 case STT_TLS: return "TLS";
9923 case STT_RELC: return "RELC";
9924 case STT_SRELC: return "SRELC";
9925 default:
9926 if (type >= STT_LOPROC && type <= STT_HIPROC)
9927 {
9928 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9929 return "THUMB_FUNC";
9930
9931 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9932 return "REGISTER";
9933
9934 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9935 return "PARISC_MILLI";
9936
9937 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9938 }
9939 else if (type >= STT_LOOS && type <= STT_HIOS)
9940 {
9941 if (elf_header.e_machine == EM_PARISC)
9942 {
9943 if (type == STT_HP_OPAQUE)
9944 return "HP_OPAQUE";
9945 if (type == STT_HP_STUB)
9946 return "HP_STUB";
9947 }
9948
9949 if (type == STT_GNU_IFUNC
9950 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9951 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9952 /* GNU is still using the default value 0. */
9953 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9954 return "IFUNC";
9955
9956 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9957 }
9958 else
9959 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9960 return buff;
9961 }
9962 }
9963
9964 static const char *
9965 get_symbol_visibility (unsigned int visibility)
9966 {
9967 switch (visibility)
9968 {
9969 case STV_DEFAULT: return "DEFAULT";
9970 case STV_INTERNAL: return "INTERNAL";
9971 case STV_HIDDEN: return "HIDDEN";
9972 case STV_PROTECTED: return "PROTECTED";
9973 default:
9974 error (_("Unrecognized visibility value: %u"), visibility);
9975 return _("<unknown>");
9976 }
9977 }
9978
9979 static const char *
9980 get_mips_symbol_other (unsigned int other)
9981 {
9982 switch (other)
9983 {
9984 case STO_OPTIONAL:
9985 return "OPTIONAL";
9986 case STO_MIPS_PLT:
9987 return "MIPS PLT";
9988 case STO_MIPS_PIC:
9989 return "MIPS PIC";
9990 case STO_MICROMIPS:
9991 return "MICROMIPS";
9992 case STO_MICROMIPS | STO_MIPS_PIC:
9993 return "MICROMIPS, MIPS PIC";
9994 case STO_MIPS16:
9995 return "MIPS16";
9996 default:
9997 return NULL;
9998 }
9999 }
10000
10001 static const char *
10002 get_ia64_symbol_other (unsigned int other)
10003 {
10004 if (is_ia64_vms ())
10005 {
10006 static char res[32];
10007
10008 res[0] = 0;
10009
10010 /* Function types is for images and .STB files only. */
10011 switch (elf_header.e_type)
10012 {
10013 case ET_DYN:
10014 case ET_EXEC:
10015 switch (VMS_ST_FUNC_TYPE (other))
10016 {
10017 case VMS_SFT_CODE_ADDR:
10018 strcat (res, " CA");
10019 break;
10020 case VMS_SFT_SYMV_IDX:
10021 strcat (res, " VEC");
10022 break;
10023 case VMS_SFT_FD:
10024 strcat (res, " FD");
10025 break;
10026 case VMS_SFT_RESERVE:
10027 strcat (res, " RSV");
10028 break;
10029 default:
10030 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10031 VMS_ST_FUNC_TYPE (other));
10032 strcat (res, " <unknown>");
10033 break;
10034 }
10035 break;
10036 default:
10037 break;
10038 }
10039 switch (VMS_ST_LINKAGE (other))
10040 {
10041 case VMS_STL_IGNORE:
10042 strcat (res, " IGN");
10043 break;
10044 case VMS_STL_RESERVE:
10045 strcat (res, " RSV");
10046 break;
10047 case VMS_STL_STD:
10048 strcat (res, " STD");
10049 break;
10050 case VMS_STL_LNK:
10051 strcat (res, " LNK");
10052 break;
10053 default:
10054 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10055 VMS_ST_LINKAGE (other));
10056 strcat (res, " <unknown>");
10057 break;
10058 }
10059
10060 if (res[0] != 0)
10061 return res + 1;
10062 else
10063 return res;
10064 }
10065 return NULL;
10066 }
10067
10068 static const char *
10069 get_ppc64_symbol_other (unsigned int other)
10070 {
10071 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10072 {
10073 static char buf[32];
10074 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10075 PPC64_LOCAL_ENTRY_OFFSET (other));
10076 return buf;
10077 }
10078 return NULL;
10079 }
10080
10081 static const char *
10082 get_symbol_other (unsigned int other)
10083 {
10084 const char * result = NULL;
10085 static char buff [32];
10086
10087 if (other == 0)
10088 return "";
10089
10090 switch (elf_header.e_machine)
10091 {
10092 case EM_MIPS:
10093 result = get_mips_symbol_other (other);
10094 break;
10095 case EM_IA_64:
10096 result = get_ia64_symbol_other (other);
10097 break;
10098 case EM_PPC64:
10099 result = get_ppc64_symbol_other (other);
10100 break;
10101 default:
10102 break;
10103 }
10104
10105 if (result)
10106 return result;
10107
10108 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10109 return buff;
10110 }
10111
10112 static const char *
10113 get_symbol_index_type (unsigned int type)
10114 {
10115 static char buff[32];
10116
10117 switch (type)
10118 {
10119 case SHN_UNDEF: return "UND";
10120 case SHN_ABS: return "ABS";
10121 case SHN_COMMON: return "COM";
10122 default:
10123 if (type == SHN_IA_64_ANSI_COMMON
10124 && elf_header.e_machine == EM_IA_64
10125 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10126 return "ANSI_COM";
10127 else if ((elf_header.e_machine == EM_X86_64
10128 || elf_header.e_machine == EM_L1OM
10129 || elf_header.e_machine == EM_K1OM)
10130 && type == SHN_X86_64_LCOMMON)
10131 return "LARGE_COM";
10132 else if ((type == SHN_MIPS_SCOMMON
10133 && elf_header.e_machine == EM_MIPS)
10134 || (type == SHN_TIC6X_SCOMMON
10135 && elf_header.e_machine == EM_TI_C6000))
10136 return "SCOM";
10137 else if (type == SHN_MIPS_SUNDEFINED
10138 && elf_header.e_machine == EM_MIPS)
10139 return "SUND";
10140 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10141 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10142 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10143 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10144 else if (type >= SHN_LORESERVE)
10145 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10146 else if (type >= elf_header.e_shnum)
10147 sprintf (buff, _("bad section index[%3d]"), type);
10148 else
10149 sprintf (buff, "%3d", type);
10150 break;
10151 }
10152
10153 return buff;
10154 }
10155
10156 static bfd_vma *
10157 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10158 {
10159 unsigned char * e_data;
10160 bfd_vma * i_data;
10161
10162 /* If the size_t type is smaller than the bfd_size_type, eg because
10163 you are building a 32-bit tool on a 64-bit host, then make sure
10164 that when (number) is cast to (size_t) no information is lost. */
10165 if (sizeof (size_t) < sizeof (bfd_size_type)
10166 && (bfd_size_type) ((size_t) number) != number)
10167 {
10168 error (_("Size truncation prevents reading %llu elements of size %u\n"),
10169 (unsigned long long) number, ent_size);
10170 return NULL;
10171 }
10172
10173 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10174 attempting to allocate memory when the read is bound to fail. */
10175 if (ent_size * number > current_file_size)
10176 {
10177 error (_("Invalid number of dynamic entries: %llu\n"),
10178 (unsigned long long) number);
10179 return NULL;
10180 }
10181
10182 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10183 if (e_data == NULL)
10184 {
10185 error (_("Out of memory reading %llu dynamic entries\n"),
10186 (unsigned long long) number);
10187 return NULL;
10188 }
10189
10190 if (fread (e_data, ent_size, (size_t) number, file) != number)
10191 {
10192 error (_("Unable to read in %llu bytes of dynamic data\n"),
10193 (unsigned long long) (number * ent_size));
10194 free (e_data);
10195 return NULL;
10196 }
10197
10198 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10199 if (i_data == NULL)
10200 {
10201 error (_("Out of memory allocating space for %llu dynamic entries\n"),
10202 (unsigned long long) number);
10203 free (e_data);
10204 return NULL;
10205 }
10206
10207 while (number--)
10208 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10209
10210 free (e_data);
10211
10212 return i_data;
10213 }
10214
10215 static void
10216 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10217 {
10218 Elf_Internal_Sym * psym;
10219 int n;
10220
10221 n = print_vma (si, DEC_5);
10222 if (n < 5)
10223 fputs (&" "[n], stdout);
10224 printf (" %3lu: ", hn);
10225
10226 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10227 {
10228 printf (_("<No info available for dynamic symbol number %lu>\n"),
10229 (unsigned long) si);
10230 return;
10231 }
10232
10233 psym = dynamic_symbols + si;
10234 print_vma (psym->st_value, LONG_HEX);
10235 putchar (' ');
10236 print_vma (psym->st_size, DEC_5);
10237
10238 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10239 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10240 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10241 /* Check to see if any other bits in the st_other field are set.
10242 Note - displaying this information disrupts the layout of the
10243 table being generated, but for the moment this case is very
10244 rare. */
10245 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10246 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10247 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10248 if (VALID_DYNAMIC_NAME (psym->st_name))
10249 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10250 else
10251 printf (_(" <corrupt: %14ld>"), psym->st_name);
10252 putchar ('\n');
10253 }
10254
10255 static const char *
10256 get_symbol_version_string (FILE *file, int is_dynsym,
10257 const char *strtab,
10258 unsigned long int strtab_size,
10259 unsigned int si, Elf_Internal_Sym *psym,
10260 enum versioned_symbol_info *sym_info,
10261 unsigned short *vna_other)
10262 {
10263 const char *version_string = NULL;
10264
10265 if (is_dynsym
10266 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10267 {
10268 unsigned char data[2];
10269 unsigned short vers_data;
10270 unsigned long offset;
10271 int is_nobits;
10272 int check_def;
10273
10274 offset = offset_from_vma
10275 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10276 sizeof data + si * sizeof (vers_data));
10277
10278 if (get_data (&data, file, offset + si * sizeof (vers_data),
10279 sizeof (data), 1, _("version data")) == NULL)
10280 return NULL;
10281
10282 vers_data = byte_get (data, 2);
10283
10284 is_nobits = (section_headers != NULL
10285 && psym->st_shndx < elf_header.e_shnum
10286 && section_headers[psym->st_shndx].sh_type
10287 == SHT_NOBITS);
10288
10289 check_def = (psym->st_shndx != SHN_UNDEF);
10290
10291 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10292 {
10293 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10294 && (is_nobits || ! check_def))
10295 {
10296 Elf_External_Verneed evn;
10297 Elf_Internal_Verneed ivn;
10298 Elf_Internal_Vernaux ivna;
10299
10300 /* We must test both. */
10301 offset = offset_from_vma
10302 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10303 sizeof evn);
10304
10305 do
10306 {
10307 unsigned long vna_off;
10308
10309 if (get_data (&evn, file, offset, sizeof (evn), 1,
10310 _("version need")) == NULL)
10311 {
10312 ivna.vna_next = 0;
10313 ivna.vna_other = 0;
10314 ivna.vna_name = 0;
10315 break;
10316 }
10317
10318 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10319 ivn.vn_next = BYTE_GET (evn.vn_next);
10320
10321 vna_off = offset + ivn.vn_aux;
10322
10323 do
10324 {
10325 Elf_External_Vernaux evna;
10326
10327 if (get_data (&evna, file, vna_off,
10328 sizeof (evna), 1,
10329 _("version need aux (3)")) == NULL)
10330 {
10331 ivna.vna_next = 0;
10332 ivna.vna_other = 0;
10333 ivna.vna_name = 0;
10334 }
10335 else
10336 {
10337 ivna.vna_other = BYTE_GET (evna.vna_other);
10338 ivna.vna_next = BYTE_GET (evna.vna_next);
10339 ivna.vna_name = BYTE_GET (evna.vna_name);
10340 }
10341
10342 vna_off += ivna.vna_next;
10343 }
10344 while (ivna.vna_other != vers_data
10345 && ivna.vna_next != 0);
10346
10347 if (ivna.vna_other == vers_data)
10348 break;
10349
10350 offset += ivn.vn_next;
10351 }
10352 while (ivn.vn_next != 0);
10353
10354 if (ivna.vna_other == vers_data)
10355 {
10356 *sym_info = symbol_undefined;
10357 *vna_other = ivna.vna_other;
10358 version_string = (ivna.vna_name < strtab_size
10359 ? strtab + ivna.vna_name
10360 : _("<corrupt>"));
10361 check_def = 0;
10362 }
10363 else if (! is_nobits)
10364 error (_("bad dynamic symbol\n"));
10365 else
10366 check_def = 1;
10367 }
10368
10369 if (check_def)
10370 {
10371 if (vers_data != 0x8001
10372 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10373 {
10374 Elf_Internal_Verdef ivd;
10375 Elf_Internal_Verdaux ivda;
10376 Elf_External_Verdaux evda;
10377 unsigned long off;
10378
10379 off = offset_from_vma
10380 (file,
10381 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10382 sizeof (Elf_External_Verdef));
10383
10384 do
10385 {
10386 Elf_External_Verdef evd;
10387
10388 if (get_data (&evd, file, off, sizeof (evd),
10389 1, _("version def")) == NULL)
10390 {
10391 ivd.vd_ndx = 0;
10392 ivd.vd_aux = 0;
10393 ivd.vd_next = 0;
10394 }
10395 else
10396 {
10397 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10398 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10399 ivd.vd_next = BYTE_GET (evd.vd_next);
10400 }
10401
10402 off += ivd.vd_next;
10403 }
10404 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10405 && ivd.vd_next != 0);
10406
10407 off -= ivd.vd_next;
10408 off += ivd.vd_aux;
10409
10410 if (get_data (&evda, file, off, sizeof (evda),
10411 1, _("version def aux")) == NULL)
10412 return version_string;
10413
10414 ivda.vda_name = BYTE_GET (evda.vda_name);
10415
10416 if (psym->st_name != ivda.vda_name)
10417 {
10418 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10419 ? symbol_hidden : symbol_public);
10420 version_string = (ivda.vda_name < strtab_size
10421 ? strtab + ivda.vda_name
10422 : _("<corrupt>"));
10423 }
10424 }
10425 }
10426 }
10427 }
10428 return version_string;
10429 }
10430
10431 /* Dump the symbol table. */
10432 static int
10433 process_symbol_table (FILE * file)
10434 {
10435 Elf_Internal_Shdr * section;
10436 bfd_size_type nbuckets = 0;
10437 bfd_size_type nchains = 0;
10438 bfd_vma * buckets = NULL;
10439 bfd_vma * chains = NULL;
10440 bfd_vma ngnubuckets = 0;
10441 bfd_vma * gnubuckets = NULL;
10442 bfd_vma * gnuchains = NULL;
10443 bfd_vma gnusymidx = 0;
10444 bfd_size_type ngnuchains = 0;
10445
10446 if (!do_syms && !do_dyn_syms && !do_histogram)
10447 return 1;
10448
10449 if (dynamic_info[DT_HASH]
10450 && (do_histogram
10451 || (do_using_dynamic
10452 && !do_dyn_syms
10453 && dynamic_strings != NULL)))
10454 {
10455 unsigned char nb[8];
10456 unsigned char nc[8];
10457 unsigned int hash_ent_size = 4;
10458
10459 if ((elf_header.e_machine == EM_ALPHA
10460 || elf_header.e_machine == EM_S390
10461 || elf_header.e_machine == EM_S390_OLD)
10462 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10463 hash_ent_size = 8;
10464
10465 if (fseek (file,
10466 (archive_file_offset
10467 + offset_from_vma (file, dynamic_info[DT_HASH],
10468 sizeof nb + sizeof nc)),
10469 SEEK_SET))
10470 {
10471 error (_("Unable to seek to start of dynamic information\n"));
10472 goto no_hash;
10473 }
10474
10475 if (fread (nb, hash_ent_size, 1, file) != 1)
10476 {
10477 error (_("Failed to read in number of buckets\n"));
10478 goto no_hash;
10479 }
10480
10481 if (fread (nc, hash_ent_size, 1, file) != 1)
10482 {
10483 error (_("Failed to read in number of chains\n"));
10484 goto no_hash;
10485 }
10486
10487 nbuckets = byte_get (nb, hash_ent_size);
10488 nchains = byte_get (nc, hash_ent_size);
10489
10490 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10491 chains = get_dynamic_data (file, nchains, hash_ent_size);
10492
10493 no_hash:
10494 if (buckets == NULL || chains == NULL)
10495 {
10496 if (do_using_dynamic)
10497 return 0;
10498 free (buckets);
10499 free (chains);
10500 buckets = NULL;
10501 chains = NULL;
10502 nbuckets = 0;
10503 nchains = 0;
10504 }
10505 }
10506
10507 if (dynamic_info_DT_GNU_HASH
10508 && (do_histogram
10509 || (do_using_dynamic
10510 && !do_dyn_syms
10511 && dynamic_strings != NULL)))
10512 {
10513 unsigned char nb[16];
10514 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10515 bfd_vma buckets_vma;
10516
10517 if (fseek (file,
10518 (archive_file_offset
10519 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10520 sizeof nb)),
10521 SEEK_SET))
10522 {
10523 error (_("Unable to seek to start of dynamic information\n"));
10524 goto no_gnu_hash;
10525 }
10526
10527 if (fread (nb, 16, 1, file) != 1)
10528 {
10529 error (_("Failed to read in number of buckets\n"));
10530 goto no_gnu_hash;
10531 }
10532
10533 ngnubuckets = byte_get (nb, 4);
10534 gnusymidx = byte_get (nb + 4, 4);
10535 bitmaskwords = byte_get (nb + 8, 4);
10536 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10537 if (is_32bit_elf)
10538 buckets_vma += bitmaskwords * 4;
10539 else
10540 buckets_vma += bitmaskwords * 8;
10541
10542 if (fseek (file,
10543 (archive_file_offset
10544 + offset_from_vma (file, buckets_vma, 4)),
10545 SEEK_SET))
10546 {
10547 error (_("Unable to seek to start of dynamic information\n"));
10548 goto no_gnu_hash;
10549 }
10550
10551 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10552
10553 if (gnubuckets == NULL)
10554 goto no_gnu_hash;
10555
10556 for (i = 0; i < ngnubuckets; i++)
10557 if (gnubuckets[i] != 0)
10558 {
10559 if (gnubuckets[i] < gnusymidx)
10560 return 0;
10561
10562 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10563 maxchain = gnubuckets[i];
10564 }
10565
10566 if (maxchain == 0xffffffff)
10567 goto no_gnu_hash;
10568
10569 maxchain -= gnusymidx;
10570
10571 if (fseek (file,
10572 (archive_file_offset
10573 + offset_from_vma (file, buckets_vma
10574 + 4 * (ngnubuckets + maxchain), 4)),
10575 SEEK_SET))
10576 {
10577 error (_("Unable to seek to start of dynamic information\n"));
10578 goto no_gnu_hash;
10579 }
10580
10581 do
10582 {
10583 if (fread (nb, 4, 1, file) != 1)
10584 {
10585 error (_("Failed to determine last chain length\n"));
10586 goto no_gnu_hash;
10587 }
10588
10589 if (maxchain + 1 == 0)
10590 goto no_gnu_hash;
10591
10592 ++maxchain;
10593 }
10594 while ((byte_get (nb, 4) & 1) == 0);
10595
10596 if (fseek (file,
10597 (archive_file_offset
10598 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10599 SEEK_SET))
10600 {
10601 error (_("Unable to seek to start of dynamic information\n"));
10602 goto no_gnu_hash;
10603 }
10604
10605 gnuchains = get_dynamic_data (file, maxchain, 4);
10606 ngnuchains = maxchain;
10607
10608 no_gnu_hash:
10609 if (gnuchains == NULL)
10610 {
10611 free (gnubuckets);
10612 gnubuckets = NULL;
10613 ngnubuckets = 0;
10614 if (do_using_dynamic)
10615 return 0;
10616 }
10617 }
10618
10619 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10620 && do_syms
10621 && do_using_dynamic
10622 && dynamic_strings != NULL
10623 && dynamic_symbols != NULL)
10624 {
10625 unsigned long hn;
10626
10627 if (dynamic_info[DT_HASH])
10628 {
10629 bfd_vma si;
10630
10631 printf (_("\nSymbol table for image:\n"));
10632 if (is_32bit_elf)
10633 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10634 else
10635 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10636
10637 for (hn = 0; hn < nbuckets; hn++)
10638 {
10639 if (! buckets[hn])
10640 continue;
10641
10642 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10643 print_dynamic_symbol (si, hn);
10644 }
10645 }
10646
10647 if (dynamic_info_DT_GNU_HASH)
10648 {
10649 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10650 if (is_32bit_elf)
10651 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10652 else
10653 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10654
10655 for (hn = 0; hn < ngnubuckets; ++hn)
10656 if (gnubuckets[hn] != 0)
10657 {
10658 bfd_vma si = gnubuckets[hn];
10659 bfd_vma off = si - gnusymidx;
10660
10661 do
10662 {
10663 print_dynamic_symbol (si, hn);
10664 si++;
10665 }
10666 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10667 }
10668 }
10669 }
10670 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10671 && section_headers != NULL)
10672 {
10673 unsigned int i;
10674
10675 for (i = 0, section = section_headers;
10676 i < elf_header.e_shnum;
10677 i++, section++)
10678 {
10679 unsigned int si;
10680 char * strtab = NULL;
10681 unsigned long int strtab_size = 0;
10682 Elf_Internal_Sym * symtab;
10683 Elf_Internal_Sym * psym;
10684 unsigned long num_syms;
10685
10686 if ((section->sh_type != SHT_SYMTAB
10687 && section->sh_type != SHT_DYNSYM)
10688 || (!do_syms
10689 && section->sh_type == SHT_SYMTAB))
10690 continue;
10691
10692 if (section->sh_entsize == 0)
10693 {
10694 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10695 printable_section_name (section));
10696 continue;
10697 }
10698
10699 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10700 printable_section_name (section),
10701 (unsigned long) (section->sh_size / section->sh_entsize));
10702
10703 if (is_32bit_elf)
10704 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10705 else
10706 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10707
10708 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10709 if (symtab == NULL)
10710 continue;
10711
10712 if (section->sh_link == elf_header.e_shstrndx)
10713 {
10714 strtab = string_table;
10715 strtab_size = string_table_length;
10716 }
10717 else if (section->sh_link < elf_header.e_shnum)
10718 {
10719 Elf_Internal_Shdr * string_sec;
10720
10721 string_sec = section_headers + section->sh_link;
10722
10723 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10724 1, string_sec->sh_size,
10725 _("string table"));
10726 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10727 }
10728
10729 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10730 {
10731 const char *version_string;
10732 enum versioned_symbol_info sym_info;
10733 unsigned short vna_other;
10734
10735 printf ("%6d: ", si);
10736 print_vma (psym->st_value, LONG_HEX);
10737 putchar (' ');
10738 print_vma (psym->st_size, DEC_5);
10739 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10740 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10741 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10742 /* Check to see if any other bits in the st_other field are set.
10743 Note - displaying this information disrupts the layout of the
10744 table being generated, but for the moment this case is very rare. */
10745 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10746 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10747 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10748 print_symbol (25, psym->st_name < strtab_size
10749 ? strtab + psym->st_name : _("<corrupt>"));
10750
10751 version_string
10752 = get_symbol_version_string (file,
10753 section->sh_type == SHT_DYNSYM,
10754 strtab, strtab_size, si,
10755 psym, &sym_info, &vna_other);
10756 if (version_string)
10757 {
10758 if (sym_info == symbol_undefined)
10759 printf ("@%s (%d)", version_string, vna_other);
10760 else
10761 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10762 version_string);
10763 }
10764
10765 putchar ('\n');
10766 }
10767
10768 free (symtab);
10769 if (strtab != string_table)
10770 free (strtab);
10771 }
10772 }
10773 else if (do_syms)
10774 printf
10775 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10776
10777 if (do_histogram && buckets != NULL)
10778 {
10779 unsigned long * lengths;
10780 unsigned long * counts;
10781 unsigned long hn;
10782 bfd_vma si;
10783 unsigned long maxlength = 0;
10784 unsigned long nzero_counts = 0;
10785 unsigned long nsyms = 0;
10786
10787 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10788 (unsigned long) nbuckets);
10789
10790 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10791 if (lengths == NULL)
10792 {
10793 error (_("Out of memory allocating space for histogram buckets\n"));
10794 return 0;
10795 }
10796
10797 printf (_(" Length Number %% of total Coverage\n"));
10798 for (hn = 0; hn < nbuckets; ++hn)
10799 {
10800 for (si = buckets[hn]; si > 0 && si < nchains && si < nbuckets; si = chains[si])
10801 {
10802 ++nsyms;
10803 if (maxlength < ++lengths[hn])
10804 ++maxlength;
10805
10806 /* PR binutils/17531: A corrupt binary could contain broken
10807 histogram data. Do not go into an infinite loop trying
10808 to process it. */
10809 if (chains[si] == si)
10810 {
10811 error (_("histogram chain links to itself\n"));
10812 break;
10813 }
10814 }
10815 }
10816
10817 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10818 if (counts == NULL)
10819 {
10820 free (lengths);
10821 error (_("Out of memory allocating space for histogram counts\n"));
10822 return 0;
10823 }
10824
10825 for (hn = 0; hn < nbuckets; ++hn)
10826 ++counts[lengths[hn]];
10827
10828 if (nbuckets > 0)
10829 {
10830 unsigned long i;
10831 printf (" 0 %-10lu (%5.1f%%)\n",
10832 counts[0], (counts[0] * 100.0) / nbuckets);
10833 for (i = 1; i <= maxlength; ++i)
10834 {
10835 nzero_counts += counts[i] * i;
10836 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10837 i, counts[i], (counts[i] * 100.0) / nbuckets,
10838 (nzero_counts * 100.0) / nsyms);
10839 }
10840 }
10841
10842 free (counts);
10843 free (lengths);
10844 }
10845
10846 if (buckets != NULL)
10847 {
10848 free (buckets);
10849 free (chains);
10850 }
10851
10852 if (do_histogram && gnubuckets != NULL)
10853 {
10854 unsigned long * lengths;
10855 unsigned long * counts;
10856 unsigned long hn;
10857 unsigned long maxlength = 0;
10858 unsigned long nzero_counts = 0;
10859 unsigned long nsyms = 0;
10860
10861 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10862 (unsigned long) ngnubuckets);
10863
10864 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10865 if (lengths == NULL)
10866 {
10867 error (_("Out of memory allocating space for gnu histogram buckets\n"));
10868 return 0;
10869 }
10870
10871 printf (_(" Length Number %% of total Coverage\n"));
10872
10873 for (hn = 0; hn < ngnubuckets; ++hn)
10874 if (gnubuckets[hn] != 0)
10875 {
10876 bfd_vma off, length = 1;
10877
10878 for (off = gnubuckets[hn] - gnusymidx;
10879 /* PR 17531 file: 010-77222-0.004. */
10880 off < ngnuchains && (gnuchains[off] & 1) == 0;
10881 ++off)
10882 ++length;
10883 lengths[hn] = length;
10884 if (length > maxlength)
10885 maxlength = length;
10886 nsyms += length;
10887 }
10888
10889 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10890 if (counts == NULL)
10891 {
10892 free (lengths);
10893 error (_("Out of memory allocating space for gnu histogram counts\n"));
10894 return 0;
10895 }
10896
10897 for (hn = 0; hn < ngnubuckets; ++hn)
10898 ++counts[lengths[hn]];
10899
10900 if (ngnubuckets > 0)
10901 {
10902 unsigned long j;
10903 printf (" 0 %-10lu (%5.1f%%)\n",
10904 counts[0], (counts[0] * 100.0) / ngnubuckets);
10905 for (j = 1; j <= maxlength; ++j)
10906 {
10907 nzero_counts += counts[j] * j;
10908 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10909 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10910 (nzero_counts * 100.0) / nsyms);
10911 }
10912 }
10913
10914 free (counts);
10915 free (lengths);
10916 free (gnubuckets);
10917 free (gnuchains);
10918 }
10919
10920 return 1;
10921 }
10922
10923 static int
10924 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10925 {
10926 unsigned int i;
10927
10928 if (dynamic_syminfo == NULL
10929 || !do_dynamic)
10930 /* No syminfo, this is ok. */
10931 return 1;
10932
10933 /* There better should be a dynamic symbol section. */
10934 if (dynamic_symbols == NULL || dynamic_strings == NULL)
10935 return 0;
10936
10937 if (dynamic_addr)
10938 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10939 dynamic_syminfo_offset, dynamic_syminfo_nent);
10940
10941 printf (_(" Num: Name BoundTo Flags\n"));
10942 for (i = 0; i < dynamic_syminfo_nent; ++i)
10943 {
10944 unsigned short int flags = dynamic_syminfo[i].si_flags;
10945
10946 printf ("%4d: ", i);
10947 if (i >= num_dynamic_syms)
10948 printf (_("<corrupt index>"));
10949 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10950 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10951 else
10952 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10953 putchar (' ');
10954
10955 switch (dynamic_syminfo[i].si_boundto)
10956 {
10957 case SYMINFO_BT_SELF:
10958 fputs ("SELF ", stdout);
10959 break;
10960 case SYMINFO_BT_PARENT:
10961 fputs ("PARENT ", stdout);
10962 break;
10963 default:
10964 if (dynamic_syminfo[i].si_boundto > 0
10965 && dynamic_syminfo[i].si_boundto < dynamic_nent
10966 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10967 {
10968 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10969 putchar (' ' );
10970 }
10971 else
10972 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10973 break;
10974 }
10975
10976 if (flags & SYMINFO_FLG_DIRECT)
10977 printf (" DIRECT");
10978 if (flags & SYMINFO_FLG_PASSTHRU)
10979 printf (" PASSTHRU");
10980 if (flags & SYMINFO_FLG_COPY)
10981 printf (" COPY");
10982 if (flags & SYMINFO_FLG_LAZYLOAD)
10983 printf (" LAZYLOAD");
10984
10985 puts ("");
10986 }
10987
10988 return 1;
10989 }
10990
10991 /* Check to see if the given reloc needs to be handled in a target specific
10992 manner. If so then process the reloc and return TRUE otherwise return
10993 FALSE. */
10994
10995 static bfd_boolean
10996 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10997 unsigned char * start,
10998 Elf_Internal_Sym * symtab)
10999 {
11000 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11001
11002 switch (elf_header.e_machine)
11003 {
11004 case EM_MSP430:
11005 case EM_MSP430_OLD:
11006 {
11007 static Elf_Internal_Sym * saved_sym = NULL;
11008
11009 switch (reloc_type)
11010 {
11011 case 10: /* R_MSP430_SYM_DIFF */
11012 if (uses_msp430x_relocs ())
11013 break;
11014 case 21: /* R_MSP430X_SYM_DIFF */
11015 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11016 return TRUE;
11017
11018 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11019 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11020 goto handle_sym_diff;
11021
11022 case 5: /* R_MSP430_16_BYTE */
11023 case 9: /* R_MSP430_8 */
11024 if (uses_msp430x_relocs ())
11025 break;
11026 goto handle_sym_diff;
11027
11028 case 2: /* R_MSP430_ABS16 */
11029 case 15: /* R_MSP430X_ABS16 */
11030 if (! uses_msp430x_relocs ())
11031 break;
11032 goto handle_sym_diff;
11033
11034 handle_sym_diff:
11035 if (saved_sym != NULL)
11036 {
11037 bfd_vma value;
11038
11039 value = reloc->r_addend
11040 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11041 - saved_sym->st_value);
11042
11043 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11044
11045 saved_sym = NULL;
11046 return TRUE;
11047 }
11048 break;
11049
11050 default:
11051 if (saved_sym != NULL)
11052 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11053 break;
11054 }
11055 break;
11056 }
11057
11058 case EM_MN10300:
11059 case EM_CYGNUS_MN10300:
11060 {
11061 static Elf_Internal_Sym * saved_sym = NULL;
11062
11063 switch (reloc_type)
11064 {
11065 case 34: /* R_MN10300_ALIGN */
11066 return TRUE;
11067 case 33: /* R_MN10300_SYM_DIFF */
11068 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11069 return TRUE;
11070 case 1: /* R_MN10300_32 */
11071 case 2: /* R_MN10300_16 */
11072 if (saved_sym != NULL)
11073 {
11074 bfd_vma value;
11075
11076 value = reloc->r_addend
11077 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11078 - saved_sym->st_value);
11079
11080 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11081
11082 saved_sym = NULL;
11083 return TRUE;
11084 }
11085 break;
11086 default:
11087 if (saved_sym != NULL)
11088 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11089 break;
11090 }
11091 break;
11092 }
11093 }
11094
11095 return FALSE;
11096 }
11097
11098 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11099 DWARF debug sections. This is a target specific test. Note - we do not
11100 go through the whole including-target-headers-multiple-times route, (as
11101 we have already done with <elf/h8.h>) because this would become very
11102 messy and even then this function would have to contain target specific
11103 information (the names of the relocs instead of their numeric values).
11104 FIXME: This is not the correct way to solve this problem. The proper way
11105 is to have target specific reloc sizing and typing functions created by
11106 the reloc-macros.h header, in the same way that it already creates the
11107 reloc naming functions. */
11108
11109 static bfd_boolean
11110 is_32bit_abs_reloc (unsigned int reloc_type)
11111 {
11112 switch (elf_header.e_machine)
11113 {
11114 case EM_386:
11115 case EM_486:
11116 return reloc_type == 1; /* R_386_32. */
11117 case EM_68K:
11118 return reloc_type == 1; /* R_68K_32. */
11119 case EM_860:
11120 return reloc_type == 1; /* R_860_32. */
11121 case EM_960:
11122 return reloc_type == 2; /* R_960_32. */
11123 case EM_AARCH64:
11124 return reloc_type == 258; /* R_AARCH64_ABS32 */
11125 case EM_ALPHA:
11126 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11127 case EM_ARC:
11128 return reloc_type == 1; /* R_ARC_32. */
11129 case EM_ARM:
11130 return reloc_type == 2; /* R_ARM_ABS32 */
11131 case EM_AVR_OLD:
11132 case EM_AVR:
11133 return reloc_type == 1;
11134 case EM_ADAPTEVA_EPIPHANY:
11135 return reloc_type == 3;
11136 case EM_BLACKFIN:
11137 return reloc_type == 0x12; /* R_byte4_data. */
11138 case EM_CRIS:
11139 return reloc_type == 3; /* R_CRIS_32. */
11140 case EM_CR16:
11141 return reloc_type == 3; /* R_CR16_NUM32. */
11142 case EM_CRX:
11143 return reloc_type == 15; /* R_CRX_NUM32. */
11144 case EM_CYGNUS_FRV:
11145 return reloc_type == 1;
11146 case EM_CYGNUS_D10V:
11147 case EM_D10V:
11148 return reloc_type == 6; /* R_D10V_32. */
11149 case EM_CYGNUS_D30V:
11150 case EM_D30V:
11151 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11152 case EM_DLX:
11153 return reloc_type == 3; /* R_DLX_RELOC_32. */
11154 case EM_CYGNUS_FR30:
11155 case EM_FR30:
11156 return reloc_type == 3; /* R_FR30_32. */
11157 case EM_FT32:
11158 return reloc_type == 1; /* R_FT32_32. */
11159 case EM_H8S:
11160 case EM_H8_300:
11161 case EM_H8_300H:
11162 return reloc_type == 1; /* R_H8_DIR32. */
11163 case EM_IA_64:
11164 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
11165 case EM_IP2K_OLD:
11166 case EM_IP2K:
11167 return reloc_type == 2; /* R_IP2K_32. */
11168 case EM_IQ2000:
11169 return reloc_type == 2; /* R_IQ2000_32. */
11170 case EM_LATTICEMICO32:
11171 return reloc_type == 3; /* R_LM32_32. */
11172 case EM_M32C_OLD:
11173 case EM_M32C:
11174 return reloc_type == 3; /* R_M32C_32. */
11175 case EM_M32R:
11176 return reloc_type == 34; /* R_M32R_32_RELA. */
11177 case EM_MCORE:
11178 return reloc_type == 1; /* R_MCORE_ADDR32. */
11179 case EM_CYGNUS_MEP:
11180 return reloc_type == 4; /* R_MEP_32. */
11181 case EM_METAG:
11182 return reloc_type == 2; /* R_METAG_ADDR32. */
11183 case EM_MICROBLAZE:
11184 return reloc_type == 1; /* R_MICROBLAZE_32. */
11185 case EM_MIPS:
11186 return reloc_type == 2; /* R_MIPS_32. */
11187 case EM_MMIX:
11188 return reloc_type == 4; /* R_MMIX_32. */
11189 case EM_CYGNUS_MN10200:
11190 case EM_MN10200:
11191 return reloc_type == 1; /* R_MN10200_32. */
11192 case EM_CYGNUS_MN10300:
11193 case EM_MN10300:
11194 return reloc_type == 1; /* R_MN10300_32. */
11195 case EM_MOXIE:
11196 return reloc_type == 1; /* R_MOXIE_32. */
11197 case EM_MSP430_OLD:
11198 case EM_MSP430:
11199 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11200 case EM_MT:
11201 return reloc_type == 2; /* R_MT_32. */
11202 case EM_NDS32:
11203 return reloc_type == 20; /* R_NDS32_RELA. */
11204 case EM_ALTERA_NIOS2:
11205 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11206 case EM_NIOS32:
11207 return reloc_type == 1; /* R_NIOS_32. */
11208 case EM_OR1K:
11209 return reloc_type == 1; /* R_OR1K_32. */
11210 case EM_PARISC:
11211 return (reloc_type == 1 /* R_PARISC_DIR32. */
11212 || reloc_type == 41); /* R_PARISC_SECREL32. */
11213 case EM_PJ:
11214 case EM_PJ_OLD:
11215 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11216 case EM_PPC64:
11217 return reloc_type == 1; /* R_PPC64_ADDR32. */
11218 case EM_PPC:
11219 return reloc_type == 1; /* R_PPC_ADDR32. */
11220 case EM_RL78:
11221 return reloc_type == 1; /* R_RL78_DIR32. */
11222 case EM_RX:
11223 return reloc_type == 1; /* R_RX_DIR32. */
11224 case EM_S370:
11225 return reloc_type == 1; /* R_I370_ADDR31. */
11226 case EM_S390_OLD:
11227 case EM_S390:
11228 return reloc_type == 4; /* R_S390_32. */
11229 case EM_SCORE:
11230 return reloc_type == 8; /* R_SCORE_ABS32. */
11231 case EM_SH:
11232 return reloc_type == 1; /* R_SH_DIR32. */
11233 case EM_SPARC32PLUS:
11234 case EM_SPARCV9:
11235 case EM_SPARC:
11236 return reloc_type == 3 /* R_SPARC_32. */
11237 || reloc_type == 23; /* R_SPARC_UA32. */
11238 case EM_SPU:
11239 return reloc_type == 6; /* R_SPU_ADDR32 */
11240 case EM_TI_C6000:
11241 return reloc_type == 1; /* R_C6000_ABS32. */
11242 case EM_TILEGX:
11243 return reloc_type == 2; /* R_TILEGX_32. */
11244 case EM_TILEPRO:
11245 return reloc_type == 1; /* R_TILEPRO_32. */
11246 case EM_CYGNUS_V850:
11247 case EM_V850:
11248 return reloc_type == 6; /* R_V850_ABS32. */
11249 case EM_V800:
11250 return reloc_type == 0x33; /* R_V810_WORD. */
11251 case EM_VAX:
11252 return reloc_type == 1; /* R_VAX_32. */
11253 case EM_VISIUM:
11254 return reloc_type == 3; /* R_VISIUM_32. */
11255 case EM_X86_64:
11256 case EM_L1OM:
11257 case EM_K1OM:
11258 return reloc_type == 10; /* R_X86_64_32. */
11259 case EM_XC16X:
11260 case EM_C166:
11261 return reloc_type == 3; /* R_XC16C_ABS_32. */
11262 case EM_XGATE:
11263 return reloc_type == 4; /* R_XGATE_32. */
11264 case EM_XSTORMY16:
11265 return reloc_type == 1; /* R_XSTROMY16_32. */
11266 case EM_XTENSA_OLD:
11267 case EM_XTENSA:
11268 return reloc_type == 1; /* R_XTENSA_32. */
11269 default:
11270 {
11271 static unsigned int prev_warn = 0;
11272
11273 /* Avoid repeating the same warning multiple times. */
11274 if (prev_warn != elf_header.e_machine)
11275 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11276 elf_header.e_machine);
11277 prev_warn = elf_header.e_machine;
11278 return FALSE;
11279 }
11280 }
11281 }
11282
11283 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11284 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11285
11286 static bfd_boolean
11287 is_32bit_pcrel_reloc (unsigned int reloc_type)
11288 {
11289 switch (elf_header.e_machine)
11290 {
11291 case EM_386:
11292 case EM_486:
11293 return reloc_type == 2; /* R_386_PC32. */
11294 case EM_68K:
11295 return reloc_type == 4; /* R_68K_PC32. */
11296 case EM_AARCH64:
11297 return reloc_type == 261; /* R_AARCH64_PREL32 */
11298 case EM_ADAPTEVA_EPIPHANY:
11299 return reloc_type == 6;
11300 case EM_ALPHA:
11301 return reloc_type == 10; /* R_ALPHA_SREL32. */
11302 case EM_ARM:
11303 return reloc_type == 3; /* R_ARM_REL32 */
11304 case EM_MICROBLAZE:
11305 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11306 case EM_OR1K:
11307 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11308 case EM_PARISC:
11309 return reloc_type == 9; /* R_PARISC_PCREL32. */
11310 case EM_PPC:
11311 return reloc_type == 26; /* R_PPC_REL32. */
11312 case EM_PPC64:
11313 return reloc_type == 26; /* R_PPC64_REL32. */
11314 case EM_S390_OLD:
11315 case EM_S390:
11316 return reloc_type == 5; /* R_390_PC32. */
11317 case EM_SH:
11318 return reloc_type == 2; /* R_SH_REL32. */
11319 case EM_SPARC32PLUS:
11320 case EM_SPARCV9:
11321 case EM_SPARC:
11322 return reloc_type == 6; /* R_SPARC_DISP32. */
11323 case EM_SPU:
11324 return reloc_type == 13; /* R_SPU_REL32. */
11325 case EM_TILEGX:
11326 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11327 case EM_TILEPRO:
11328 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11329 case EM_VISIUM:
11330 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11331 case EM_X86_64:
11332 case EM_L1OM:
11333 case EM_K1OM:
11334 return reloc_type == 2; /* R_X86_64_PC32. */
11335 case EM_XTENSA_OLD:
11336 case EM_XTENSA:
11337 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11338 default:
11339 /* Do not abort or issue an error message here. Not all targets use
11340 pc-relative 32-bit relocs in their DWARF debug information and we
11341 have already tested for target coverage in is_32bit_abs_reloc. A
11342 more helpful warning message will be generated by apply_relocations
11343 anyway, so just return. */
11344 return FALSE;
11345 }
11346 }
11347
11348 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11349 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11350
11351 static bfd_boolean
11352 is_64bit_abs_reloc (unsigned int reloc_type)
11353 {
11354 switch (elf_header.e_machine)
11355 {
11356 case EM_AARCH64:
11357 return reloc_type == 257; /* R_AARCH64_ABS64. */
11358 case EM_ALPHA:
11359 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11360 case EM_IA_64:
11361 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11362 case EM_PARISC:
11363 return reloc_type == 80; /* R_PARISC_DIR64. */
11364 case EM_PPC64:
11365 return reloc_type == 38; /* R_PPC64_ADDR64. */
11366 case EM_SPARC32PLUS:
11367 case EM_SPARCV9:
11368 case EM_SPARC:
11369 return reloc_type == 54; /* R_SPARC_UA64. */
11370 case EM_X86_64:
11371 case EM_L1OM:
11372 case EM_K1OM:
11373 return reloc_type == 1; /* R_X86_64_64. */
11374 case EM_S390_OLD:
11375 case EM_S390:
11376 return reloc_type == 22; /* R_S390_64. */
11377 case EM_TILEGX:
11378 return reloc_type == 1; /* R_TILEGX_64. */
11379 case EM_MIPS:
11380 return reloc_type == 18; /* R_MIPS_64. */
11381 default:
11382 return FALSE;
11383 }
11384 }
11385
11386 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11387 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11388
11389 static bfd_boolean
11390 is_64bit_pcrel_reloc (unsigned int reloc_type)
11391 {
11392 switch (elf_header.e_machine)
11393 {
11394 case EM_AARCH64:
11395 return reloc_type == 260; /* R_AARCH64_PREL64. */
11396 case EM_ALPHA:
11397 return reloc_type == 11; /* R_ALPHA_SREL64. */
11398 case EM_IA_64:
11399 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11400 case EM_PARISC:
11401 return reloc_type == 72; /* R_PARISC_PCREL64. */
11402 case EM_PPC64:
11403 return reloc_type == 44; /* R_PPC64_REL64. */
11404 case EM_SPARC32PLUS:
11405 case EM_SPARCV9:
11406 case EM_SPARC:
11407 return reloc_type == 46; /* R_SPARC_DISP64. */
11408 case EM_X86_64:
11409 case EM_L1OM:
11410 case EM_K1OM:
11411 return reloc_type == 24; /* R_X86_64_PC64. */
11412 case EM_S390_OLD:
11413 case EM_S390:
11414 return reloc_type == 23; /* R_S390_PC64. */
11415 case EM_TILEGX:
11416 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11417 default:
11418 return FALSE;
11419 }
11420 }
11421
11422 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11423 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11424
11425 static bfd_boolean
11426 is_24bit_abs_reloc (unsigned int reloc_type)
11427 {
11428 switch (elf_header.e_machine)
11429 {
11430 case EM_CYGNUS_MN10200:
11431 case EM_MN10200:
11432 return reloc_type == 4; /* R_MN10200_24. */
11433 default:
11434 return FALSE;
11435 }
11436 }
11437
11438 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11439 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11440
11441 static bfd_boolean
11442 is_16bit_abs_reloc (unsigned int reloc_type)
11443 {
11444 switch (elf_header.e_machine)
11445 {
11446 case EM_AVR_OLD:
11447 case EM_AVR:
11448 return reloc_type == 4; /* R_AVR_16. */
11449 case EM_ADAPTEVA_EPIPHANY:
11450 return reloc_type == 5;
11451 case EM_CYGNUS_D10V:
11452 case EM_D10V:
11453 return reloc_type == 3; /* R_D10V_16. */
11454 case EM_H8S:
11455 case EM_H8_300:
11456 case EM_H8_300H:
11457 return reloc_type == R_H8_DIR16;
11458 case EM_IP2K_OLD:
11459 case EM_IP2K:
11460 return reloc_type == 1; /* R_IP2K_16. */
11461 case EM_M32C_OLD:
11462 case EM_M32C:
11463 return reloc_type == 1; /* R_M32C_16 */
11464 case EM_MSP430:
11465 if (uses_msp430x_relocs ())
11466 return reloc_type == 2; /* R_MSP430_ABS16. */
11467 case EM_MSP430_OLD:
11468 return reloc_type == 5; /* R_MSP430_16_BYTE. */
11469 case EM_NDS32:
11470 return reloc_type == 19; /* R_NDS32_RELA. */
11471 case EM_ALTERA_NIOS2:
11472 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
11473 case EM_NIOS32:
11474 return reloc_type == 9; /* R_NIOS_16. */
11475 case EM_OR1K:
11476 return reloc_type == 2; /* R_OR1K_16. */
11477 case EM_TI_C6000:
11478 return reloc_type == 2; /* R_C6000_ABS16. */
11479 case EM_XC16X:
11480 case EM_C166:
11481 return reloc_type == 2; /* R_XC16C_ABS_16. */
11482 case EM_CYGNUS_MN10200:
11483 case EM_MN10200:
11484 return reloc_type == 2; /* R_MN10200_16. */
11485 case EM_CYGNUS_MN10300:
11486 case EM_MN10300:
11487 return reloc_type == 2; /* R_MN10300_16. */
11488 case EM_VISIUM:
11489 return reloc_type == 2; /* R_VISIUM_16. */
11490 case EM_XGATE:
11491 return reloc_type == 3; /* R_XGATE_16. */
11492 default:
11493 return FALSE;
11494 }
11495 }
11496
11497 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11498 relocation entries (possibly formerly used for SHT_GROUP sections). */
11499
11500 static bfd_boolean
11501 is_none_reloc (unsigned int reloc_type)
11502 {
11503 switch (elf_header.e_machine)
11504 {
11505 case EM_68K: /* R_68K_NONE. */
11506 case EM_386: /* R_386_NONE. */
11507 case EM_SPARC32PLUS:
11508 case EM_SPARCV9:
11509 case EM_SPARC: /* R_SPARC_NONE. */
11510 case EM_MIPS: /* R_MIPS_NONE. */
11511 case EM_PARISC: /* R_PARISC_NONE. */
11512 case EM_ALPHA: /* R_ALPHA_NONE. */
11513 case EM_ADAPTEVA_EPIPHANY:
11514 case EM_PPC: /* R_PPC_NONE. */
11515 case EM_PPC64: /* R_PPC64_NONE. */
11516 case EM_ARM: /* R_ARM_NONE. */
11517 case EM_IA_64: /* R_IA64_NONE. */
11518 case EM_SH: /* R_SH_NONE. */
11519 case EM_S390_OLD:
11520 case EM_S390: /* R_390_NONE. */
11521 case EM_CRIS: /* R_CRIS_NONE. */
11522 case EM_X86_64: /* R_X86_64_NONE. */
11523 case EM_L1OM: /* R_X86_64_NONE. */
11524 case EM_K1OM: /* R_X86_64_NONE. */
11525 case EM_MN10300: /* R_MN10300_NONE. */
11526 case EM_FT32: /* R_FT32_NONE. */
11527 case EM_MOXIE: /* R_MOXIE_NONE. */
11528 case EM_M32R: /* R_M32R_NONE. */
11529 case EM_TI_C6000:/* R_C6000_NONE. */
11530 case EM_TILEGX: /* R_TILEGX_NONE. */
11531 case EM_TILEPRO: /* R_TILEPRO_NONE. */
11532 case EM_XC16X:
11533 case EM_C166: /* R_XC16X_NONE. */
11534 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11535 case EM_NIOS32: /* R_NIOS_NONE. */
11536 case EM_OR1K: /* R_OR1K_NONE. */
11537 return reloc_type == 0;
11538 case EM_AARCH64:
11539 return reloc_type == 0 || reloc_type == 256;
11540 case EM_NDS32:
11541 return (reloc_type == 0 /* R_XTENSA_NONE. */
11542 || reloc_type == 204 /* R_NDS32_DIFF8. */
11543 || reloc_type == 205 /* R_NDS32_DIFF16. */
11544 || reloc_type == 206 /* R_NDS32_DIFF32. */
11545 || reloc_type == 207 /* R_NDS32_ULEB128. */);
11546 case EM_XTENSA_OLD:
11547 case EM_XTENSA:
11548 return (reloc_type == 0 /* R_XTENSA_NONE. */
11549 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11550 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11551 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
11552 case EM_METAG:
11553 return reloc_type == 3; /* R_METAG_NONE. */
11554 }
11555 return FALSE;
11556 }
11557
11558 /* Apply relocations to a section.
11559 Note: So far support has been added only for those relocations
11560 which can be found in debug sections.
11561 FIXME: Add support for more relocations ? */
11562
11563 static void
11564 apply_relocations (void * file,
11565 Elf_Internal_Shdr * section,
11566 unsigned char * start)
11567 {
11568 Elf_Internal_Shdr * relsec;
11569 unsigned char * end = start + section->sh_size;
11570
11571 if (elf_header.e_type != ET_REL)
11572 return;
11573
11574 /* Find the reloc section associated with the section. */
11575 for (relsec = section_headers;
11576 relsec < section_headers + elf_header.e_shnum;
11577 ++relsec)
11578 {
11579 bfd_boolean is_rela;
11580 unsigned long num_relocs;
11581 Elf_Internal_Rela * relocs;
11582 Elf_Internal_Rela * rp;
11583 Elf_Internal_Shdr * symsec;
11584 Elf_Internal_Sym * symtab;
11585 unsigned long num_syms;
11586 Elf_Internal_Sym * sym;
11587
11588 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11589 || relsec->sh_info >= elf_header.e_shnum
11590 || section_headers + relsec->sh_info != section
11591 || relsec->sh_size == 0
11592 || relsec->sh_link >= elf_header.e_shnum)
11593 continue;
11594
11595 is_rela = relsec->sh_type == SHT_RELA;
11596
11597 if (is_rela)
11598 {
11599 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11600 relsec->sh_size, & relocs, & num_relocs))
11601 return;
11602 }
11603 else
11604 {
11605 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11606 relsec->sh_size, & relocs, & num_relocs))
11607 return;
11608 }
11609
11610 /* SH uses RELA but uses in place value instead of the addend field. */
11611 if (elf_header.e_machine == EM_SH)
11612 is_rela = FALSE;
11613
11614 symsec = section_headers + relsec->sh_link;
11615 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11616
11617 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11618 {
11619 bfd_vma addend;
11620 unsigned int reloc_type;
11621 unsigned int reloc_size;
11622 unsigned char * rloc;
11623 unsigned long sym_index;
11624
11625 reloc_type = get_reloc_type (rp->r_info);
11626
11627 if (target_specific_reloc_handling (rp, start, symtab))
11628 continue;
11629 else if (is_none_reloc (reloc_type))
11630 continue;
11631 else if (is_32bit_abs_reloc (reloc_type)
11632 || is_32bit_pcrel_reloc (reloc_type))
11633 reloc_size = 4;
11634 else if (is_64bit_abs_reloc (reloc_type)
11635 || is_64bit_pcrel_reloc (reloc_type))
11636 reloc_size = 8;
11637 else if (is_24bit_abs_reloc (reloc_type))
11638 reloc_size = 3;
11639 else if (is_16bit_abs_reloc (reloc_type))
11640 reloc_size = 2;
11641 else
11642 {
11643 static unsigned int prev_reloc = 0;
11644 if (reloc_type != prev_reloc)
11645 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11646 reloc_type, printable_section_name (section));
11647 prev_reloc = reloc_type;
11648 continue;
11649 }
11650
11651 rloc = start + rp->r_offset;
11652 if ((rloc + reloc_size) > end || (rloc < start))
11653 {
11654 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11655 (unsigned long) rp->r_offset,
11656 printable_section_name (section));
11657 continue;
11658 }
11659
11660 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11661 if (sym_index >= num_syms)
11662 {
11663 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11664 sym_index, printable_section_name (section));
11665 continue;
11666 }
11667 sym = symtab + sym_index;
11668
11669 /* If the reloc has a symbol associated with it,
11670 make sure that it is of an appropriate type.
11671
11672 Relocations against symbols without type can happen.
11673 Gcc -feliminate-dwarf2-dups may generate symbols
11674 without type for debug info.
11675
11676 Icc generates relocations against function symbols
11677 instead of local labels.
11678
11679 Relocations against object symbols can happen, eg when
11680 referencing a global array. For an example of this see
11681 the _clz.o binary in libgcc.a. */
11682 if (sym != symtab
11683 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11684 {
11685 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11686 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11687 (long int)(rp - relocs),
11688 printable_section_name (relsec));
11689 continue;
11690 }
11691
11692 addend = 0;
11693 if (is_rela)
11694 addend += rp->r_addend;
11695 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11696 partial_inplace. */
11697 if (!is_rela
11698 || (elf_header.e_machine == EM_XTENSA
11699 && reloc_type == 1)
11700 || ((elf_header.e_machine == EM_PJ
11701 || elf_header.e_machine == EM_PJ_OLD)
11702 && reloc_type == 1)
11703 || ((elf_header.e_machine == EM_D30V
11704 || elf_header.e_machine == EM_CYGNUS_D30V)
11705 && reloc_type == 12))
11706 addend += byte_get (rloc, reloc_size);
11707
11708 if (is_32bit_pcrel_reloc (reloc_type)
11709 || is_64bit_pcrel_reloc (reloc_type))
11710 {
11711 /* On HPPA, all pc-relative relocations are biased by 8. */
11712 if (elf_header.e_machine == EM_PARISC)
11713 addend -= 8;
11714 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11715 reloc_size);
11716 }
11717 else
11718 byte_put (rloc, addend + sym->st_value, reloc_size);
11719 }
11720
11721 free (symtab);
11722 free (relocs);
11723 break;
11724 }
11725 }
11726
11727 #ifdef SUPPORT_DISASSEMBLY
11728 static int
11729 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11730 {
11731 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11732
11733 /* FIXME: XXX -- to be done --- XXX */
11734
11735 return 1;
11736 }
11737 #endif
11738
11739 /* Reads in the contents of SECTION from FILE, returning a pointer
11740 to a malloc'ed buffer or NULL if something went wrong. */
11741
11742 static char *
11743 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11744 {
11745 bfd_size_type num_bytes;
11746
11747 num_bytes = section->sh_size;
11748
11749 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11750 {
11751 printf (_("\nSection '%s' has no data to dump.\n"),
11752 printable_section_name (section));
11753 return NULL;
11754 }
11755
11756 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11757 _("section contents"));
11758 }
11759
11760
11761 static void
11762 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11763 {
11764 Elf_Internal_Shdr * relsec;
11765 bfd_size_type num_bytes;
11766 char * data;
11767 char * end;
11768 char * start;
11769 bfd_boolean some_strings_shown;
11770
11771 start = get_section_contents (section, file);
11772 if (start == NULL)
11773 return;
11774
11775 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11776
11777 /* If the section being dumped has relocations against it the user might
11778 be expecting these relocations to have been applied. Check for this
11779 case and issue a warning message in order to avoid confusion.
11780 FIXME: Maybe we ought to have an option that dumps a section with
11781 relocs applied ? */
11782 for (relsec = section_headers;
11783 relsec < section_headers + elf_header.e_shnum;
11784 ++relsec)
11785 {
11786 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11787 || relsec->sh_info >= elf_header.e_shnum
11788 || section_headers + relsec->sh_info != section
11789 || relsec->sh_size == 0
11790 || relsec->sh_link >= elf_header.e_shnum)
11791 continue;
11792
11793 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11794 break;
11795 }
11796
11797 num_bytes = section->sh_size;
11798 data = start;
11799 end = start + num_bytes;
11800 some_strings_shown = FALSE;
11801
11802 while (data < end)
11803 {
11804 while (!ISPRINT (* data))
11805 if (++ data >= end)
11806 break;
11807
11808 if (data < end)
11809 {
11810 size_t maxlen = end - data;
11811
11812 #ifndef __MSVCRT__
11813 /* PR 11128: Use two separate invocations in order to work
11814 around bugs in the Solaris 8 implementation of printf. */
11815 printf (" [%6tx] ", data - start);
11816 #else
11817 printf (" [%6Ix] ", (size_t) (data - start));
11818 #endif
11819 if (maxlen > 0)
11820 {
11821 print_symbol ((int) maxlen, data);
11822 putchar ('\n');
11823 data += strnlen (data, maxlen);
11824 }
11825 else
11826 {
11827 printf (_("<corrupt>\n"));
11828 data = end;
11829 }
11830 some_strings_shown = TRUE;
11831 }
11832 }
11833
11834 if (! some_strings_shown)
11835 printf (_(" No strings found in this section."));
11836
11837 free (start);
11838
11839 putchar ('\n');
11840 }
11841
11842 static void
11843 dump_section_as_bytes (Elf_Internal_Shdr * section,
11844 FILE * file,
11845 bfd_boolean relocate)
11846 {
11847 Elf_Internal_Shdr * relsec;
11848 bfd_size_type bytes;
11849 bfd_vma addr;
11850 unsigned char * data;
11851 unsigned char * start;
11852
11853 start = (unsigned char *) get_section_contents (section, file);
11854 if (start == NULL)
11855 return;
11856
11857 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11858
11859 if (relocate)
11860 {
11861 apply_relocations (file, section, start);
11862 }
11863 else
11864 {
11865 /* If the section being dumped has relocations against it the user might
11866 be expecting these relocations to have been applied. Check for this
11867 case and issue a warning message in order to avoid confusion.
11868 FIXME: Maybe we ought to have an option that dumps a section with
11869 relocs applied ? */
11870 for (relsec = section_headers;
11871 relsec < section_headers + elf_header.e_shnum;
11872 ++relsec)
11873 {
11874 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11875 || relsec->sh_info >= elf_header.e_shnum
11876 || section_headers + relsec->sh_info != section
11877 || relsec->sh_size == 0
11878 || relsec->sh_link >= elf_header.e_shnum)
11879 continue;
11880
11881 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11882 break;
11883 }
11884 }
11885
11886 addr = section->sh_addr;
11887 bytes = section->sh_size;
11888 data = start;
11889
11890 while (bytes)
11891 {
11892 int j;
11893 int k;
11894 int lbytes;
11895
11896 lbytes = (bytes > 16 ? 16 : bytes);
11897
11898 printf (" 0x%8.8lx ", (unsigned long) addr);
11899
11900 for (j = 0; j < 16; j++)
11901 {
11902 if (j < lbytes)
11903 printf ("%2.2x", data[j]);
11904 else
11905 printf (" ");
11906
11907 if ((j & 3) == 3)
11908 printf (" ");
11909 }
11910
11911 for (j = 0; j < lbytes; j++)
11912 {
11913 k = data[j];
11914 if (k >= ' ' && k < 0x7f)
11915 printf ("%c", k);
11916 else
11917 printf (".");
11918 }
11919
11920 putchar ('\n');
11921
11922 data += lbytes;
11923 addr += lbytes;
11924 bytes -= lbytes;
11925 }
11926
11927 free (start);
11928
11929 putchar ('\n');
11930 }
11931
11932 /* Uncompresses a section that was compressed using zlib, in place. */
11933
11934 static int
11935 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11936 dwarf_size_type *size ATTRIBUTE_UNUSED)
11937 {
11938 #ifndef HAVE_ZLIB_H
11939 return FALSE;
11940 #else
11941 dwarf_size_type compressed_size = *size;
11942 unsigned char * compressed_buffer = *buffer;
11943 dwarf_size_type uncompressed_size;
11944 unsigned char * uncompressed_buffer;
11945 z_stream strm;
11946 int rc;
11947 dwarf_size_type header_size = 12;
11948
11949 /* Read the zlib header. In this case, it should be "ZLIB" followed
11950 by the uncompressed section size, 8 bytes in big-endian order. */
11951 if (compressed_size < header_size
11952 || ! streq ((char *) compressed_buffer, "ZLIB"))
11953 return 0;
11954
11955 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11956 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11957 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11958 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11959 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11960 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11961 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11962 uncompressed_size += compressed_buffer[11];
11963
11964 /* It is possible the section consists of several compressed
11965 buffers concatenated together, so we uncompress in a loop. */
11966 strm.zalloc = NULL;
11967 strm.zfree = NULL;
11968 strm.opaque = NULL;
11969 strm.avail_in = compressed_size - header_size;
11970 strm.next_in = (Bytef *) compressed_buffer + header_size;
11971 strm.avail_out = uncompressed_size;
11972 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11973
11974 rc = inflateInit (& strm);
11975 while (strm.avail_in > 0)
11976 {
11977 if (rc != Z_OK)
11978 goto fail;
11979 strm.next_out = ((Bytef *) uncompressed_buffer
11980 + (uncompressed_size - strm.avail_out));
11981 rc = inflate (&strm, Z_FINISH);
11982 if (rc != Z_STREAM_END)
11983 goto fail;
11984 rc = inflateReset (& strm);
11985 }
11986 rc = inflateEnd (& strm);
11987 if (rc != Z_OK
11988 || strm.avail_out != 0)
11989 goto fail;
11990
11991 free (compressed_buffer);
11992 *buffer = uncompressed_buffer;
11993 *size = uncompressed_size;
11994 return 1;
11995
11996 fail:
11997 free (uncompressed_buffer);
11998 /* Indicate decompression failure. */
11999 *buffer = NULL;
12000 return 0;
12001 #endif /* HAVE_ZLIB_H */
12002 }
12003
12004 static int
12005 load_specific_debug_section (enum dwarf_section_display_enum debug,
12006 Elf_Internal_Shdr * sec, void * file)
12007 {
12008 struct dwarf_section * section = &debug_displays [debug].section;
12009 char buf [64];
12010
12011 /* If it is already loaded, do nothing. */
12012 if (section->start != NULL)
12013 return 1;
12014
12015 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12016 section->address = sec->sh_addr;
12017 section->user_data = NULL;
12018 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12019 sec->sh_offset, 1,
12020 sec->sh_size, buf);
12021 if (section->start == NULL)
12022 section->size = 0;
12023 else
12024 {
12025 section->size = sec->sh_size;
12026 if (uncompress_section_contents (&section->start, &section->size))
12027 sec->sh_size = section->size;
12028 }
12029
12030 if (section->start == NULL)
12031 return 0;
12032
12033 if (debug_displays [debug].relocate)
12034 apply_relocations ((FILE *) file, sec, section->start);
12035
12036 return 1;
12037 }
12038
12039 /* If this is not NULL, load_debug_section will only look for sections
12040 within the list of sections given here. */
12041 unsigned int *section_subset = NULL;
12042
12043 int
12044 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12045 {
12046 struct dwarf_section * section = &debug_displays [debug].section;
12047 Elf_Internal_Shdr * sec;
12048
12049 /* Locate the debug section. */
12050 sec = find_section_in_set (section->uncompressed_name, section_subset);
12051 if (sec != NULL)
12052 section->name = section->uncompressed_name;
12053 else
12054 {
12055 sec = find_section_in_set (section->compressed_name, section_subset);
12056 if (sec != NULL)
12057 section->name = section->compressed_name;
12058 }
12059 if (sec == NULL)
12060 return 0;
12061
12062 /* If we're loading from a subset of sections, and we've loaded
12063 a section matching this name before, it's likely that it's a
12064 different one. */
12065 if (section_subset != NULL)
12066 free_debug_section (debug);
12067
12068 return load_specific_debug_section (debug, sec, (FILE *) file);
12069 }
12070
12071 void
12072 free_debug_section (enum dwarf_section_display_enum debug)
12073 {
12074 struct dwarf_section * section = &debug_displays [debug].section;
12075
12076 if (section->start == NULL)
12077 return;
12078
12079 free ((char *) section->start);
12080 section->start = NULL;
12081 section->address = 0;
12082 section->size = 0;
12083 }
12084
12085 static int
12086 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12087 {
12088 char * name = SECTION_NAME (section);
12089 const char * print_name = printable_section_name (section);
12090 bfd_size_type length;
12091 int result = 1;
12092 int i;
12093
12094 length = section->sh_size;
12095 if (length == 0)
12096 {
12097 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12098 return 0;
12099 }
12100 if (section->sh_type == SHT_NOBITS)
12101 {
12102 /* There is no point in dumping the contents of a debugging section
12103 which has the NOBITS type - the bits in the file will be random.
12104 This can happen when a file containing a .eh_frame section is
12105 stripped with the --only-keep-debug command line option. */
12106 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12107 print_name);
12108 return 0;
12109 }
12110
12111 if (const_strneq (name, ".gnu.linkonce.wi."))
12112 name = ".debug_info";
12113
12114 /* See if we know how to display the contents of this section. */
12115 for (i = 0; i < max; i++)
12116 if (streq (debug_displays[i].section.uncompressed_name, name)
12117 || (i == line && const_strneq (name, ".debug_line."))
12118 || streq (debug_displays[i].section.compressed_name, name))
12119 {
12120 struct dwarf_section * sec = &debug_displays [i].section;
12121 int secondary = (section != find_section (name));
12122
12123 if (secondary)
12124 free_debug_section ((enum dwarf_section_display_enum) i);
12125
12126 if (i == line && const_strneq (name, ".debug_line."))
12127 sec->name = name;
12128 else if (streq (sec->uncompressed_name, name))
12129 sec->name = sec->uncompressed_name;
12130 else
12131 sec->name = sec->compressed_name;
12132 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12133 section, file))
12134 {
12135 /* If this debug section is part of a CU/TU set in a .dwp file,
12136 restrict load_debug_section to the sections in that set. */
12137 section_subset = find_cu_tu_set (file, shndx);
12138
12139 result &= debug_displays[i].display (sec, file);
12140
12141 section_subset = NULL;
12142
12143 if (secondary || (i != info && i != abbrev))
12144 free_debug_section ((enum dwarf_section_display_enum) i);
12145 }
12146
12147 break;
12148 }
12149
12150 if (i == max)
12151 {
12152 printf (_("Unrecognized debug section: %s\n"), print_name);
12153 result = 0;
12154 }
12155
12156 return result;
12157 }
12158
12159 /* Set DUMP_SECTS for all sections where dumps were requested
12160 based on section name. */
12161
12162 static void
12163 initialise_dumps_byname (void)
12164 {
12165 struct dump_list_entry * cur;
12166
12167 for (cur = dump_sects_byname; cur; cur = cur->next)
12168 {
12169 unsigned int i;
12170 int any;
12171
12172 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12173 if (streq (SECTION_NAME (section_headers + i), cur->name))
12174 {
12175 request_dump_bynumber (i, cur->type);
12176 any = 1;
12177 }
12178
12179 if (!any)
12180 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12181 cur->name);
12182 }
12183 }
12184
12185 static void
12186 process_section_contents (FILE * file)
12187 {
12188 Elf_Internal_Shdr * section;
12189 unsigned int i;
12190
12191 if (! do_dump)
12192 return;
12193
12194 initialise_dumps_byname ();
12195
12196 for (i = 0, section = section_headers;
12197 i < elf_header.e_shnum && i < num_dump_sects;
12198 i++, section++)
12199 {
12200 #ifdef SUPPORT_DISASSEMBLY
12201 if (dump_sects[i] & DISASS_DUMP)
12202 disassemble_section (section, file);
12203 #endif
12204 if (dump_sects[i] & HEX_DUMP)
12205 dump_section_as_bytes (section, file, FALSE);
12206
12207 if (dump_sects[i] & RELOC_DUMP)
12208 dump_section_as_bytes (section, file, TRUE);
12209
12210 if (dump_sects[i] & STRING_DUMP)
12211 dump_section_as_strings (section, file);
12212
12213 if (dump_sects[i] & DEBUG_DUMP)
12214 display_debug_section (i, section, file);
12215 }
12216
12217 /* Check to see if the user requested a
12218 dump of a section that does not exist. */
12219 while (i++ < num_dump_sects)
12220 if (dump_sects[i])
12221 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12222 }
12223
12224 static void
12225 process_mips_fpe_exception (int mask)
12226 {
12227 if (mask)
12228 {
12229 int first = 1;
12230 if (mask & OEX_FPU_INEX)
12231 fputs ("INEX", stdout), first = 0;
12232 if (mask & OEX_FPU_UFLO)
12233 printf ("%sUFLO", first ? "" : "|"), first = 0;
12234 if (mask & OEX_FPU_OFLO)
12235 printf ("%sOFLO", first ? "" : "|"), first = 0;
12236 if (mask & OEX_FPU_DIV0)
12237 printf ("%sDIV0", first ? "" : "|"), first = 0;
12238 if (mask & OEX_FPU_INVAL)
12239 printf ("%sINVAL", first ? "" : "|");
12240 }
12241 else
12242 fputs ("0", stdout);
12243 }
12244
12245 /* Display's the value of TAG at location P. If TAG is
12246 greater than 0 it is assumed to be an unknown tag, and
12247 a message is printed to this effect. Otherwise it is
12248 assumed that a message has already been printed.
12249
12250 If the bottom bit of TAG is set it assumed to have a
12251 string value, otherwise it is assumed to have an integer
12252 value.
12253
12254 Returns an updated P pointing to the first unread byte
12255 beyond the end of TAG's value.
12256
12257 Reads at or beyond END will not be made. */
12258
12259 static unsigned char *
12260 display_tag_value (int tag,
12261 unsigned char * p,
12262 const unsigned char * const end)
12263 {
12264 unsigned long val;
12265
12266 if (tag > 0)
12267 printf (" Tag_unknown_%d: ", tag);
12268
12269 if (p >= end)
12270 {
12271 warn (_("<corrupt tag>\n"));
12272 }
12273 else if (tag & 1)
12274 {
12275 /* PR 17531 file: 027-19978-0.004. */
12276 size_t maxlen = (end - p) - 1;
12277
12278 putchar ('"');
12279 if (maxlen > 0)
12280 {
12281 print_symbol ((int) maxlen, (const char *) p);
12282 p += strnlen ((char *) p, maxlen) + 1;
12283 }
12284 else
12285 {
12286 printf (_("<corrupt string tag>"));
12287 p = (unsigned char *) end;
12288 }
12289 printf ("\"\n");
12290 }
12291 else
12292 {
12293 unsigned int len;
12294
12295 val = read_uleb128 (p, &len, end);
12296 p += len;
12297 printf ("%ld (0x%lx)\n", val, val);
12298 }
12299
12300 assert (p <= end);
12301 return p;
12302 }
12303
12304 /* ARM EABI attributes section. */
12305 typedef struct
12306 {
12307 unsigned int tag;
12308 const char * name;
12309 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
12310 unsigned int type;
12311 const char ** table;
12312 } arm_attr_public_tag;
12313
12314 static const char * arm_attr_tag_CPU_arch[] =
12315 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12316 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12317 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12318 static const char * arm_attr_tag_THUMB_ISA_use[] =
12319 {"No", "Thumb-1", "Thumb-2"};
12320 static const char * arm_attr_tag_FP_arch[] =
12321 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12322 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12323 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12324 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12325 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12326 static const char * arm_attr_tag_PCS_config[] =
12327 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12328 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12329 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12330 {"V6", "SB", "TLS", "Unused"};
12331 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12332 {"Absolute", "PC-relative", "SB-relative", "None"};
12333 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12334 {"Absolute", "PC-relative", "None"};
12335 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12336 {"None", "direct", "GOT-indirect"};
12337 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12338 {"None", "??? 1", "2", "??? 3", "4"};
12339 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12340 static const char * arm_attr_tag_ABI_FP_denormal[] =
12341 {"Unused", "Needed", "Sign only"};
12342 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12343 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12344 static const char * arm_attr_tag_ABI_FP_number_model[] =
12345 {"Unused", "Finite", "RTABI", "IEEE 754"};
12346 static const char * arm_attr_tag_ABI_enum_size[] =
12347 {"Unused", "small", "int", "forced to int"};
12348 static const char * arm_attr_tag_ABI_HardFP_use[] =
12349 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
12350 static const char * arm_attr_tag_ABI_VFP_args[] =
12351 {"AAPCS", "VFP registers", "custom", "compatible"};
12352 static const char * arm_attr_tag_ABI_WMMX_args[] =
12353 {"AAPCS", "WMMX registers", "custom"};
12354 static const char * arm_attr_tag_ABI_optimization_goals[] =
12355 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12356 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12357 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12358 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12359 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12360 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12361 static const char * arm_attr_tag_FP_HP_extension[] =
12362 {"Not Allowed", "Allowed"};
12363 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12364 {"None", "IEEE 754", "Alternative Format"};
12365 static const char * arm_attr_tag_MPextension_use[] =
12366 {"Not Allowed", "Allowed"};
12367 static const char * arm_attr_tag_DIV_use[] =
12368 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12369 "Allowed in v7-A with integer division extension"};
12370 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12371 static const char * arm_attr_tag_Virtualization_use[] =
12372 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12373 "TrustZone and Virtualization Extensions"};
12374 static const char * arm_attr_tag_MPextension_use_legacy[] =
12375 {"Not Allowed", "Allowed"};
12376
12377 #define LOOKUP(id, name) \
12378 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12379 static arm_attr_public_tag arm_attr_public_tags[] =
12380 {
12381 {4, "CPU_raw_name", 1, NULL},
12382 {5, "CPU_name", 1, NULL},
12383 LOOKUP(6, CPU_arch),
12384 {7, "CPU_arch_profile", 0, NULL},
12385 LOOKUP(8, ARM_ISA_use),
12386 LOOKUP(9, THUMB_ISA_use),
12387 LOOKUP(10, FP_arch),
12388 LOOKUP(11, WMMX_arch),
12389 LOOKUP(12, Advanced_SIMD_arch),
12390 LOOKUP(13, PCS_config),
12391 LOOKUP(14, ABI_PCS_R9_use),
12392 LOOKUP(15, ABI_PCS_RW_data),
12393 LOOKUP(16, ABI_PCS_RO_data),
12394 LOOKUP(17, ABI_PCS_GOT_use),
12395 LOOKUP(18, ABI_PCS_wchar_t),
12396 LOOKUP(19, ABI_FP_rounding),
12397 LOOKUP(20, ABI_FP_denormal),
12398 LOOKUP(21, ABI_FP_exceptions),
12399 LOOKUP(22, ABI_FP_user_exceptions),
12400 LOOKUP(23, ABI_FP_number_model),
12401 {24, "ABI_align_needed", 0, NULL},
12402 {25, "ABI_align_preserved", 0, NULL},
12403 LOOKUP(26, ABI_enum_size),
12404 LOOKUP(27, ABI_HardFP_use),
12405 LOOKUP(28, ABI_VFP_args),
12406 LOOKUP(29, ABI_WMMX_args),
12407 LOOKUP(30, ABI_optimization_goals),
12408 LOOKUP(31, ABI_FP_optimization_goals),
12409 {32, "compatibility", 0, NULL},
12410 LOOKUP(34, CPU_unaligned_access),
12411 LOOKUP(36, FP_HP_extension),
12412 LOOKUP(38, ABI_FP_16bit_format),
12413 LOOKUP(42, MPextension_use),
12414 LOOKUP(44, DIV_use),
12415 {64, "nodefaults", 0, NULL},
12416 {65, "also_compatible_with", 0, NULL},
12417 LOOKUP(66, T2EE_use),
12418 {67, "conformance", 1, NULL},
12419 LOOKUP(68, Virtualization_use),
12420 LOOKUP(70, MPextension_use_legacy)
12421 };
12422 #undef LOOKUP
12423
12424 static unsigned char *
12425 display_arm_attribute (unsigned char * p,
12426 const unsigned char * const end)
12427 {
12428 unsigned int tag;
12429 unsigned int len;
12430 unsigned int val;
12431 arm_attr_public_tag * attr;
12432 unsigned i;
12433 unsigned int type;
12434
12435 tag = read_uleb128 (p, &len, end);
12436 p += len;
12437 attr = NULL;
12438 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12439 {
12440 if (arm_attr_public_tags[i].tag == tag)
12441 {
12442 attr = &arm_attr_public_tags[i];
12443 break;
12444 }
12445 }
12446
12447 if (attr)
12448 {
12449 printf (" Tag_%s: ", attr->name);
12450 switch (attr->type)
12451 {
12452 case 0:
12453 switch (tag)
12454 {
12455 case 7: /* Tag_CPU_arch_profile. */
12456 val = read_uleb128 (p, &len, end);
12457 p += len;
12458 switch (val)
12459 {
12460 case 0: printf (_("None\n")); break;
12461 case 'A': printf (_("Application\n")); break;
12462 case 'R': printf (_("Realtime\n")); break;
12463 case 'M': printf (_("Microcontroller\n")); break;
12464 case 'S': printf (_("Application or Realtime\n")); break;
12465 default: printf ("??? (%d)\n", val); break;
12466 }
12467 break;
12468
12469 case 24: /* Tag_align_needed. */
12470 val = read_uleb128 (p, &len, end);
12471 p += len;
12472 switch (val)
12473 {
12474 case 0: printf (_("None\n")); break;
12475 case 1: printf (_("8-byte\n")); break;
12476 case 2: printf (_("4-byte\n")); break;
12477 case 3: printf ("??? 3\n"); break;
12478 default:
12479 if (val <= 12)
12480 printf (_("8-byte and up to %d-byte extended\n"),
12481 1 << val);
12482 else
12483 printf ("??? (%d)\n", val);
12484 break;
12485 }
12486 break;
12487
12488 case 25: /* Tag_align_preserved. */
12489 val = read_uleb128 (p, &len, end);
12490 p += len;
12491 switch (val)
12492 {
12493 case 0: printf (_("None\n")); break;
12494 case 1: printf (_("8-byte, except leaf SP\n")); break;
12495 case 2: printf (_("8-byte\n")); break;
12496 case 3: printf ("??? 3\n"); break;
12497 default:
12498 if (val <= 12)
12499 printf (_("8-byte and up to %d-byte extended\n"),
12500 1 << val);
12501 else
12502 printf ("??? (%d)\n", val);
12503 break;
12504 }
12505 break;
12506
12507 case 32: /* Tag_compatibility. */
12508 {
12509 val = read_uleb128 (p, &len, end);
12510 p += len;
12511 printf (_("flag = %d, vendor = "), val);
12512 if (p < end - 1)
12513 {
12514 size_t maxlen = (end - p) - 1;
12515
12516 print_symbol ((int) maxlen, (const char *) p);
12517 p += strnlen ((char *) p, maxlen) + 1;
12518 }
12519 else
12520 {
12521 printf (_("<corrupt>"));
12522 p = (unsigned char *) end;
12523 }
12524 putchar ('\n');
12525 }
12526 break;
12527
12528 case 64: /* Tag_nodefaults. */
12529 /* PR 17531: file: 001-505008-0.01. */
12530 if (p < end)
12531 p++;
12532 printf (_("True\n"));
12533 break;
12534
12535 case 65: /* Tag_also_compatible_with. */
12536 val = read_uleb128 (p, &len, end);
12537 p += len;
12538 if (val == 6 /* Tag_CPU_arch. */)
12539 {
12540 val = read_uleb128 (p, &len, end);
12541 p += len;
12542 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12543 printf ("??? (%d)\n", val);
12544 else
12545 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12546 }
12547 else
12548 printf ("???\n");
12549 while (p < end && *(p++) != '\0' /* NUL terminator. */)
12550 ;
12551 break;
12552
12553 default:
12554 printf (_("<unknown: %d>\n"), tag);
12555 break;
12556 }
12557 return p;
12558
12559 case 1:
12560 return display_tag_value (-1, p, end);
12561 case 2:
12562 return display_tag_value (0, p, end);
12563
12564 default:
12565 assert (attr->type & 0x80);
12566 val = read_uleb128 (p, &len, end);
12567 p += len;
12568 type = attr->type & 0x7f;
12569 if (val >= type)
12570 printf ("??? (%d)\n", val);
12571 else
12572 printf ("%s\n", attr->table[val]);
12573 return p;
12574 }
12575 }
12576
12577 return display_tag_value (tag, p, end);
12578 }
12579
12580 static unsigned char *
12581 display_gnu_attribute (unsigned char * p,
12582 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12583 const unsigned char * const end)
12584 {
12585 int tag;
12586 unsigned int len;
12587 int val;
12588
12589 tag = read_uleb128 (p, &len, end);
12590 p += len;
12591
12592 /* Tag_compatibility is the only generic GNU attribute defined at
12593 present. */
12594 if (tag == 32)
12595 {
12596 val = read_uleb128 (p, &len, end);
12597 p += len;
12598
12599 printf (_("flag = %d, vendor = "), val);
12600 if (p == end)
12601 {
12602 printf (_("<corrupt>\n"));
12603 warn (_("corrupt vendor attribute\n"));
12604 }
12605 else
12606 {
12607 if (p < end - 1)
12608 {
12609 size_t maxlen = (end - p) - 1;
12610
12611 print_symbol ((int) maxlen, (const char *) p);
12612 p += strnlen ((char *) p, maxlen) + 1;
12613 }
12614 else
12615 {
12616 printf (_("<corrupt>"));
12617 p = (unsigned char *) end;
12618 }
12619 putchar ('\n');
12620 }
12621 return p;
12622 }
12623
12624 if ((tag & 2) == 0 && display_proc_gnu_attribute)
12625 return display_proc_gnu_attribute (p, tag, end);
12626
12627 return display_tag_value (tag, p, end);
12628 }
12629
12630 static unsigned char *
12631 display_power_gnu_attribute (unsigned char * p,
12632 int tag,
12633 const unsigned char * const end)
12634 {
12635 unsigned int len;
12636 int val;
12637
12638 if (tag == Tag_GNU_Power_ABI_FP)
12639 {
12640 val = read_uleb128 (p, &len, end);
12641 p += len;
12642 printf (" Tag_GNU_Power_ABI_FP: ");
12643
12644 switch (val)
12645 {
12646 case 0:
12647 printf (_("Hard or soft float\n"));
12648 break;
12649 case 1:
12650 printf (_("Hard float\n"));
12651 break;
12652 case 2:
12653 printf (_("Soft float\n"));
12654 break;
12655 case 3:
12656 printf (_("Single-precision hard float\n"));
12657 break;
12658 default:
12659 printf ("??? (%d)\n", val);
12660 break;
12661 }
12662 return p;
12663 }
12664
12665 if (tag == Tag_GNU_Power_ABI_Vector)
12666 {
12667 val = read_uleb128 (p, &len, end);
12668 p += len;
12669 printf (" Tag_GNU_Power_ABI_Vector: ");
12670 switch (val)
12671 {
12672 case 0:
12673 printf (_("Any\n"));
12674 break;
12675 case 1:
12676 printf (_("Generic\n"));
12677 break;
12678 case 2:
12679 printf ("AltiVec\n");
12680 break;
12681 case 3:
12682 printf ("SPE\n");
12683 break;
12684 default:
12685 printf ("??? (%d)\n", val);
12686 break;
12687 }
12688 return p;
12689 }
12690
12691 if (tag == Tag_GNU_Power_ABI_Struct_Return)
12692 {
12693 if (p == end)
12694 {
12695 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12696 return p;
12697 }
12698
12699 val = read_uleb128 (p, &len, end);
12700 p += len;
12701 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
12702 switch (val)
12703 {
12704 case 0:
12705 printf (_("Any\n"));
12706 break;
12707 case 1:
12708 printf ("r3/r4\n");
12709 break;
12710 case 2:
12711 printf (_("Memory\n"));
12712 break;
12713 default:
12714 printf ("??? (%d)\n", val);
12715 break;
12716 }
12717 return p;
12718 }
12719
12720 return display_tag_value (tag & 1, p, end);
12721 }
12722
12723 static void
12724 display_sparc_hwcaps (int mask)
12725 {
12726 if (mask)
12727 {
12728 int first = 1;
12729
12730 if (mask & ELF_SPARC_HWCAP_MUL32)
12731 fputs ("mul32", stdout), first = 0;
12732 if (mask & ELF_SPARC_HWCAP_DIV32)
12733 printf ("%sdiv32", first ? "" : "|"), first = 0;
12734 if (mask & ELF_SPARC_HWCAP_FSMULD)
12735 printf ("%sfsmuld", first ? "" : "|"), first = 0;
12736 if (mask & ELF_SPARC_HWCAP_V8PLUS)
12737 printf ("%sv8plus", first ? "" : "|"), first = 0;
12738 if (mask & ELF_SPARC_HWCAP_POPC)
12739 printf ("%spopc", first ? "" : "|"), first = 0;
12740 if (mask & ELF_SPARC_HWCAP_VIS)
12741 printf ("%svis", first ? "" : "|"), first = 0;
12742 if (mask & ELF_SPARC_HWCAP_VIS2)
12743 printf ("%svis2", first ? "" : "|"), first = 0;
12744 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12745 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12746 if (mask & ELF_SPARC_HWCAP_FMAF)
12747 printf ("%sfmaf", first ? "" : "|"), first = 0;
12748 if (mask & ELF_SPARC_HWCAP_VIS3)
12749 printf ("%svis3", first ? "" : "|"), first = 0;
12750 if (mask & ELF_SPARC_HWCAP_HPC)
12751 printf ("%shpc", first ? "" : "|"), first = 0;
12752 if (mask & ELF_SPARC_HWCAP_RANDOM)
12753 printf ("%srandom", first ? "" : "|"), first = 0;
12754 if (mask & ELF_SPARC_HWCAP_TRANS)
12755 printf ("%strans", first ? "" : "|"), first = 0;
12756 if (mask & ELF_SPARC_HWCAP_FJFMAU)
12757 printf ("%sfjfmau", first ? "" : "|"), first = 0;
12758 if (mask & ELF_SPARC_HWCAP_IMA)
12759 printf ("%sima", first ? "" : "|"), first = 0;
12760 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12761 printf ("%scspare", first ? "" : "|"), first = 0;
12762 }
12763 else
12764 fputc ('0', stdout);
12765 fputc ('\n', stdout);
12766 }
12767
12768 static void
12769 display_sparc_hwcaps2 (int mask)
12770 {
12771 if (mask)
12772 {
12773 int first = 1;
12774
12775 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12776 fputs ("fjathplus", stdout), first = 0;
12777 if (mask & ELF_SPARC_HWCAP2_VIS3B)
12778 printf ("%svis3b", first ? "" : "|"), first = 0;
12779 if (mask & ELF_SPARC_HWCAP2_ADP)
12780 printf ("%sadp", first ? "" : "|"), first = 0;
12781 if (mask & ELF_SPARC_HWCAP2_SPARC5)
12782 printf ("%ssparc5", first ? "" : "|"), first = 0;
12783 if (mask & ELF_SPARC_HWCAP2_MWAIT)
12784 printf ("%smwait", first ? "" : "|"), first = 0;
12785 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12786 printf ("%sxmpmul", first ? "" : "|"), first = 0;
12787 if (mask & ELF_SPARC_HWCAP2_XMONT)
12788 printf ("%sxmont2", first ? "" : "|"), first = 0;
12789 if (mask & ELF_SPARC_HWCAP2_NSEC)
12790 printf ("%snsec", first ? "" : "|"), first = 0;
12791 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12792 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12793 if (mask & ELF_SPARC_HWCAP2_FJDES)
12794 printf ("%sfjdes", first ? "" : "|"), first = 0;
12795 if (mask & ELF_SPARC_HWCAP2_FJAES)
12796 printf ("%sfjaes", first ? "" : "|"), first = 0;
12797 }
12798 else
12799 fputc ('0', stdout);
12800 fputc ('\n', stdout);
12801 }
12802
12803 static unsigned char *
12804 display_sparc_gnu_attribute (unsigned char * p,
12805 int tag,
12806 const unsigned char * const end)
12807 {
12808 unsigned int len;
12809 int val;
12810
12811 if (tag == Tag_GNU_Sparc_HWCAPS)
12812 {
12813 val = read_uleb128 (p, &len, end);
12814 p += len;
12815 printf (" Tag_GNU_Sparc_HWCAPS: ");
12816 display_sparc_hwcaps (val);
12817 return p;
12818 }
12819 if (tag == Tag_GNU_Sparc_HWCAPS2)
12820 {
12821 val = read_uleb128 (p, &len, end);
12822 p += len;
12823 printf (" Tag_GNU_Sparc_HWCAPS2: ");
12824 display_sparc_hwcaps2 (val);
12825 return p;
12826 }
12827
12828 return display_tag_value (tag, p, end);
12829 }
12830
12831 static void
12832 print_mips_fp_abi_value (int val)
12833 {
12834 switch (val)
12835 {
12836 case Val_GNU_MIPS_ABI_FP_ANY:
12837 printf (_("Hard or soft float\n"));
12838 break;
12839 case Val_GNU_MIPS_ABI_FP_DOUBLE:
12840 printf (_("Hard float (double precision)\n"));
12841 break;
12842 case Val_GNU_MIPS_ABI_FP_SINGLE:
12843 printf (_("Hard float (single precision)\n"));
12844 break;
12845 case Val_GNU_MIPS_ABI_FP_SOFT:
12846 printf (_("Soft float\n"));
12847 break;
12848 case Val_GNU_MIPS_ABI_FP_OLD_64:
12849 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12850 break;
12851 case Val_GNU_MIPS_ABI_FP_XX:
12852 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12853 break;
12854 case Val_GNU_MIPS_ABI_FP_64:
12855 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12856 break;
12857 case Val_GNU_MIPS_ABI_FP_64A:
12858 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12859 break;
12860 default:
12861 printf ("??? (%d)\n", val);
12862 break;
12863 }
12864 }
12865
12866 static unsigned char *
12867 display_mips_gnu_attribute (unsigned char * p,
12868 int tag,
12869 const unsigned char * const end)
12870 {
12871 if (tag == Tag_GNU_MIPS_ABI_FP)
12872 {
12873 unsigned int len;
12874 int val;
12875
12876 val = read_uleb128 (p, &len, end);
12877 p += len;
12878 printf (" Tag_GNU_MIPS_ABI_FP: ");
12879
12880 print_mips_fp_abi_value (val);
12881
12882 return p;
12883 }
12884
12885 if (tag == Tag_GNU_MIPS_ABI_MSA)
12886 {
12887 unsigned int len;
12888 int val;
12889
12890 val = read_uleb128 (p, &len, end);
12891 p += len;
12892 printf (" Tag_GNU_MIPS_ABI_MSA: ");
12893
12894 switch (val)
12895 {
12896 case Val_GNU_MIPS_ABI_MSA_ANY:
12897 printf (_("Any MSA or not\n"));
12898 break;
12899 case Val_GNU_MIPS_ABI_MSA_128:
12900 printf (_("128-bit MSA\n"));
12901 break;
12902 default:
12903 printf ("??? (%d)\n", val);
12904 break;
12905 }
12906 return p;
12907 }
12908
12909 return display_tag_value (tag & 1, p, end);
12910 }
12911
12912 static unsigned char *
12913 display_tic6x_attribute (unsigned char * p,
12914 const unsigned char * const end)
12915 {
12916 int tag;
12917 unsigned int len;
12918 int val;
12919
12920 tag = read_uleb128 (p, &len, end);
12921 p += len;
12922
12923 switch (tag)
12924 {
12925 case Tag_ISA:
12926 val = read_uleb128 (p, &len, end);
12927 p += len;
12928 printf (" Tag_ISA: ");
12929
12930 switch (val)
12931 {
12932 case C6XABI_Tag_ISA_none:
12933 printf (_("None\n"));
12934 break;
12935 case C6XABI_Tag_ISA_C62X:
12936 printf ("C62x\n");
12937 break;
12938 case C6XABI_Tag_ISA_C67X:
12939 printf ("C67x\n");
12940 break;
12941 case C6XABI_Tag_ISA_C67XP:
12942 printf ("C67x+\n");
12943 break;
12944 case C6XABI_Tag_ISA_C64X:
12945 printf ("C64x\n");
12946 break;
12947 case C6XABI_Tag_ISA_C64XP:
12948 printf ("C64x+\n");
12949 break;
12950 case C6XABI_Tag_ISA_C674X:
12951 printf ("C674x\n");
12952 break;
12953 default:
12954 printf ("??? (%d)\n", val);
12955 break;
12956 }
12957 return p;
12958
12959 case Tag_ABI_wchar_t:
12960 val = read_uleb128 (p, &len, end);
12961 p += len;
12962 printf (" Tag_ABI_wchar_t: ");
12963 switch (val)
12964 {
12965 case 0:
12966 printf (_("Not used\n"));
12967 break;
12968 case 1:
12969 printf (_("2 bytes\n"));
12970 break;
12971 case 2:
12972 printf (_("4 bytes\n"));
12973 break;
12974 default:
12975 printf ("??? (%d)\n", val);
12976 break;
12977 }
12978 return p;
12979
12980 case Tag_ABI_stack_align_needed:
12981 val = read_uleb128 (p, &len, end);
12982 p += len;
12983 printf (" Tag_ABI_stack_align_needed: ");
12984 switch (val)
12985 {
12986 case 0:
12987 printf (_("8-byte\n"));
12988 break;
12989 case 1:
12990 printf (_("16-byte\n"));
12991 break;
12992 default:
12993 printf ("??? (%d)\n", val);
12994 break;
12995 }
12996 return p;
12997
12998 case Tag_ABI_stack_align_preserved:
12999 val = read_uleb128 (p, &len, end);
13000 p += len;
13001 printf (" Tag_ABI_stack_align_preserved: ");
13002 switch (val)
13003 {
13004 case 0:
13005 printf (_("8-byte\n"));
13006 break;
13007 case 1:
13008 printf (_("16-byte\n"));
13009 break;
13010 default:
13011 printf ("??? (%d)\n", val);
13012 break;
13013 }
13014 return p;
13015
13016 case Tag_ABI_DSBT:
13017 val = read_uleb128 (p, &len, end);
13018 p += len;
13019 printf (" Tag_ABI_DSBT: ");
13020 switch (val)
13021 {
13022 case 0:
13023 printf (_("DSBT addressing not used\n"));
13024 break;
13025 case 1:
13026 printf (_("DSBT addressing used\n"));
13027 break;
13028 default:
13029 printf ("??? (%d)\n", val);
13030 break;
13031 }
13032 return p;
13033
13034 case Tag_ABI_PID:
13035 val = read_uleb128 (p, &len, end);
13036 p += len;
13037 printf (" Tag_ABI_PID: ");
13038 switch (val)
13039 {
13040 case 0:
13041 printf (_("Data addressing position-dependent\n"));
13042 break;
13043 case 1:
13044 printf (_("Data addressing position-independent, GOT near DP\n"));
13045 break;
13046 case 2:
13047 printf (_("Data addressing position-independent, GOT far from DP\n"));
13048 break;
13049 default:
13050 printf ("??? (%d)\n", val);
13051 break;
13052 }
13053 return p;
13054
13055 case Tag_ABI_PIC:
13056 val = read_uleb128 (p, &len, end);
13057 p += len;
13058 printf (" Tag_ABI_PIC: ");
13059 switch (val)
13060 {
13061 case 0:
13062 printf (_("Code addressing position-dependent\n"));
13063 break;
13064 case 1:
13065 printf (_("Code addressing position-independent\n"));
13066 break;
13067 default:
13068 printf ("??? (%d)\n", val);
13069 break;
13070 }
13071 return p;
13072
13073 case Tag_ABI_array_object_alignment:
13074 val = read_uleb128 (p, &len, end);
13075 p += len;
13076 printf (" Tag_ABI_array_object_alignment: ");
13077 switch (val)
13078 {
13079 case 0:
13080 printf (_("8-byte\n"));
13081 break;
13082 case 1:
13083 printf (_("4-byte\n"));
13084 break;
13085 case 2:
13086 printf (_("16-byte\n"));
13087 break;
13088 default:
13089 printf ("??? (%d)\n", val);
13090 break;
13091 }
13092 return p;
13093
13094 case Tag_ABI_array_object_align_expected:
13095 val = read_uleb128 (p, &len, end);
13096 p += len;
13097 printf (" Tag_ABI_array_object_align_expected: ");
13098 switch (val)
13099 {
13100 case 0:
13101 printf (_("8-byte\n"));
13102 break;
13103 case 1:
13104 printf (_("4-byte\n"));
13105 break;
13106 case 2:
13107 printf (_("16-byte\n"));
13108 break;
13109 default:
13110 printf ("??? (%d)\n", val);
13111 break;
13112 }
13113 return p;
13114
13115 case Tag_ABI_compatibility:
13116 {
13117 val = read_uleb128 (p, &len, end);
13118 p += len;
13119 printf (" Tag_ABI_compatibility: ");
13120 printf (_("flag = %d, vendor = "), val);
13121 if (p < end - 1)
13122 {
13123 size_t maxlen = (end - p) - 1;
13124
13125 print_symbol ((int) maxlen, (const char *) p);
13126 p += strnlen ((char *) p, maxlen) + 1;
13127 }
13128 else
13129 {
13130 printf (_("<corrupt>"));
13131 p = (unsigned char *) end;
13132 }
13133 putchar ('\n');
13134 return p;
13135 }
13136
13137 case Tag_ABI_conformance:
13138 {
13139 printf (" Tag_ABI_conformance: \"");
13140 if (p < end - 1)
13141 {
13142 size_t maxlen = (end - p) - 1;
13143
13144 print_symbol ((int) maxlen, (const char *) p);
13145 p += strnlen ((char *) p, maxlen) + 1;
13146 }
13147 else
13148 {
13149 printf (_("<corrupt>"));
13150 p = (unsigned char *) end;
13151 }
13152 printf ("\"\n");
13153 return p;
13154 }
13155 }
13156
13157 return display_tag_value (tag, p, end);
13158 }
13159
13160 static void
13161 display_raw_attribute (unsigned char * p, unsigned char * end)
13162 {
13163 unsigned long addr = 0;
13164 size_t bytes = end - p;
13165
13166 assert (end > p);
13167 while (bytes)
13168 {
13169 int j;
13170 int k;
13171 int lbytes = (bytes > 16 ? 16 : bytes);
13172
13173 printf (" 0x%8.8lx ", addr);
13174
13175 for (j = 0; j < 16; j++)
13176 {
13177 if (j < lbytes)
13178 printf ("%2.2x", p[j]);
13179 else
13180 printf (" ");
13181
13182 if ((j & 3) == 3)
13183 printf (" ");
13184 }
13185
13186 for (j = 0; j < lbytes; j++)
13187 {
13188 k = p[j];
13189 if (k >= ' ' && k < 0x7f)
13190 printf ("%c", k);
13191 else
13192 printf (".");
13193 }
13194
13195 putchar ('\n');
13196
13197 p += lbytes;
13198 bytes -= lbytes;
13199 addr += lbytes;
13200 }
13201
13202 putchar ('\n');
13203 }
13204
13205 static unsigned char *
13206 display_msp430x_attribute (unsigned char * p,
13207 const unsigned char * const end)
13208 {
13209 unsigned int len;
13210 int val;
13211 int tag;
13212
13213 tag = read_uleb128 (p, & len, end);
13214 p += len;
13215
13216 switch (tag)
13217 {
13218 case OFBA_MSPABI_Tag_ISA:
13219 val = read_uleb128 (p, &len, end);
13220 p += len;
13221 printf (" Tag_ISA: ");
13222 switch (val)
13223 {
13224 case 0: printf (_("None\n")); break;
13225 case 1: printf (_("MSP430\n")); break;
13226 case 2: printf (_("MSP430X\n")); break;
13227 default: printf ("??? (%d)\n", val); break;
13228 }
13229 break;
13230
13231 case OFBA_MSPABI_Tag_Code_Model:
13232 val = read_uleb128 (p, &len, end);
13233 p += len;
13234 printf (" Tag_Code_Model: ");
13235 switch (val)
13236 {
13237 case 0: printf (_("None\n")); break;
13238 case 1: printf (_("Small\n")); break;
13239 case 2: printf (_("Large\n")); break;
13240 default: printf ("??? (%d)\n", val); break;
13241 }
13242 break;
13243
13244 case OFBA_MSPABI_Tag_Data_Model:
13245 val = read_uleb128 (p, &len, end);
13246 p += len;
13247 printf (" Tag_Data_Model: ");
13248 switch (val)
13249 {
13250 case 0: printf (_("None\n")); break;
13251 case 1: printf (_("Small\n")); break;
13252 case 2: printf (_("Large\n")); break;
13253 case 3: printf (_("Restricted Large\n")); break;
13254 default: printf ("??? (%d)\n", val); break;
13255 }
13256 break;
13257
13258 default:
13259 printf (_(" <unknown tag %d>: "), tag);
13260
13261 if (tag & 1)
13262 {
13263 putchar ('"');
13264 if (p < end - 1)
13265 {
13266 size_t maxlen = (end - p) - 1;
13267
13268 print_symbol ((int) maxlen, (const char *) p);
13269 p += strnlen ((char *) p, maxlen) + 1;
13270 }
13271 else
13272 {
13273 printf (_("<corrupt>"));
13274 p = (unsigned char *) end;
13275 }
13276 printf ("\"\n");
13277 }
13278 else
13279 {
13280 val = read_uleb128 (p, &len, end);
13281 p += len;
13282 printf ("%d (0x%x)\n", val, val);
13283 }
13284 break;
13285 }
13286
13287 assert (p <= end);
13288 return p;
13289 }
13290
13291 static int
13292 process_attributes (FILE * file,
13293 const char * public_name,
13294 unsigned int proc_type,
13295 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13296 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13297 {
13298 Elf_Internal_Shdr * sect;
13299 unsigned i;
13300
13301 /* Find the section header so that we get the size. */
13302 for (i = 0, sect = section_headers;
13303 i < elf_header.e_shnum;
13304 i++, sect++)
13305 {
13306 unsigned char * contents;
13307 unsigned char * p;
13308
13309 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13310 continue;
13311
13312 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13313 sect->sh_size, _("attributes"));
13314 if (contents == NULL)
13315 continue;
13316
13317 p = contents;
13318 if (*p == 'A')
13319 {
13320 bfd_vma section_len;
13321
13322 section_len = sect->sh_size - 1;
13323 p++;
13324
13325 while (section_len > 0)
13326 {
13327 bfd_vma attr_len;
13328 unsigned int namelen;
13329 bfd_boolean public_section;
13330 bfd_boolean gnu_section;
13331
13332 if (section_len <= 4)
13333 {
13334 error (_("Tag section ends prematurely\n"));
13335 break;
13336 }
13337 attr_len = byte_get (p, 4);
13338 p += 4;
13339
13340 if (attr_len > section_len)
13341 {
13342 error (_("Bad attribute length (%u > %u)\n"),
13343 (unsigned) attr_len, (unsigned) section_len);
13344 attr_len = section_len;
13345 }
13346 /* PR 17531: file: 001-101425-0.004 */
13347 else if (attr_len < 5)
13348 {
13349 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13350 break;
13351 }
13352
13353 section_len -= attr_len;
13354 attr_len -= 4;
13355
13356 namelen = strnlen ((char *) p, attr_len) + 1;
13357 if (namelen == 0 || namelen >= attr_len)
13358 {
13359 error (_("Corrupt attribute section name\n"));
13360 break;
13361 }
13362
13363 printf (_("Attribute Section: "));
13364 print_symbol (INT_MAX, (const char *) p);
13365 putchar ('\n');
13366
13367 if (public_name && streq ((char *) p, public_name))
13368 public_section = TRUE;
13369 else
13370 public_section = FALSE;
13371
13372 if (streq ((char *) p, "gnu"))
13373 gnu_section = TRUE;
13374 else
13375 gnu_section = FALSE;
13376
13377 p += namelen;
13378 attr_len -= namelen;
13379
13380 while (attr_len > 0 && p < contents + sect->sh_size)
13381 {
13382 int tag;
13383 int val;
13384 bfd_vma size;
13385 unsigned char * end;
13386
13387 /* PR binutils/17531: Safe handling of corrupt files. */
13388 if (attr_len < 6)
13389 {
13390 error (_("Unused bytes at end of section\n"));
13391 section_len = 0;
13392 break;
13393 }
13394
13395 tag = *(p++);
13396 size = byte_get (p, 4);
13397 if (size > attr_len)
13398 {
13399 error (_("Bad subsection length (%u > %u)\n"),
13400 (unsigned) size, (unsigned) attr_len);
13401 size = attr_len;
13402 }
13403 /* PR binutils/17531: Safe handling of corrupt files. */
13404 if (size < 6)
13405 {
13406 error (_("Bad subsection length (%u < 6)\n"),
13407 (unsigned) size);
13408 section_len = 0;
13409 break;
13410 }
13411
13412 attr_len -= size;
13413 end = p + size - 1;
13414 assert (end <= contents + sect->sh_size);
13415 p += 4;
13416
13417 switch (tag)
13418 {
13419 case 1:
13420 printf (_("File Attributes\n"));
13421 break;
13422 case 2:
13423 printf (_("Section Attributes:"));
13424 goto do_numlist;
13425 case 3:
13426 printf (_("Symbol Attributes:"));
13427 do_numlist:
13428 for (;;)
13429 {
13430 unsigned int j;
13431
13432 val = read_uleb128 (p, &j, end);
13433 p += j;
13434 if (val == 0)
13435 break;
13436 printf (" %d", val);
13437 }
13438 printf ("\n");
13439 break;
13440 default:
13441 printf (_("Unknown tag: %d\n"), tag);
13442 public_section = FALSE;
13443 break;
13444 }
13445
13446 if (public_section && display_pub_attribute != NULL)
13447 {
13448 while (p < end)
13449 p = display_pub_attribute (p, end);
13450 assert (p <= end);
13451 }
13452 else if (gnu_section && display_proc_gnu_attribute != NULL)
13453 {
13454 while (p < end)
13455 p = display_gnu_attribute (p,
13456 display_proc_gnu_attribute,
13457 end);
13458 assert (p <= end);
13459 }
13460 else if (p < end)
13461 {
13462 printf (_(" Unknown attribute:\n"));
13463 display_raw_attribute (p, end);
13464 p = end;
13465 }
13466 else
13467 attr_len = 0;
13468 }
13469 }
13470 }
13471 else
13472 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13473
13474 free (contents);
13475 }
13476 return 1;
13477 }
13478
13479 static int
13480 process_arm_specific (FILE * file)
13481 {
13482 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13483 display_arm_attribute, NULL);
13484 }
13485
13486 static int
13487 process_power_specific (FILE * file)
13488 {
13489 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13490 display_power_gnu_attribute);
13491 }
13492
13493 static int
13494 process_sparc_specific (FILE * file)
13495 {
13496 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13497 display_sparc_gnu_attribute);
13498 }
13499
13500 static int
13501 process_tic6x_specific (FILE * file)
13502 {
13503 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13504 display_tic6x_attribute, NULL);
13505 }
13506
13507 static int
13508 process_msp430x_specific (FILE * file)
13509 {
13510 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13511 display_msp430x_attribute, NULL);
13512 }
13513
13514 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13515 Print the Address, Access and Initial fields of an entry at VMA ADDR
13516 and return the VMA of the next entry, or -1 if there was a problem.
13517 Does not read from DATA_END or beyond. */
13518
13519 static bfd_vma
13520 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
13521 unsigned char * data_end)
13522 {
13523 printf (" ");
13524 print_vma (addr, LONG_HEX);
13525 printf (" ");
13526 if (addr < pltgot + 0xfff0)
13527 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13528 else
13529 printf ("%10s", "");
13530 printf (" ");
13531 if (data == NULL)
13532 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13533 else
13534 {
13535 bfd_vma entry;
13536 unsigned char * from = data + addr - pltgot;
13537
13538 if (from + (is_32bit_elf ? 4 : 8) > data_end)
13539 {
13540 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
13541 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
13542 return (bfd_vma) -1;
13543 }
13544 else
13545 {
13546 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13547 print_vma (entry, LONG_HEX);
13548 }
13549 }
13550 return addr + (is_32bit_elf ? 4 : 8);
13551 }
13552
13553 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13554 PLTGOT. Print the Address and Initial fields of an entry at VMA
13555 ADDR and return the VMA of the next entry. */
13556
13557 static bfd_vma
13558 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13559 {
13560 printf (" ");
13561 print_vma (addr, LONG_HEX);
13562 printf (" ");
13563 if (data == NULL)
13564 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13565 else
13566 {
13567 bfd_vma entry;
13568
13569 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13570 print_vma (entry, LONG_HEX);
13571 }
13572 return addr + (is_32bit_elf ? 4 : 8);
13573 }
13574
13575 static void
13576 print_mips_ases (unsigned int mask)
13577 {
13578 if (mask & AFL_ASE_DSP)
13579 fputs ("\n\tDSP ASE", stdout);
13580 if (mask & AFL_ASE_DSPR2)
13581 fputs ("\n\tDSP R2 ASE", stdout);
13582 if (mask & AFL_ASE_EVA)
13583 fputs ("\n\tEnhanced VA Scheme", stdout);
13584 if (mask & AFL_ASE_MCU)
13585 fputs ("\n\tMCU (MicroController) ASE", stdout);
13586 if (mask & AFL_ASE_MDMX)
13587 fputs ("\n\tMDMX ASE", stdout);
13588 if (mask & AFL_ASE_MIPS3D)
13589 fputs ("\n\tMIPS-3D ASE", stdout);
13590 if (mask & AFL_ASE_MT)
13591 fputs ("\n\tMT ASE", stdout);
13592 if (mask & AFL_ASE_SMARTMIPS)
13593 fputs ("\n\tSmartMIPS ASE", stdout);
13594 if (mask & AFL_ASE_VIRT)
13595 fputs ("\n\tVZ ASE", stdout);
13596 if (mask & AFL_ASE_MSA)
13597 fputs ("\n\tMSA ASE", stdout);
13598 if (mask & AFL_ASE_MIPS16)
13599 fputs ("\n\tMIPS16 ASE", stdout);
13600 if (mask & AFL_ASE_MICROMIPS)
13601 fputs ("\n\tMICROMIPS ASE", stdout);
13602 if (mask & AFL_ASE_XPA)
13603 fputs ("\n\tXPA ASE", stdout);
13604 if (mask == 0)
13605 fprintf (stdout, "\n\t%s", _("None"));
13606 else if ((mask & ~AFL_ASE_MASK) != 0)
13607 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13608 }
13609
13610 static void
13611 print_mips_isa_ext (unsigned int isa_ext)
13612 {
13613 switch (isa_ext)
13614 {
13615 case 0:
13616 fputs (_("None"), stdout);
13617 break;
13618 case AFL_EXT_XLR:
13619 fputs ("RMI XLR", stdout);
13620 break;
13621 case AFL_EXT_OCTEON3:
13622 fputs ("Cavium Networks Octeon3", stdout);
13623 break;
13624 case AFL_EXT_OCTEON2:
13625 fputs ("Cavium Networks Octeon2", stdout);
13626 break;
13627 case AFL_EXT_OCTEONP:
13628 fputs ("Cavium Networks OcteonP", stdout);
13629 break;
13630 case AFL_EXT_LOONGSON_3A:
13631 fputs ("Loongson 3A", stdout);
13632 break;
13633 case AFL_EXT_OCTEON:
13634 fputs ("Cavium Networks Octeon", stdout);
13635 break;
13636 case AFL_EXT_5900:
13637 fputs ("Toshiba R5900", stdout);
13638 break;
13639 case AFL_EXT_4650:
13640 fputs ("MIPS R4650", stdout);
13641 break;
13642 case AFL_EXT_4010:
13643 fputs ("LSI R4010", stdout);
13644 break;
13645 case AFL_EXT_4100:
13646 fputs ("NEC VR4100", stdout);
13647 break;
13648 case AFL_EXT_3900:
13649 fputs ("Toshiba R3900", stdout);
13650 break;
13651 case AFL_EXT_10000:
13652 fputs ("MIPS R10000", stdout);
13653 break;
13654 case AFL_EXT_SB1:
13655 fputs ("Broadcom SB-1", stdout);
13656 break;
13657 case AFL_EXT_4111:
13658 fputs ("NEC VR4111/VR4181", stdout);
13659 break;
13660 case AFL_EXT_4120:
13661 fputs ("NEC VR4120", stdout);
13662 break;
13663 case AFL_EXT_5400:
13664 fputs ("NEC VR5400", stdout);
13665 break;
13666 case AFL_EXT_5500:
13667 fputs ("NEC VR5500", stdout);
13668 break;
13669 case AFL_EXT_LOONGSON_2E:
13670 fputs ("ST Microelectronics Loongson 2E", stdout);
13671 break;
13672 case AFL_EXT_LOONGSON_2F:
13673 fputs ("ST Microelectronics Loongson 2F", stdout);
13674 break;
13675 default:
13676 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13677 }
13678 }
13679
13680 static int
13681 get_mips_reg_size (int reg_size)
13682 {
13683 return (reg_size == AFL_REG_NONE) ? 0
13684 : (reg_size == AFL_REG_32) ? 32
13685 : (reg_size == AFL_REG_64) ? 64
13686 : (reg_size == AFL_REG_128) ? 128
13687 : -1;
13688 }
13689
13690 static int
13691 process_mips_specific (FILE * file)
13692 {
13693 Elf_Internal_Dyn * entry;
13694 Elf_Internal_Shdr *sect = NULL;
13695 size_t liblist_offset = 0;
13696 size_t liblistno = 0;
13697 size_t conflictsno = 0;
13698 size_t options_offset = 0;
13699 size_t conflicts_offset = 0;
13700 size_t pltrelsz = 0;
13701 size_t pltrel = 0;
13702 bfd_vma pltgot = 0;
13703 bfd_vma mips_pltgot = 0;
13704 bfd_vma jmprel = 0;
13705 bfd_vma local_gotno = 0;
13706 bfd_vma gotsym = 0;
13707 bfd_vma symtabno = 0;
13708
13709 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13710 display_mips_gnu_attribute);
13711
13712 sect = find_section (".MIPS.abiflags");
13713
13714 if (sect != NULL)
13715 {
13716 Elf_External_ABIFlags_v0 *abiflags_ext;
13717 Elf_Internal_ABIFlags_v0 abiflags_in;
13718
13719 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13720 fputs ("\nCorrupt ABI Flags section.\n", stdout);
13721 else
13722 {
13723 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13724 sect->sh_size, _("MIPS ABI Flags section"));
13725 if (abiflags_ext)
13726 {
13727 abiflags_in.version = BYTE_GET (abiflags_ext->version);
13728 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13729 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13730 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13731 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13732 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13733 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13734 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13735 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13736 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13737 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13738
13739 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13740 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13741 if (abiflags_in.isa_rev > 1)
13742 printf ("r%d", abiflags_in.isa_rev);
13743 printf ("\nGPR size: %d",
13744 get_mips_reg_size (abiflags_in.gpr_size));
13745 printf ("\nCPR1 size: %d",
13746 get_mips_reg_size (abiflags_in.cpr1_size));
13747 printf ("\nCPR2 size: %d",
13748 get_mips_reg_size (abiflags_in.cpr2_size));
13749 fputs ("\nFP ABI: ", stdout);
13750 print_mips_fp_abi_value (abiflags_in.fp_abi);
13751 fputs ("ISA Extension: ", stdout);
13752 print_mips_isa_ext (abiflags_in.isa_ext);
13753 fputs ("\nASEs:", stdout);
13754 print_mips_ases (abiflags_in.ases);
13755 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13756 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13757 fputc ('\n', stdout);
13758 free (abiflags_ext);
13759 }
13760 }
13761 }
13762
13763 /* We have a lot of special sections. Thanks SGI! */
13764 if (dynamic_section == NULL)
13765 /* No information available. */
13766 return 0;
13767
13768 for (entry = dynamic_section;
13769 /* PR 17531 file: 012-50589-0.004. */
13770 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13771 ++entry)
13772 switch (entry->d_tag)
13773 {
13774 case DT_MIPS_LIBLIST:
13775 liblist_offset
13776 = offset_from_vma (file, entry->d_un.d_val,
13777 liblistno * sizeof (Elf32_External_Lib));
13778 break;
13779 case DT_MIPS_LIBLISTNO:
13780 liblistno = entry->d_un.d_val;
13781 break;
13782 case DT_MIPS_OPTIONS:
13783 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13784 break;
13785 case DT_MIPS_CONFLICT:
13786 conflicts_offset
13787 = offset_from_vma (file, entry->d_un.d_val,
13788 conflictsno * sizeof (Elf32_External_Conflict));
13789 break;
13790 case DT_MIPS_CONFLICTNO:
13791 conflictsno = entry->d_un.d_val;
13792 break;
13793 case DT_PLTGOT:
13794 pltgot = entry->d_un.d_ptr;
13795 break;
13796 case DT_MIPS_LOCAL_GOTNO:
13797 local_gotno = entry->d_un.d_val;
13798 break;
13799 case DT_MIPS_GOTSYM:
13800 gotsym = entry->d_un.d_val;
13801 break;
13802 case DT_MIPS_SYMTABNO:
13803 symtabno = entry->d_un.d_val;
13804 break;
13805 case DT_MIPS_PLTGOT:
13806 mips_pltgot = entry->d_un.d_ptr;
13807 break;
13808 case DT_PLTREL:
13809 pltrel = entry->d_un.d_val;
13810 break;
13811 case DT_PLTRELSZ:
13812 pltrelsz = entry->d_un.d_val;
13813 break;
13814 case DT_JMPREL:
13815 jmprel = entry->d_un.d_ptr;
13816 break;
13817 default:
13818 break;
13819 }
13820
13821 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13822 {
13823 Elf32_External_Lib * elib;
13824 size_t cnt;
13825
13826 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13827 liblistno,
13828 sizeof (Elf32_External_Lib),
13829 _("liblist section data"));
13830 if (elib)
13831 {
13832 printf (_("\nSection '.liblist' contains %lu entries:\n"),
13833 (unsigned long) liblistno);
13834 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
13835 stdout);
13836
13837 for (cnt = 0; cnt < liblistno; ++cnt)
13838 {
13839 Elf32_Lib liblist;
13840 time_t atime;
13841 char timebuf[20];
13842 struct tm * tmp;
13843
13844 liblist.l_name = BYTE_GET (elib[cnt].l_name);
13845 atime = BYTE_GET (elib[cnt].l_time_stamp);
13846 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13847 liblist.l_version = BYTE_GET (elib[cnt].l_version);
13848 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13849
13850 tmp = gmtime (&atime);
13851 snprintf (timebuf, sizeof (timebuf),
13852 "%04u-%02u-%02uT%02u:%02u:%02u",
13853 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13854 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13855
13856 printf ("%3lu: ", (unsigned long) cnt);
13857 if (VALID_DYNAMIC_NAME (liblist.l_name))
13858 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13859 else
13860 printf (_("<corrupt: %9ld>"), liblist.l_name);
13861 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13862 liblist.l_version);
13863
13864 if (liblist.l_flags == 0)
13865 puts (_(" NONE"));
13866 else
13867 {
13868 static const struct
13869 {
13870 const char * name;
13871 int bit;
13872 }
13873 l_flags_vals[] =
13874 {
13875 { " EXACT_MATCH", LL_EXACT_MATCH },
13876 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13877 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13878 { " EXPORTS", LL_EXPORTS },
13879 { " DELAY_LOAD", LL_DELAY_LOAD },
13880 { " DELTA", LL_DELTA }
13881 };
13882 int flags = liblist.l_flags;
13883 size_t fcnt;
13884
13885 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13886 if ((flags & l_flags_vals[fcnt].bit) != 0)
13887 {
13888 fputs (l_flags_vals[fcnt].name, stdout);
13889 flags ^= l_flags_vals[fcnt].bit;
13890 }
13891 if (flags != 0)
13892 printf (" %#x", (unsigned int) flags);
13893
13894 puts ("");
13895 }
13896 }
13897
13898 free (elib);
13899 }
13900 }
13901
13902 if (options_offset != 0)
13903 {
13904 Elf_External_Options * eopt;
13905 Elf_Internal_Options * iopt;
13906 Elf_Internal_Options * option;
13907 size_t offset;
13908 int cnt;
13909 sect = section_headers;
13910
13911 /* Find the section header so that we get the size. */
13912 sect = find_section_by_type (SHT_MIPS_OPTIONS);
13913 /* PR 17533 file: 012-277276-0.004. */
13914 if (sect == NULL)
13915 {
13916 error (_("No MIPS_OPTIONS header found\n"));
13917 return 0;
13918 }
13919
13920 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13921 sect->sh_size, _("options"));
13922 if (eopt)
13923 {
13924 iopt = (Elf_Internal_Options *)
13925 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13926 if (iopt == NULL)
13927 {
13928 error (_("Out of memory allocatinf space for MIPS options\n"));
13929 return 0;
13930 }
13931
13932 offset = cnt = 0;
13933 option = iopt;
13934
13935 while (offset <= sect->sh_size - sizeof (* eopt))
13936 {
13937 Elf_External_Options * eoption;
13938
13939 eoption = (Elf_External_Options *) ((char *) eopt + offset);
13940
13941 option->kind = BYTE_GET (eoption->kind);
13942 option->size = BYTE_GET (eoption->size);
13943 option->section = BYTE_GET (eoption->section);
13944 option->info = BYTE_GET (eoption->info);
13945
13946 /* PR 17531: file: ffa0fa3b. */
13947 if (option->size < sizeof (* eopt)
13948 || offset + option->size > sect->sh_size)
13949 {
13950 error (_("Invalid size (%u) for MIPS option\n"), option->size);
13951 return 0;
13952 }
13953 offset += option->size;
13954
13955 ++option;
13956 ++cnt;
13957 }
13958
13959 printf (_("\nSection '%s' contains %d entries:\n"),
13960 printable_section_name (sect), cnt);
13961
13962 option = iopt;
13963 offset = 0;
13964
13965 while (cnt-- > 0)
13966 {
13967 size_t len;
13968
13969 switch (option->kind)
13970 {
13971 case ODK_NULL:
13972 /* This shouldn't happen. */
13973 printf (" NULL %d %lx", option->section, option->info);
13974 break;
13975 case ODK_REGINFO:
13976 printf (" REGINFO ");
13977 if (elf_header.e_machine == EM_MIPS)
13978 {
13979 /* 32bit form. */
13980 Elf32_External_RegInfo * ereg;
13981 Elf32_RegInfo reginfo;
13982
13983 ereg = (Elf32_External_RegInfo *) (option + 1);
13984 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13985 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13986 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13987 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13988 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13989 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13990
13991 printf ("GPR %08lx GP 0x%lx\n",
13992 reginfo.ri_gprmask,
13993 (unsigned long) reginfo.ri_gp_value);
13994 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
13995 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13996 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13997 }
13998 else
13999 {
14000 /* 64 bit form. */
14001 Elf64_External_RegInfo * ereg;
14002 Elf64_Internal_RegInfo reginfo;
14003
14004 ereg = (Elf64_External_RegInfo *) (option + 1);
14005 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14006 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14007 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14008 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14009 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14010 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14011
14012 printf ("GPR %08lx GP 0x",
14013 reginfo.ri_gprmask);
14014 printf_vma (reginfo.ri_gp_value);
14015 printf ("\n");
14016
14017 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14018 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14019 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14020 }
14021 ++option;
14022 continue;
14023 case ODK_EXCEPTIONS:
14024 fputs (" EXCEPTIONS fpe_min(", stdout);
14025 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14026 fputs (") fpe_max(", stdout);
14027 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14028 fputs (")", stdout);
14029
14030 if (option->info & OEX_PAGE0)
14031 fputs (" PAGE0", stdout);
14032 if (option->info & OEX_SMM)
14033 fputs (" SMM", stdout);
14034 if (option->info & OEX_FPDBUG)
14035 fputs (" FPDBUG", stdout);
14036 if (option->info & OEX_DISMISS)
14037 fputs (" DISMISS", stdout);
14038 break;
14039 case ODK_PAD:
14040 fputs (" PAD ", stdout);
14041 if (option->info & OPAD_PREFIX)
14042 fputs (" PREFIX", stdout);
14043 if (option->info & OPAD_POSTFIX)
14044 fputs (" POSTFIX", stdout);
14045 if (option->info & OPAD_SYMBOL)
14046 fputs (" SYMBOL", stdout);
14047 break;
14048 case ODK_HWPATCH:
14049 fputs (" HWPATCH ", stdout);
14050 if (option->info & OHW_R4KEOP)
14051 fputs (" R4KEOP", stdout);
14052 if (option->info & OHW_R8KPFETCH)
14053 fputs (" R8KPFETCH", stdout);
14054 if (option->info & OHW_R5KEOP)
14055 fputs (" R5KEOP", stdout);
14056 if (option->info & OHW_R5KCVTL)
14057 fputs (" R5KCVTL", stdout);
14058 break;
14059 case ODK_FILL:
14060 fputs (" FILL ", stdout);
14061 /* XXX Print content of info word? */
14062 break;
14063 case ODK_TAGS:
14064 fputs (" TAGS ", stdout);
14065 /* XXX Print content of info word? */
14066 break;
14067 case ODK_HWAND:
14068 fputs (" HWAND ", stdout);
14069 if (option->info & OHWA0_R4KEOP_CHECKED)
14070 fputs (" R4KEOP_CHECKED", stdout);
14071 if (option->info & OHWA0_R4KEOP_CLEAN)
14072 fputs (" R4KEOP_CLEAN", stdout);
14073 break;
14074 case ODK_HWOR:
14075 fputs (" HWOR ", stdout);
14076 if (option->info & OHWA0_R4KEOP_CHECKED)
14077 fputs (" R4KEOP_CHECKED", stdout);
14078 if (option->info & OHWA0_R4KEOP_CLEAN)
14079 fputs (" R4KEOP_CLEAN", stdout);
14080 break;
14081 case ODK_GP_GROUP:
14082 printf (" GP_GROUP %#06lx self-contained %#06lx",
14083 option->info & OGP_GROUP,
14084 (option->info & OGP_SELF) >> 16);
14085 break;
14086 case ODK_IDENT:
14087 printf (" IDENT %#06lx self-contained %#06lx",
14088 option->info & OGP_GROUP,
14089 (option->info & OGP_SELF) >> 16);
14090 break;
14091 default:
14092 /* This shouldn't happen. */
14093 printf (" %3d ??? %d %lx",
14094 option->kind, option->section, option->info);
14095 break;
14096 }
14097
14098 len = sizeof (* eopt);
14099 while (len < option->size)
14100 {
14101 char datum = * ((char *) eopt + offset + len);
14102
14103 if (ISPRINT (datum))
14104 printf ("%c", datum);
14105 else
14106 printf ("\\%03o", datum);
14107 len ++;
14108 }
14109 fputs ("\n", stdout);
14110
14111 offset += option->size;
14112 ++option;
14113 }
14114
14115 free (eopt);
14116 }
14117 }
14118
14119 if (conflicts_offset != 0 && conflictsno != 0)
14120 {
14121 Elf32_Conflict * iconf;
14122 size_t cnt;
14123
14124 if (dynamic_symbols == NULL)
14125 {
14126 error (_("conflict list found without a dynamic symbol table\n"));
14127 return 0;
14128 }
14129
14130 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14131 if (iconf == NULL)
14132 {
14133 error (_("Out of memory allocating space for dynamic conflicts\n"));
14134 return 0;
14135 }
14136
14137 if (is_32bit_elf)
14138 {
14139 Elf32_External_Conflict * econf32;
14140
14141 econf32 = (Elf32_External_Conflict *)
14142 get_data (NULL, file, conflicts_offset, conflictsno,
14143 sizeof (* econf32), _("conflict"));
14144 if (!econf32)
14145 return 0;
14146
14147 for (cnt = 0; cnt < conflictsno; ++cnt)
14148 iconf[cnt] = BYTE_GET (econf32[cnt]);
14149
14150 free (econf32);
14151 }
14152 else
14153 {
14154 Elf64_External_Conflict * econf64;
14155
14156 econf64 = (Elf64_External_Conflict *)
14157 get_data (NULL, file, conflicts_offset, conflictsno,
14158 sizeof (* econf64), _("conflict"));
14159 if (!econf64)
14160 return 0;
14161
14162 for (cnt = 0; cnt < conflictsno; ++cnt)
14163 iconf[cnt] = BYTE_GET (econf64[cnt]);
14164
14165 free (econf64);
14166 }
14167
14168 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14169 (unsigned long) conflictsno);
14170 puts (_(" Num: Index Value Name"));
14171
14172 for (cnt = 0; cnt < conflictsno; ++cnt)
14173 {
14174 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14175
14176 if (iconf[cnt] >= num_dynamic_syms)
14177 printf (_("<corrupt symbol index>"));
14178 else
14179 {
14180 Elf_Internal_Sym * psym;
14181
14182 psym = & dynamic_symbols[iconf[cnt]];
14183 print_vma (psym->st_value, FULL_HEX);
14184 putchar (' ');
14185 if (VALID_DYNAMIC_NAME (psym->st_name))
14186 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14187 else
14188 printf (_("<corrupt: %14ld>"), psym->st_name);
14189 }
14190 putchar ('\n');
14191 }
14192
14193 free (iconf);
14194 }
14195
14196 if (pltgot != 0 && local_gotno != 0)
14197 {
14198 bfd_vma ent, local_end, global_end;
14199 size_t i, offset;
14200 unsigned char * data;
14201 unsigned char * data_end;
14202 int addr_size;
14203
14204 ent = pltgot;
14205 addr_size = (is_32bit_elf ? 4 : 8);
14206 local_end = pltgot + local_gotno * addr_size;
14207
14208 /* PR binutils/17533 file: 012-111227-0.004 */
14209 if (symtabno < gotsym)
14210 {
14211 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14212 (unsigned long) gotsym, (unsigned long) symtabno);
14213 return 0;
14214 }
14215
14216 global_end = local_end + (symtabno - gotsym) * addr_size;
14217 /* PR 17531: file: 54c91a34. */
14218 if (global_end < local_end)
14219 {
14220 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14221 return 0;
14222 }
14223
14224 offset = offset_from_vma (file, pltgot, global_end - pltgot);
14225 data = (unsigned char *) get_data (NULL, file, offset,
14226 global_end - pltgot, 1,
14227 _("Global Offset Table data"));
14228 if (data == NULL)
14229 return 0;
14230 data_end = data + (global_end - pltgot);
14231
14232 printf (_("\nPrimary GOT:\n"));
14233 printf (_(" Canonical gp value: "));
14234 print_vma (pltgot + 0x7ff0, LONG_HEX);
14235 printf ("\n\n");
14236
14237 printf (_(" Reserved entries:\n"));
14238 printf (_(" %*s %10s %*s Purpose\n"),
14239 addr_size * 2, _("Address"), _("Access"),
14240 addr_size * 2, _("Initial"));
14241 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14242 printf (_(" Lazy resolver\n"));
14243 if (ent == (bfd_vma) -1)
14244 goto got_print_fail;
14245 if (data
14246 && (byte_get (data + ent - pltgot, addr_size)
14247 >> (addr_size * 8 - 1)) != 0)
14248 {
14249 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14250 printf (_(" Module pointer (GNU extension)\n"));
14251 if (ent == (bfd_vma) -1)
14252 goto got_print_fail;
14253 }
14254 printf ("\n");
14255
14256 if (ent < local_end)
14257 {
14258 printf (_(" Local entries:\n"));
14259 printf (" %*s %10s %*s\n",
14260 addr_size * 2, _("Address"), _("Access"),
14261 addr_size * 2, _("Initial"));
14262 while (ent < local_end)
14263 {
14264 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14265 printf ("\n");
14266 if (ent == (bfd_vma) -1)
14267 goto got_print_fail;
14268 }
14269 printf ("\n");
14270 }
14271
14272 if (gotsym < symtabno)
14273 {
14274 int sym_width;
14275
14276 printf (_(" Global entries:\n"));
14277 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
14278 addr_size * 2, _("Address"),
14279 _("Access"),
14280 addr_size * 2, _("Initial"),
14281 addr_size * 2, _("Sym.Val."),
14282 _("Type"),
14283 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14284 _("Ndx"), _("Name"));
14285
14286 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14287
14288 for (i = gotsym; i < symtabno; i++)
14289 {
14290 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14291 printf (" ");
14292
14293 if (dynamic_symbols == NULL)
14294 printf (_("<no dynamic symbols>"));
14295 else if (i < num_dynamic_syms)
14296 {
14297 Elf_Internal_Sym * psym = dynamic_symbols + i;
14298
14299 print_vma (psym->st_value, LONG_HEX);
14300 printf (" %-7s %3s ",
14301 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14302 get_symbol_index_type (psym->st_shndx));
14303
14304 if (VALID_DYNAMIC_NAME (psym->st_name))
14305 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14306 else
14307 printf (_("<corrupt: %14ld>"), psym->st_name);
14308 }
14309 else
14310 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14311 (unsigned long) i);
14312
14313 printf ("\n");
14314 if (ent == (bfd_vma) -1)
14315 break;
14316 }
14317 printf ("\n");
14318 }
14319
14320 got_print_fail:
14321 if (data)
14322 free (data);
14323 }
14324
14325 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14326 {
14327 bfd_vma ent, end;
14328 size_t offset, rel_offset;
14329 unsigned long count, i;
14330 unsigned char * data;
14331 int addr_size, sym_width;
14332 Elf_Internal_Rela * rels;
14333
14334 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14335 if (pltrel == DT_RELA)
14336 {
14337 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14338 return 0;
14339 }
14340 else
14341 {
14342 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14343 return 0;
14344 }
14345
14346 ent = mips_pltgot;
14347 addr_size = (is_32bit_elf ? 4 : 8);
14348 end = mips_pltgot + (2 + count) * addr_size;
14349
14350 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14351 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14352 1, _("Procedure Linkage Table data"));
14353 if (data == NULL)
14354 return 0;
14355
14356 printf ("\nPLT GOT:\n\n");
14357 printf (_(" Reserved entries:\n"));
14358 printf (_(" %*s %*s Purpose\n"),
14359 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14360 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14361 printf (_(" PLT lazy resolver\n"));
14362 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14363 printf (_(" Module pointer\n"));
14364 printf ("\n");
14365
14366 printf (_(" Entries:\n"));
14367 printf (" %*s %*s %*s %-7s %3s %s\n",
14368 addr_size * 2, _("Address"),
14369 addr_size * 2, _("Initial"),
14370 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14371 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14372 for (i = 0; i < count; i++)
14373 {
14374 unsigned long idx = get_reloc_symindex (rels[i].r_info);
14375
14376 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14377 printf (" ");
14378
14379 if (idx >= num_dynamic_syms)
14380 printf (_("<corrupt symbol index: %lu>"), idx);
14381 else
14382 {
14383 Elf_Internal_Sym * psym = dynamic_symbols + idx;
14384
14385 print_vma (psym->st_value, LONG_HEX);
14386 printf (" %-7s %3s ",
14387 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14388 get_symbol_index_type (psym->st_shndx));
14389 if (VALID_DYNAMIC_NAME (psym->st_name))
14390 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14391 else
14392 printf (_("<corrupt: %14ld>"), psym->st_name);
14393 }
14394 printf ("\n");
14395 }
14396 printf ("\n");
14397
14398 if (data)
14399 free (data);
14400 free (rels);
14401 }
14402
14403 return 1;
14404 }
14405
14406 static int
14407 process_nds32_specific (FILE * file)
14408 {
14409 Elf_Internal_Shdr *sect = NULL;
14410
14411 sect = find_section (".nds32_e_flags");
14412 if (sect != NULL)
14413 {
14414 unsigned int *flag;
14415
14416 printf ("\nNDS32 elf flags section:\n");
14417 flag = get_data (NULL, file, sect->sh_offset, 1,
14418 sect->sh_size, _("NDS32 elf flags section"));
14419
14420 switch ((*flag) & 0x3)
14421 {
14422 case 0:
14423 printf ("(VEC_SIZE):\tNo entry.\n");
14424 break;
14425 case 1:
14426 printf ("(VEC_SIZE):\t4 bytes\n");
14427 break;
14428 case 2:
14429 printf ("(VEC_SIZE):\t16 bytes\n");
14430 break;
14431 case 3:
14432 printf ("(VEC_SIZE):\treserved\n");
14433 break;
14434 }
14435 }
14436
14437 return TRUE;
14438 }
14439
14440 static int
14441 process_gnu_liblist (FILE * file)
14442 {
14443 Elf_Internal_Shdr * section;
14444 Elf_Internal_Shdr * string_sec;
14445 Elf32_External_Lib * elib;
14446 char * strtab;
14447 size_t strtab_size;
14448 size_t cnt;
14449 unsigned i;
14450
14451 if (! do_arch)
14452 return 0;
14453
14454 for (i = 0, section = section_headers;
14455 i < elf_header.e_shnum;
14456 i++, section++)
14457 {
14458 switch (section->sh_type)
14459 {
14460 case SHT_GNU_LIBLIST:
14461 if (section->sh_link >= elf_header.e_shnum)
14462 break;
14463
14464 elib = (Elf32_External_Lib *)
14465 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14466 _("liblist section data"));
14467
14468 if (elib == NULL)
14469 break;
14470 string_sec = section_headers + section->sh_link;
14471
14472 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14473 string_sec->sh_size,
14474 _("liblist string table"));
14475 if (strtab == NULL
14476 || section->sh_entsize != sizeof (Elf32_External_Lib))
14477 {
14478 free (elib);
14479 free (strtab);
14480 break;
14481 }
14482 strtab_size = string_sec->sh_size;
14483
14484 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14485 printable_section_name (section),
14486 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14487
14488 puts (_(" Library Time Stamp Checksum Version Flags"));
14489
14490 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14491 ++cnt)
14492 {
14493 Elf32_Lib liblist;
14494 time_t atime;
14495 char timebuf[20];
14496 struct tm * tmp;
14497
14498 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14499 atime = BYTE_GET (elib[cnt].l_time_stamp);
14500 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14501 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14502 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14503
14504 tmp = gmtime (&atime);
14505 snprintf (timebuf, sizeof (timebuf),
14506 "%04u-%02u-%02uT%02u:%02u:%02u",
14507 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14508 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14509
14510 printf ("%3lu: ", (unsigned long) cnt);
14511 if (do_wide)
14512 printf ("%-20s", liblist.l_name < strtab_size
14513 ? strtab + liblist.l_name : _("<corrupt>"));
14514 else
14515 printf ("%-20.20s", liblist.l_name < strtab_size
14516 ? strtab + liblist.l_name : _("<corrupt>"));
14517 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14518 liblist.l_version, liblist.l_flags);
14519 }
14520
14521 free (elib);
14522 free (strtab);
14523 }
14524 }
14525
14526 return 1;
14527 }
14528
14529 static const char *
14530 get_note_type (unsigned e_type)
14531 {
14532 static char buff[64];
14533
14534 if (elf_header.e_type == ET_CORE)
14535 switch (e_type)
14536 {
14537 case NT_AUXV:
14538 return _("NT_AUXV (auxiliary vector)");
14539 case NT_PRSTATUS:
14540 return _("NT_PRSTATUS (prstatus structure)");
14541 case NT_FPREGSET:
14542 return _("NT_FPREGSET (floating point registers)");
14543 case NT_PRPSINFO:
14544 return _("NT_PRPSINFO (prpsinfo structure)");
14545 case NT_TASKSTRUCT:
14546 return _("NT_TASKSTRUCT (task structure)");
14547 case NT_PRXFPREG:
14548 return _("NT_PRXFPREG (user_xfpregs structure)");
14549 case NT_PPC_VMX:
14550 return _("NT_PPC_VMX (ppc Altivec registers)");
14551 case NT_PPC_VSX:
14552 return _("NT_PPC_VSX (ppc VSX registers)");
14553 case NT_386_TLS:
14554 return _("NT_386_TLS (x86 TLS information)");
14555 case NT_386_IOPERM:
14556 return _("NT_386_IOPERM (x86 I/O permissions)");
14557 case NT_X86_XSTATE:
14558 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14559 case NT_S390_HIGH_GPRS:
14560 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14561 case NT_S390_TIMER:
14562 return _("NT_S390_TIMER (s390 timer register)");
14563 case NT_S390_TODCMP:
14564 return _("NT_S390_TODCMP (s390 TOD comparator register)");
14565 case NT_S390_TODPREG:
14566 return _("NT_S390_TODPREG (s390 TOD programmable register)");
14567 case NT_S390_CTRS:
14568 return _("NT_S390_CTRS (s390 control registers)");
14569 case NT_S390_PREFIX:
14570 return _("NT_S390_PREFIX (s390 prefix register)");
14571 case NT_S390_LAST_BREAK:
14572 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14573 case NT_S390_SYSTEM_CALL:
14574 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14575 case NT_S390_TDB:
14576 return _("NT_S390_TDB (s390 transaction diagnostic block)");
14577 case NT_S390_VXRS_LOW:
14578 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
14579 case NT_S390_VXRS_HIGH:
14580 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
14581 case NT_ARM_VFP:
14582 return _("NT_ARM_VFP (arm VFP registers)");
14583 case NT_ARM_TLS:
14584 return _("NT_ARM_TLS (AArch TLS registers)");
14585 case NT_ARM_HW_BREAK:
14586 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14587 case NT_ARM_HW_WATCH:
14588 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14589 case NT_PSTATUS:
14590 return _("NT_PSTATUS (pstatus structure)");
14591 case NT_FPREGS:
14592 return _("NT_FPREGS (floating point registers)");
14593 case NT_PSINFO:
14594 return _("NT_PSINFO (psinfo structure)");
14595 case NT_LWPSTATUS:
14596 return _("NT_LWPSTATUS (lwpstatus_t structure)");
14597 case NT_LWPSINFO:
14598 return _("NT_LWPSINFO (lwpsinfo_t structure)");
14599 case NT_WIN32PSTATUS:
14600 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14601 case NT_SIGINFO:
14602 return _("NT_SIGINFO (siginfo_t data)");
14603 case NT_FILE:
14604 return _("NT_FILE (mapped files)");
14605 default:
14606 break;
14607 }
14608 else
14609 switch (e_type)
14610 {
14611 case NT_VERSION:
14612 return _("NT_VERSION (version)");
14613 case NT_ARCH:
14614 return _("NT_ARCH (architecture)");
14615 default:
14616 break;
14617 }
14618
14619 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14620 return buff;
14621 }
14622
14623 static int
14624 print_core_note (Elf_Internal_Note *pnote)
14625 {
14626 unsigned int addr_size = is_32bit_elf ? 4 : 8;
14627 bfd_vma count, page_size;
14628 unsigned char *descdata, *filenames, *descend;
14629
14630 if (pnote->type != NT_FILE)
14631 return 1;
14632
14633 #ifndef BFD64
14634 if (!is_32bit_elf)
14635 {
14636 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
14637 /* Still "successful". */
14638 return 1;
14639 }
14640 #endif
14641
14642 if (pnote->descsz < 2 * addr_size)
14643 {
14644 printf (_(" Malformed note - too short for header\n"));
14645 return 0;
14646 }
14647
14648 descdata = (unsigned char *) pnote->descdata;
14649 descend = descdata + pnote->descsz;
14650
14651 if (descdata[pnote->descsz - 1] != '\0')
14652 {
14653 printf (_(" Malformed note - does not end with \\0\n"));
14654 return 0;
14655 }
14656
14657 count = byte_get (descdata, addr_size);
14658 descdata += addr_size;
14659
14660 page_size = byte_get (descdata, addr_size);
14661 descdata += addr_size;
14662
14663 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14664 {
14665 printf (_(" Malformed note - too short for supplied file count\n"));
14666 return 0;
14667 }
14668
14669 printf (_(" Page size: "));
14670 print_vma (page_size, DEC);
14671 printf ("\n");
14672
14673 printf (_(" %*s%*s%*s\n"),
14674 (int) (2 + 2 * addr_size), _("Start"),
14675 (int) (4 + 2 * addr_size), _("End"),
14676 (int) (4 + 2 * addr_size), _("Page Offset"));
14677 filenames = descdata + count * 3 * addr_size;
14678 while (--count > 0)
14679 {
14680 bfd_vma start, end, file_ofs;
14681
14682 if (filenames == descend)
14683 {
14684 printf (_(" Malformed note - filenames end too early\n"));
14685 return 0;
14686 }
14687
14688 start = byte_get (descdata, addr_size);
14689 descdata += addr_size;
14690 end = byte_get (descdata, addr_size);
14691 descdata += addr_size;
14692 file_ofs = byte_get (descdata, addr_size);
14693 descdata += addr_size;
14694
14695 printf (" ");
14696 print_vma (start, FULL_HEX);
14697 printf (" ");
14698 print_vma (end, FULL_HEX);
14699 printf (" ");
14700 print_vma (file_ofs, FULL_HEX);
14701 printf ("\n %s\n", filenames);
14702
14703 filenames += 1 + strlen ((char *) filenames);
14704 }
14705
14706 return 1;
14707 }
14708
14709 static const char *
14710 get_gnu_elf_note_type (unsigned e_type)
14711 {
14712 static char buff[64];
14713
14714 switch (e_type)
14715 {
14716 case NT_GNU_ABI_TAG:
14717 return _("NT_GNU_ABI_TAG (ABI version tag)");
14718 case NT_GNU_HWCAP:
14719 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14720 case NT_GNU_BUILD_ID:
14721 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14722 case NT_GNU_GOLD_VERSION:
14723 return _("NT_GNU_GOLD_VERSION (gold version)");
14724 default:
14725 break;
14726 }
14727
14728 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14729 return buff;
14730 }
14731
14732 static int
14733 print_gnu_note (Elf_Internal_Note *pnote)
14734 {
14735 switch (pnote->type)
14736 {
14737 case NT_GNU_BUILD_ID:
14738 {
14739 unsigned long i;
14740
14741 printf (_(" Build ID: "));
14742 for (i = 0; i < pnote->descsz; ++i)
14743 printf ("%02x", pnote->descdata[i] & 0xff);
14744 printf ("\n");
14745 }
14746 break;
14747
14748 case NT_GNU_ABI_TAG:
14749 {
14750 unsigned long os, major, minor, subminor;
14751 const char *osname;
14752
14753 /* PR 17531: file: 030-599401-0.004. */
14754 if (pnote->descsz < 16)
14755 {
14756 printf (_(" <corrupt GNU_ABI_TAG>\n"));
14757 break;
14758 }
14759
14760 os = byte_get ((unsigned char *) pnote->descdata, 4);
14761 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14762 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14763 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14764
14765 switch (os)
14766 {
14767 case GNU_ABI_TAG_LINUX:
14768 osname = "Linux";
14769 break;
14770 case GNU_ABI_TAG_HURD:
14771 osname = "Hurd";
14772 break;
14773 case GNU_ABI_TAG_SOLARIS:
14774 osname = "Solaris";
14775 break;
14776 case GNU_ABI_TAG_FREEBSD:
14777 osname = "FreeBSD";
14778 break;
14779 case GNU_ABI_TAG_NETBSD:
14780 osname = "NetBSD";
14781 break;
14782 default:
14783 osname = "Unknown";
14784 break;
14785 }
14786
14787 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14788 major, minor, subminor);
14789 }
14790 break;
14791
14792 case NT_GNU_GOLD_VERSION:
14793 {
14794 unsigned long i;
14795
14796 printf (_(" Version: "));
14797 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14798 printf ("%c", pnote->descdata[i]);
14799 printf ("\n");
14800 }
14801 break;
14802 }
14803
14804 return 1;
14805 }
14806
14807 static const char *
14808 get_netbsd_elfcore_note_type (unsigned e_type)
14809 {
14810 static char buff[64];
14811
14812 if (e_type == NT_NETBSDCORE_PROCINFO)
14813 {
14814 /* NetBSD core "procinfo" structure. */
14815 return _("NetBSD procinfo structure");
14816 }
14817
14818 /* As of Jan 2002 there are no other machine-independent notes
14819 defined for NetBSD core files. If the note type is less
14820 than the start of the machine-dependent note types, we don't
14821 understand it. */
14822
14823 if (e_type < NT_NETBSDCORE_FIRSTMACH)
14824 {
14825 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14826 return buff;
14827 }
14828
14829 switch (elf_header.e_machine)
14830 {
14831 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14832 and PT_GETFPREGS == mach+2. */
14833
14834 case EM_OLD_ALPHA:
14835 case EM_ALPHA:
14836 case EM_SPARC:
14837 case EM_SPARC32PLUS:
14838 case EM_SPARCV9:
14839 switch (e_type)
14840 {
14841 case NT_NETBSDCORE_FIRSTMACH + 0:
14842 return _("PT_GETREGS (reg structure)");
14843 case NT_NETBSDCORE_FIRSTMACH + 2:
14844 return _("PT_GETFPREGS (fpreg structure)");
14845 default:
14846 break;
14847 }
14848 break;
14849
14850 /* On all other arch's, PT_GETREGS == mach+1 and
14851 PT_GETFPREGS == mach+3. */
14852 default:
14853 switch (e_type)
14854 {
14855 case NT_NETBSDCORE_FIRSTMACH + 1:
14856 return _("PT_GETREGS (reg structure)");
14857 case NT_NETBSDCORE_FIRSTMACH + 3:
14858 return _("PT_GETFPREGS (fpreg structure)");
14859 default:
14860 break;
14861 }
14862 }
14863
14864 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14865 e_type - NT_NETBSDCORE_FIRSTMACH);
14866 return buff;
14867 }
14868
14869 static const char *
14870 get_stapsdt_note_type (unsigned e_type)
14871 {
14872 static char buff[64];
14873
14874 switch (e_type)
14875 {
14876 case NT_STAPSDT:
14877 return _("NT_STAPSDT (SystemTap probe descriptors)");
14878
14879 default:
14880 break;
14881 }
14882
14883 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14884 return buff;
14885 }
14886
14887 static int
14888 print_stapsdt_note (Elf_Internal_Note *pnote)
14889 {
14890 int addr_size = is_32bit_elf ? 4 : 8;
14891 char *data = pnote->descdata;
14892 char *data_end = pnote->descdata + pnote->descsz;
14893 bfd_vma pc, base_addr, semaphore;
14894 char *provider, *probe, *arg_fmt;
14895
14896 pc = byte_get ((unsigned char *) data, addr_size);
14897 data += addr_size;
14898 base_addr = byte_get ((unsigned char *) data, addr_size);
14899 data += addr_size;
14900 semaphore = byte_get ((unsigned char *) data, addr_size);
14901 data += addr_size;
14902
14903 provider = data;
14904 data += strlen (data) + 1;
14905 probe = data;
14906 data += strlen (data) + 1;
14907 arg_fmt = data;
14908 data += strlen (data) + 1;
14909
14910 printf (_(" Provider: %s\n"), provider);
14911 printf (_(" Name: %s\n"), probe);
14912 printf (_(" Location: "));
14913 print_vma (pc, FULL_HEX);
14914 printf (_(", Base: "));
14915 print_vma (base_addr, FULL_HEX);
14916 printf (_(", Semaphore: "));
14917 print_vma (semaphore, FULL_HEX);
14918 printf ("\n");
14919 printf (_(" Arguments: %s\n"), arg_fmt);
14920
14921 return data == data_end;
14922 }
14923
14924 static const char *
14925 get_ia64_vms_note_type (unsigned e_type)
14926 {
14927 static char buff[64];
14928
14929 switch (e_type)
14930 {
14931 case NT_VMS_MHD:
14932 return _("NT_VMS_MHD (module header)");
14933 case NT_VMS_LNM:
14934 return _("NT_VMS_LNM (language name)");
14935 case NT_VMS_SRC:
14936 return _("NT_VMS_SRC (source files)");
14937 case NT_VMS_TITLE:
14938 return "NT_VMS_TITLE";
14939 case NT_VMS_EIDC:
14940 return _("NT_VMS_EIDC (consistency check)");
14941 case NT_VMS_FPMODE:
14942 return _("NT_VMS_FPMODE (FP mode)");
14943 case NT_VMS_LINKTIME:
14944 return "NT_VMS_LINKTIME";
14945 case NT_VMS_IMGNAM:
14946 return _("NT_VMS_IMGNAM (image name)");
14947 case NT_VMS_IMGID:
14948 return _("NT_VMS_IMGID (image id)");
14949 case NT_VMS_LINKID:
14950 return _("NT_VMS_LINKID (link id)");
14951 case NT_VMS_IMGBID:
14952 return _("NT_VMS_IMGBID (build id)");
14953 case NT_VMS_GSTNAM:
14954 return _("NT_VMS_GSTNAM (sym table name)");
14955 case NT_VMS_ORIG_DYN:
14956 return "NT_VMS_ORIG_DYN";
14957 case NT_VMS_PATCHTIME:
14958 return "NT_VMS_PATCHTIME";
14959 default:
14960 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14961 return buff;
14962 }
14963 }
14964
14965 static int
14966 print_ia64_vms_note (Elf_Internal_Note * pnote)
14967 {
14968 switch (pnote->type)
14969 {
14970 case NT_VMS_MHD:
14971 if (pnote->descsz > 36)
14972 {
14973 size_t l = strlen (pnote->descdata + 34);
14974 printf (_(" Creation date : %.17s\n"), pnote->descdata);
14975 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
14976 printf (_(" Module name : %s\n"), pnote->descdata + 34);
14977 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
14978 }
14979 else
14980 printf (_(" Invalid size\n"));
14981 break;
14982 case NT_VMS_LNM:
14983 printf (_(" Language: %s\n"), pnote->descdata);
14984 break;
14985 #ifdef BFD64
14986 case NT_VMS_FPMODE:
14987 printf (_(" Floating Point mode: "));
14988 printf ("0x%016" BFD_VMA_FMT "x\n",
14989 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
14990 break;
14991 case NT_VMS_LINKTIME:
14992 printf (_(" Link time: "));
14993 print_vms_time
14994 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14995 printf ("\n");
14996 break;
14997 case NT_VMS_PATCHTIME:
14998 printf (_(" Patch time: "));
14999 print_vms_time
15000 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15001 printf ("\n");
15002 break;
15003 case NT_VMS_ORIG_DYN:
15004 printf (_(" Major id: %u, minor id: %u\n"),
15005 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15006 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15007 printf (_(" Last modified : "));
15008 print_vms_time
15009 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15010 printf (_("\n Link flags : "));
15011 printf ("0x%016" BFD_VMA_FMT "x\n",
15012 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15013 printf (_(" Header flags: 0x%08x\n"),
15014 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15015 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15016 break;
15017 #endif
15018 case NT_VMS_IMGNAM:
15019 printf (_(" Image name: %s\n"), pnote->descdata);
15020 break;
15021 case NT_VMS_GSTNAM:
15022 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15023 break;
15024 case NT_VMS_IMGID:
15025 printf (_(" Image id: %s\n"), pnote->descdata);
15026 break;
15027 case NT_VMS_LINKID:
15028 printf (_(" Linker id: %s\n"), pnote->descdata);
15029 break;
15030 default:
15031 break;
15032 }
15033 return 1;
15034 }
15035
15036 /* Note that by the ELF standard, the name field is already null byte
15037 terminated, and namesz includes the terminating null byte.
15038 I.E. the value of namesz for the name "FSF" is 4.
15039
15040 If the value of namesz is zero, there is no name present. */
15041 static int
15042 process_note (Elf_Internal_Note * pnote)
15043 {
15044 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15045 const char * nt;
15046
15047 if (pnote->namesz == 0)
15048 /* If there is no note name, then use the default set of
15049 note type strings. */
15050 nt = get_note_type (pnote->type);
15051
15052 else if (const_strneq (pnote->namedata, "GNU"))
15053 /* GNU-specific object file notes. */
15054 nt = get_gnu_elf_note_type (pnote->type);
15055
15056 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15057 /* NetBSD-specific core file notes. */
15058 nt = get_netbsd_elfcore_note_type (pnote->type);
15059
15060 else if (strneq (pnote->namedata, "SPU/", 4))
15061 {
15062 /* SPU-specific core file notes. */
15063 nt = pnote->namedata + 4;
15064 name = "SPU";
15065 }
15066
15067 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15068 /* VMS/ia64-specific file notes. */
15069 nt = get_ia64_vms_note_type (pnote->type);
15070
15071 else if (const_strneq (pnote->namedata, "stapsdt"))
15072 nt = get_stapsdt_note_type (pnote->type);
15073
15074 else
15075 /* Don't recognize this note name; just use the default set of
15076 note type strings. */
15077 nt = get_note_type (pnote->type);
15078
15079 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15080
15081 if (const_strneq (pnote->namedata, "IPF/VMS"))
15082 return print_ia64_vms_note (pnote);
15083 else if (const_strneq (pnote->namedata, "GNU"))
15084 return print_gnu_note (pnote);
15085 else if (const_strneq (pnote->namedata, "stapsdt"))
15086 return print_stapsdt_note (pnote);
15087 else if (const_strneq (pnote->namedata, "CORE"))
15088 return print_core_note (pnote);
15089 else
15090 return 1;
15091 }
15092
15093
15094 static int
15095 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15096 {
15097 Elf_External_Note * pnotes;
15098 Elf_External_Note * external;
15099 int res = 1;
15100
15101 if (length <= 0)
15102 return 0;
15103
15104 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15105 _("notes"));
15106 if (pnotes == NULL)
15107 return 0;
15108
15109 external = pnotes;
15110
15111 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15112 (unsigned long) offset, (unsigned long) length);
15113 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15114
15115 while ((char *) external < (char *) pnotes + length)
15116 {
15117 Elf_Internal_Note inote;
15118 size_t min_notesz;
15119 char *next;
15120 char * temp = NULL;
15121 size_t data_remaining = ((char *) pnotes + length) - (char *) external;
15122
15123 if (!is_ia64_vms ())
15124 {
15125 /* PR binutils/15191
15126 Make sure that there is enough data to read. */
15127 min_notesz = offsetof (Elf_External_Note, name);
15128 if (data_remaining < min_notesz)
15129 {
15130 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15131 (int) data_remaining);
15132 break;
15133 }
15134 inote.type = BYTE_GET (external->type);
15135 inote.namesz = BYTE_GET (external->namesz);
15136 inote.namedata = external->name;
15137 inote.descsz = BYTE_GET (external->descsz);
15138 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15139 /* PR 17531: file: 3443835e. */
15140 if (inote.descdata < (char *) pnotes)
15141 {
15142 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15143 inote.descdata = inote.namedata;
15144 inote.namesz = 0;
15145 }
15146 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15147 next = inote.descdata + align_power (inote.descsz, 2);
15148 }
15149 else
15150 {
15151 Elf64_External_VMS_Note *vms_external;
15152
15153 /* PR binutils/15191
15154 Make sure that there is enough data to read. */
15155 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15156 if (data_remaining < min_notesz)
15157 {
15158 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15159 (int) data_remaining);
15160 break;
15161 }
15162
15163 vms_external = (Elf64_External_VMS_Note *) external;
15164 inote.type = BYTE_GET (vms_external->type);
15165 inote.namesz = BYTE_GET (vms_external->namesz);
15166 inote.namedata = vms_external->name;
15167 inote.descsz = BYTE_GET (vms_external->descsz);
15168 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15169 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15170 next = inote.descdata + align_power (inote.descsz, 3);
15171 }
15172
15173 if (inote.descdata < (char *) external + min_notesz
15174 || next < (char *) external + min_notesz
15175 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15176 || inote.namedata + inote.namesz < inote.namedata
15177 || inote.descdata + inote.descsz < inote.descdata
15178 || data_remaining < (size_t)(next - (char *) external))
15179 {
15180 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15181 (unsigned long) ((char *) external - (char *) pnotes));
15182 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15183 inote.type, inote.namesz, inote.descsz);
15184 break;
15185 }
15186
15187 external = (Elf_External_Note *) next;
15188
15189 /* Verify that name is null terminated. It appears that at least
15190 one version of Linux (RedHat 6.0) generates corefiles that don't
15191 comply with the ELF spec by failing to include the null byte in
15192 namesz. */
15193 if (inote.namedata[inote.namesz - 1] != '\0')
15194 {
15195 temp = (char *) malloc (inote.namesz + 1);
15196 if (temp == NULL)
15197 {
15198 error (_("Out of memory allocating space for inote name\n"));
15199 res = 0;
15200 break;
15201 }
15202
15203 strncpy (temp, inote.namedata, inote.namesz);
15204 temp[inote.namesz] = 0;
15205
15206 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15207 inote.namedata = temp;
15208 }
15209
15210 res &= process_note (& inote);
15211
15212 if (temp != NULL)
15213 {
15214 free (temp);
15215 temp = NULL;
15216 }
15217 }
15218
15219 free (pnotes);
15220
15221 return res;
15222 }
15223
15224 static int
15225 process_corefile_note_segments (FILE * file)
15226 {
15227 Elf_Internal_Phdr * segment;
15228 unsigned int i;
15229 int res = 1;
15230
15231 if (! get_program_headers (file))
15232 return 0;
15233
15234 for (i = 0, segment = program_headers;
15235 i < elf_header.e_phnum;
15236 i++, segment++)
15237 {
15238 if (segment->p_type == PT_NOTE)
15239 res &= process_corefile_note_segment (file,
15240 (bfd_vma) segment->p_offset,
15241 (bfd_vma) segment->p_filesz);
15242 }
15243
15244 return res;
15245 }
15246
15247 static int
15248 process_note_sections (FILE * file)
15249 {
15250 Elf_Internal_Shdr * section;
15251 unsigned long i;
15252 int n = 0;
15253 int res = 1;
15254
15255 for (i = 0, section = section_headers;
15256 i < elf_header.e_shnum && section != NULL;
15257 i++, section++)
15258 if (section->sh_type == SHT_NOTE)
15259 {
15260 res &= process_corefile_note_segment (file,
15261 (bfd_vma) section->sh_offset,
15262 (bfd_vma) section->sh_size);
15263 n++;
15264 }
15265
15266 if (n == 0)
15267 /* Try processing NOTE segments instead. */
15268 return process_corefile_note_segments (file);
15269
15270 return res;
15271 }
15272
15273 static int
15274 process_notes (FILE * file)
15275 {
15276 /* If we have not been asked to display the notes then do nothing. */
15277 if (! do_notes)
15278 return 1;
15279
15280 if (elf_header.e_type != ET_CORE)
15281 return process_note_sections (file);
15282
15283 /* No program headers means no NOTE segment. */
15284 if (elf_header.e_phnum > 0)
15285 return process_corefile_note_segments (file);
15286
15287 printf (_("No note segments present in the core file.\n"));
15288 return 1;
15289 }
15290
15291 static int
15292 process_arch_specific (FILE * file)
15293 {
15294 if (! do_arch)
15295 return 1;
15296
15297 switch (elf_header.e_machine)
15298 {
15299 case EM_ARM:
15300 return process_arm_specific (file);
15301 case EM_MIPS:
15302 case EM_MIPS_RS3_LE:
15303 return process_mips_specific (file);
15304 break;
15305 case EM_NDS32:
15306 return process_nds32_specific (file);
15307 break;
15308 case EM_PPC:
15309 return process_power_specific (file);
15310 break;
15311 case EM_SPARC:
15312 case EM_SPARC32PLUS:
15313 case EM_SPARCV9:
15314 return process_sparc_specific (file);
15315 break;
15316 case EM_TI_C6000:
15317 return process_tic6x_specific (file);
15318 break;
15319 case EM_MSP430:
15320 return process_msp430x_specific (file);
15321 default:
15322 break;
15323 }
15324 return 1;
15325 }
15326
15327 static int
15328 get_file_header (FILE * file)
15329 {
15330 /* Read in the identity array. */
15331 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
15332 return 0;
15333
15334 /* Determine how to read the rest of the header. */
15335 switch (elf_header.e_ident[EI_DATA])
15336 {
15337 default: /* fall through */
15338 case ELFDATANONE: /* fall through */
15339 case ELFDATA2LSB:
15340 byte_get = byte_get_little_endian;
15341 byte_put = byte_put_little_endian;
15342 break;
15343 case ELFDATA2MSB:
15344 byte_get = byte_get_big_endian;
15345 byte_put = byte_put_big_endian;
15346 break;
15347 }
15348
15349 /* For now we only support 32 bit and 64 bit ELF files. */
15350 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
15351
15352 /* Read in the rest of the header. */
15353 if (is_32bit_elf)
15354 {
15355 Elf32_External_Ehdr ehdr32;
15356
15357 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15358 return 0;
15359
15360 elf_header.e_type = BYTE_GET (ehdr32.e_type);
15361 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
15362 elf_header.e_version = BYTE_GET (ehdr32.e_version);
15363 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
15364 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
15365 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
15366 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
15367 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
15368 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15369 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
15370 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15371 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
15372 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
15373 }
15374 else
15375 {
15376 Elf64_External_Ehdr ehdr64;
15377
15378 /* If we have been compiled with sizeof (bfd_vma) == 4, then
15379 we will not be able to cope with the 64bit data found in
15380 64 ELF files. Detect this now and abort before we start
15381 overwriting things. */
15382 if (sizeof (bfd_vma) < 8)
15383 {
15384 error (_("This instance of readelf has been built without support for a\n\
15385 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15386 return 0;
15387 }
15388
15389 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15390 return 0;
15391
15392 elf_header.e_type = BYTE_GET (ehdr64.e_type);
15393 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
15394 elf_header.e_version = BYTE_GET (ehdr64.e_version);
15395 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
15396 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
15397 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
15398 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
15399 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
15400 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15401 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
15402 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15403 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
15404 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
15405 }
15406
15407 if (elf_header.e_shoff)
15408 {
15409 /* There may be some extensions in the first section header. Don't
15410 bomb if we can't read it. */
15411 if (is_32bit_elf)
15412 get_32bit_section_headers (file, TRUE);
15413 else
15414 get_64bit_section_headers (file, TRUE);
15415 }
15416
15417 return 1;
15418 }
15419
15420 /* Process one ELF object file according to the command line options.
15421 This file may actually be stored in an archive. The file is
15422 positioned at the start of the ELF object. */
15423
15424 static int
15425 process_object (char * file_name, FILE * file)
15426 {
15427 unsigned int i;
15428
15429 if (! get_file_header (file))
15430 {
15431 error (_("%s: Failed to read file header\n"), file_name);
15432 return 1;
15433 }
15434
15435 /* Initialise per file variables. */
15436 for (i = ARRAY_SIZE (version_info); i--;)
15437 version_info[i] = 0;
15438
15439 for (i = ARRAY_SIZE (dynamic_info); i--;)
15440 dynamic_info[i] = 0;
15441 dynamic_info_DT_GNU_HASH = 0;
15442
15443 /* Process the file. */
15444 if (show_name)
15445 printf (_("\nFile: %s\n"), file_name);
15446
15447 /* Initialise the dump_sects array from the cmdline_dump_sects array.
15448 Note we do this even if cmdline_dump_sects is empty because we
15449 must make sure that the dump_sets array is zeroed out before each
15450 object file is processed. */
15451 if (num_dump_sects > num_cmdline_dump_sects)
15452 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15453
15454 if (num_cmdline_dump_sects > 0)
15455 {
15456 if (num_dump_sects == 0)
15457 /* A sneaky way of allocating the dump_sects array. */
15458 request_dump_bynumber (num_cmdline_dump_sects, 0);
15459
15460 assert (num_dump_sects >= num_cmdline_dump_sects);
15461 memcpy (dump_sects, cmdline_dump_sects,
15462 num_cmdline_dump_sects * sizeof (* dump_sects));
15463 }
15464
15465 if (! process_file_header ())
15466 return 1;
15467
15468 if (! process_section_headers (file))
15469 {
15470 /* Without loaded section headers we cannot process lots of
15471 things. */
15472 do_unwind = do_version = do_dump = do_arch = 0;
15473
15474 if (! do_using_dynamic)
15475 do_syms = do_dyn_syms = do_reloc = 0;
15476 }
15477
15478 if (! process_section_groups (file))
15479 {
15480 /* Without loaded section groups we cannot process unwind. */
15481 do_unwind = 0;
15482 }
15483
15484 if (process_program_headers (file))
15485 process_dynamic_section (file);
15486
15487 process_relocs (file);
15488
15489 process_unwind (file);
15490
15491 process_symbol_table (file);
15492
15493 process_syminfo (file);
15494
15495 process_version_sections (file);
15496
15497 process_section_contents (file);
15498
15499 process_notes (file);
15500
15501 process_gnu_liblist (file);
15502
15503 process_arch_specific (file);
15504
15505 if (program_headers)
15506 {
15507 free (program_headers);
15508 program_headers = NULL;
15509 }
15510
15511 if (section_headers)
15512 {
15513 free (section_headers);
15514 section_headers = NULL;
15515 }
15516
15517 if (string_table)
15518 {
15519 free (string_table);
15520 string_table = NULL;
15521 string_table_length = 0;
15522 }
15523
15524 if (dynamic_strings)
15525 {
15526 free (dynamic_strings);
15527 dynamic_strings = NULL;
15528 dynamic_strings_length = 0;
15529 }
15530
15531 if (dynamic_symbols)
15532 {
15533 free (dynamic_symbols);
15534 dynamic_symbols = NULL;
15535 num_dynamic_syms = 0;
15536 }
15537
15538 if (dynamic_syminfo)
15539 {
15540 free (dynamic_syminfo);
15541 dynamic_syminfo = NULL;
15542 }
15543
15544 if (dynamic_section)
15545 {
15546 free (dynamic_section);
15547 dynamic_section = NULL;
15548 }
15549
15550 if (section_headers_groups)
15551 {
15552 free (section_headers_groups);
15553 section_headers_groups = NULL;
15554 }
15555
15556 if (section_groups)
15557 {
15558 struct group_list * g;
15559 struct group_list * next;
15560
15561 for (i = 0; i < group_count; i++)
15562 {
15563 for (g = section_groups [i].root; g != NULL; g = next)
15564 {
15565 next = g->next;
15566 free (g);
15567 }
15568 }
15569
15570 free (section_groups);
15571 section_groups = NULL;
15572 }
15573
15574 free_debug_memory ();
15575
15576 return 0;
15577 }
15578
15579 /* Process an ELF archive.
15580 On entry the file is positioned just after the ARMAG string. */
15581
15582 static int
15583 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15584 {
15585 struct archive_info arch;
15586 struct archive_info nested_arch;
15587 size_t got;
15588 int ret;
15589
15590 show_name = 1;
15591
15592 /* The ARCH structure is used to hold information about this archive. */
15593 arch.file_name = NULL;
15594 arch.file = NULL;
15595 arch.index_array = NULL;
15596 arch.sym_table = NULL;
15597 arch.longnames = NULL;
15598
15599 /* The NESTED_ARCH structure is used as a single-item cache of information
15600 about a nested archive (when members of a thin archive reside within
15601 another regular archive file). */
15602 nested_arch.file_name = NULL;
15603 nested_arch.file = NULL;
15604 nested_arch.index_array = NULL;
15605 nested_arch.sym_table = NULL;
15606 nested_arch.longnames = NULL;
15607
15608 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15609 {
15610 ret = 1;
15611 goto out;
15612 }
15613
15614 if (do_archive_index)
15615 {
15616 if (arch.sym_table == NULL)
15617 error (_("%s: unable to dump the index as none was found\n"), file_name);
15618 else
15619 {
15620 unsigned long i, l;
15621 unsigned long current_pos;
15622
15623 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
15624 file_name, (unsigned long) arch.index_num, arch.sym_size);
15625 current_pos = ftell (file);
15626
15627 for (i = l = 0; i < arch.index_num; i++)
15628 {
15629 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15630 {
15631 char * member_name;
15632
15633 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15634
15635 if (member_name != NULL)
15636 {
15637 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15638
15639 if (qualified_name != NULL)
15640 {
15641 printf (_("Contents of binary %s at offset "), qualified_name);
15642 (void) print_vma (arch.index_array[i], PREFIX_HEX);
15643 putchar ('\n');
15644 free (qualified_name);
15645 }
15646 }
15647 }
15648
15649 if (l >= arch.sym_size)
15650 {
15651 error (_("%s: end of the symbol table reached before the end of the index\n"),
15652 file_name);
15653 break;
15654 }
15655 /* PR 17531: file: 0b6630b2. */
15656 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
15657 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
15658 }
15659
15660 if (arch.uses_64bit_indicies)
15661 l = (l + 7) & ~ 7;
15662 else
15663 l += l & 1;
15664
15665 if (l < arch.sym_size)
15666 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15667 file_name, arch.sym_size - l);
15668
15669 if (fseek (file, current_pos, SEEK_SET) != 0)
15670 {
15671 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15672 ret = 1;
15673 goto out;
15674 }
15675 }
15676
15677 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15678 && !do_segments && !do_header && !do_dump && !do_version
15679 && !do_histogram && !do_debugging && !do_arch && !do_notes
15680 && !do_section_groups && !do_dyn_syms)
15681 {
15682 ret = 0; /* Archive index only. */
15683 goto out;
15684 }
15685 }
15686
15687 ret = 0;
15688
15689 while (1)
15690 {
15691 char * name;
15692 size_t namelen;
15693 char * qualified_name;
15694
15695 /* Read the next archive header. */
15696 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15697 {
15698 error (_("%s: failed to seek to next archive header\n"), file_name);
15699 return 1;
15700 }
15701 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15702 if (got != sizeof arch.arhdr)
15703 {
15704 if (got == 0)
15705 break;
15706 error (_("%s: failed to read archive header\n"), file_name);
15707 ret = 1;
15708 break;
15709 }
15710 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15711 {
15712 error (_("%s: did not find a valid archive header\n"), arch.file_name);
15713 ret = 1;
15714 break;
15715 }
15716
15717 arch.next_arhdr_offset += sizeof arch.arhdr;
15718
15719 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15720 if (archive_file_size & 01)
15721 ++archive_file_size;
15722
15723 name = get_archive_member_name (&arch, &nested_arch);
15724 if (name == NULL)
15725 {
15726 error (_("%s: bad archive file name\n"), file_name);
15727 ret = 1;
15728 break;
15729 }
15730 namelen = strlen (name);
15731
15732 qualified_name = make_qualified_name (&arch, &nested_arch, name);
15733 if (qualified_name == NULL)
15734 {
15735 error (_("%s: bad archive file name\n"), file_name);
15736 ret = 1;
15737 break;
15738 }
15739
15740 if (is_thin_archive && arch.nested_member_origin == 0)
15741 {
15742 /* This is a proxy for an external member of a thin archive. */
15743 FILE * member_file;
15744 char * member_file_name = adjust_relative_path (file_name, name, namelen);
15745 if (member_file_name == NULL)
15746 {
15747 ret = 1;
15748 break;
15749 }
15750
15751 member_file = fopen (member_file_name, "rb");
15752 if (member_file == NULL)
15753 {
15754 error (_("Input file '%s' is not readable.\n"), member_file_name);
15755 free (member_file_name);
15756 ret = 1;
15757 break;
15758 }
15759
15760 archive_file_offset = arch.nested_member_origin;
15761
15762 ret |= process_object (qualified_name, member_file);
15763
15764 fclose (member_file);
15765 free (member_file_name);
15766 }
15767 else if (is_thin_archive)
15768 {
15769 /* PR 15140: Allow for corrupt thin archives. */
15770 if (nested_arch.file == NULL)
15771 {
15772 error (_("%s: contains corrupt thin archive: %s\n"),
15773 file_name, name);
15774 ret = 1;
15775 break;
15776 }
15777
15778 /* This is a proxy for a member of a nested archive. */
15779 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15780
15781 /* The nested archive file will have been opened and setup by
15782 get_archive_member_name. */
15783 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15784 {
15785 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15786 ret = 1;
15787 break;
15788 }
15789
15790 ret |= process_object (qualified_name, nested_arch.file);
15791 }
15792 else
15793 {
15794 archive_file_offset = arch.next_arhdr_offset;
15795 arch.next_arhdr_offset += archive_file_size;
15796
15797 ret |= process_object (qualified_name, file);
15798 }
15799
15800 if (dump_sects != NULL)
15801 {
15802 free (dump_sects);
15803 dump_sects = NULL;
15804 num_dump_sects = 0;
15805 }
15806
15807 free (qualified_name);
15808 }
15809
15810 out:
15811 if (nested_arch.file != NULL)
15812 fclose (nested_arch.file);
15813 release_archive (&nested_arch);
15814 release_archive (&arch);
15815
15816 return ret;
15817 }
15818
15819 static int
15820 process_file (char * file_name)
15821 {
15822 FILE * file;
15823 struct stat statbuf;
15824 char armag[SARMAG];
15825 int ret;
15826
15827 if (stat (file_name, &statbuf) < 0)
15828 {
15829 if (errno == ENOENT)
15830 error (_("'%s': No such file\n"), file_name);
15831 else
15832 error (_("Could not locate '%s'. System error message: %s\n"),
15833 file_name, strerror (errno));
15834 return 1;
15835 }
15836
15837 if (! S_ISREG (statbuf.st_mode))
15838 {
15839 error (_("'%s' is not an ordinary file\n"), file_name);
15840 return 1;
15841 }
15842
15843 file = fopen (file_name, "rb");
15844 if (file == NULL)
15845 {
15846 error (_("Input file '%s' is not readable.\n"), file_name);
15847 return 1;
15848 }
15849
15850 if (fread (armag, SARMAG, 1, file) != 1)
15851 {
15852 error (_("%s: Failed to read file's magic number\n"), file_name);
15853 fclose (file);
15854 return 1;
15855 }
15856
15857 current_file_size = (bfd_size_type) statbuf.st_size;
15858
15859 if (memcmp (armag, ARMAG, SARMAG) == 0)
15860 ret = process_archive (file_name, file, FALSE);
15861 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15862 ret = process_archive (file_name, file, TRUE);
15863 else
15864 {
15865 if (do_archive_index)
15866 error (_("File %s is not an archive so its index cannot be displayed.\n"),
15867 file_name);
15868
15869 rewind (file);
15870 archive_file_size = archive_file_offset = 0;
15871 ret = process_object (file_name, file);
15872 }
15873
15874 fclose (file);
15875
15876 current_file_size = 0;
15877 return ret;
15878 }
15879
15880 #ifdef SUPPORT_DISASSEMBLY
15881 /* Needed by the i386 disassembler. For extra credit, someone could
15882 fix this so that we insert symbolic addresses here, esp for GOT/PLT
15883 symbols. */
15884
15885 void
15886 print_address (unsigned int addr, FILE * outfile)
15887 {
15888 fprintf (outfile,"0x%8.8x", addr);
15889 }
15890
15891 /* Needed by the i386 disassembler. */
15892 void
15893 db_task_printsym (unsigned int addr)
15894 {
15895 print_address (addr, stderr);
15896 }
15897 #endif
15898
15899 int
15900 main (int argc, char ** argv)
15901 {
15902 int err;
15903
15904 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15905 setlocale (LC_MESSAGES, "");
15906 #endif
15907 #if defined (HAVE_SETLOCALE)
15908 setlocale (LC_CTYPE, "");
15909 #endif
15910 bindtextdomain (PACKAGE, LOCALEDIR);
15911 textdomain (PACKAGE);
15912
15913 expandargv (&argc, &argv);
15914
15915 parse_args (argc, argv);
15916
15917 if (num_dump_sects > 0)
15918 {
15919 /* Make a copy of the dump_sects array. */
15920 cmdline_dump_sects = (dump_type *)
15921 malloc (num_dump_sects * sizeof (* dump_sects));
15922 if (cmdline_dump_sects == NULL)
15923 error (_("Out of memory allocating dump request table.\n"));
15924 else
15925 {
15926 memcpy (cmdline_dump_sects, dump_sects,
15927 num_dump_sects * sizeof (* dump_sects));
15928 num_cmdline_dump_sects = num_dump_sects;
15929 }
15930 }
15931
15932 if (optind < (argc - 1))
15933 show_name = 1;
15934
15935 err = 0;
15936 while (optind < argc)
15937 err |= process_file (argv[optind++]);
15938
15939 if (dump_sects != NULL)
15940 free (dump_sects);
15941 if (cmdline_dump_sects != NULL)
15942 free (cmdline_dump_sects);
15943
15944 return err;
15945 }