]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
[ARM]Update for Tag_ABI_HardFP_use per EABI doc
[thirdparty/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_REGMODE22: strcat (buf, ", regmode:22"); break;
2956 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2957 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2958 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2959 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2960 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2961 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2962 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2963 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2964 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2965 default: break;
2966 }
2967 }
2968 break;
2969
2970 case EM_V850:
2971 case EM_CYGNUS_V850:
2972 switch (e_flags & EF_V850_ARCH)
2973 {
2974 case E_V850E3V5_ARCH:
2975 strcat (buf, ", v850e3v5");
2976 break;
2977 case E_V850E2V3_ARCH:
2978 strcat (buf, ", v850e2v3");
2979 break;
2980 case E_V850E2_ARCH:
2981 strcat (buf, ", v850e2");
2982 break;
2983 case E_V850E1_ARCH:
2984 strcat (buf, ", v850e1");
2985 break;
2986 case E_V850E_ARCH:
2987 strcat (buf, ", v850e");
2988 break;
2989 case E_V850_ARCH:
2990 strcat (buf, ", v850");
2991 break;
2992 default:
2993 strcat (buf, _(", unknown v850 architecture variant"));
2994 break;
2995 }
2996 break;
2997
2998 case EM_M32R:
2999 case EM_CYGNUS_M32R:
3000 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3001 strcat (buf, ", m32r");
3002 break;
3003
3004 case EM_MIPS:
3005 case EM_MIPS_RS3_LE:
3006 if (e_flags & EF_MIPS_NOREORDER)
3007 strcat (buf, ", noreorder");
3008
3009 if (e_flags & EF_MIPS_PIC)
3010 strcat (buf, ", pic");
3011
3012 if (e_flags & EF_MIPS_CPIC)
3013 strcat (buf, ", cpic");
3014
3015 if (e_flags & EF_MIPS_UCODE)
3016 strcat (buf, ", ugen_reserved");
3017
3018 if (e_flags & EF_MIPS_ABI2)
3019 strcat (buf, ", abi2");
3020
3021 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3022 strcat (buf, ", odk first");
3023
3024 if (e_flags & EF_MIPS_32BITMODE)
3025 strcat (buf, ", 32bitmode");
3026
3027 if (e_flags & EF_MIPS_NAN2008)
3028 strcat (buf, ", nan2008");
3029
3030 if (e_flags & EF_MIPS_FP64)
3031 strcat (buf, ", fp64");
3032
3033 switch ((e_flags & EF_MIPS_MACH))
3034 {
3035 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3036 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3037 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3038 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3039 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3040 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3041 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3042 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3043 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3044 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3045 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3046 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3047 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3048 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3049 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3050 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3051 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3052 case 0:
3053 /* We simply ignore the field in this case to avoid confusion:
3054 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3055 extension. */
3056 break;
3057 default: strcat (buf, _(", unknown CPU")); break;
3058 }
3059
3060 switch ((e_flags & EF_MIPS_ABI))
3061 {
3062 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3063 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3064 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3065 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3066 case 0:
3067 /* We simply ignore the field in this case to avoid confusion:
3068 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3069 This means it is likely to be an o32 file, but not for
3070 sure. */
3071 break;
3072 default: strcat (buf, _(", unknown ABI")); break;
3073 }
3074
3075 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3076 strcat (buf, ", mdmx");
3077
3078 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3079 strcat (buf, ", mips16");
3080
3081 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3082 strcat (buf, ", micromips");
3083
3084 switch ((e_flags & EF_MIPS_ARCH))
3085 {
3086 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3087 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3088 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3089 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3090 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3091 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3092 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3093 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3094 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3095 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3096 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3097 default: strcat (buf, _(", unknown ISA")); break;
3098 }
3099 break;
3100
3101 case EM_NDS32:
3102 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3103 break;
3104
3105 case EM_SH:
3106 switch ((e_flags & EF_SH_MACH_MASK))
3107 {
3108 case EF_SH1: strcat (buf, ", sh1"); break;
3109 case EF_SH2: strcat (buf, ", sh2"); break;
3110 case EF_SH3: strcat (buf, ", sh3"); break;
3111 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3112 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3113 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3114 case EF_SH3E: strcat (buf, ", sh3e"); break;
3115 case EF_SH4: strcat (buf, ", sh4"); break;
3116 case EF_SH5: strcat (buf, ", sh5"); break;
3117 case EF_SH2E: strcat (buf, ", sh2e"); break;
3118 case EF_SH4A: strcat (buf, ", sh4a"); break;
3119 case EF_SH2A: strcat (buf, ", sh2a"); break;
3120 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3121 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3122 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3123 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3124 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3125 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3126 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3127 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3128 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3129 default: strcat (buf, _(", unknown ISA")); break;
3130 }
3131
3132 if (e_flags & EF_SH_PIC)
3133 strcat (buf, ", pic");
3134
3135 if (e_flags & EF_SH_FDPIC)
3136 strcat (buf, ", fdpic");
3137 break;
3138
3139 case EM_OR1K:
3140 if (e_flags & EF_OR1K_NODELAY)
3141 strcat (buf, ", no delay");
3142 break;
3143
3144 case EM_SPARCV9:
3145 if (e_flags & EF_SPARC_32PLUS)
3146 strcat (buf, ", v8+");
3147
3148 if (e_flags & EF_SPARC_SUN_US1)
3149 strcat (buf, ", ultrasparcI");
3150
3151 if (e_flags & EF_SPARC_SUN_US3)
3152 strcat (buf, ", ultrasparcIII");
3153
3154 if (e_flags & EF_SPARC_HAL_R1)
3155 strcat (buf, ", halr1");
3156
3157 if (e_flags & EF_SPARC_LEDATA)
3158 strcat (buf, ", ledata");
3159
3160 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3161 strcat (buf, ", tso");
3162
3163 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3164 strcat (buf, ", pso");
3165
3166 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3167 strcat (buf, ", rmo");
3168 break;
3169
3170 case EM_PARISC:
3171 switch (e_flags & EF_PARISC_ARCH)
3172 {
3173 case EFA_PARISC_1_0:
3174 strcpy (buf, ", PA-RISC 1.0");
3175 break;
3176 case EFA_PARISC_1_1:
3177 strcpy (buf, ", PA-RISC 1.1");
3178 break;
3179 case EFA_PARISC_2_0:
3180 strcpy (buf, ", PA-RISC 2.0");
3181 break;
3182 default:
3183 break;
3184 }
3185 if (e_flags & EF_PARISC_TRAPNIL)
3186 strcat (buf, ", trapnil");
3187 if (e_flags & EF_PARISC_EXT)
3188 strcat (buf, ", ext");
3189 if (e_flags & EF_PARISC_LSB)
3190 strcat (buf, ", lsb");
3191 if (e_flags & EF_PARISC_WIDE)
3192 strcat (buf, ", wide");
3193 if (e_flags & EF_PARISC_NO_KABP)
3194 strcat (buf, ", no kabp");
3195 if (e_flags & EF_PARISC_LAZYSWAP)
3196 strcat (buf, ", lazyswap");
3197 break;
3198
3199 case EM_PJ:
3200 case EM_PJ_OLD:
3201 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3202 strcat (buf, ", new calling convention");
3203
3204 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3205 strcat (buf, ", gnu calling convention");
3206 break;
3207
3208 case EM_IA_64:
3209 if ((e_flags & EF_IA_64_ABI64))
3210 strcat (buf, ", 64-bit");
3211 else
3212 strcat (buf, ", 32-bit");
3213 if ((e_flags & EF_IA_64_REDUCEDFP))
3214 strcat (buf, ", reduced fp model");
3215 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3216 strcat (buf, ", no function descriptors, constant gp");
3217 else if ((e_flags & EF_IA_64_CONS_GP))
3218 strcat (buf, ", constant gp");
3219 if ((e_flags & EF_IA_64_ABSOLUTE))
3220 strcat (buf, ", absolute");
3221 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3222 {
3223 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3224 strcat (buf, ", vms_linkages");
3225 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3226 {
3227 case EF_IA_64_VMS_COMCOD_SUCCESS:
3228 break;
3229 case EF_IA_64_VMS_COMCOD_WARNING:
3230 strcat (buf, ", warning");
3231 break;
3232 case EF_IA_64_VMS_COMCOD_ERROR:
3233 strcat (buf, ", error");
3234 break;
3235 case EF_IA_64_VMS_COMCOD_ABORT:
3236 strcat (buf, ", abort");
3237 break;
3238 default:
3239 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3240 e_flags & EF_IA_64_VMS_COMCOD);
3241 strcat (buf, ", <unknown>");
3242 }
3243 }
3244 break;
3245
3246 case EM_VAX:
3247 if ((e_flags & EF_VAX_NONPIC))
3248 strcat (buf, ", non-PIC");
3249 if ((e_flags & EF_VAX_DFLOAT))
3250 strcat (buf, ", D-Float");
3251 if ((e_flags & EF_VAX_GFLOAT))
3252 strcat (buf, ", G-Float");
3253 break;
3254
3255 case EM_VISIUM:
3256 if (e_flags & EF_VISIUM_ARCH_MCM)
3257 strcat (buf, ", mcm");
3258 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3259 strcat (buf, ", mcm24");
3260 if (e_flags & EF_VISIUM_ARCH_GR6)
3261 strcat (buf, ", gr6");
3262 break;
3263
3264 case EM_RL78:
3265 if (e_flags & E_FLAG_RL78_G10)
3266 strcat (buf, ", G10");
3267 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3268 strcat (buf, ", 64-bit doubles");
3269 break;
3270
3271 case EM_RX:
3272 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3273 strcat (buf, ", 64-bit doubles");
3274 if (e_flags & E_FLAG_RX_DSP)
3275 strcat (buf, ", dsp");
3276 if (e_flags & E_FLAG_RX_PID)
3277 strcat (buf, ", pid");
3278 if (e_flags & E_FLAG_RX_ABI)
3279 strcat (buf, ", RX ABI");
3280 break;
3281
3282 case EM_S390:
3283 if (e_flags & EF_S390_HIGH_GPRS)
3284 strcat (buf, ", highgprs");
3285 break;
3286
3287 case EM_TI_C6000:
3288 if ((e_flags & EF_C6000_REL))
3289 strcat (buf, ", relocatable module");
3290 break;
3291
3292 case EM_MSP430:
3293 strcat (buf, _(": architecture variant: "));
3294 switch (e_flags & EF_MSP430_MACH)
3295 {
3296 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3297 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3298 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3299 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3300 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3301 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3302 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3303 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3304 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3305 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3306 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3307 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3308 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3309 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3310 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3311 default:
3312 strcat (buf, _(": unknown")); break;
3313 }
3314
3315 if (e_flags & ~ EF_MSP430_MACH)
3316 strcat (buf, _(": unknown extra flag bits also present"));
3317 }
3318 }
3319
3320 return buf;
3321 }
3322
3323 static const char *
3324 get_osabi_name (unsigned int osabi)
3325 {
3326 static char buff[32];
3327
3328 switch (osabi)
3329 {
3330 case ELFOSABI_NONE: return "UNIX - System V";
3331 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3332 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3333 case ELFOSABI_GNU: return "UNIX - GNU";
3334 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3335 case ELFOSABI_AIX: return "UNIX - AIX";
3336 case ELFOSABI_IRIX: return "UNIX - IRIX";
3337 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3338 case ELFOSABI_TRU64: return "UNIX - TRU64";
3339 case ELFOSABI_MODESTO: return "Novell - Modesto";
3340 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3341 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3342 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3343 case ELFOSABI_AROS: return "AROS";
3344 case ELFOSABI_FENIXOS: return "FenixOS";
3345 default:
3346 if (osabi >= 64)
3347 switch (elf_header.e_machine)
3348 {
3349 case EM_ARM:
3350 switch (osabi)
3351 {
3352 case ELFOSABI_ARM: return "ARM";
3353 default:
3354 break;
3355 }
3356 break;
3357
3358 case EM_MSP430:
3359 case EM_MSP430_OLD:
3360 case EM_VISIUM:
3361 switch (osabi)
3362 {
3363 case ELFOSABI_STANDALONE: return _("Standalone App");
3364 default:
3365 break;
3366 }
3367 break;
3368
3369 case EM_TI_C6000:
3370 switch (osabi)
3371 {
3372 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3373 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3374 default:
3375 break;
3376 }
3377 break;
3378
3379 default:
3380 break;
3381 }
3382 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3383 return buff;
3384 }
3385 }
3386
3387 static const char *
3388 get_aarch64_segment_type (unsigned long type)
3389 {
3390 switch (type)
3391 {
3392 case PT_AARCH64_ARCHEXT:
3393 return "AARCH64_ARCHEXT";
3394 default:
3395 break;
3396 }
3397
3398 return NULL;
3399 }
3400
3401 static const char *
3402 get_arm_segment_type (unsigned long type)
3403 {
3404 switch (type)
3405 {
3406 case PT_ARM_EXIDX:
3407 return "EXIDX";
3408 default:
3409 break;
3410 }
3411
3412 return NULL;
3413 }
3414
3415 static const char *
3416 get_mips_segment_type (unsigned long type)
3417 {
3418 switch (type)
3419 {
3420 case PT_MIPS_REGINFO:
3421 return "REGINFO";
3422 case PT_MIPS_RTPROC:
3423 return "RTPROC";
3424 case PT_MIPS_OPTIONS:
3425 return "OPTIONS";
3426 case PT_MIPS_ABIFLAGS:
3427 return "ABIFLAGS";
3428 default:
3429 break;
3430 }
3431
3432 return NULL;
3433 }
3434
3435 static const char *
3436 get_parisc_segment_type (unsigned long type)
3437 {
3438 switch (type)
3439 {
3440 case PT_HP_TLS: return "HP_TLS";
3441 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3442 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3443 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3444 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3445 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3446 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3447 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3448 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3449 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3450 case PT_HP_PARALLEL: return "HP_PARALLEL";
3451 case PT_HP_FASTBIND: return "HP_FASTBIND";
3452 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3453 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3454 case PT_HP_STACK: return "HP_STACK";
3455 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3456 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3457 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3458 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3459 default:
3460 break;
3461 }
3462
3463 return NULL;
3464 }
3465
3466 static const char *
3467 get_ia64_segment_type (unsigned long type)
3468 {
3469 switch (type)
3470 {
3471 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3472 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3473 case PT_HP_TLS: return "HP_TLS";
3474 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3475 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3476 case PT_IA_64_HP_STACK: return "HP_STACK";
3477 default:
3478 break;
3479 }
3480
3481 return NULL;
3482 }
3483
3484 static const char *
3485 get_tic6x_segment_type (unsigned long type)
3486 {
3487 switch (type)
3488 {
3489 case PT_C6000_PHATTR: return "C6000_PHATTR";
3490 default:
3491 break;
3492 }
3493
3494 return NULL;
3495 }
3496
3497 static const char *
3498 get_segment_type (unsigned long p_type)
3499 {
3500 static char buff[32];
3501
3502 switch (p_type)
3503 {
3504 case PT_NULL: return "NULL";
3505 case PT_LOAD: return "LOAD";
3506 case PT_DYNAMIC: return "DYNAMIC";
3507 case PT_INTERP: return "INTERP";
3508 case PT_NOTE: return "NOTE";
3509 case PT_SHLIB: return "SHLIB";
3510 case PT_PHDR: return "PHDR";
3511 case PT_TLS: return "TLS";
3512
3513 case PT_GNU_EH_FRAME:
3514 return "GNU_EH_FRAME";
3515 case PT_GNU_STACK: return "GNU_STACK";
3516 case PT_GNU_RELRO: return "GNU_RELRO";
3517
3518 default:
3519 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3520 {
3521 const char * result;
3522
3523 switch (elf_header.e_machine)
3524 {
3525 case EM_AARCH64:
3526 result = get_aarch64_segment_type (p_type);
3527 break;
3528 case EM_ARM:
3529 result = get_arm_segment_type (p_type);
3530 break;
3531 case EM_MIPS:
3532 case EM_MIPS_RS3_LE:
3533 result = get_mips_segment_type (p_type);
3534 break;
3535 case EM_PARISC:
3536 result = get_parisc_segment_type (p_type);
3537 break;
3538 case EM_IA_64:
3539 result = get_ia64_segment_type (p_type);
3540 break;
3541 case EM_TI_C6000:
3542 result = get_tic6x_segment_type (p_type);
3543 break;
3544 default:
3545 result = NULL;
3546 break;
3547 }
3548
3549 if (result != NULL)
3550 return result;
3551
3552 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3553 }
3554 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3555 {
3556 const char * result;
3557
3558 switch (elf_header.e_machine)
3559 {
3560 case EM_PARISC:
3561 result = get_parisc_segment_type (p_type);
3562 break;
3563 case EM_IA_64:
3564 result = get_ia64_segment_type (p_type);
3565 break;
3566 default:
3567 result = NULL;
3568 break;
3569 }
3570
3571 if (result != NULL)
3572 return result;
3573
3574 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3575 }
3576 else
3577 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3578
3579 return buff;
3580 }
3581 }
3582
3583 static const char *
3584 get_mips_section_type_name (unsigned int sh_type)
3585 {
3586 switch (sh_type)
3587 {
3588 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3589 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3590 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3591 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3592 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3593 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3594 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3595 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3596 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3597 case SHT_MIPS_RELD: return "MIPS_RELD";
3598 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3599 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3600 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3601 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3602 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3603 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3604 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3605 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3606 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3607 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3608 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3609 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3610 case SHT_MIPS_LINE: return "MIPS_LINE";
3611 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3612 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3613 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3614 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3615 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3616 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3617 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3618 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3619 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3620 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3621 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3622 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3623 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3624 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3625 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3626 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3627 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3628 default:
3629 break;
3630 }
3631 return NULL;
3632 }
3633
3634 static const char *
3635 get_parisc_section_type_name (unsigned int sh_type)
3636 {
3637 switch (sh_type)
3638 {
3639 case SHT_PARISC_EXT: return "PARISC_EXT";
3640 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3641 case SHT_PARISC_DOC: return "PARISC_DOC";
3642 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3643 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3644 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3645 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3646 default:
3647 break;
3648 }
3649 return NULL;
3650 }
3651
3652 static const char *
3653 get_ia64_section_type_name (unsigned int sh_type)
3654 {
3655 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3656 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3657 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3658
3659 switch (sh_type)
3660 {
3661 case SHT_IA_64_EXT: return "IA_64_EXT";
3662 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3663 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3664 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3665 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3666 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3667 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3668 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3669 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3670 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3671 default:
3672 break;
3673 }
3674 return NULL;
3675 }
3676
3677 static const char *
3678 get_x86_64_section_type_name (unsigned int sh_type)
3679 {
3680 switch (sh_type)
3681 {
3682 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3683 default:
3684 break;
3685 }
3686 return NULL;
3687 }
3688
3689 static const char *
3690 get_aarch64_section_type_name (unsigned int sh_type)
3691 {
3692 switch (sh_type)
3693 {
3694 case SHT_AARCH64_ATTRIBUTES:
3695 return "AARCH64_ATTRIBUTES";
3696 default:
3697 break;
3698 }
3699 return NULL;
3700 }
3701
3702 static const char *
3703 get_arm_section_type_name (unsigned int sh_type)
3704 {
3705 switch (sh_type)
3706 {
3707 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3708 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3709 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3710 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3711 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3712 default:
3713 break;
3714 }
3715 return NULL;
3716 }
3717
3718 static const char *
3719 get_tic6x_section_type_name (unsigned int sh_type)
3720 {
3721 switch (sh_type)
3722 {
3723 case SHT_C6000_UNWIND:
3724 return "C6000_UNWIND";
3725 case SHT_C6000_PREEMPTMAP:
3726 return "C6000_PREEMPTMAP";
3727 case SHT_C6000_ATTRIBUTES:
3728 return "C6000_ATTRIBUTES";
3729 case SHT_TI_ICODE:
3730 return "TI_ICODE";
3731 case SHT_TI_XREF:
3732 return "TI_XREF";
3733 case SHT_TI_HANDLER:
3734 return "TI_HANDLER";
3735 case SHT_TI_INITINFO:
3736 return "TI_INITINFO";
3737 case SHT_TI_PHATTRS:
3738 return "TI_PHATTRS";
3739 default:
3740 break;
3741 }
3742 return NULL;
3743 }
3744
3745 static const char *
3746 get_msp430x_section_type_name (unsigned int sh_type)
3747 {
3748 switch (sh_type)
3749 {
3750 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3751 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3752 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3753 default: return NULL;
3754 }
3755 }
3756
3757 static const char *
3758 get_v850_section_type_name (unsigned int sh_type)
3759 {
3760 switch (sh_type)
3761 {
3762 case SHT_V850_SCOMMON: return "V850 Small Common";
3763 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3764 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3765 case SHT_RENESAS_IOP: return "RENESAS IOP";
3766 case SHT_RENESAS_INFO: return "RENESAS INFO";
3767 default: return NULL;
3768 }
3769 }
3770
3771 static const char *
3772 get_section_type_name (unsigned int sh_type)
3773 {
3774 static char buff[32];
3775
3776 switch (sh_type)
3777 {
3778 case SHT_NULL: return "NULL";
3779 case SHT_PROGBITS: return "PROGBITS";
3780 case SHT_SYMTAB: return "SYMTAB";
3781 case SHT_STRTAB: return "STRTAB";
3782 case SHT_RELA: return "RELA";
3783 case SHT_HASH: return "HASH";
3784 case SHT_DYNAMIC: return "DYNAMIC";
3785 case SHT_NOTE: return "NOTE";
3786 case SHT_NOBITS: return "NOBITS";
3787 case SHT_REL: return "REL";
3788 case SHT_SHLIB: return "SHLIB";
3789 case SHT_DYNSYM: return "DYNSYM";
3790 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3791 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3792 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3793 case SHT_GNU_HASH: return "GNU_HASH";
3794 case SHT_GROUP: return "GROUP";
3795 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3796 case SHT_GNU_verdef: return "VERDEF";
3797 case SHT_GNU_verneed: return "VERNEED";
3798 case SHT_GNU_versym: return "VERSYM";
3799 case 0x6ffffff0: return "VERSYM";
3800 case 0x6ffffffc: return "VERDEF";
3801 case 0x7ffffffd: return "AUXILIARY";
3802 case 0x7fffffff: return "FILTER";
3803 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3804
3805 default:
3806 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3807 {
3808 const char * result;
3809
3810 switch (elf_header.e_machine)
3811 {
3812 case EM_MIPS:
3813 case EM_MIPS_RS3_LE:
3814 result = get_mips_section_type_name (sh_type);
3815 break;
3816 case EM_PARISC:
3817 result = get_parisc_section_type_name (sh_type);
3818 break;
3819 case EM_IA_64:
3820 result = get_ia64_section_type_name (sh_type);
3821 break;
3822 case EM_X86_64:
3823 case EM_L1OM:
3824 case EM_K1OM:
3825 result = get_x86_64_section_type_name (sh_type);
3826 break;
3827 case EM_AARCH64:
3828 result = get_aarch64_section_type_name (sh_type);
3829 break;
3830 case EM_ARM:
3831 result = get_arm_section_type_name (sh_type);
3832 break;
3833 case EM_TI_C6000:
3834 result = get_tic6x_section_type_name (sh_type);
3835 break;
3836 case EM_MSP430:
3837 result = get_msp430x_section_type_name (sh_type);
3838 break;
3839 case EM_V800:
3840 case EM_V850:
3841 case EM_CYGNUS_V850:
3842 result = get_v850_section_type_name (sh_type);
3843 break;
3844 default:
3845 result = NULL;
3846 break;
3847 }
3848
3849 if (result != NULL)
3850 return result;
3851
3852 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3853 }
3854 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3855 {
3856 const char * result;
3857
3858 switch (elf_header.e_machine)
3859 {
3860 case EM_IA_64:
3861 result = get_ia64_section_type_name (sh_type);
3862 break;
3863 default:
3864 result = NULL;
3865 break;
3866 }
3867
3868 if (result != NULL)
3869 return result;
3870
3871 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3872 }
3873 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3874 {
3875 switch (elf_header.e_machine)
3876 {
3877 case EM_V800:
3878 case EM_V850:
3879 case EM_CYGNUS_V850:
3880 return get_v850_section_type_name (sh_type);
3881 default:
3882 break;
3883 }
3884
3885 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3886 }
3887 else
3888 /* This message is probably going to be displayed in a 15
3889 character wide field, so put the hex value first. */
3890 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3891
3892 return buff;
3893 }
3894 }
3895
3896 #define OPTION_DEBUG_DUMP 512
3897 #define OPTION_DYN_SYMS 513
3898 #define OPTION_DWARF_DEPTH 514
3899 #define OPTION_DWARF_START 515
3900 #define OPTION_DWARF_CHECK 516
3901
3902 static struct option options[] =
3903 {
3904 {"all", no_argument, 0, 'a'},
3905 {"file-header", no_argument, 0, 'h'},
3906 {"program-headers", no_argument, 0, 'l'},
3907 {"headers", no_argument, 0, 'e'},
3908 {"histogram", no_argument, 0, 'I'},
3909 {"segments", no_argument, 0, 'l'},
3910 {"sections", no_argument, 0, 'S'},
3911 {"section-headers", no_argument, 0, 'S'},
3912 {"section-groups", no_argument, 0, 'g'},
3913 {"section-details", no_argument, 0, 't'},
3914 {"full-section-name",no_argument, 0, 'N'},
3915 {"symbols", no_argument, 0, 's'},
3916 {"syms", no_argument, 0, 's'},
3917 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3918 {"relocs", no_argument, 0, 'r'},
3919 {"notes", no_argument, 0, 'n'},
3920 {"dynamic", no_argument, 0, 'd'},
3921 {"arch-specific", no_argument, 0, 'A'},
3922 {"version-info", no_argument, 0, 'V'},
3923 {"use-dynamic", no_argument, 0, 'D'},
3924 {"unwind", no_argument, 0, 'u'},
3925 {"archive-index", no_argument, 0, 'c'},
3926 {"hex-dump", required_argument, 0, 'x'},
3927 {"relocated-dump", required_argument, 0, 'R'},
3928 {"string-dump", required_argument, 0, 'p'},
3929 #ifdef SUPPORT_DISASSEMBLY
3930 {"instruction-dump", required_argument, 0, 'i'},
3931 #endif
3932 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3933
3934 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3935 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3936 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3937
3938 {"version", no_argument, 0, 'v'},
3939 {"wide", no_argument, 0, 'W'},
3940 {"help", no_argument, 0, 'H'},
3941 {0, no_argument, 0, 0}
3942 };
3943
3944 static void
3945 usage (FILE * stream)
3946 {
3947 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3948 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3949 fprintf (stream, _(" Options are:\n\
3950 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3951 -h --file-header Display the ELF file header\n\
3952 -l --program-headers Display the program headers\n\
3953 --segments An alias for --program-headers\n\
3954 -S --section-headers Display the sections' header\n\
3955 --sections An alias for --section-headers\n\
3956 -g --section-groups Display the section groups\n\
3957 -t --section-details Display the section details\n\
3958 -e --headers Equivalent to: -h -l -S\n\
3959 -s --syms Display the symbol table\n\
3960 --symbols An alias for --syms\n\
3961 --dyn-syms Display the dynamic symbol table\n\
3962 -n --notes Display the core notes (if present)\n\
3963 -r --relocs Display the relocations (if present)\n\
3964 -u --unwind Display the unwind info (if present)\n\
3965 -d --dynamic Display the dynamic section (if present)\n\
3966 -V --version-info Display the version sections (if present)\n\
3967 -A --arch-specific Display architecture specific information (if any)\n\
3968 -c --archive-index Display the symbol/file index in an archive\n\
3969 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3970 -x --hex-dump=<number|name>\n\
3971 Dump the contents of section <number|name> as bytes\n\
3972 -p --string-dump=<number|name>\n\
3973 Dump the contents of section <number|name> as strings\n\
3974 -R --relocated-dump=<number|name>\n\
3975 Dump the contents of section <number|name> as relocated bytes\n\
3976 -w[lLiaprmfFsoRt] or\n\
3977 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3978 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3979 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3980 =addr,=cu_index]\n\
3981 Display the contents of DWARF2 debug sections\n"));
3982 fprintf (stream, _("\
3983 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3984 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3985 or deeper\n"));
3986 #ifdef SUPPORT_DISASSEMBLY
3987 fprintf (stream, _("\
3988 -i --instruction-dump=<number|name>\n\
3989 Disassemble the contents of section <number|name>\n"));
3990 #endif
3991 fprintf (stream, _("\
3992 -I --histogram Display histogram of bucket list lengths\n\
3993 -W --wide Allow output width to exceed 80 characters\n\
3994 @<file> Read options from <file>\n\
3995 -H --help Display this information\n\
3996 -v --version Display the version number of readelf\n"));
3997
3998 if (REPORT_BUGS_TO[0] && stream == stdout)
3999 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4000
4001 exit (stream == stdout ? 0 : 1);
4002 }
4003
4004 /* Record the fact that the user wants the contents of section number
4005 SECTION to be displayed using the method(s) encoded as flags bits
4006 in TYPE. Note, TYPE can be zero if we are creating the array for
4007 the first time. */
4008
4009 static void
4010 request_dump_bynumber (unsigned int section, dump_type type)
4011 {
4012 if (section >= num_dump_sects)
4013 {
4014 dump_type * new_dump_sects;
4015
4016 new_dump_sects = (dump_type *) calloc (section + 1,
4017 sizeof (* dump_sects));
4018
4019 if (new_dump_sects == NULL)
4020 error (_("Out of memory allocating dump request table.\n"));
4021 else
4022 {
4023 /* Copy current flag settings. */
4024 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4025
4026 free (dump_sects);
4027
4028 dump_sects = new_dump_sects;
4029 num_dump_sects = section + 1;
4030 }
4031 }
4032
4033 if (dump_sects)
4034 dump_sects[section] |= type;
4035
4036 return;
4037 }
4038
4039 /* Request a dump by section name. */
4040
4041 static void
4042 request_dump_byname (const char * section, dump_type type)
4043 {
4044 struct dump_list_entry * new_request;
4045
4046 new_request = (struct dump_list_entry *)
4047 malloc (sizeof (struct dump_list_entry));
4048 if (!new_request)
4049 error (_("Out of memory allocating dump request table.\n"));
4050
4051 new_request->name = strdup (section);
4052 if (!new_request->name)
4053 error (_("Out of memory allocating dump request table.\n"));
4054
4055 new_request->type = type;
4056
4057 new_request->next = dump_sects_byname;
4058 dump_sects_byname = new_request;
4059 }
4060
4061 static inline void
4062 request_dump (dump_type type)
4063 {
4064 int section;
4065 char * cp;
4066
4067 do_dump++;
4068 section = strtoul (optarg, & cp, 0);
4069
4070 if (! *cp && section >= 0)
4071 request_dump_bynumber (section, type);
4072 else
4073 request_dump_byname (optarg, type);
4074 }
4075
4076
4077 static void
4078 parse_args (int argc, char ** argv)
4079 {
4080 int c;
4081
4082 if (argc < 2)
4083 usage (stderr);
4084
4085 while ((c = getopt_long
4086 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
4087 {
4088 switch (c)
4089 {
4090 case 0:
4091 /* Long options. */
4092 break;
4093 case 'H':
4094 usage (stdout);
4095 break;
4096
4097 case 'a':
4098 do_syms++;
4099 do_reloc++;
4100 do_unwind++;
4101 do_dynamic++;
4102 do_header++;
4103 do_sections++;
4104 do_section_groups++;
4105 do_segments++;
4106 do_version++;
4107 do_histogram++;
4108 do_arch++;
4109 do_notes++;
4110 break;
4111 case 'g':
4112 do_section_groups++;
4113 break;
4114 case 't':
4115 case 'N':
4116 do_sections++;
4117 do_section_details++;
4118 break;
4119 case 'e':
4120 do_header++;
4121 do_sections++;
4122 do_segments++;
4123 break;
4124 case 'A':
4125 do_arch++;
4126 break;
4127 case 'D':
4128 do_using_dynamic++;
4129 break;
4130 case 'r':
4131 do_reloc++;
4132 break;
4133 case 'u':
4134 do_unwind++;
4135 break;
4136 case 'h':
4137 do_header++;
4138 break;
4139 case 'l':
4140 do_segments++;
4141 break;
4142 case 's':
4143 do_syms++;
4144 break;
4145 case 'S':
4146 do_sections++;
4147 break;
4148 case 'd':
4149 do_dynamic++;
4150 break;
4151 case 'I':
4152 do_histogram++;
4153 break;
4154 case 'n':
4155 do_notes++;
4156 break;
4157 case 'c':
4158 do_archive_index++;
4159 break;
4160 case 'x':
4161 request_dump (HEX_DUMP);
4162 break;
4163 case 'p':
4164 request_dump (STRING_DUMP);
4165 break;
4166 case 'R':
4167 request_dump (RELOC_DUMP);
4168 break;
4169 case 'w':
4170 do_dump++;
4171 if (optarg == 0)
4172 {
4173 do_debugging = 1;
4174 dwarf_select_sections_all ();
4175 }
4176 else
4177 {
4178 do_debugging = 0;
4179 dwarf_select_sections_by_letters (optarg);
4180 }
4181 break;
4182 case OPTION_DEBUG_DUMP:
4183 do_dump++;
4184 if (optarg == 0)
4185 do_debugging = 1;
4186 else
4187 {
4188 do_debugging = 0;
4189 dwarf_select_sections_by_names (optarg);
4190 }
4191 break;
4192 case OPTION_DWARF_DEPTH:
4193 {
4194 char *cp;
4195
4196 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4197 }
4198 break;
4199 case OPTION_DWARF_START:
4200 {
4201 char *cp;
4202
4203 dwarf_start_die = strtoul (optarg, & cp, 0);
4204 }
4205 break;
4206 case OPTION_DWARF_CHECK:
4207 dwarf_check = 1;
4208 break;
4209 case OPTION_DYN_SYMS:
4210 do_dyn_syms++;
4211 break;
4212 #ifdef SUPPORT_DISASSEMBLY
4213 case 'i':
4214 request_dump (DISASS_DUMP);
4215 break;
4216 #endif
4217 case 'v':
4218 print_version (program_name);
4219 break;
4220 case 'V':
4221 do_version++;
4222 break;
4223 case 'W':
4224 do_wide++;
4225 break;
4226 default:
4227 /* xgettext:c-format */
4228 error (_("Invalid option '-%c'\n"), c);
4229 /* Drop through. */
4230 case '?':
4231 usage (stderr);
4232 }
4233 }
4234
4235 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4236 && !do_segments && !do_header && !do_dump && !do_version
4237 && !do_histogram && !do_debugging && !do_arch && !do_notes
4238 && !do_section_groups && !do_archive_index
4239 && !do_dyn_syms)
4240 usage (stderr);
4241 else if (argc < 3)
4242 {
4243 warn (_("Nothing to do.\n"));
4244 usage (stderr);
4245 }
4246 }
4247
4248 static const char *
4249 get_elf_class (unsigned int elf_class)
4250 {
4251 static char buff[32];
4252
4253 switch (elf_class)
4254 {
4255 case ELFCLASSNONE: return _("none");
4256 case ELFCLASS32: return "ELF32";
4257 case ELFCLASS64: return "ELF64";
4258 default:
4259 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4260 return buff;
4261 }
4262 }
4263
4264 static const char *
4265 get_data_encoding (unsigned int encoding)
4266 {
4267 static char buff[32];
4268
4269 switch (encoding)
4270 {
4271 case ELFDATANONE: return _("none");
4272 case ELFDATA2LSB: return _("2's complement, little endian");
4273 case ELFDATA2MSB: return _("2's complement, big endian");
4274 default:
4275 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4276 return buff;
4277 }
4278 }
4279
4280 /* Decode the data held in 'elf_header'. */
4281
4282 static int
4283 process_file_header (void)
4284 {
4285 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4286 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4287 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4288 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4289 {
4290 error
4291 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4292 return 0;
4293 }
4294
4295 init_dwarf_regnames (elf_header.e_machine);
4296
4297 if (do_header)
4298 {
4299 int i;
4300
4301 printf (_("ELF Header:\n"));
4302 printf (_(" Magic: "));
4303 for (i = 0; i < EI_NIDENT; i++)
4304 printf ("%2.2x ", elf_header.e_ident[i]);
4305 printf ("\n");
4306 printf (_(" Class: %s\n"),
4307 get_elf_class (elf_header.e_ident[EI_CLASS]));
4308 printf (_(" Data: %s\n"),
4309 get_data_encoding (elf_header.e_ident[EI_DATA]));
4310 printf (_(" Version: %d %s\n"),
4311 elf_header.e_ident[EI_VERSION],
4312 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4313 ? "(current)"
4314 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4315 ? _("<unknown: %lx>")
4316 : "")));
4317 printf (_(" OS/ABI: %s\n"),
4318 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4319 printf (_(" ABI Version: %d\n"),
4320 elf_header.e_ident[EI_ABIVERSION]);
4321 printf (_(" Type: %s\n"),
4322 get_file_type (elf_header.e_type));
4323 printf (_(" Machine: %s\n"),
4324 get_machine_name (elf_header.e_machine));
4325 printf (_(" Version: 0x%lx\n"),
4326 (unsigned long) elf_header.e_version);
4327
4328 printf (_(" Entry point address: "));
4329 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4330 printf (_("\n Start of program headers: "));
4331 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4332 printf (_(" (bytes into file)\n Start of section headers: "));
4333 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4334 printf (_(" (bytes into file)\n"));
4335
4336 printf (_(" Flags: 0x%lx%s\n"),
4337 (unsigned long) elf_header.e_flags,
4338 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4339 printf (_(" Size of this header: %ld (bytes)\n"),
4340 (long) elf_header.e_ehsize);
4341 printf (_(" Size of program headers: %ld (bytes)\n"),
4342 (long) elf_header.e_phentsize);
4343 printf (_(" Number of program headers: %ld"),
4344 (long) elf_header.e_phnum);
4345 if (section_headers != NULL
4346 && elf_header.e_phnum == PN_XNUM
4347 && section_headers[0].sh_info != 0)
4348 printf (" (%ld)", (long) section_headers[0].sh_info);
4349 putc ('\n', stdout);
4350 printf (_(" Size of section headers: %ld (bytes)\n"),
4351 (long) elf_header.e_shentsize);
4352 printf (_(" Number of section headers: %ld"),
4353 (long) elf_header.e_shnum);
4354 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4355 printf (" (%ld)", (long) section_headers[0].sh_size);
4356 putc ('\n', stdout);
4357 printf (_(" Section header string table index: %ld"),
4358 (long) elf_header.e_shstrndx);
4359 if (section_headers != NULL
4360 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4361 printf (" (%u)", section_headers[0].sh_link);
4362 else if (elf_header.e_shstrndx != SHN_UNDEF
4363 && elf_header.e_shstrndx >= elf_header.e_shnum)
4364 printf (_(" <corrupt: out of range>"));
4365 putc ('\n', stdout);
4366 }
4367
4368 if (section_headers != NULL)
4369 {
4370 if (elf_header.e_phnum == PN_XNUM
4371 && section_headers[0].sh_info != 0)
4372 elf_header.e_phnum = section_headers[0].sh_info;
4373 if (elf_header.e_shnum == SHN_UNDEF)
4374 elf_header.e_shnum = section_headers[0].sh_size;
4375 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4376 elf_header.e_shstrndx = section_headers[0].sh_link;
4377 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4378 elf_header.e_shstrndx = SHN_UNDEF;
4379 free (section_headers);
4380 section_headers = NULL;
4381 }
4382
4383 return 1;
4384 }
4385
4386 static bfd_boolean
4387 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4388 {
4389 Elf32_External_Phdr * phdrs;
4390 Elf32_External_Phdr * external;
4391 Elf_Internal_Phdr * internal;
4392 unsigned int i;
4393 unsigned int size = elf_header.e_phentsize;
4394 unsigned int num = elf_header.e_phnum;
4395
4396 /* PR binutils/17531: Cope with unexpected section header sizes. */
4397 if (size == 0 || num == 0)
4398 return FALSE;
4399 if (size < sizeof * phdrs)
4400 {
4401 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4402 return FALSE;
4403 }
4404 if (size > sizeof * phdrs)
4405 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4406
4407 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4408 size, num, _("program headers"));
4409 if (phdrs == NULL)
4410 return FALSE;
4411
4412 for (i = 0, internal = pheaders, external = phdrs;
4413 i < elf_header.e_phnum;
4414 i++, internal++, external++)
4415 {
4416 internal->p_type = BYTE_GET (external->p_type);
4417 internal->p_offset = BYTE_GET (external->p_offset);
4418 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4419 internal->p_paddr = BYTE_GET (external->p_paddr);
4420 internal->p_filesz = BYTE_GET (external->p_filesz);
4421 internal->p_memsz = BYTE_GET (external->p_memsz);
4422 internal->p_flags = BYTE_GET (external->p_flags);
4423 internal->p_align = BYTE_GET (external->p_align);
4424 }
4425
4426 free (phdrs);
4427 return TRUE;
4428 }
4429
4430 static bfd_boolean
4431 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4432 {
4433 Elf64_External_Phdr * phdrs;
4434 Elf64_External_Phdr * external;
4435 Elf_Internal_Phdr * internal;
4436 unsigned int i;
4437 unsigned int size = elf_header.e_phentsize;
4438 unsigned int num = elf_header.e_phnum;
4439
4440 /* PR binutils/17531: Cope with unexpected section header sizes. */
4441 if (size == 0 || num == 0)
4442 return FALSE;
4443 if (size < sizeof * phdrs)
4444 {
4445 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4446 return FALSE;
4447 }
4448 if (size > sizeof * phdrs)
4449 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4450
4451 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4452 size, num, _("program headers"));
4453 if (!phdrs)
4454 return FALSE;
4455
4456 for (i = 0, internal = pheaders, external = phdrs;
4457 i < elf_header.e_phnum;
4458 i++, internal++, external++)
4459 {
4460 internal->p_type = BYTE_GET (external->p_type);
4461 internal->p_flags = BYTE_GET (external->p_flags);
4462 internal->p_offset = BYTE_GET (external->p_offset);
4463 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4464 internal->p_paddr = BYTE_GET (external->p_paddr);
4465 internal->p_filesz = BYTE_GET (external->p_filesz);
4466 internal->p_memsz = BYTE_GET (external->p_memsz);
4467 internal->p_align = BYTE_GET (external->p_align);
4468 }
4469
4470 free (phdrs);
4471 return TRUE;
4472 }
4473
4474 /* Returns 1 if the program headers were read into `program_headers'. */
4475
4476 static int
4477 get_program_headers (FILE * file)
4478 {
4479 Elf_Internal_Phdr * phdrs;
4480
4481 /* Check cache of prior read. */
4482 if (program_headers != NULL)
4483 return 1;
4484
4485 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4486 sizeof (Elf_Internal_Phdr));
4487
4488 if (phdrs == NULL)
4489 {
4490 error (_("Out of memory reading %u program headers\n"),
4491 elf_header.e_phnum);
4492 return 0;
4493 }
4494
4495 if (is_32bit_elf
4496 ? get_32bit_program_headers (file, phdrs)
4497 : get_64bit_program_headers (file, phdrs))
4498 {
4499 program_headers = phdrs;
4500 return 1;
4501 }
4502
4503 free (phdrs);
4504 return 0;
4505 }
4506
4507 /* Returns 1 if the program headers were loaded. */
4508
4509 static int
4510 process_program_headers (FILE * file)
4511 {
4512 Elf_Internal_Phdr * segment;
4513 unsigned int i;
4514
4515 if (elf_header.e_phnum == 0)
4516 {
4517 /* PR binutils/12467. */
4518 if (elf_header.e_phoff != 0)
4519 warn (_("possibly corrupt ELF header - it has a non-zero program"
4520 " header offset, but no program headers\n"));
4521 else if (do_segments)
4522 printf (_("\nThere are no program headers in this file.\n"));
4523 return 0;
4524 }
4525
4526 if (do_segments && !do_header)
4527 {
4528 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4529 printf (_("Entry point "));
4530 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4531 printf (_("\nThere are %d program headers, starting at offset "),
4532 elf_header.e_phnum);
4533 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4534 printf ("\n");
4535 }
4536
4537 if (! get_program_headers (file))
4538 return 0;
4539
4540 if (do_segments)
4541 {
4542 if (elf_header.e_phnum > 1)
4543 printf (_("\nProgram Headers:\n"));
4544 else
4545 printf (_("\nProgram Headers:\n"));
4546
4547 if (is_32bit_elf)
4548 printf
4549 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4550 else if (do_wide)
4551 printf
4552 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4553 else
4554 {
4555 printf
4556 (_(" Type Offset VirtAddr PhysAddr\n"));
4557 printf
4558 (_(" FileSiz MemSiz Flags Align\n"));
4559 }
4560 }
4561
4562 dynamic_addr = 0;
4563 dynamic_size = 0;
4564
4565 for (i = 0, segment = program_headers;
4566 i < elf_header.e_phnum;
4567 i++, segment++)
4568 {
4569 if (do_segments)
4570 {
4571 printf (" %-14.14s ", get_segment_type (segment->p_type));
4572
4573 if (is_32bit_elf)
4574 {
4575 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4576 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4577 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4578 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4579 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4580 printf ("%c%c%c ",
4581 (segment->p_flags & PF_R ? 'R' : ' '),
4582 (segment->p_flags & PF_W ? 'W' : ' '),
4583 (segment->p_flags & PF_X ? 'E' : ' '));
4584 printf ("%#lx", (unsigned long) segment->p_align);
4585 }
4586 else if (do_wide)
4587 {
4588 if ((unsigned long) segment->p_offset == segment->p_offset)
4589 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4590 else
4591 {
4592 print_vma (segment->p_offset, FULL_HEX);
4593 putchar (' ');
4594 }
4595
4596 print_vma (segment->p_vaddr, FULL_HEX);
4597 putchar (' ');
4598 print_vma (segment->p_paddr, FULL_HEX);
4599 putchar (' ');
4600
4601 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4602 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4603 else
4604 {
4605 print_vma (segment->p_filesz, FULL_HEX);
4606 putchar (' ');
4607 }
4608
4609 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4610 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4611 else
4612 {
4613 print_vma (segment->p_memsz, FULL_HEX);
4614 }
4615
4616 printf (" %c%c%c ",
4617 (segment->p_flags & PF_R ? 'R' : ' '),
4618 (segment->p_flags & PF_W ? 'W' : ' '),
4619 (segment->p_flags & PF_X ? 'E' : ' '));
4620
4621 if ((unsigned long) segment->p_align == segment->p_align)
4622 printf ("%#lx", (unsigned long) segment->p_align);
4623 else
4624 {
4625 print_vma (segment->p_align, PREFIX_HEX);
4626 }
4627 }
4628 else
4629 {
4630 print_vma (segment->p_offset, FULL_HEX);
4631 putchar (' ');
4632 print_vma (segment->p_vaddr, FULL_HEX);
4633 putchar (' ');
4634 print_vma (segment->p_paddr, FULL_HEX);
4635 printf ("\n ");
4636 print_vma (segment->p_filesz, FULL_HEX);
4637 putchar (' ');
4638 print_vma (segment->p_memsz, FULL_HEX);
4639 printf (" %c%c%c ",
4640 (segment->p_flags & PF_R ? 'R' : ' '),
4641 (segment->p_flags & PF_W ? 'W' : ' '),
4642 (segment->p_flags & PF_X ? 'E' : ' '));
4643 print_vma (segment->p_align, HEX);
4644 }
4645 }
4646
4647 if (do_segments)
4648 putc ('\n', stdout);
4649
4650 switch (segment->p_type)
4651 {
4652 case PT_DYNAMIC:
4653 if (dynamic_addr)
4654 error (_("more than one dynamic segment\n"));
4655
4656 /* By default, assume that the .dynamic section is the first
4657 section in the DYNAMIC segment. */
4658 dynamic_addr = segment->p_offset;
4659 dynamic_size = segment->p_filesz;
4660 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4661 if (dynamic_addr + dynamic_size >= current_file_size)
4662 {
4663 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4664 dynamic_addr = dynamic_size = 0;
4665 }
4666
4667 /* Try to locate the .dynamic section. If there is
4668 a section header table, we can easily locate it. */
4669 if (section_headers != NULL)
4670 {
4671 Elf_Internal_Shdr * sec;
4672
4673 sec = find_section (".dynamic");
4674 if (sec == NULL || sec->sh_size == 0)
4675 {
4676 /* A corresponding .dynamic section is expected, but on
4677 IA-64/OpenVMS it is OK for it to be missing. */
4678 if (!is_ia64_vms ())
4679 error (_("no .dynamic section in the dynamic segment\n"));
4680 break;
4681 }
4682
4683 if (sec->sh_type == SHT_NOBITS)
4684 {
4685 dynamic_size = 0;
4686 break;
4687 }
4688
4689 dynamic_addr = sec->sh_offset;
4690 dynamic_size = sec->sh_size;
4691
4692 if (dynamic_addr < segment->p_offset
4693 || dynamic_addr > segment->p_offset + segment->p_filesz)
4694 warn (_("the .dynamic section is not contained"
4695 " within the dynamic segment\n"));
4696 else if (dynamic_addr > segment->p_offset)
4697 warn (_("the .dynamic section is not the first section"
4698 " in the dynamic segment.\n"));
4699 }
4700 break;
4701
4702 case PT_INTERP:
4703 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4704 SEEK_SET))
4705 error (_("Unable to find program interpreter name\n"));
4706 else
4707 {
4708 char fmt [32];
4709 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4710
4711 if (ret >= (int) sizeof (fmt) || ret < 0)
4712 error (_("Internal error: failed to create format string to display program interpreter\n"));
4713
4714 program_interpreter[0] = 0;
4715 if (fscanf (file, fmt, program_interpreter) <= 0)
4716 error (_("Unable to read program interpreter name\n"));
4717
4718 if (do_segments)
4719 printf (_(" [Requesting program interpreter: %s]\n"),
4720 program_interpreter);
4721 }
4722 break;
4723 }
4724 }
4725
4726 if (do_segments && section_headers != NULL && string_table != NULL)
4727 {
4728 printf (_("\n Section to Segment mapping:\n"));
4729 printf (_(" Segment Sections...\n"));
4730
4731 for (i = 0; i < elf_header.e_phnum; i++)
4732 {
4733 unsigned int j;
4734 Elf_Internal_Shdr * section;
4735
4736 segment = program_headers + i;
4737 section = section_headers + 1;
4738
4739 printf (" %2.2d ", i);
4740
4741 for (j = 1; j < elf_header.e_shnum; j++, section++)
4742 {
4743 if (!ELF_TBSS_SPECIAL (section, segment)
4744 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4745 printf ("%s ", printable_section_name (section));
4746 }
4747
4748 putc ('\n',stdout);
4749 }
4750 }
4751
4752 return 1;
4753 }
4754
4755
4756 /* Find the file offset corresponding to VMA by using the program headers. */
4757
4758 static long
4759 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4760 {
4761 Elf_Internal_Phdr * seg;
4762
4763 if (! get_program_headers (file))
4764 {
4765 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4766 return (long) vma;
4767 }
4768
4769 for (seg = program_headers;
4770 seg < program_headers + elf_header.e_phnum;
4771 ++seg)
4772 {
4773 if (seg->p_type != PT_LOAD)
4774 continue;
4775
4776 if (vma >= (seg->p_vaddr & -seg->p_align)
4777 && vma + size <= seg->p_vaddr + seg->p_filesz)
4778 return vma - seg->p_vaddr + seg->p_offset;
4779 }
4780
4781 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4782 (unsigned long) vma);
4783 return (long) vma;
4784 }
4785
4786
4787 /* Allocate memory and load the sections headers into the global pointer
4788 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4789 generate any error messages if the load fails. */
4790
4791 static bfd_boolean
4792 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4793 {
4794 Elf32_External_Shdr * shdrs;
4795 Elf_Internal_Shdr * internal;
4796 unsigned int i;
4797 unsigned int size = elf_header.e_shentsize;
4798 unsigned int num = probe ? 1 : elf_header.e_shnum;
4799
4800 /* PR binutils/17531: Cope with unexpected section header sizes. */
4801 if (size == 0 || num == 0)
4802 return FALSE;
4803 if (size < sizeof * shdrs)
4804 {
4805 if (! probe)
4806 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4807 return FALSE;
4808 }
4809 if (!probe && size > sizeof * shdrs)
4810 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4811
4812 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4813 size, num,
4814 probe ? NULL : _("section headers"));
4815 if (shdrs == NULL)
4816 return FALSE;
4817
4818 if (section_headers != NULL)
4819 free (section_headers);
4820 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4821 sizeof (Elf_Internal_Shdr));
4822 if (section_headers == NULL)
4823 {
4824 if (!probe)
4825 error (_("Out of memory reading %u section headers\n"), num);
4826 return FALSE;
4827 }
4828
4829 for (i = 0, internal = section_headers;
4830 i < num;
4831 i++, internal++)
4832 {
4833 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4834 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4835 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4836 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4837 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4838 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4839 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4840 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4841 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4842 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4843 }
4844
4845 free (shdrs);
4846 return TRUE;
4847 }
4848
4849 static bfd_boolean
4850 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4851 {
4852 Elf64_External_Shdr * shdrs;
4853 Elf_Internal_Shdr * internal;
4854 unsigned int i;
4855 unsigned int size = elf_header.e_shentsize;
4856 unsigned int num = probe ? 1 : elf_header.e_shnum;
4857
4858 /* PR binutils/17531: Cope with unexpected section header sizes. */
4859 if (size == 0 || num == 0)
4860 return FALSE;
4861 if (size < sizeof * shdrs)
4862 {
4863 if (! probe)
4864 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4865 return FALSE;
4866 }
4867 if (! probe && size > sizeof * shdrs)
4868 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4869
4870 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4871 size, num,
4872 probe ? NULL : _("section headers"));
4873 if (shdrs == NULL)
4874 return FALSE;
4875
4876 if (section_headers != NULL)
4877 free (section_headers);
4878 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4879 sizeof (Elf_Internal_Shdr));
4880 if (section_headers == NULL)
4881 {
4882 if (! probe)
4883 error (_("Out of memory reading %u section headers\n"), num);
4884 return FALSE;
4885 }
4886
4887 for (i = 0, internal = section_headers;
4888 i < num;
4889 i++, internal++)
4890 {
4891 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4892 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4893 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4894 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4895 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4896 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4897 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4898 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4899 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4900 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4901 }
4902
4903 free (shdrs);
4904 return TRUE;
4905 }
4906
4907 static Elf_Internal_Sym *
4908 get_32bit_elf_symbols (FILE * file,
4909 Elf_Internal_Shdr * section,
4910 unsigned long * num_syms_return)
4911 {
4912 unsigned long number = 0;
4913 Elf32_External_Sym * esyms = NULL;
4914 Elf_External_Sym_Shndx * shndx = NULL;
4915 Elf_Internal_Sym * isyms = NULL;
4916 Elf_Internal_Sym * psym;
4917 unsigned int j;
4918
4919 if (section->sh_size == 0)
4920 {
4921 if (num_syms_return != NULL)
4922 * num_syms_return = 0;
4923 return NULL;
4924 }
4925
4926 /* Run some sanity checks first. */
4927 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4928 {
4929 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4930 printable_section_name (section), (unsigned long) section->sh_entsize);
4931 goto exit_point;
4932 }
4933
4934 if (section->sh_size > current_file_size)
4935 {
4936 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4937 printable_section_name (section), (unsigned long) section->sh_size);
4938 goto exit_point;
4939 }
4940
4941 number = section->sh_size / section->sh_entsize;
4942
4943 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4944 {
4945 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4946 (unsigned long) section->sh_size,
4947 printable_section_name (section),
4948 (unsigned long) section->sh_entsize);
4949 goto exit_point;
4950 }
4951
4952 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4953 section->sh_size, _("symbols"));
4954 if (esyms == NULL)
4955 goto exit_point;
4956
4957 shndx = NULL;
4958 if (symtab_shndx_hdr != NULL
4959 && (symtab_shndx_hdr->sh_link
4960 == (unsigned long) (section - section_headers)))
4961 {
4962 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4963 symtab_shndx_hdr->sh_offset,
4964 1, symtab_shndx_hdr->sh_size,
4965 _("symbol table section indicies"));
4966 if (shndx == NULL)
4967 goto exit_point;
4968 /* PR17531: file: heap-buffer-overflow */
4969 else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
4970 {
4971 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
4972 printable_section_name (symtab_shndx_hdr),
4973 (unsigned long) symtab_shndx_hdr->sh_size,
4974 (unsigned long) section->sh_size);
4975 goto exit_point;
4976 }
4977 }
4978
4979 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4980
4981 if (isyms == NULL)
4982 {
4983 error (_("Out of memory reading %lu symbols\n"),
4984 (unsigned long) number);
4985 goto exit_point;
4986 }
4987
4988 for (j = 0, psym = isyms; j < number; j++, psym++)
4989 {
4990 psym->st_name = BYTE_GET (esyms[j].st_name);
4991 psym->st_value = BYTE_GET (esyms[j].st_value);
4992 psym->st_size = BYTE_GET (esyms[j].st_size);
4993 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4994 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4995 psym->st_shndx
4996 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4997 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4998 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4999 psym->st_info = BYTE_GET (esyms[j].st_info);
5000 psym->st_other = BYTE_GET (esyms[j].st_other);
5001 }
5002
5003 exit_point:
5004 if (shndx != NULL)
5005 free (shndx);
5006 if (esyms != NULL)
5007 free (esyms);
5008
5009 if (num_syms_return != NULL)
5010 * num_syms_return = isyms == NULL ? 0 : number;
5011
5012 return isyms;
5013 }
5014
5015 static Elf_Internal_Sym *
5016 get_64bit_elf_symbols (FILE * file,
5017 Elf_Internal_Shdr * section,
5018 unsigned long * num_syms_return)
5019 {
5020 unsigned long number = 0;
5021 Elf64_External_Sym * esyms = NULL;
5022 Elf_External_Sym_Shndx * shndx = NULL;
5023 Elf_Internal_Sym * isyms = NULL;
5024 Elf_Internal_Sym * psym;
5025 unsigned int j;
5026
5027 if (section->sh_size == 0)
5028 {
5029 if (num_syms_return != NULL)
5030 * num_syms_return = 0;
5031 return NULL;
5032 }
5033
5034 /* Run some sanity checks first. */
5035 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5036 {
5037 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5038 printable_section_name (section),
5039 (unsigned long) section->sh_entsize);
5040 goto exit_point;
5041 }
5042
5043 if (section->sh_size > current_file_size)
5044 {
5045 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5046 printable_section_name (section),
5047 (unsigned long) section->sh_size);
5048 goto exit_point;
5049 }
5050
5051 number = section->sh_size / section->sh_entsize;
5052
5053 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5054 {
5055 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5056 (unsigned long) section->sh_size,
5057 printable_section_name (section),
5058 (unsigned long) section->sh_entsize);
5059 goto exit_point;
5060 }
5061
5062 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5063 section->sh_size, _("symbols"));
5064 if (!esyms)
5065 goto exit_point;
5066
5067 if (symtab_shndx_hdr != NULL
5068 && (symtab_shndx_hdr->sh_link
5069 == (unsigned long) (section - section_headers)))
5070 {
5071 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5072 symtab_shndx_hdr->sh_offset,
5073 1, symtab_shndx_hdr->sh_size,
5074 _("symbol table section indicies"));
5075 if (shndx == NULL)
5076 goto exit_point;
5077 else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5078 {
5079 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5080 printable_section_name (symtab_shndx_hdr),
5081 (unsigned long) symtab_shndx_hdr->sh_size,
5082 (unsigned long) section->sh_size);
5083 goto exit_point;
5084 }
5085 }
5086
5087 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5088
5089 if (isyms == NULL)
5090 {
5091 error (_("Out of memory reading %lu symbols\n"),
5092 (unsigned long) number);
5093 goto exit_point;
5094 }
5095
5096 for (j = 0, psym = isyms; j < number; j++, psym++)
5097 {
5098 psym->st_name = BYTE_GET (esyms[j].st_name);
5099 psym->st_info = BYTE_GET (esyms[j].st_info);
5100 psym->st_other = BYTE_GET (esyms[j].st_other);
5101 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5102
5103 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5104 psym->st_shndx
5105 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5106 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5107 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5108
5109 psym->st_value = BYTE_GET (esyms[j].st_value);
5110 psym->st_size = BYTE_GET (esyms[j].st_size);
5111 }
5112
5113 exit_point:
5114 if (shndx != NULL)
5115 free (shndx);
5116 if (esyms != NULL)
5117 free (esyms);
5118
5119 if (num_syms_return != NULL)
5120 * num_syms_return = isyms == NULL ? 0 : number;
5121
5122 return isyms;
5123 }
5124
5125 static const char *
5126 get_elf_section_flags (bfd_vma sh_flags)
5127 {
5128 static char buff[1024];
5129 char * p = buff;
5130 int field_size = is_32bit_elf ? 8 : 16;
5131 int sindex;
5132 int size = sizeof (buff) - (field_size + 4 + 1);
5133 bfd_vma os_flags = 0;
5134 bfd_vma proc_flags = 0;
5135 bfd_vma unknown_flags = 0;
5136 static const struct
5137 {
5138 const char * str;
5139 int len;
5140 }
5141 flags [] =
5142 {
5143 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5144 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5145 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5146 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5147 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5148 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5149 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5150 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5151 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5152 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5153 /* IA-64 specific. */
5154 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5155 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5156 /* IA-64 OpenVMS specific. */
5157 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5158 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5159 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5160 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5161 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5162 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5163 /* Generic. */
5164 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5165 /* SPARC specific. */
5166 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
5167 };
5168
5169 if (do_section_details)
5170 {
5171 sprintf (buff, "[%*.*lx]: ",
5172 field_size, field_size, (unsigned long) sh_flags);
5173 p += field_size + 4;
5174 }
5175
5176 while (sh_flags)
5177 {
5178 bfd_vma flag;
5179
5180 flag = sh_flags & - sh_flags;
5181 sh_flags &= ~ flag;
5182
5183 if (do_section_details)
5184 {
5185 switch (flag)
5186 {
5187 case SHF_WRITE: sindex = 0; break;
5188 case SHF_ALLOC: sindex = 1; break;
5189 case SHF_EXECINSTR: sindex = 2; break;
5190 case SHF_MERGE: sindex = 3; break;
5191 case SHF_STRINGS: sindex = 4; break;
5192 case SHF_INFO_LINK: sindex = 5; break;
5193 case SHF_LINK_ORDER: sindex = 6; break;
5194 case SHF_OS_NONCONFORMING: sindex = 7; break;
5195 case SHF_GROUP: sindex = 8; break;
5196 case SHF_TLS: sindex = 9; break;
5197 case SHF_EXCLUDE: sindex = 18; break;
5198
5199 default:
5200 sindex = -1;
5201 switch (elf_header.e_machine)
5202 {
5203 case EM_IA_64:
5204 if (flag == SHF_IA_64_SHORT)
5205 sindex = 10;
5206 else if (flag == SHF_IA_64_NORECOV)
5207 sindex = 11;
5208 #ifdef BFD64
5209 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5210 switch (flag)
5211 {
5212 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5213 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5214 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5215 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5216 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5217 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5218 default: break;
5219 }
5220 #endif
5221 break;
5222
5223 case EM_386:
5224 case EM_486:
5225 case EM_X86_64:
5226 case EM_L1OM:
5227 case EM_K1OM:
5228 case EM_OLD_SPARCV9:
5229 case EM_SPARC32PLUS:
5230 case EM_SPARCV9:
5231 case EM_SPARC:
5232 if (flag == SHF_ORDERED)
5233 sindex = 19;
5234 break;
5235 default:
5236 break;
5237 }
5238 }
5239
5240 if (sindex != -1)
5241 {
5242 if (p != buff + field_size + 4)
5243 {
5244 if (size < (10 + 2))
5245 {
5246 warn (_("Internal error: not enough buffer room for section flag info"));
5247 return _("<unknown>");
5248 }
5249 size -= 2;
5250 *p++ = ',';
5251 *p++ = ' ';
5252 }
5253
5254 size -= flags [sindex].len;
5255 p = stpcpy (p, flags [sindex].str);
5256 }
5257 else if (flag & SHF_MASKOS)
5258 os_flags |= flag;
5259 else if (flag & SHF_MASKPROC)
5260 proc_flags |= flag;
5261 else
5262 unknown_flags |= flag;
5263 }
5264 else
5265 {
5266 switch (flag)
5267 {
5268 case SHF_WRITE: *p = 'W'; break;
5269 case SHF_ALLOC: *p = 'A'; break;
5270 case SHF_EXECINSTR: *p = 'X'; break;
5271 case SHF_MERGE: *p = 'M'; break;
5272 case SHF_STRINGS: *p = 'S'; break;
5273 case SHF_INFO_LINK: *p = 'I'; break;
5274 case SHF_LINK_ORDER: *p = 'L'; break;
5275 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5276 case SHF_GROUP: *p = 'G'; break;
5277 case SHF_TLS: *p = 'T'; break;
5278 case SHF_EXCLUDE: *p = 'E'; break;
5279
5280 default:
5281 if ((elf_header.e_machine == EM_X86_64
5282 || elf_header.e_machine == EM_L1OM
5283 || elf_header.e_machine == EM_K1OM)
5284 && flag == SHF_X86_64_LARGE)
5285 *p = 'l';
5286 else if (flag & SHF_MASKOS)
5287 {
5288 *p = 'o';
5289 sh_flags &= ~ SHF_MASKOS;
5290 }
5291 else if (flag & SHF_MASKPROC)
5292 {
5293 *p = 'p';
5294 sh_flags &= ~ SHF_MASKPROC;
5295 }
5296 else
5297 *p = 'x';
5298 break;
5299 }
5300 p++;
5301 }
5302 }
5303
5304 if (do_section_details)
5305 {
5306 if (os_flags)
5307 {
5308 size -= 5 + field_size;
5309 if (p != buff + field_size + 4)
5310 {
5311 if (size < (2 + 1))
5312 {
5313 warn (_("Internal error: not enough buffer room for section flag info"));
5314 return _("<unknown>");
5315 }
5316 size -= 2;
5317 *p++ = ',';
5318 *p++ = ' ';
5319 }
5320 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5321 (unsigned long) os_flags);
5322 p += 5 + field_size;
5323 }
5324 if (proc_flags)
5325 {
5326 size -= 7 + field_size;
5327 if (p != buff + field_size + 4)
5328 {
5329 if (size < (2 + 1))
5330 {
5331 warn (_("Internal error: not enough buffer room for section flag info"));
5332 return _("<unknown>");
5333 }
5334 size -= 2;
5335 *p++ = ',';
5336 *p++ = ' ';
5337 }
5338 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5339 (unsigned long) proc_flags);
5340 p += 7 + field_size;
5341 }
5342 if (unknown_flags)
5343 {
5344 size -= 10 + field_size;
5345 if (p != buff + field_size + 4)
5346 {
5347 if (size < (2 + 1))
5348 {
5349 warn (_("Internal error: not enough buffer room for section flag info"));
5350 return _("<unknown>");
5351 }
5352 size -= 2;
5353 *p++ = ',';
5354 *p++ = ' ';
5355 }
5356 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5357 (unsigned long) unknown_flags);
5358 p += 10 + field_size;
5359 }
5360 }
5361
5362 *p = '\0';
5363 return buff;
5364 }
5365
5366 static int
5367 process_section_headers (FILE * file)
5368 {
5369 Elf_Internal_Shdr * section;
5370 unsigned int i;
5371
5372 section_headers = NULL;
5373
5374 if (elf_header.e_shnum == 0)
5375 {
5376 /* PR binutils/12467. */
5377 if (elf_header.e_shoff != 0)
5378 warn (_("possibly corrupt ELF file header - it has a non-zero"
5379 " section header offset, but no section headers\n"));
5380 else if (do_sections)
5381 printf (_("\nThere are no sections in this file.\n"));
5382
5383 return 1;
5384 }
5385
5386 if (do_sections && !do_header)
5387 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5388 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5389
5390 if (is_32bit_elf)
5391 {
5392 if (! get_32bit_section_headers (file, FALSE))
5393 return 0;
5394 }
5395 else if (! get_64bit_section_headers (file, FALSE))
5396 return 0;
5397
5398 /* Read in the string table, so that we have names to display. */
5399 if (elf_header.e_shstrndx != SHN_UNDEF
5400 && elf_header.e_shstrndx < elf_header.e_shnum)
5401 {
5402 section = section_headers + elf_header.e_shstrndx;
5403
5404 if (section->sh_size != 0)
5405 {
5406 string_table = (char *) get_data (NULL, file, section->sh_offset,
5407 1, section->sh_size,
5408 _("string table"));
5409
5410 string_table_length = string_table != NULL ? section->sh_size : 0;
5411 }
5412 }
5413
5414 /* Scan the sections for the dynamic symbol table
5415 and dynamic string table and debug sections. */
5416 dynamic_symbols = NULL;
5417 dynamic_strings = NULL;
5418 dynamic_syminfo = NULL;
5419 symtab_shndx_hdr = NULL;
5420
5421 eh_addr_size = is_32bit_elf ? 4 : 8;
5422 switch (elf_header.e_machine)
5423 {
5424 case EM_MIPS:
5425 case EM_MIPS_RS3_LE:
5426 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5427 FDE addresses. However, the ABI also has a semi-official ILP32
5428 variant for which the normal FDE address size rules apply.
5429
5430 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5431 section, where XX is the size of longs in bits. Unfortunately,
5432 earlier compilers provided no way of distinguishing ILP32 objects
5433 from LP64 objects, so if there's any doubt, we should assume that
5434 the official LP64 form is being used. */
5435 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5436 && find_section (".gcc_compiled_long32") == NULL)
5437 eh_addr_size = 8;
5438 break;
5439
5440 case EM_H8_300:
5441 case EM_H8_300H:
5442 switch (elf_header.e_flags & EF_H8_MACH)
5443 {
5444 case E_H8_MACH_H8300:
5445 case E_H8_MACH_H8300HN:
5446 case E_H8_MACH_H8300SN:
5447 case E_H8_MACH_H8300SXN:
5448 eh_addr_size = 2;
5449 break;
5450 case E_H8_MACH_H8300H:
5451 case E_H8_MACH_H8300S:
5452 case E_H8_MACH_H8300SX:
5453 eh_addr_size = 4;
5454 break;
5455 }
5456 break;
5457
5458 case EM_M32C_OLD:
5459 case EM_M32C:
5460 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5461 {
5462 case EF_M32C_CPU_M16C:
5463 eh_addr_size = 2;
5464 break;
5465 }
5466 break;
5467 }
5468
5469 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5470 do \
5471 { \
5472 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5473 if (section->sh_entsize != expected_entsize) \
5474 { \
5475 char buf[40]; \
5476 sprintf_vma (buf, section->sh_entsize); \
5477 /* Note: coded this way so that there is a single string for \
5478 translation. */ \
5479 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5480 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5481 (unsigned) expected_entsize); \
5482 section->sh_entsize = expected_entsize; \
5483 } \
5484 } \
5485 while (0)
5486
5487 #define CHECK_ENTSIZE(section, i, type) \
5488 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5489 sizeof (Elf64_External_##type))
5490
5491 for (i = 0, section = section_headers;
5492 i < elf_header.e_shnum;
5493 i++, section++)
5494 {
5495 char * name = SECTION_NAME (section);
5496
5497 if (section->sh_type == SHT_DYNSYM)
5498 {
5499 if (dynamic_symbols != NULL)
5500 {
5501 error (_("File contains multiple dynamic symbol tables\n"));
5502 continue;
5503 }
5504
5505 CHECK_ENTSIZE (section, i, Sym);
5506 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5507 }
5508 else if (section->sh_type == SHT_STRTAB
5509 && streq (name, ".dynstr"))
5510 {
5511 if (dynamic_strings != NULL)
5512 {
5513 error (_("File contains multiple dynamic string tables\n"));
5514 continue;
5515 }
5516
5517 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5518 1, section->sh_size,
5519 _("dynamic strings"));
5520 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5521 }
5522 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5523 {
5524 if (symtab_shndx_hdr != NULL)
5525 {
5526 error (_("File contains multiple symtab shndx tables\n"));
5527 continue;
5528 }
5529 symtab_shndx_hdr = section;
5530 }
5531 else if (section->sh_type == SHT_SYMTAB)
5532 CHECK_ENTSIZE (section, i, Sym);
5533 else if (section->sh_type == SHT_GROUP)
5534 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5535 else if (section->sh_type == SHT_REL)
5536 CHECK_ENTSIZE (section, i, Rel);
5537 else if (section->sh_type == SHT_RELA)
5538 CHECK_ENTSIZE (section, i, Rela);
5539 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5540 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5541 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5542 || do_debug_str || do_debug_loc || do_debug_ranges
5543 || do_debug_addr || do_debug_cu_index)
5544 && (const_strneq (name, ".debug_")
5545 || const_strneq (name, ".zdebug_")))
5546 {
5547 if (name[1] == 'z')
5548 name += sizeof (".zdebug_") - 1;
5549 else
5550 name += sizeof (".debug_") - 1;
5551
5552 if (do_debugging
5553 || (do_debug_info && const_strneq (name, "info"))
5554 || (do_debug_info && const_strneq (name, "types"))
5555 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5556 || (do_debug_lines && strcmp (name, "line") == 0)
5557 || (do_debug_lines && const_strneq (name, "line."))
5558 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5559 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5560 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5561 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5562 || (do_debug_aranges && const_strneq (name, "aranges"))
5563 || (do_debug_ranges && const_strneq (name, "ranges"))
5564 || (do_debug_frames && const_strneq (name, "frame"))
5565 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5566 || (do_debug_macinfo && const_strneq (name, "macro"))
5567 || (do_debug_str && const_strneq (name, "str"))
5568 || (do_debug_loc && const_strneq (name, "loc"))
5569 || (do_debug_addr && const_strneq (name, "addr"))
5570 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5571 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5572 )
5573 request_dump_bynumber (i, DEBUG_DUMP);
5574 }
5575 /* Linkonce section to be combined with .debug_info at link time. */
5576 else if ((do_debugging || do_debug_info)
5577 && const_strneq (name, ".gnu.linkonce.wi."))
5578 request_dump_bynumber (i, DEBUG_DUMP);
5579 else if (do_debug_frames && streq (name, ".eh_frame"))
5580 request_dump_bynumber (i, DEBUG_DUMP);
5581 else if (do_gdb_index && streq (name, ".gdb_index"))
5582 request_dump_bynumber (i, DEBUG_DUMP);
5583 /* Trace sections for Itanium VMS. */
5584 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5585 || do_trace_aranges)
5586 && const_strneq (name, ".trace_"))
5587 {
5588 name += sizeof (".trace_") - 1;
5589
5590 if (do_debugging
5591 || (do_trace_info && streq (name, "info"))
5592 || (do_trace_abbrevs && streq (name, "abbrev"))
5593 || (do_trace_aranges && streq (name, "aranges"))
5594 )
5595 request_dump_bynumber (i, DEBUG_DUMP);
5596 }
5597 }
5598
5599 if (! do_sections)
5600 return 1;
5601
5602 if (elf_header.e_shnum > 1)
5603 printf (_("\nSection Headers:\n"));
5604 else
5605 printf (_("\nSection Header:\n"));
5606
5607 if (is_32bit_elf)
5608 {
5609 if (do_section_details)
5610 {
5611 printf (_(" [Nr] Name\n"));
5612 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5613 }
5614 else
5615 printf
5616 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5617 }
5618 else if (do_wide)
5619 {
5620 if (do_section_details)
5621 {
5622 printf (_(" [Nr] Name\n"));
5623 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5624 }
5625 else
5626 printf
5627 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5628 }
5629 else
5630 {
5631 if (do_section_details)
5632 {
5633 printf (_(" [Nr] Name\n"));
5634 printf (_(" Type Address Offset Link\n"));
5635 printf (_(" Size EntSize Info Align\n"));
5636 }
5637 else
5638 {
5639 printf (_(" [Nr] Name Type Address Offset\n"));
5640 printf (_(" Size EntSize Flags Link Info Align\n"));
5641 }
5642 }
5643
5644 if (do_section_details)
5645 printf (_(" Flags\n"));
5646
5647 for (i = 0, section = section_headers;
5648 i < elf_header.e_shnum;
5649 i++, section++)
5650 {
5651 printf (" [%2u] ", i);
5652 if (do_section_details)
5653 printf ("%s\n ", printable_section_name (section));
5654 else
5655 print_symbol (-17, SECTION_NAME (section));
5656
5657 printf (do_wide ? " %-15s " : " %-15.15s ",
5658 get_section_type_name (section->sh_type));
5659
5660 if (is_32bit_elf)
5661 {
5662 const char * link_too_big = NULL;
5663
5664 print_vma (section->sh_addr, LONG_HEX);
5665
5666 printf ( " %6.6lx %6.6lx %2.2lx",
5667 (unsigned long) section->sh_offset,
5668 (unsigned long) section->sh_size,
5669 (unsigned long) section->sh_entsize);
5670
5671 if (do_section_details)
5672 fputs (" ", stdout);
5673 else
5674 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5675
5676 if (section->sh_link >= elf_header.e_shnum)
5677 {
5678 link_too_big = "";
5679 /* The sh_link value is out of range. Normally this indicates
5680 an error but it can have special values in Solaris binaries. */
5681 switch (elf_header.e_machine)
5682 {
5683 case EM_386:
5684 case EM_486:
5685 case EM_X86_64:
5686 case EM_L1OM:
5687 case EM_K1OM:
5688 case EM_OLD_SPARCV9:
5689 case EM_SPARC32PLUS:
5690 case EM_SPARCV9:
5691 case EM_SPARC:
5692 if (section->sh_link == (SHN_BEFORE & 0xffff))
5693 link_too_big = "BEFORE";
5694 else if (section->sh_link == (SHN_AFTER & 0xffff))
5695 link_too_big = "AFTER";
5696 break;
5697 default:
5698 break;
5699 }
5700 }
5701
5702 if (do_section_details)
5703 {
5704 if (link_too_big != NULL && * link_too_big)
5705 printf ("<%s> ", link_too_big);
5706 else
5707 printf ("%2u ", section->sh_link);
5708 printf ("%3u %2lu\n", section->sh_info,
5709 (unsigned long) section->sh_addralign);
5710 }
5711 else
5712 printf ("%2u %3u %2lu\n",
5713 section->sh_link,
5714 section->sh_info,
5715 (unsigned long) section->sh_addralign);
5716
5717 if (link_too_big && ! * link_too_big)
5718 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5719 i, section->sh_link);
5720 }
5721 else if (do_wide)
5722 {
5723 print_vma (section->sh_addr, LONG_HEX);
5724
5725 if ((long) section->sh_offset == section->sh_offset)
5726 printf (" %6.6lx", (unsigned long) section->sh_offset);
5727 else
5728 {
5729 putchar (' ');
5730 print_vma (section->sh_offset, LONG_HEX);
5731 }
5732
5733 if ((unsigned long) section->sh_size == section->sh_size)
5734 printf (" %6.6lx", (unsigned long) section->sh_size);
5735 else
5736 {
5737 putchar (' ');
5738 print_vma (section->sh_size, LONG_HEX);
5739 }
5740
5741 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5742 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5743 else
5744 {
5745 putchar (' ');
5746 print_vma (section->sh_entsize, LONG_HEX);
5747 }
5748
5749 if (do_section_details)
5750 fputs (" ", stdout);
5751 else
5752 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5753
5754 printf ("%2u %3u ", section->sh_link, section->sh_info);
5755
5756 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5757 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5758 else
5759 {
5760 print_vma (section->sh_addralign, DEC);
5761 putchar ('\n');
5762 }
5763 }
5764 else if (do_section_details)
5765 {
5766 printf (" %-15.15s ",
5767 get_section_type_name (section->sh_type));
5768 print_vma (section->sh_addr, LONG_HEX);
5769 if ((long) section->sh_offset == section->sh_offset)
5770 printf (" %16.16lx", (unsigned long) section->sh_offset);
5771 else
5772 {
5773 printf (" ");
5774 print_vma (section->sh_offset, LONG_HEX);
5775 }
5776 printf (" %u\n ", section->sh_link);
5777 print_vma (section->sh_size, LONG_HEX);
5778 putchar (' ');
5779 print_vma (section->sh_entsize, LONG_HEX);
5780
5781 printf (" %-16u %lu\n",
5782 section->sh_info,
5783 (unsigned long) section->sh_addralign);
5784 }
5785 else
5786 {
5787 putchar (' ');
5788 print_vma (section->sh_addr, LONG_HEX);
5789 if ((long) section->sh_offset == section->sh_offset)
5790 printf (" %8.8lx", (unsigned long) section->sh_offset);
5791 else
5792 {
5793 printf (" ");
5794 print_vma (section->sh_offset, LONG_HEX);
5795 }
5796 printf ("\n ");
5797 print_vma (section->sh_size, LONG_HEX);
5798 printf (" ");
5799 print_vma (section->sh_entsize, LONG_HEX);
5800
5801 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5802
5803 printf (" %2u %3u %lu\n",
5804 section->sh_link,
5805 section->sh_info,
5806 (unsigned long) section->sh_addralign);
5807 }
5808
5809 if (do_section_details)
5810 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5811 }
5812
5813 if (!do_section_details)
5814 {
5815 if (elf_header.e_machine == EM_X86_64
5816 || elf_header.e_machine == EM_L1OM
5817 || elf_header.e_machine == EM_K1OM)
5818 printf (_("Key to Flags:\n\
5819 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5820 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5821 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5822 else
5823 printf (_("Key to Flags:\n\
5824 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5825 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5826 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5827 }
5828
5829 return 1;
5830 }
5831
5832 static const char *
5833 get_group_flags (unsigned int flags)
5834 {
5835 static char buff[32];
5836 switch (flags)
5837 {
5838 case 0:
5839 return "";
5840
5841 case GRP_COMDAT:
5842 return "COMDAT ";
5843
5844 default:
5845 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5846 break;
5847 }
5848 return buff;
5849 }
5850
5851 static int
5852 process_section_groups (FILE * file)
5853 {
5854 Elf_Internal_Shdr * section;
5855 unsigned int i;
5856 struct group * group;
5857 Elf_Internal_Shdr * symtab_sec;
5858 Elf_Internal_Shdr * strtab_sec;
5859 Elf_Internal_Sym * symtab;
5860 unsigned long num_syms;
5861 char * strtab;
5862 size_t strtab_size;
5863
5864 /* Don't process section groups unless needed. */
5865 if (!do_unwind && !do_section_groups)
5866 return 1;
5867
5868 if (elf_header.e_shnum == 0)
5869 {
5870 if (do_section_groups)
5871 printf (_("\nThere are no sections to group in this file.\n"));
5872
5873 return 1;
5874 }
5875
5876 if (section_headers == NULL)
5877 {
5878 error (_("Section headers are not available!\n"));
5879 /* PR 13622: This can happen with a corrupt ELF header. */
5880 return 0;
5881 }
5882
5883 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5884 sizeof (struct group *));
5885
5886 if (section_headers_groups == NULL)
5887 {
5888 error (_("Out of memory reading %u section group headers\n"),
5889 elf_header.e_shnum);
5890 return 0;
5891 }
5892
5893 /* Scan the sections for the group section. */
5894 group_count = 0;
5895 for (i = 0, section = section_headers;
5896 i < elf_header.e_shnum;
5897 i++, section++)
5898 if (section->sh_type == SHT_GROUP)
5899 group_count++;
5900
5901 if (group_count == 0)
5902 {
5903 if (do_section_groups)
5904 printf (_("\nThere are no section groups in this file.\n"));
5905
5906 return 1;
5907 }
5908
5909 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5910
5911 if (section_groups == NULL)
5912 {
5913 error (_("Out of memory reading %lu groups\n"),
5914 (unsigned long) group_count);
5915 return 0;
5916 }
5917
5918 symtab_sec = NULL;
5919 strtab_sec = NULL;
5920 symtab = NULL;
5921 num_syms = 0;
5922 strtab = NULL;
5923 strtab_size = 0;
5924 for (i = 0, section = section_headers, group = section_groups;
5925 i < elf_header.e_shnum;
5926 i++, section++)
5927 {
5928 if (section->sh_type == SHT_GROUP)
5929 {
5930 const char * name = printable_section_name (section);
5931 const char * group_name;
5932 unsigned char * start;
5933 unsigned char * indices;
5934 unsigned int entry, j, size;
5935 Elf_Internal_Shdr * sec;
5936 Elf_Internal_Sym * sym;
5937
5938 /* Get the symbol table. */
5939 if (section->sh_link >= elf_header.e_shnum
5940 || ((sec = section_headers + section->sh_link)->sh_type
5941 != SHT_SYMTAB))
5942 {
5943 error (_("Bad sh_link in group section `%s'\n"), name);
5944 continue;
5945 }
5946
5947 if (symtab_sec != sec)
5948 {
5949 symtab_sec = sec;
5950 if (symtab)
5951 free (symtab);
5952 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5953 }
5954
5955 if (symtab == NULL)
5956 {
5957 error (_("Corrupt header in group section `%s'\n"), name);
5958 continue;
5959 }
5960
5961 if (section->sh_info >= num_syms)
5962 {
5963 error (_("Bad sh_info in group section `%s'\n"), name);
5964 continue;
5965 }
5966
5967 sym = symtab + section->sh_info;
5968
5969 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5970 {
5971 if (sym->st_shndx == 0
5972 || sym->st_shndx >= elf_header.e_shnum)
5973 {
5974 error (_("Bad sh_info in group section `%s'\n"), name);
5975 continue;
5976 }
5977
5978 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5979 strtab_sec = NULL;
5980 if (strtab)
5981 free (strtab);
5982 strtab = NULL;
5983 strtab_size = 0;
5984 }
5985 else
5986 {
5987 /* Get the string table. */
5988 if (symtab_sec->sh_link >= elf_header.e_shnum)
5989 {
5990 strtab_sec = NULL;
5991 if (strtab)
5992 free (strtab);
5993 strtab = NULL;
5994 strtab_size = 0;
5995 }
5996 else if (strtab_sec
5997 != (sec = section_headers + symtab_sec->sh_link))
5998 {
5999 strtab_sec = sec;
6000 if (strtab)
6001 free (strtab);
6002
6003 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6004 1, strtab_sec->sh_size,
6005 _("string table"));
6006 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6007 }
6008 group_name = sym->st_name < strtab_size
6009 ? strtab + sym->st_name : _("<corrupt>");
6010 }
6011
6012 /* PR 17531: file: loop. */
6013 if (section->sh_entsize > section->sh_size)
6014 {
6015 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6016 printable_section_name (section),
6017 (unsigned long) section->sh_entsize,
6018 (unsigned long) section->sh_size);
6019 break;
6020 }
6021
6022 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6023 1, section->sh_size,
6024 _("section data"));
6025 if (start == NULL)
6026 continue;
6027
6028 indices = start;
6029 size = (section->sh_size / section->sh_entsize) - 1;
6030 entry = byte_get (indices, 4);
6031 indices += 4;
6032
6033 if (do_section_groups)
6034 {
6035 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6036 get_group_flags (entry), i, name, group_name, size);
6037
6038 printf (_(" [Index] Name\n"));
6039 }
6040
6041 group->group_index = i;
6042
6043 for (j = 0; j < size; j++)
6044 {
6045 struct group_list * g;
6046
6047 entry = byte_get (indices, 4);
6048 indices += 4;
6049
6050 if (entry >= elf_header.e_shnum)
6051 {
6052 static unsigned num_group_errors = 0;
6053
6054 if (num_group_errors ++ < 10)
6055 {
6056 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6057 entry, i, elf_header.e_shnum - 1);
6058 if (num_group_errors == 10)
6059 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6060 }
6061 continue;
6062 }
6063
6064 if (section_headers_groups [entry] != NULL)
6065 {
6066 if (entry)
6067 {
6068 static unsigned num_errs = 0;
6069
6070 if (num_errs ++ < 10)
6071 {
6072 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6073 entry, i,
6074 section_headers_groups [entry]->group_index);
6075 if (num_errs == 10)
6076 warn (_("Further error messages about already contained group sections suppressed\n"));
6077 }
6078 continue;
6079 }
6080 else
6081 {
6082 /* Intel C/C++ compiler may put section 0 in a
6083 section group. We just warn it the first time
6084 and ignore it afterwards. */
6085 static int warned = 0;
6086 if (!warned)
6087 {
6088 error (_("section 0 in group section [%5u]\n"),
6089 section_headers_groups [entry]->group_index);
6090 warned++;
6091 }
6092 }
6093 }
6094
6095 section_headers_groups [entry] = group;
6096
6097 if (do_section_groups)
6098 {
6099 sec = section_headers + entry;
6100 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6101 }
6102
6103 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6104 g->section_index = entry;
6105 g->next = group->root;
6106 group->root = g;
6107 }
6108
6109 if (start)
6110 free (start);
6111
6112 group++;
6113 }
6114 }
6115
6116 if (symtab)
6117 free (symtab);
6118 if (strtab)
6119 free (strtab);
6120 return 1;
6121 }
6122
6123 /* Data used to display dynamic fixups. */
6124
6125 struct ia64_vms_dynfixup
6126 {
6127 bfd_vma needed_ident; /* Library ident number. */
6128 bfd_vma needed; /* Index in the dstrtab of the library name. */
6129 bfd_vma fixup_needed; /* Index of the library. */
6130 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6131 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6132 };
6133
6134 /* Data used to display dynamic relocations. */
6135
6136 struct ia64_vms_dynimgrela
6137 {
6138 bfd_vma img_rela_cnt; /* Number of relocations. */
6139 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6140 };
6141
6142 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6143 library). */
6144
6145 static void
6146 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6147 const char *strtab, unsigned int strtab_sz)
6148 {
6149 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6150 long i;
6151 const char *lib_name;
6152
6153 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6154 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6155 _("dynamic section image fixups"));
6156 if (!imfs)
6157 return;
6158
6159 if (fixup->needed < strtab_sz)
6160 lib_name = strtab + fixup->needed;
6161 else
6162 {
6163 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6164 (unsigned long) fixup->needed);
6165 lib_name = "???";
6166 }
6167 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6168 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6169 printf
6170 (_("Seg Offset Type SymVec DataType\n"));
6171
6172 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6173 {
6174 unsigned int type;
6175 const char *rtype;
6176
6177 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6178 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6179 type = BYTE_GET (imfs [i].type);
6180 rtype = elf_ia64_reloc_type (type);
6181 if (rtype == NULL)
6182 printf (" 0x%08x ", type);
6183 else
6184 printf (" %-32s ", rtype);
6185 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6186 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6187 }
6188
6189 free (imfs);
6190 }
6191
6192 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6193
6194 static void
6195 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6196 {
6197 Elf64_External_VMS_IMAGE_RELA *imrs;
6198 long i;
6199
6200 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6201 1, imgrela->img_rela_cnt * sizeof (*imrs),
6202 _("dynamic section image relocations"));
6203 if (!imrs)
6204 return;
6205
6206 printf (_("\nImage relocs\n"));
6207 printf
6208 (_("Seg Offset Type Addend Seg Sym Off\n"));
6209
6210 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6211 {
6212 unsigned int type;
6213 const char *rtype;
6214
6215 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6216 printf ("%08" BFD_VMA_FMT "x ",
6217 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6218 type = BYTE_GET (imrs [i].type);
6219 rtype = elf_ia64_reloc_type (type);
6220 if (rtype == NULL)
6221 printf ("0x%08x ", type);
6222 else
6223 printf ("%-31s ", rtype);
6224 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6225 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6226 printf ("%08" BFD_VMA_FMT "x\n",
6227 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6228 }
6229
6230 free (imrs);
6231 }
6232
6233 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6234
6235 static int
6236 process_ia64_vms_dynamic_relocs (FILE *file)
6237 {
6238 struct ia64_vms_dynfixup fixup;
6239 struct ia64_vms_dynimgrela imgrela;
6240 Elf_Internal_Dyn *entry;
6241 int res = 0;
6242 bfd_vma strtab_off = 0;
6243 bfd_vma strtab_sz = 0;
6244 char *strtab = NULL;
6245
6246 memset (&fixup, 0, sizeof (fixup));
6247 memset (&imgrela, 0, sizeof (imgrela));
6248
6249 /* Note: the order of the entries is specified by the OpenVMS specs. */
6250 for (entry = dynamic_section;
6251 entry < dynamic_section + dynamic_nent;
6252 entry++)
6253 {
6254 switch (entry->d_tag)
6255 {
6256 case DT_IA_64_VMS_STRTAB_OFFSET:
6257 strtab_off = entry->d_un.d_val;
6258 break;
6259 case DT_STRSZ:
6260 strtab_sz = entry->d_un.d_val;
6261 if (strtab == NULL)
6262 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6263 1, strtab_sz, _("dynamic string section"));
6264 break;
6265
6266 case DT_IA_64_VMS_NEEDED_IDENT:
6267 fixup.needed_ident = entry->d_un.d_val;
6268 break;
6269 case DT_NEEDED:
6270 fixup.needed = entry->d_un.d_val;
6271 break;
6272 case DT_IA_64_VMS_FIXUP_NEEDED:
6273 fixup.fixup_needed = entry->d_un.d_val;
6274 break;
6275 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6276 fixup.fixup_rela_cnt = entry->d_un.d_val;
6277 break;
6278 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6279 fixup.fixup_rela_off = entry->d_un.d_val;
6280 res++;
6281 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6282 break;
6283
6284 case DT_IA_64_VMS_IMG_RELA_CNT:
6285 imgrela.img_rela_cnt = entry->d_un.d_val;
6286 break;
6287 case DT_IA_64_VMS_IMG_RELA_OFF:
6288 imgrela.img_rela_off = entry->d_un.d_val;
6289 res++;
6290 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6291 break;
6292
6293 default:
6294 break;
6295 }
6296 }
6297
6298 if (strtab != NULL)
6299 free (strtab);
6300
6301 return res;
6302 }
6303
6304 static struct
6305 {
6306 const char * name;
6307 int reloc;
6308 int size;
6309 int rela;
6310 } dynamic_relocations [] =
6311 {
6312 { "REL", DT_REL, DT_RELSZ, FALSE },
6313 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6314 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6315 };
6316
6317 /* Process the reloc section. */
6318
6319 static int
6320 process_relocs (FILE * file)
6321 {
6322 unsigned long rel_size;
6323 unsigned long rel_offset;
6324
6325
6326 if (!do_reloc)
6327 return 1;
6328
6329 if (do_using_dynamic)
6330 {
6331 int is_rela;
6332 const char * name;
6333 int has_dynamic_reloc;
6334 unsigned int i;
6335
6336 has_dynamic_reloc = 0;
6337
6338 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6339 {
6340 is_rela = dynamic_relocations [i].rela;
6341 name = dynamic_relocations [i].name;
6342 rel_size = dynamic_info [dynamic_relocations [i].size];
6343 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6344
6345 has_dynamic_reloc |= rel_size;
6346
6347 if (is_rela == UNKNOWN)
6348 {
6349 if (dynamic_relocations [i].reloc == DT_JMPREL)
6350 switch (dynamic_info[DT_PLTREL])
6351 {
6352 case DT_REL:
6353 is_rela = FALSE;
6354 break;
6355 case DT_RELA:
6356 is_rela = TRUE;
6357 break;
6358 }
6359 }
6360
6361 if (rel_size)
6362 {
6363 printf
6364 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6365 name, rel_offset, rel_size);
6366
6367 dump_relocations (file,
6368 offset_from_vma (file, rel_offset, rel_size),
6369 rel_size,
6370 dynamic_symbols, num_dynamic_syms,
6371 dynamic_strings, dynamic_strings_length,
6372 is_rela, 1);
6373 }
6374 }
6375
6376 if (is_ia64_vms ())
6377 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6378
6379 if (! has_dynamic_reloc)
6380 printf (_("\nThere are no dynamic relocations in this file.\n"));
6381 }
6382 else
6383 {
6384 Elf_Internal_Shdr * section;
6385 unsigned long i;
6386 int found = 0;
6387
6388 for (i = 0, section = section_headers;
6389 i < elf_header.e_shnum;
6390 i++, section++)
6391 {
6392 if ( section->sh_type != SHT_RELA
6393 && section->sh_type != SHT_REL)
6394 continue;
6395
6396 rel_offset = section->sh_offset;
6397 rel_size = section->sh_size;
6398
6399 if (rel_size)
6400 {
6401 Elf_Internal_Shdr * strsec;
6402 int is_rela;
6403
6404 printf (_("\nRelocation section "));
6405
6406 if (string_table == NULL)
6407 printf ("%d", section->sh_name);
6408 else
6409 printf ("'%s'", printable_section_name (section));
6410
6411 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6412 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6413
6414 is_rela = section->sh_type == SHT_RELA;
6415
6416 if (section->sh_link != 0
6417 && section->sh_link < elf_header.e_shnum)
6418 {
6419 Elf_Internal_Shdr * symsec;
6420 Elf_Internal_Sym * symtab;
6421 unsigned long nsyms;
6422 unsigned long strtablen = 0;
6423 char * strtab = NULL;
6424
6425 symsec = section_headers + section->sh_link;
6426 if (symsec->sh_type != SHT_SYMTAB
6427 && symsec->sh_type != SHT_DYNSYM)
6428 continue;
6429
6430 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6431
6432 if (symtab == NULL)
6433 continue;
6434
6435 if (symsec->sh_link != 0
6436 && symsec->sh_link < elf_header.e_shnum)
6437 {
6438 strsec = section_headers + symsec->sh_link;
6439
6440 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6441 1, strsec->sh_size,
6442 _("string table"));
6443 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6444 }
6445
6446 dump_relocations (file, rel_offset, rel_size,
6447 symtab, nsyms, strtab, strtablen,
6448 is_rela,
6449 symsec->sh_type == SHT_DYNSYM);
6450 if (strtab)
6451 free (strtab);
6452 free (symtab);
6453 }
6454 else
6455 dump_relocations (file, rel_offset, rel_size,
6456 NULL, 0, NULL, 0, is_rela, 0);
6457
6458 found = 1;
6459 }
6460 }
6461
6462 if (! found)
6463 printf (_("\nThere are no relocations in this file.\n"));
6464 }
6465
6466 return 1;
6467 }
6468
6469 /* An absolute address consists of a section and an offset. If the
6470 section is NULL, the offset itself is the address, otherwise, the
6471 address equals to LOAD_ADDRESS(section) + offset. */
6472
6473 struct absaddr
6474 {
6475 unsigned short section;
6476 bfd_vma offset;
6477 };
6478
6479 #define ABSADDR(a) \
6480 ((a).section \
6481 ? section_headers [(a).section].sh_addr + (a).offset \
6482 : (a).offset)
6483
6484 /* Find the nearest symbol at or below ADDR. Returns the symbol
6485 name, if found, and the offset from the symbol to ADDR. */
6486
6487 static void
6488 find_symbol_for_address (Elf_Internal_Sym * symtab,
6489 unsigned long nsyms,
6490 const char * strtab,
6491 unsigned long strtab_size,
6492 struct absaddr addr,
6493 const char ** symname,
6494 bfd_vma * offset)
6495 {
6496 bfd_vma dist = 0x100000;
6497 Elf_Internal_Sym * sym;
6498 Elf_Internal_Sym * beg;
6499 Elf_Internal_Sym * end;
6500 Elf_Internal_Sym * best = NULL;
6501
6502 REMOVE_ARCH_BITS (addr.offset);
6503 beg = symtab;
6504 end = symtab + nsyms;
6505
6506 while (beg < end)
6507 {
6508 bfd_vma value;
6509
6510 sym = beg + (end - beg) / 2;
6511
6512 value = sym->st_value;
6513 REMOVE_ARCH_BITS (value);
6514
6515 if (sym->st_name != 0
6516 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6517 && addr.offset >= value
6518 && addr.offset - value < dist)
6519 {
6520 best = sym;
6521 dist = addr.offset - value;
6522 if (!dist)
6523 break;
6524 }
6525
6526 if (addr.offset < value)
6527 end = sym;
6528 else
6529 beg = sym + 1;
6530 }
6531
6532 if (best)
6533 {
6534 *symname = (best->st_name >= strtab_size
6535 ? _("<corrupt>") : strtab + best->st_name);
6536 *offset = dist;
6537 return;
6538 }
6539
6540 *symname = NULL;
6541 *offset = addr.offset;
6542 }
6543
6544 static int
6545 symcmp (const void *p, const void *q)
6546 {
6547 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6548 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6549
6550 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6551 }
6552
6553 /* Process the unwind section. */
6554
6555 #include "unwind-ia64.h"
6556
6557 struct ia64_unw_table_entry
6558 {
6559 struct absaddr start;
6560 struct absaddr end;
6561 struct absaddr info;
6562 };
6563
6564 struct ia64_unw_aux_info
6565 {
6566 struct ia64_unw_table_entry *table; /* Unwind table. */
6567 unsigned long table_len; /* Length of unwind table. */
6568 unsigned char * info; /* Unwind info. */
6569 unsigned long info_size; /* Size of unwind info. */
6570 bfd_vma info_addr; /* Starting address of unwind info. */
6571 bfd_vma seg_base; /* Starting address of segment. */
6572 Elf_Internal_Sym * symtab; /* The symbol table. */
6573 unsigned long nsyms; /* Number of symbols. */
6574 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6575 unsigned long nfuns; /* Number of entries in funtab. */
6576 char * strtab; /* The string table. */
6577 unsigned long strtab_size; /* Size of string table. */
6578 };
6579
6580 static void
6581 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6582 {
6583 struct ia64_unw_table_entry * tp;
6584 unsigned long j, nfuns;
6585 int in_body;
6586
6587 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6588 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6589 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6590 aux->funtab[nfuns++] = aux->symtab[j];
6591 aux->nfuns = nfuns;
6592 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6593
6594 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6595 {
6596 bfd_vma stamp;
6597 bfd_vma offset;
6598 const unsigned char * dp;
6599 const unsigned char * head;
6600 const unsigned char * end;
6601 const char * procname;
6602
6603 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6604 aux->strtab_size, tp->start, &procname, &offset);
6605
6606 fputs ("\n<", stdout);
6607
6608 if (procname)
6609 {
6610 fputs (procname, stdout);
6611
6612 if (offset)
6613 printf ("+%lx", (unsigned long) offset);
6614 }
6615
6616 fputs (">: [", stdout);
6617 print_vma (tp->start.offset, PREFIX_HEX);
6618 fputc ('-', stdout);
6619 print_vma (tp->end.offset, PREFIX_HEX);
6620 printf ("], info at +0x%lx\n",
6621 (unsigned long) (tp->info.offset - aux->seg_base));
6622
6623 /* PR 17531: file: 86232b32. */
6624 if (aux->info == NULL)
6625 continue;
6626
6627 /* PR 17531: file: 0997b4d1. */
6628 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6629 {
6630 warn (_("Invalid offset %lx in table entry %ld\n"),
6631 (long) tp->info.offset, (long) (tp - aux->table));
6632 continue;
6633 }
6634
6635 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6636 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6637
6638 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6639 (unsigned) UNW_VER (stamp),
6640 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6641 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6642 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6643 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6644
6645 if (UNW_VER (stamp) != 1)
6646 {
6647 printf (_("\tUnknown version.\n"));
6648 continue;
6649 }
6650
6651 in_body = 0;
6652 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6653 /* PR 17531: file: 16ceda89. */
6654 if (end > aux->info + aux->info_size)
6655 end = aux->info + aux->info_size;
6656 for (dp = head + 8; dp < end;)
6657 dp = unw_decode (dp, in_body, & in_body);
6658 }
6659
6660 free (aux->funtab);
6661 }
6662
6663 static bfd_boolean
6664 slurp_ia64_unwind_table (FILE * file,
6665 struct ia64_unw_aux_info * aux,
6666 Elf_Internal_Shdr * sec)
6667 {
6668 unsigned long size, nrelas, i;
6669 Elf_Internal_Phdr * seg;
6670 struct ia64_unw_table_entry * tep;
6671 Elf_Internal_Shdr * relsec;
6672 Elf_Internal_Rela * rela;
6673 Elf_Internal_Rela * rp;
6674 unsigned char * table;
6675 unsigned char * tp;
6676 Elf_Internal_Sym * sym;
6677 const char * relname;
6678
6679 aux->table_len = 0;
6680
6681 /* First, find the starting address of the segment that includes
6682 this section: */
6683
6684 if (elf_header.e_phnum)
6685 {
6686 if (! get_program_headers (file))
6687 return FALSE;
6688
6689 for (seg = program_headers;
6690 seg < program_headers + elf_header.e_phnum;
6691 ++seg)
6692 {
6693 if (seg->p_type != PT_LOAD)
6694 continue;
6695
6696 if (sec->sh_addr >= seg->p_vaddr
6697 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6698 {
6699 aux->seg_base = seg->p_vaddr;
6700 break;
6701 }
6702 }
6703 }
6704
6705 /* Second, build the unwind table from the contents of the unwind section: */
6706 size = sec->sh_size;
6707 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6708 _("unwind table"));
6709 if (!table)
6710 return FALSE;
6711
6712 aux->table_len = size / (3 * eh_addr_size);
6713 aux->table = (struct ia64_unw_table_entry *)
6714 xcmalloc (aux->table_len, sizeof (aux->table[0]));
6715 tep = aux->table;
6716
6717 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6718 {
6719 tep->start.section = SHN_UNDEF;
6720 tep->end.section = SHN_UNDEF;
6721 tep->info.section = SHN_UNDEF;
6722 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6723 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6724 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6725 tep->start.offset += aux->seg_base;
6726 tep->end.offset += aux->seg_base;
6727 tep->info.offset += aux->seg_base;
6728 }
6729 free (table);
6730
6731 /* Third, apply any relocations to the unwind table: */
6732 for (relsec = section_headers;
6733 relsec < section_headers + elf_header.e_shnum;
6734 ++relsec)
6735 {
6736 if (relsec->sh_type != SHT_RELA
6737 || relsec->sh_info >= elf_header.e_shnum
6738 || section_headers + relsec->sh_info != sec)
6739 continue;
6740
6741 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6742 & rela, & nrelas))
6743 {
6744 free (aux->table);
6745 aux->table = NULL;
6746 aux->table_len = 0;
6747 return FALSE;
6748 }
6749
6750 for (rp = rela; rp < rela + nrelas; ++rp)
6751 {
6752 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6753 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6754
6755 /* PR 17531: file: 9fa67536. */
6756 if (relname == NULL)
6757 {
6758 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6759 continue;
6760 }
6761
6762 if (! const_strneq (relname, "R_IA64_SEGREL"))
6763 {
6764 warn (_("Skipping unexpected relocation type: %s\n"), relname);
6765 continue;
6766 }
6767
6768 i = rp->r_offset / (3 * eh_addr_size);
6769
6770 /* PR 17531: file: 5bc8d9bf. */
6771 if (i >= aux->table_len)
6772 {
6773 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6774 continue;
6775 }
6776
6777 switch (rp->r_offset / eh_addr_size % 3)
6778 {
6779 case 0:
6780 aux->table[i].start.section = sym->st_shndx;
6781 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6782 break;
6783 case 1:
6784 aux->table[i].end.section = sym->st_shndx;
6785 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6786 break;
6787 case 2:
6788 aux->table[i].info.section = sym->st_shndx;
6789 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6790 break;
6791 default:
6792 break;
6793 }
6794 }
6795
6796 free (rela);
6797 }
6798
6799 return TRUE;
6800 }
6801
6802 static void
6803 ia64_process_unwind (FILE * file)
6804 {
6805 Elf_Internal_Shdr * sec;
6806 Elf_Internal_Shdr * unwsec = NULL;
6807 Elf_Internal_Shdr * strsec;
6808 unsigned long i, unwcount = 0, unwstart = 0;
6809 struct ia64_unw_aux_info aux;
6810
6811 memset (& aux, 0, sizeof (aux));
6812
6813 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6814 {
6815 if (sec->sh_type == SHT_SYMTAB
6816 && sec->sh_link < elf_header.e_shnum)
6817 {
6818 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6819
6820 strsec = section_headers + sec->sh_link;
6821 if (aux.strtab != NULL)
6822 {
6823 error (_("Multiple auxillary string tables encountered\n"));
6824 free (aux.strtab);
6825 }
6826 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6827 1, strsec->sh_size,
6828 _("string table"));
6829 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6830 }
6831 else if (sec->sh_type == SHT_IA_64_UNWIND)
6832 unwcount++;
6833 }
6834
6835 if (!unwcount)
6836 printf (_("\nThere are no unwind sections in this file.\n"));
6837
6838 while (unwcount-- > 0)
6839 {
6840 char * suffix;
6841 size_t len, len2;
6842
6843 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6844 i < elf_header.e_shnum; ++i, ++sec)
6845 if (sec->sh_type == SHT_IA_64_UNWIND)
6846 {
6847 unwsec = sec;
6848 break;
6849 }
6850 /* We have already counted the number of SHT_IA64_UNWIND
6851 sections so the loop above should never fail. */
6852 assert (unwsec != NULL);
6853
6854 unwstart = i + 1;
6855 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6856
6857 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6858 {
6859 /* We need to find which section group it is in. */
6860 struct group_list * g;
6861
6862 if (section_headers_groups == NULL
6863 || section_headers_groups [i] == NULL)
6864 i = elf_header.e_shnum;
6865 else
6866 {
6867 g = section_headers_groups [i]->root;
6868
6869 for (; g != NULL; g = g->next)
6870 {
6871 sec = section_headers + g->section_index;
6872
6873 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6874 break;
6875 }
6876
6877 if (g == NULL)
6878 i = elf_header.e_shnum;
6879 }
6880 }
6881 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6882 {
6883 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6884 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6885 suffix = SECTION_NAME (unwsec) + len;
6886 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6887 ++i, ++sec)
6888 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6889 && streq (SECTION_NAME (sec) + len2, suffix))
6890 break;
6891 }
6892 else
6893 {
6894 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6895 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6896 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6897 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6898 suffix = "";
6899 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6900 suffix = SECTION_NAME (unwsec) + len;
6901 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6902 ++i, ++sec)
6903 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6904 && streq (SECTION_NAME (sec) + len2, suffix))
6905 break;
6906 }
6907
6908 if (i == elf_header.e_shnum)
6909 {
6910 printf (_("\nCould not find unwind info section for "));
6911
6912 if (string_table == NULL)
6913 printf ("%d", unwsec->sh_name);
6914 else
6915 printf ("'%s'", printable_section_name (unwsec));
6916 }
6917 else
6918 {
6919 aux.info_addr = sec->sh_addr;
6920 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6921 sec->sh_size,
6922 _("unwind info"));
6923 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6924
6925 printf (_("\nUnwind section "));
6926
6927 if (string_table == NULL)
6928 printf ("%d", unwsec->sh_name);
6929 else
6930 printf ("'%s'", printable_section_name (unwsec));
6931
6932 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6933 (unsigned long) unwsec->sh_offset,
6934 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6935
6936 if (slurp_ia64_unwind_table (file, & aux, unwsec)
6937 && aux.table_len > 0)
6938 dump_ia64_unwind (& aux);
6939
6940 if (aux.table)
6941 free ((char *) aux.table);
6942 if (aux.info)
6943 free ((char *) aux.info);
6944 aux.table = NULL;
6945 aux.info = NULL;
6946 }
6947 }
6948
6949 if (aux.symtab)
6950 free (aux.symtab);
6951 if (aux.strtab)
6952 free ((char *) aux.strtab);
6953 }
6954
6955 struct hppa_unw_table_entry
6956 {
6957 struct absaddr start;
6958 struct absaddr end;
6959 unsigned int Cannot_unwind:1; /* 0 */
6960 unsigned int Millicode:1; /* 1 */
6961 unsigned int Millicode_save_sr0:1; /* 2 */
6962 unsigned int Region_description:2; /* 3..4 */
6963 unsigned int reserved1:1; /* 5 */
6964 unsigned int Entry_SR:1; /* 6 */
6965 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6966 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6967 unsigned int Args_stored:1; /* 16 */
6968 unsigned int Variable_Frame:1; /* 17 */
6969 unsigned int Separate_Package_Body:1; /* 18 */
6970 unsigned int Frame_Extension_Millicode:1; /* 19 */
6971 unsigned int Stack_Overflow_Check:1; /* 20 */
6972 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
6973 unsigned int Ada_Region:1; /* 22 */
6974 unsigned int cxx_info:1; /* 23 */
6975 unsigned int cxx_try_catch:1; /* 24 */
6976 unsigned int sched_entry_seq:1; /* 25 */
6977 unsigned int reserved2:1; /* 26 */
6978 unsigned int Save_SP:1; /* 27 */
6979 unsigned int Save_RP:1; /* 28 */
6980 unsigned int Save_MRP_in_frame:1; /* 29 */
6981 unsigned int extn_ptr_defined:1; /* 30 */
6982 unsigned int Cleanup_defined:1; /* 31 */
6983
6984 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6985 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6986 unsigned int Large_frame:1; /* 2 */
6987 unsigned int Pseudo_SP_Set:1; /* 3 */
6988 unsigned int reserved4:1; /* 4 */
6989 unsigned int Total_frame_size:27; /* 5..31 */
6990 };
6991
6992 struct hppa_unw_aux_info
6993 {
6994 struct hppa_unw_table_entry * table; /* Unwind table. */
6995 unsigned long table_len; /* Length of unwind table. */
6996 bfd_vma seg_base; /* Starting address of segment. */
6997 Elf_Internal_Sym * symtab; /* The symbol table. */
6998 unsigned long nsyms; /* Number of symbols. */
6999 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7000 unsigned long nfuns; /* Number of entries in funtab. */
7001 char * strtab; /* The string table. */
7002 unsigned long strtab_size; /* Size of string table. */
7003 };
7004
7005 static void
7006 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7007 {
7008 struct hppa_unw_table_entry * tp;
7009 unsigned long j, nfuns;
7010
7011 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7012 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7013 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7014 aux->funtab[nfuns++] = aux->symtab[j];
7015 aux->nfuns = nfuns;
7016 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7017
7018 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7019 {
7020 bfd_vma offset;
7021 const char * procname;
7022
7023 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7024 aux->strtab_size, tp->start, &procname,
7025 &offset);
7026
7027 fputs ("\n<", stdout);
7028
7029 if (procname)
7030 {
7031 fputs (procname, stdout);
7032
7033 if (offset)
7034 printf ("+%lx", (unsigned long) offset);
7035 }
7036
7037 fputs (">: [", stdout);
7038 print_vma (tp->start.offset, PREFIX_HEX);
7039 fputc ('-', stdout);
7040 print_vma (tp->end.offset, PREFIX_HEX);
7041 printf ("]\n\t");
7042
7043 #define PF(_m) if (tp->_m) printf (#_m " ");
7044 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7045 PF(Cannot_unwind);
7046 PF(Millicode);
7047 PF(Millicode_save_sr0);
7048 /* PV(Region_description); */
7049 PF(Entry_SR);
7050 PV(Entry_FR);
7051 PV(Entry_GR);
7052 PF(Args_stored);
7053 PF(Variable_Frame);
7054 PF(Separate_Package_Body);
7055 PF(Frame_Extension_Millicode);
7056 PF(Stack_Overflow_Check);
7057 PF(Two_Instruction_SP_Increment);
7058 PF(Ada_Region);
7059 PF(cxx_info);
7060 PF(cxx_try_catch);
7061 PF(sched_entry_seq);
7062 PF(Save_SP);
7063 PF(Save_RP);
7064 PF(Save_MRP_in_frame);
7065 PF(extn_ptr_defined);
7066 PF(Cleanup_defined);
7067 PF(MPE_XL_interrupt_marker);
7068 PF(HP_UX_interrupt_marker);
7069 PF(Large_frame);
7070 PF(Pseudo_SP_Set);
7071 PV(Total_frame_size);
7072 #undef PF
7073 #undef PV
7074 }
7075
7076 printf ("\n");
7077
7078 free (aux->funtab);
7079 }
7080
7081 static int
7082 slurp_hppa_unwind_table (FILE * file,
7083 struct hppa_unw_aux_info * aux,
7084 Elf_Internal_Shdr * sec)
7085 {
7086 unsigned long size, unw_ent_size, nentries, nrelas, i;
7087 Elf_Internal_Phdr * seg;
7088 struct hppa_unw_table_entry * tep;
7089 Elf_Internal_Shdr * relsec;
7090 Elf_Internal_Rela * rela;
7091 Elf_Internal_Rela * rp;
7092 unsigned char * table;
7093 unsigned char * tp;
7094 Elf_Internal_Sym * sym;
7095 const char * relname;
7096
7097 /* First, find the starting address of the segment that includes
7098 this section. */
7099
7100 if (elf_header.e_phnum)
7101 {
7102 if (! get_program_headers (file))
7103 return 0;
7104
7105 for (seg = program_headers;
7106 seg < program_headers + elf_header.e_phnum;
7107 ++seg)
7108 {
7109 if (seg->p_type != PT_LOAD)
7110 continue;
7111
7112 if (sec->sh_addr >= seg->p_vaddr
7113 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7114 {
7115 aux->seg_base = seg->p_vaddr;
7116 break;
7117 }
7118 }
7119 }
7120
7121 /* Second, build the unwind table from the contents of the unwind
7122 section. */
7123 size = sec->sh_size;
7124 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7125 _("unwind table"));
7126 if (!table)
7127 return 0;
7128
7129 unw_ent_size = 16;
7130 nentries = size / unw_ent_size;
7131 size = unw_ent_size * nentries;
7132
7133 tep = aux->table = (struct hppa_unw_table_entry *)
7134 xcmalloc (nentries, sizeof (aux->table[0]));
7135
7136 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7137 {
7138 unsigned int tmp1, tmp2;
7139
7140 tep->start.section = SHN_UNDEF;
7141 tep->end.section = SHN_UNDEF;
7142
7143 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7144 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7145 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7146 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7147
7148 tep->start.offset += aux->seg_base;
7149 tep->end.offset += aux->seg_base;
7150
7151 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7152 tep->Millicode = (tmp1 >> 30) & 0x1;
7153 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7154 tep->Region_description = (tmp1 >> 27) & 0x3;
7155 tep->reserved1 = (tmp1 >> 26) & 0x1;
7156 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7157 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7158 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7159 tep->Args_stored = (tmp1 >> 15) & 0x1;
7160 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7161 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7162 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7163 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7164 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7165 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7166 tep->cxx_info = (tmp1 >> 8) & 0x1;
7167 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7168 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7169 tep->reserved2 = (tmp1 >> 5) & 0x1;
7170 tep->Save_SP = (tmp1 >> 4) & 0x1;
7171 tep->Save_RP = (tmp1 >> 3) & 0x1;
7172 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7173 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7174 tep->Cleanup_defined = tmp1 & 0x1;
7175
7176 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7177 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7178 tep->Large_frame = (tmp2 >> 29) & 0x1;
7179 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7180 tep->reserved4 = (tmp2 >> 27) & 0x1;
7181 tep->Total_frame_size = tmp2 & 0x7ffffff;
7182 }
7183 free (table);
7184
7185 /* Third, apply any relocations to the unwind table. */
7186 for (relsec = section_headers;
7187 relsec < section_headers + elf_header.e_shnum;
7188 ++relsec)
7189 {
7190 if (relsec->sh_type != SHT_RELA
7191 || relsec->sh_info >= elf_header.e_shnum
7192 || section_headers + relsec->sh_info != sec)
7193 continue;
7194
7195 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7196 & rela, & nrelas))
7197 return 0;
7198
7199 for (rp = rela; rp < rela + nrelas; ++rp)
7200 {
7201 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7202 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7203
7204 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7205 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7206 {
7207 warn (_("Skipping unexpected relocation type %s\n"), relname);
7208 continue;
7209 }
7210
7211 i = rp->r_offset / unw_ent_size;
7212
7213 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7214 {
7215 case 0:
7216 aux->table[i].start.section = sym->st_shndx;
7217 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7218 break;
7219 case 1:
7220 aux->table[i].end.section = sym->st_shndx;
7221 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7222 break;
7223 default:
7224 break;
7225 }
7226 }
7227
7228 free (rela);
7229 }
7230
7231 aux->table_len = nentries;
7232
7233 return 1;
7234 }
7235
7236 static void
7237 hppa_process_unwind (FILE * file)
7238 {
7239 struct hppa_unw_aux_info aux;
7240 Elf_Internal_Shdr * unwsec = NULL;
7241 Elf_Internal_Shdr * strsec;
7242 Elf_Internal_Shdr * sec;
7243 unsigned long i;
7244
7245 if (string_table == NULL)
7246 return;
7247
7248 memset (& aux, 0, sizeof (aux));
7249
7250 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7251 {
7252 if (sec->sh_type == SHT_SYMTAB
7253 && sec->sh_link < elf_header.e_shnum)
7254 {
7255 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7256
7257 strsec = section_headers + sec->sh_link;
7258 if (aux.strtab != NULL)
7259 {
7260 error (_("Multiple auxillary string tables encountered\n"));
7261 free (aux.strtab);
7262 }
7263 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7264 1, strsec->sh_size,
7265 _("string table"));
7266 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7267 }
7268 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7269 unwsec = sec;
7270 }
7271
7272 if (!unwsec)
7273 printf (_("\nThere are no unwind sections in this file.\n"));
7274
7275 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7276 {
7277 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7278 {
7279 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7280 printable_section_name (sec),
7281 (unsigned long) sec->sh_offset,
7282 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7283
7284 slurp_hppa_unwind_table (file, &aux, sec);
7285 if (aux.table_len > 0)
7286 dump_hppa_unwind (&aux);
7287
7288 if (aux.table)
7289 free ((char *) aux.table);
7290 aux.table = NULL;
7291 }
7292 }
7293
7294 if (aux.symtab)
7295 free (aux.symtab);
7296 if (aux.strtab)
7297 free ((char *) aux.strtab);
7298 }
7299
7300 struct arm_section
7301 {
7302 unsigned char * data; /* The unwind data. */
7303 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7304 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7305 unsigned long nrelas; /* The number of relocations. */
7306 unsigned int rel_type; /* REL or RELA ? */
7307 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7308 };
7309
7310 struct arm_unw_aux_info
7311 {
7312 FILE * file; /* The file containing the unwind sections. */
7313 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7314 unsigned long nsyms; /* Number of symbols. */
7315 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7316 unsigned long nfuns; /* Number of these symbols. */
7317 char * strtab; /* The file's string table. */
7318 unsigned long strtab_size; /* Size of string table. */
7319 };
7320
7321 static const char *
7322 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7323 bfd_vma fn, struct absaddr addr)
7324 {
7325 const char *procname;
7326 bfd_vma sym_offset;
7327
7328 if (addr.section == SHN_UNDEF)
7329 addr.offset = fn;
7330
7331 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7332 aux->strtab_size, addr, &procname,
7333 &sym_offset);
7334
7335 print_vma (fn, PREFIX_HEX);
7336
7337 if (procname)
7338 {
7339 fputs (" <", stdout);
7340 fputs (procname, stdout);
7341
7342 if (sym_offset)
7343 printf ("+0x%lx", (unsigned long) sym_offset);
7344 fputc ('>', stdout);
7345 }
7346
7347 return procname;
7348 }
7349
7350 static void
7351 arm_free_section (struct arm_section *arm_sec)
7352 {
7353 if (arm_sec->data != NULL)
7354 free (arm_sec->data);
7355
7356 if (arm_sec->rela != NULL)
7357 free (arm_sec->rela);
7358 }
7359
7360 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7361 cached section and install SEC instead.
7362 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7363 and return its valued in * WORDP, relocating if necessary.
7364 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7365 relocation's offset in ADDR.
7366 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7367 into the string table of the symbol associated with the reloc. If no
7368 reloc was applied store -1 there.
7369 5) Return TRUE upon success, FALSE otherwise. */
7370
7371 static bfd_boolean
7372 get_unwind_section_word (struct arm_unw_aux_info * aux,
7373 struct arm_section * arm_sec,
7374 Elf_Internal_Shdr * sec,
7375 bfd_vma word_offset,
7376 unsigned int * wordp,
7377 struct absaddr * addr,
7378 bfd_vma * sym_name)
7379 {
7380 Elf_Internal_Rela *rp;
7381 Elf_Internal_Sym *sym;
7382 const char * relname;
7383 unsigned int word;
7384 bfd_boolean wrapped;
7385
7386 if (sec == NULL || arm_sec == NULL)
7387 return FALSE;
7388
7389 addr->section = SHN_UNDEF;
7390 addr->offset = 0;
7391
7392 if (sym_name != NULL)
7393 *sym_name = (bfd_vma) -1;
7394
7395 /* If necessary, update the section cache. */
7396 if (sec != arm_sec->sec)
7397 {
7398 Elf_Internal_Shdr *relsec;
7399
7400 arm_free_section (arm_sec);
7401
7402 arm_sec->sec = sec;
7403 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7404 sec->sh_size, _("unwind data"));
7405 arm_sec->rela = NULL;
7406 arm_sec->nrelas = 0;
7407
7408 for (relsec = section_headers;
7409 relsec < section_headers + elf_header.e_shnum;
7410 ++relsec)
7411 {
7412 if (relsec->sh_info >= elf_header.e_shnum
7413 || section_headers + relsec->sh_info != sec
7414 /* PR 15745: Check the section type as well. */
7415 || (relsec->sh_type != SHT_REL
7416 && relsec->sh_type != SHT_RELA))
7417 continue;
7418
7419 arm_sec->rel_type = relsec->sh_type;
7420 if (relsec->sh_type == SHT_REL)
7421 {
7422 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7423 relsec->sh_size,
7424 & arm_sec->rela, & arm_sec->nrelas))
7425 return FALSE;
7426 }
7427 else /* relsec->sh_type == SHT_RELA */
7428 {
7429 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7430 relsec->sh_size,
7431 & arm_sec->rela, & arm_sec->nrelas))
7432 return FALSE;
7433 }
7434 break;
7435 }
7436
7437 arm_sec->next_rela = arm_sec->rela;
7438 }
7439
7440 /* If there is no unwind data we can do nothing. */
7441 if (arm_sec->data == NULL)
7442 return FALSE;
7443
7444 /* If the offset is invalid then fail. */
7445 if (word_offset > sec->sh_size - 4)
7446 return FALSE;
7447
7448 /* Get the word at the required offset. */
7449 word = byte_get (arm_sec->data + word_offset, 4);
7450
7451 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7452 if (arm_sec->rela == NULL)
7453 {
7454 * wordp = word;
7455 return TRUE;
7456 }
7457
7458 /* Look through the relocs to find the one that applies to the provided offset. */
7459 wrapped = FALSE;
7460 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7461 {
7462 bfd_vma prelval, offset;
7463
7464 if (rp->r_offset > word_offset && !wrapped)
7465 {
7466 rp = arm_sec->rela;
7467 wrapped = TRUE;
7468 }
7469 if (rp->r_offset > word_offset)
7470 break;
7471
7472 if (rp->r_offset & 3)
7473 {
7474 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7475 (unsigned long) rp->r_offset);
7476 continue;
7477 }
7478
7479 if (rp->r_offset < word_offset)
7480 continue;
7481
7482 /* PR 17531: file: 027-161405-0.004 */
7483 if (aux->symtab == NULL)
7484 continue;
7485
7486 if (arm_sec->rel_type == SHT_REL)
7487 {
7488 offset = word & 0x7fffffff;
7489 if (offset & 0x40000000)
7490 offset |= ~ (bfd_vma) 0x7fffffff;
7491 }
7492 else if (arm_sec->rel_type == SHT_RELA)
7493 offset = rp->r_addend;
7494 else
7495 {
7496 error (_("Unknown section relocation type %d encountered\n"),
7497 arm_sec->rel_type);
7498 break;
7499 }
7500
7501 /* PR 17531 file: 027-1241568-0.004. */
7502 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7503 {
7504 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7505 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7506 break;
7507 }
7508
7509 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7510 offset += sym->st_value;
7511 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7512
7513 /* Check that we are processing the expected reloc type. */
7514 if (elf_header.e_machine == EM_ARM)
7515 {
7516 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7517 if (relname == NULL)
7518 {
7519 warn (_("Skipping unknown ARM relocation type: %d\n"),
7520 (int) ELF32_R_TYPE (rp->r_info));
7521 continue;
7522 }
7523
7524 if (streq (relname, "R_ARM_NONE"))
7525 continue;
7526
7527 if (! streq (relname, "R_ARM_PREL31"))
7528 {
7529 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7530 continue;
7531 }
7532 }
7533 else if (elf_header.e_machine == EM_TI_C6000)
7534 {
7535 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7536 if (relname == NULL)
7537 {
7538 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7539 (int) ELF32_R_TYPE (rp->r_info));
7540 continue;
7541 }
7542
7543 if (streq (relname, "R_C6000_NONE"))
7544 continue;
7545
7546 if (! streq (relname, "R_C6000_PREL31"))
7547 {
7548 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7549 continue;
7550 }
7551
7552 prelval >>= 1;
7553 }
7554 else
7555 {
7556 /* This function currently only supports ARM and TI unwinders. */
7557 warn (_("Only TI and ARM unwinders are currently supported\n"));
7558 break;
7559 }
7560
7561 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7562 addr->section = sym->st_shndx;
7563 addr->offset = offset;
7564
7565 if (sym_name)
7566 * sym_name = sym->st_name;
7567 break;
7568 }
7569
7570 *wordp = word;
7571 arm_sec->next_rela = rp;
7572
7573 return TRUE;
7574 }
7575
7576 static const char *tic6x_unwind_regnames[16] =
7577 {
7578 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7579 "A14", "A13", "A12", "A11", "A10",
7580 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7581 };
7582
7583 static void
7584 decode_tic6x_unwind_regmask (unsigned int mask)
7585 {
7586 int i;
7587
7588 for (i = 12; mask; mask >>= 1, i--)
7589 {
7590 if (mask & 1)
7591 {
7592 fputs (tic6x_unwind_regnames[i], stdout);
7593 if (mask > 1)
7594 fputs (", ", stdout);
7595 }
7596 }
7597 }
7598
7599 #define ADVANCE \
7600 if (remaining == 0 && more_words) \
7601 { \
7602 data_offset += 4; \
7603 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7604 data_offset, & word, & addr, NULL)) \
7605 return; \
7606 remaining = 4; \
7607 more_words--; \
7608 } \
7609
7610 #define GET_OP(OP) \
7611 ADVANCE; \
7612 if (remaining) \
7613 { \
7614 remaining--; \
7615 (OP) = word >> 24; \
7616 word <<= 8; \
7617 } \
7618 else \
7619 { \
7620 printf (_("[Truncated opcode]\n")); \
7621 return; \
7622 } \
7623 printf ("0x%02x ", OP)
7624
7625 static void
7626 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7627 unsigned int word,
7628 unsigned int remaining,
7629 unsigned int more_words,
7630 bfd_vma data_offset,
7631 Elf_Internal_Shdr * data_sec,
7632 struct arm_section * data_arm_sec)
7633 {
7634 struct absaddr addr;
7635
7636 /* Decode the unwinding instructions. */
7637 while (1)
7638 {
7639 unsigned int op, op2;
7640
7641 ADVANCE;
7642 if (remaining == 0)
7643 break;
7644 remaining--;
7645 op = word >> 24;
7646 word <<= 8;
7647
7648 printf (" 0x%02x ", op);
7649
7650 if ((op & 0xc0) == 0x00)
7651 {
7652 int offset = ((op & 0x3f) << 2) + 4;
7653
7654 printf (" vsp = vsp + %d", offset);
7655 }
7656 else if ((op & 0xc0) == 0x40)
7657 {
7658 int offset = ((op & 0x3f) << 2) + 4;
7659
7660 printf (" vsp = vsp - %d", offset);
7661 }
7662 else if ((op & 0xf0) == 0x80)
7663 {
7664 GET_OP (op2);
7665 if (op == 0x80 && op2 == 0)
7666 printf (_("Refuse to unwind"));
7667 else
7668 {
7669 unsigned int mask = ((op & 0x0f) << 8) | op2;
7670 int first = 1;
7671 int i;
7672
7673 printf ("pop {");
7674 for (i = 0; i < 12; i++)
7675 if (mask & (1 << i))
7676 {
7677 if (first)
7678 first = 0;
7679 else
7680 printf (", ");
7681 printf ("r%d", 4 + i);
7682 }
7683 printf ("}");
7684 }
7685 }
7686 else if ((op & 0xf0) == 0x90)
7687 {
7688 if (op == 0x9d || op == 0x9f)
7689 printf (_(" [Reserved]"));
7690 else
7691 printf (" vsp = r%d", op & 0x0f);
7692 }
7693 else if ((op & 0xf0) == 0xa0)
7694 {
7695 int end = 4 + (op & 0x07);
7696 int first = 1;
7697 int i;
7698
7699 printf (" pop {");
7700 for (i = 4; i <= end; i++)
7701 {
7702 if (first)
7703 first = 0;
7704 else
7705 printf (", ");
7706 printf ("r%d", i);
7707 }
7708 if (op & 0x08)
7709 {
7710 if (!first)
7711 printf (", ");
7712 printf ("r14");
7713 }
7714 printf ("}");
7715 }
7716 else if (op == 0xb0)
7717 printf (_(" finish"));
7718 else if (op == 0xb1)
7719 {
7720 GET_OP (op2);
7721 if (op2 == 0 || (op2 & 0xf0) != 0)
7722 printf (_("[Spare]"));
7723 else
7724 {
7725 unsigned int mask = op2 & 0x0f;
7726 int first = 1;
7727 int i;
7728
7729 printf ("pop {");
7730 for (i = 0; i < 12; i++)
7731 if (mask & (1 << i))
7732 {
7733 if (first)
7734 first = 0;
7735 else
7736 printf (", ");
7737 printf ("r%d", i);
7738 }
7739 printf ("}");
7740 }
7741 }
7742 else if (op == 0xb2)
7743 {
7744 unsigned char buf[9];
7745 unsigned int i, len;
7746 unsigned long offset;
7747
7748 for (i = 0; i < sizeof (buf); i++)
7749 {
7750 GET_OP (buf[i]);
7751 if ((buf[i] & 0x80) == 0)
7752 break;
7753 }
7754 if (i == sizeof (buf))
7755 printf (_("corrupt change to vsp"));
7756 else
7757 {
7758 offset = read_uleb128 (buf, &len, buf + i + 1);
7759 assert (len == i + 1);
7760 offset = offset * 4 + 0x204;
7761 printf ("vsp = vsp + %ld", offset);
7762 }
7763 }
7764 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7765 {
7766 unsigned int first, last;
7767
7768 GET_OP (op2);
7769 first = op2 >> 4;
7770 last = op2 & 0x0f;
7771 if (op == 0xc8)
7772 first = first + 16;
7773 printf ("pop {D%d", first);
7774 if (last)
7775 printf ("-D%d", first + last);
7776 printf ("}");
7777 }
7778 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7779 {
7780 unsigned int count = op & 0x07;
7781
7782 printf ("pop {D8");
7783 if (count)
7784 printf ("-D%d", 8 + count);
7785 printf ("}");
7786 }
7787 else if (op >= 0xc0 && op <= 0xc5)
7788 {
7789 unsigned int count = op & 0x07;
7790
7791 printf (" pop {wR10");
7792 if (count)
7793 printf ("-wR%d", 10 + count);
7794 printf ("}");
7795 }
7796 else if (op == 0xc6)
7797 {
7798 unsigned int first, last;
7799
7800 GET_OP (op2);
7801 first = op2 >> 4;
7802 last = op2 & 0x0f;
7803 printf ("pop {wR%d", first);
7804 if (last)
7805 printf ("-wR%d", first + last);
7806 printf ("}");
7807 }
7808 else if (op == 0xc7)
7809 {
7810 GET_OP (op2);
7811 if (op2 == 0 || (op2 & 0xf0) != 0)
7812 printf (_("[Spare]"));
7813 else
7814 {
7815 unsigned int mask = op2 & 0x0f;
7816 int first = 1;
7817 int i;
7818
7819 printf ("pop {");
7820 for (i = 0; i < 4; i++)
7821 if (mask & (1 << i))
7822 {
7823 if (first)
7824 first = 0;
7825 else
7826 printf (", ");
7827 printf ("wCGR%d", i);
7828 }
7829 printf ("}");
7830 }
7831 }
7832 else
7833 printf (_(" [unsupported opcode]"));
7834 printf ("\n");
7835 }
7836 }
7837
7838 static void
7839 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
7840 unsigned int word,
7841 unsigned int remaining,
7842 unsigned int more_words,
7843 bfd_vma data_offset,
7844 Elf_Internal_Shdr * data_sec,
7845 struct arm_section * data_arm_sec)
7846 {
7847 struct absaddr addr;
7848
7849 /* Decode the unwinding instructions. */
7850 while (1)
7851 {
7852 unsigned int op, op2;
7853
7854 ADVANCE;
7855 if (remaining == 0)
7856 break;
7857 remaining--;
7858 op = word >> 24;
7859 word <<= 8;
7860
7861 printf (" 0x%02x ", op);
7862
7863 if ((op & 0xc0) == 0x00)
7864 {
7865 int offset = ((op & 0x3f) << 3) + 8;
7866 printf (" sp = sp + %d", offset);
7867 }
7868 else if ((op & 0xc0) == 0x80)
7869 {
7870 GET_OP (op2);
7871 if (op == 0x80 && op2 == 0)
7872 printf (_("Refuse to unwind"));
7873 else
7874 {
7875 unsigned int mask = ((op & 0x1f) << 8) | op2;
7876 if (op & 0x20)
7877 printf ("pop compact {");
7878 else
7879 printf ("pop {");
7880
7881 decode_tic6x_unwind_regmask (mask);
7882 printf("}");
7883 }
7884 }
7885 else if ((op & 0xf0) == 0xc0)
7886 {
7887 unsigned int reg;
7888 unsigned int nregs;
7889 unsigned int i;
7890 const char *name;
7891 struct
7892 {
7893 unsigned int offset;
7894 unsigned int reg;
7895 } regpos[16];
7896
7897 /* Scan entire instruction first so that GET_OP output is not
7898 interleaved with disassembly. */
7899 nregs = 0;
7900 for (i = 0; nregs < (op & 0xf); i++)
7901 {
7902 GET_OP (op2);
7903 reg = op2 >> 4;
7904 if (reg != 0xf)
7905 {
7906 regpos[nregs].offset = i * 2;
7907 regpos[nregs].reg = reg;
7908 nregs++;
7909 }
7910
7911 reg = op2 & 0xf;
7912 if (reg != 0xf)
7913 {
7914 regpos[nregs].offset = i * 2 + 1;
7915 regpos[nregs].reg = reg;
7916 nregs++;
7917 }
7918 }
7919
7920 printf (_("pop frame {"));
7921 reg = nregs - 1;
7922 for (i = i * 2; i > 0; i--)
7923 {
7924 if (regpos[reg].offset == i - 1)
7925 {
7926 name = tic6x_unwind_regnames[regpos[reg].reg];
7927 if (reg > 0)
7928 reg--;
7929 }
7930 else
7931 name = _("[pad]");
7932
7933 fputs (name, stdout);
7934 if (i > 1)
7935 printf (", ");
7936 }
7937
7938 printf ("}");
7939 }
7940 else if (op == 0xd0)
7941 printf (" MOV FP, SP");
7942 else if (op == 0xd1)
7943 printf (" __c6xabi_pop_rts");
7944 else if (op == 0xd2)
7945 {
7946 unsigned char buf[9];
7947 unsigned int i, len;
7948 unsigned long offset;
7949
7950 for (i = 0; i < sizeof (buf); i++)
7951 {
7952 GET_OP (buf[i]);
7953 if ((buf[i] & 0x80) == 0)
7954 break;
7955 }
7956 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
7957 if (i == sizeof (buf))
7958 {
7959 printf ("<corrupt sp adjust>\n");
7960 warn (_("Corrupt stack pointer adjustment detected\n"));
7961 return;
7962 }
7963
7964 offset = read_uleb128 (buf, &len, buf + i + 1);
7965 assert (len == i + 1);
7966 offset = offset * 8 + 0x408;
7967 printf (_("sp = sp + %ld"), offset);
7968 }
7969 else if ((op & 0xf0) == 0xe0)
7970 {
7971 if ((op & 0x0f) == 7)
7972 printf (" RETURN");
7973 else
7974 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7975 }
7976 else
7977 {
7978 printf (_(" [unsupported opcode]"));
7979 }
7980 putchar ('\n');
7981 }
7982 }
7983
7984 static bfd_vma
7985 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7986 {
7987 bfd_vma offset;
7988
7989 offset = word & 0x7fffffff;
7990 if (offset & 0x40000000)
7991 offset |= ~ (bfd_vma) 0x7fffffff;
7992
7993 if (elf_header.e_machine == EM_TI_C6000)
7994 offset <<= 1;
7995
7996 return offset + where;
7997 }
7998
7999 static void
8000 decode_arm_unwind (struct arm_unw_aux_info * aux,
8001 unsigned int word,
8002 unsigned int remaining,
8003 bfd_vma data_offset,
8004 Elf_Internal_Shdr * data_sec,
8005 struct arm_section * data_arm_sec)
8006 {
8007 int per_index;
8008 unsigned int more_words = 0;
8009 struct absaddr addr;
8010 bfd_vma sym_name = (bfd_vma) -1;
8011
8012 if (remaining == 0)
8013 {
8014 /* Fetch the first word.
8015 Note - when decoding an object file the address extracted
8016 here will always be 0. So we also pass in the sym_name
8017 parameter so that we can find the symbol associated with
8018 the personality routine. */
8019 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8020 & word, & addr, & sym_name))
8021 return;
8022
8023 remaining = 4;
8024 }
8025
8026 if ((word & 0x80000000) == 0)
8027 {
8028 /* Expand prel31 for personality routine. */
8029 bfd_vma fn;
8030 const char *procname;
8031
8032 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8033 printf (_(" Personality routine: "));
8034 if (fn == 0
8035 && addr.section == SHN_UNDEF && addr.offset == 0
8036 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8037 {
8038 procname = aux->strtab + sym_name;
8039 print_vma (fn, PREFIX_HEX);
8040 if (procname)
8041 {
8042 fputs (" <", stdout);
8043 fputs (procname, stdout);
8044 fputc ('>', stdout);
8045 }
8046 }
8047 else
8048 procname = arm_print_vma_and_name (aux, fn, addr);
8049 fputc ('\n', stdout);
8050
8051 /* The GCC personality routines use the standard compact
8052 encoding, starting with one byte giving the number of
8053 words. */
8054 if (procname != NULL
8055 && (const_strneq (procname, "__gcc_personality_v0")
8056 || const_strneq (procname, "__gxx_personality_v0")
8057 || const_strneq (procname, "__gcj_personality_v0")
8058 || const_strneq (procname, "__gnu_objc_personality_v0")))
8059 {
8060 remaining = 0;
8061 more_words = 1;
8062 ADVANCE;
8063 if (!remaining)
8064 {
8065 printf (_(" [Truncated data]\n"));
8066 return;
8067 }
8068 more_words = word >> 24;
8069 word <<= 8;
8070 remaining--;
8071 per_index = -1;
8072 }
8073 else
8074 return;
8075 }
8076 else
8077 {
8078 /* ARM EHABI Section 6.3:
8079
8080 An exception-handling table entry for the compact model looks like:
8081
8082 31 30-28 27-24 23-0
8083 -- ----- ----- ----
8084 1 0 index Data for personalityRoutine[index] */
8085
8086 if (elf_header.e_machine == EM_ARM
8087 && (word & 0x70000000))
8088 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8089
8090 per_index = (word >> 24) & 0x7f;
8091 printf (_(" Compact model index: %d\n"), per_index);
8092 if (per_index == 0)
8093 {
8094 more_words = 0;
8095 word <<= 8;
8096 remaining--;
8097 }
8098 else if (per_index < 3)
8099 {
8100 more_words = (word >> 16) & 0xff;
8101 word <<= 16;
8102 remaining -= 2;
8103 }
8104 }
8105
8106 switch (elf_header.e_machine)
8107 {
8108 case EM_ARM:
8109 if (per_index < 3)
8110 {
8111 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8112 data_offset, data_sec, data_arm_sec);
8113 }
8114 else
8115 {
8116 warn (_("Unknown ARM compact model index encountered\n"));
8117 printf (_(" [reserved]\n"));
8118 }
8119 break;
8120
8121 case EM_TI_C6000:
8122 if (per_index < 3)
8123 {
8124 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8125 data_offset, data_sec, data_arm_sec);
8126 }
8127 else if (per_index < 5)
8128 {
8129 if (((word >> 17) & 0x7f) == 0x7f)
8130 printf (_(" Restore stack from frame pointer\n"));
8131 else
8132 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8133 printf (_(" Registers restored: "));
8134 if (per_index == 4)
8135 printf (" (compact) ");
8136 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8137 putchar ('\n');
8138 printf (_(" Return register: %s\n"),
8139 tic6x_unwind_regnames[word & 0xf]);
8140 }
8141 else
8142 printf (_(" [reserved (%d)]\n"), per_index);
8143 break;
8144
8145 default:
8146 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8147 elf_header.e_machine);
8148 }
8149
8150 /* Decode the descriptors. Not implemented. */
8151 }
8152
8153 static void
8154 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8155 {
8156 struct arm_section exidx_arm_sec, extab_arm_sec;
8157 unsigned int i, exidx_len;
8158 unsigned long j, nfuns;
8159
8160 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8161 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8162 exidx_len = exidx_sec->sh_size / 8;
8163
8164 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8165 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8166 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8167 aux->funtab[nfuns++] = aux->symtab[j];
8168 aux->nfuns = nfuns;
8169 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8170
8171 for (i = 0; i < exidx_len; i++)
8172 {
8173 unsigned int exidx_fn, exidx_entry;
8174 struct absaddr fn_addr, entry_addr;
8175 bfd_vma fn;
8176
8177 fputc ('\n', stdout);
8178
8179 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8180 8 * i, & exidx_fn, & fn_addr, NULL)
8181 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8182 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8183 {
8184 free (aux->funtab);
8185 arm_free_section (& exidx_arm_sec);
8186 arm_free_section (& extab_arm_sec);
8187 return;
8188 }
8189
8190 /* ARM EHABI, Section 5:
8191 An index table entry consists of 2 words.
8192 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8193 if (exidx_fn & 0x80000000)
8194 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8195
8196 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8197
8198 arm_print_vma_and_name (aux, fn, fn_addr);
8199 fputs (": ", stdout);
8200
8201 if (exidx_entry == 1)
8202 {
8203 print_vma (exidx_entry, PREFIX_HEX);
8204 fputs (" [cantunwind]\n", stdout);
8205 }
8206 else if (exidx_entry & 0x80000000)
8207 {
8208 print_vma (exidx_entry, PREFIX_HEX);
8209 fputc ('\n', stdout);
8210 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8211 }
8212 else
8213 {
8214 bfd_vma table, table_offset = 0;
8215 Elf_Internal_Shdr *table_sec;
8216
8217 fputs ("@", stdout);
8218 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8219 print_vma (table, PREFIX_HEX);
8220 printf ("\n");
8221
8222 /* Locate the matching .ARM.extab. */
8223 if (entry_addr.section != SHN_UNDEF
8224 && entry_addr.section < elf_header.e_shnum)
8225 {
8226 table_sec = section_headers + entry_addr.section;
8227 table_offset = entry_addr.offset;
8228 }
8229 else
8230 {
8231 table_sec = find_section_by_address (table);
8232 if (table_sec != NULL)
8233 table_offset = table - table_sec->sh_addr;
8234 }
8235 if (table_sec == NULL)
8236 {
8237 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8238 (unsigned long) table);
8239 continue;
8240 }
8241 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8242 &extab_arm_sec);
8243 }
8244 }
8245
8246 printf ("\n");
8247
8248 free (aux->funtab);
8249 arm_free_section (&exidx_arm_sec);
8250 arm_free_section (&extab_arm_sec);
8251 }
8252
8253 /* Used for both ARM and C6X unwinding tables. */
8254
8255 static void
8256 arm_process_unwind (FILE *file)
8257 {
8258 struct arm_unw_aux_info aux;
8259 Elf_Internal_Shdr *unwsec = NULL;
8260 Elf_Internal_Shdr *strsec;
8261 Elf_Internal_Shdr *sec;
8262 unsigned long i;
8263 unsigned int sec_type;
8264
8265 switch (elf_header.e_machine)
8266 {
8267 case EM_ARM:
8268 sec_type = SHT_ARM_EXIDX;
8269 break;
8270
8271 case EM_TI_C6000:
8272 sec_type = SHT_C6000_UNWIND;
8273 break;
8274
8275 default:
8276 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8277 elf_header.e_machine);
8278 return;
8279 }
8280
8281 if (string_table == NULL)
8282 return;
8283
8284 memset (& aux, 0, sizeof (aux));
8285 aux.file = file;
8286
8287 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8288 {
8289 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8290 {
8291 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8292
8293 strsec = section_headers + sec->sh_link;
8294
8295 /* PR binutils/17531 file: 011-12666-0.004. */
8296 if (aux.strtab != NULL)
8297 {
8298 error (_("Multiple string tables found in file.\n"));
8299 free (aux.strtab);
8300 }
8301 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8302 1, strsec->sh_size, _("string table"));
8303 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8304 }
8305 else if (sec->sh_type == sec_type)
8306 unwsec = sec;
8307 }
8308
8309 if (unwsec == NULL)
8310 printf (_("\nThere are no unwind sections in this file.\n"));
8311 else
8312 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8313 {
8314 if (sec->sh_type == sec_type)
8315 {
8316 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8317 printable_section_name (sec),
8318 (unsigned long) sec->sh_offset,
8319 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8320
8321 dump_arm_unwind (&aux, sec);
8322 }
8323 }
8324
8325 if (aux.symtab)
8326 free (aux.symtab);
8327 if (aux.strtab)
8328 free ((char *) aux.strtab);
8329 }
8330
8331 static void
8332 process_unwind (FILE * file)
8333 {
8334 struct unwind_handler
8335 {
8336 int machtype;
8337 void (* handler)(FILE *);
8338 } handlers[] =
8339 {
8340 { EM_ARM, arm_process_unwind },
8341 { EM_IA_64, ia64_process_unwind },
8342 { EM_PARISC, hppa_process_unwind },
8343 { EM_TI_C6000, arm_process_unwind },
8344 { 0, 0 }
8345 };
8346 int i;
8347
8348 if (!do_unwind)
8349 return;
8350
8351 for (i = 0; handlers[i].handler != NULL; i++)
8352 if (elf_header.e_machine == handlers[i].machtype)
8353 {
8354 handlers[i].handler (file);
8355 return;
8356 }
8357
8358 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8359 get_machine_name (elf_header.e_machine));
8360 }
8361
8362 static void
8363 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8364 {
8365 switch (entry->d_tag)
8366 {
8367 case DT_MIPS_FLAGS:
8368 if (entry->d_un.d_val == 0)
8369 printf (_("NONE"));
8370 else
8371 {
8372 static const char * opts[] =
8373 {
8374 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8375 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8376 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8377 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8378 "RLD_ORDER_SAFE"
8379 };
8380 unsigned int cnt;
8381 int first = 1;
8382
8383 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8384 if (entry->d_un.d_val & (1 << cnt))
8385 {
8386 printf ("%s%s", first ? "" : " ", opts[cnt]);
8387 first = 0;
8388 }
8389 }
8390 break;
8391
8392 case DT_MIPS_IVERSION:
8393 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8394 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8395 else
8396 {
8397 char buf[40];
8398 sprintf_vma (buf, entry->d_un.d_ptr);
8399 /* Note: coded this way so that there is a single string for translation. */
8400 printf (_("<corrupt: %s>"), buf);
8401 }
8402 break;
8403
8404 case DT_MIPS_TIME_STAMP:
8405 {
8406 char timebuf[20];
8407 struct tm * tmp;
8408 time_t atime = entry->d_un.d_val;
8409
8410 tmp = gmtime (&atime);
8411 /* PR 17531: file: 6accc532. */
8412 if (tmp == NULL)
8413 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8414 else
8415 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8416 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8417 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8418 printf (_("Time Stamp: %s"), timebuf);
8419 }
8420 break;
8421
8422 case DT_MIPS_RLD_VERSION:
8423 case DT_MIPS_LOCAL_GOTNO:
8424 case DT_MIPS_CONFLICTNO:
8425 case DT_MIPS_LIBLISTNO:
8426 case DT_MIPS_SYMTABNO:
8427 case DT_MIPS_UNREFEXTNO:
8428 case DT_MIPS_HIPAGENO:
8429 case DT_MIPS_DELTA_CLASS_NO:
8430 case DT_MIPS_DELTA_INSTANCE_NO:
8431 case DT_MIPS_DELTA_RELOC_NO:
8432 case DT_MIPS_DELTA_SYM_NO:
8433 case DT_MIPS_DELTA_CLASSSYM_NO:
8434 case DT_MIPS_COMPACT_SIZE:
8435 print_vma (entry->d_un.d_ptr, DEC);
8436 break;
8437
8438 default:
8439 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8440 }
8441 putchar ('\n');
8442 }
8443
8444 static void
8445 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8446 {
8447 switch (entry->d_tag)
8448 {
8449 case DT_HP_DLD_FLAGS:
8450 {
8451 static struct
8452 {
8453 long int bit;
8454 const char * str;
8455 }
8456 flags[] =
8457 {
8458 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8459 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8460 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8461 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8462 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8463 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8464 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8465 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8466 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8467 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8468 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8469 { DT_HP_GST, "HP_GST" },
8470 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8471 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8472 { DT_HP_NODELETE, "HP_NODELETE" },
8473 { DT_HP_GROUP, "HP_GROUP" },
8474 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8475 };
8476 int first = 1;
8477 size_t cnt;
8478 bfd_vma val = entry->d_un.d_val;
8479
8480 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8481 if (val & flags[cnt].bit)
8482 {
8483 if (! first)
8484 putchar (' ');
8485 fputs (flags[cnt].str, stdout);
8486 first = 0;
8487 val ^= flags[cnt].bit;
8488 }
8489
8490 if (val != 0 || first)
8491 {
8492 if (! first)
8493 putchar (' ');
8494 print_vma (val, HEX);
8495 }
8496 }
8497 break;
8498
8499 default:
8500 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8501 break;
8502 }
8503 putchar ('\n');
8504 }
8505
8506 #ifdef BFD64
8507
8508 /* VMS vs Unix time offset and factor. */
8509
8510 #define VMS_EPOCH_OFFSET 35067168000000000LL
8511 #define VMS_GRANULARITY_FACTOR 10000000
8512
8513 /* Display a VMS time in a human readable format. */
8514
8515 static void
8516 print_vms_time (bfd_int64_t vmstime)
8517 {
8518 struct tm *tm;
8519 time_t unxtime;
8520
8521 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8522 tm = gmtime (&unxtime);
8523 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8524 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8525 tm->tm_hour, tm->tm_min, tm->tm_sec);
8526 }
8527 #endif /* BFD64 */
8528
8529 static void
8530 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8531 {
8532 switch (entry->d_tag)
8533 {
8534 case DT_IA_64_PLT_RESERVE:
8535 /* First 3 slots reserved. */
8536 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8537 printf (" -- ");
8538 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8539 break;
8540
8541 case DT_IA_64_VMS_LINKTIME:
8542 #ifdef BFD64
8543 print_vms_time (entry->d_un.d_val);
8544 #endif
8545 break;
8546
8547 case DT_IA_64_VMS_LNKFLAGS:
8548 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8549 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8550 printf (" CALL_DEBUG");
8551 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8552 printf (" NOP0BUFS");
8553 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8554 printf (" P0IMAGE");
8555 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8556 printf (" MKTHREADS");
8557 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8558 printf (" UPCALLS");
8559 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8560 printf (" IMGSTA");
8561 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8562 printf (" INITIALIZE");
8563 if (entry->d_un.d_val & VMS_LF_MAIN)
8564 printf (" MAIN");
8565 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8566 printf (" EXE_INIT");
8567 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8568 printf (" TBK_IN_IMG");
8569 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8570 printf (" DBG_IN_IMG");
8571 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8572 printf (" TBK_IN_DSF");
8573 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8574 printf (" DBG_IN_DSF");
8575 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8576 printf (" SIGNATURES");
8577 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8578 printf (" REL_SEG_OFF");
8579 break;
8580
8581 default:
8582 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8583 break;
8584 }
8585 putchar ('\n');
8586 }
8587
8588 static int
8589 get_32bit_dynamic_section (FILE * file)
8590 {
8591 Elf32_External_Dyn * edyn;
8592 Elf32_External_Dyn * ext;
8593 Elf_Internal_Dyn * entry;
8594
8595 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8596 dynamic_size, _("dynamic section"));
8597 if (!edyn)
8598 return 0;
8599
8600 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8601 might not have the luxury of section headers. Look for the DT_NULL
8602 terminator to determine the number of entries. */
8603 for (ext = edyn, dynamic_nent = 0;
8604 (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8605 ext++)
8606 {
8607 dynamic_nent++;
8608 if (BYTE_GET (ext->d_tag) == DT_NULL)
8609 break;
8610 }
8611
8612 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8613 sizeof (* entry));
8614 if (dynamic_section == NULL)
8615 {
8616 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8617 (unsigned long) dynamic_nent);
8618 free (edyn);
8619 return 0;
8620 }
8621
8622 for (ext = edyn, entry = dynamic_section;
8623 entry < dynamic_section + dynamic_nent;
8624 ext++, entry++)
8625 {
8626 entry->d_tag = BYTE_GET (ext->d_tag);
8627 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8628 }
8629
8630 free (edyn);
8631
8632 return 1;
8633 }
8634
8635 static int
8636 get_64bit_dynamic_section (FILE * file)
8637 {
8638 Elf64_External_Dyn * edyn;
8639 Elf64_External_Dyn * ext;
8640 Elf_Internal_Dyn * entry;
8641
8642 /* Read in the data. */
8643 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8644 dynamic_size, _("dynamic section"));
8645 if (!edyn)
8646 return 0;
8647
8648 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8649 might not have the luxury of section headers. Look for the DT_NULL
8650 terminator to determine the number of entries. */
8651 for (ext = edyn, dynamic_nent = 0;
8652 /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer. */
8653 (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8654 ext++)
8655 {
8656 dynamic_nent++;
8657 if (BYTE_GET (ext->d_tag) == DT_NULL)
8658 break;
8659 }
8660
8661 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8662 sizeof (* entry));
8663 if (dynamic_section == NULL)
8664 {
8665 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8666 (unsigned long) dynamic_nent);
8667 free (edyn);
8668 return 0;
8669 }
8670
8671 /* Convert from external to internal formats. */
8672 for (ext = edyn, entry = dynamic_section;
8673 entry < dynamic_section + dynamic_nent;
8674 ext++, entry++)
8675 {
8676 entry->d_tag = BYTE_GET (ext->d_tag);
8677 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8678 }
8679
8680 free (edyn);
8681
8682 return 1;
8683 }
8684
8685 static void
8686 print_dynamic_flags (bfd_vma flags)
8687 {
8688 int first = 1;
8689
8690 while (flags)
8691 {
8692 bfd_vma flag;
8693
8694 flag = flags & - flags;
8695 flags &= ~ flag;
8696
8697 if (first)
8698 first = 0;
8699 else
8700 putc (' ', stdout);
8701
8702 switch (flag)
8703 {
8704 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8705 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8706 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8707 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8708 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8709 default: fputs (_("unknown"), stdout); break;
8710 }
8711 }
8712 puts ("");
8713 }
8714
8715 /* Parse and display the contents of the dynamic section. */
8716
8717 static int
8718 process_dynamic_section (FILE * file)
8719 {
8720 Elf_Internal_Dyn * entry;
8721
8722 if (dynamic_size == 0)
8723 {
8724 if (do_dynamic)
8725 printf (_("\nThere is no dynamic section in this file.\n"));
8726
8727 return 1;
8728 }
8729
8730 if (is_32bit_elf)
8731 {
8732 if (! get_32bit_dynamic_section (file))
8733 return 0;
8734 }
8735 else if (! get_64bit_dynamic_section (file))
8736 return 0;
8737
8738 /* Find the appropriate symbol table. */
8739 if (dynamic_symbols == NULL)
8740 {
8741 for (entry = dynamic_section;
8742 entry < dynamic_section + dynamic_nent;
8743 ++entry)
8744 {
8745 Elf_Internal_Shdr section;
8746
8747 if (entry->d_tag != DT_SYMTAB)
8748 continue;
8749
8750 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8751
8752 /* Since we do not know how big the symbol table is,
8753 we default to reading in the entire file (!) and
8754 processing that. This is overkill, I know, but it
8755 should work. */
8756 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8757
8758 if (archive_file_offset != 0)
8759 section.sh_size = archive_file_size - section.sh_offset;
8760 else
8761 {
8762 if (fseek (file, 0, SEEK_END))
8763 error (_("Unable to seek to end of file!\n"));
8764
8765 section.sh_size = ftell (file) - section.sh_offset;
8766 }
8767
8768 if (is_32bit_elf)
8769 section.sh_entsize = sizeof (Elf32_External_Sym);
8770 else
8771 section.sh_entsize = sizeof (Elf64_External_Sym);
8772 section.sh_name = string_table_length;
8773
8774 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8775 if (num_dynamic_syms < 1)
8776 {
8777 error (_("Unable to determine the number of symbols to load\n"));
8778 continue;
8779 }
8780 }
8781 }
8782
8783 /* Similarly find a string table. */
8784 if (dynamic_strings == NULL)
8785 {
8786 for (entry = dynamic_section;
8787 entry < dynamic_section + dynamic_nent;
8788 ++entry)
8789 {
8790 unsigned long offset;
8791 long str_tab_len;
8792
8793 if (entry->d_tag != DT_STRTAB)
8794 continue;
8795
8796 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8797
8798 /* Since we do not know how big the string table is,
8799 we default to reading in the entire file (!) and
8800 processing that. This is overkill, I know, but it
8801 should work. */
8802
8803 offset = offset_from_vma (file, entry->d_un.d_val, 0);
8804
8805 if (archive_file_offset != 0)
8806 str_tab_len = archive_file_size - offset;
8807 else
8808 {
8809 if (fseek (file, 0, SEEK_END))
8810 error (_("Unable to seek to end of file\n"));
8811 str_tab_len = ftell (file) - offset;
8812 }
8813
8814 if (str_tab_len < 1)
8815 {
8816 error
8817 (_("Unable to determine the length of the dynamic string table\n"));
8818 continue;
8819 }
8820
8821 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8822 str_tab_len,
8823 _("dynamic string table"));
8824 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8825 break;
8826 }
8827 }
8828
8829 /* And find the syminfo section if available. */
8830 if (dynamic_syminfo == NULL)
8831 {
8832 unsigned long syminsz = 0;
8833
8834 for (entry = dynamic_section;
8835 entry < dynamic_section + dynamic_nent;
8836 ++entry)
8837 {
8838 if (entry->d_tag == DT_SYMINENT)
8839 {
8840 /* Note: these braces are necessary to avoid a syntax
8841 error from the SunOS4 C compiler. */
8842 /* PR binutils/17531: A corrupt file can trigger this test.
8843 So do not use an assert, instead generate an error message. */
8844 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8845 error (_("Bad value (%d) for SYMINENT entry\n"),
8846 (int) entry->d_un.d_val);
8847 }
8848 else if (entry->d_tag == DT_SYMINSZ)
8849 syminsz = entry->d_un.d_val;
8850 else if (entry->d_tag == DT_SYMINFO)
8851 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8852 syminsz);
8853 }
8854
8855 if (dynamic_syminfo_offset != 0 && syminsz != 0)
8856 {
8857 Elf_External_Syminfo * extsyminfo;
8858 Elf_External_Syminfo * extsym;
8859 Elf_Internal_Syminfo * syminfo;
8860
8861 /* There is a syminfo section. Read the data. */
8862 extsyminfo = (Elf_External_Syminfo *)
8863 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8864 _("symbol information"));
8865 if (!extsyminfo)
8866 return 0;
8867
8868 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8869 if (dynamic_syminfo == NULL)
8870 {
8871 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8872 (unsigned long) syminsz);
8873 return 0;
8874 }
8875
8876 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8877 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8878 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8879 ++syminfo, ++extsym)
8880 {
8881 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8882 syminfo->si_flags = BYTE_GET (extsym->si_flags);
8883 }
8884
8885 free (extsyminfo);
8886 }
8887 }
8888
8889 if (do_dynamic && dynamic_addr)
8890 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8891 dynamic_addr, (unsigned long) dynamic_nent);
8892 if (do_dynamic)
8893 printf (_(" Tag Type Name/Value\n"));
8894
8895 for (entry = dynamic_section;
8896 entry < dynamic_section + dynamic_nent;
8897 entry++)
8898 {
8899 if (do_dynamic)
8900 {
8901 const char * dtype;
8902
8903 putchar (' ');
8904 print_vma (entry->d_tag, FULL_HEX);
8905 dtype = get_dynamic_type (entry->d_tag);
8906 printf (" (%s)%*s", dtype,
8907 ((is_32bit_elf ? 27 : 19)
8908 - (int) strlen (dtype)),
8909 " ");
8910 }
8911
8912 switch (entry->d_tag)
8913 {
8914 case DT_FLAGS:
8915 if (do_dynamic)
8916 print_dynamic_flags (entry->d_un.d_val);
8917 break;
8918
8919 case DT_AUXILIARY:
8920 case DT_FILTER:
8921 case DT_CONFIG:
8922 case DT_DEPAUDIT:
8923 case DT_AUDIT:
8924 if (do_dynamic)
8925 {
8926 switch (entry->d_tag)
8927 {
8928 case DT_AUXILIARY:
8929 printf (_("Auxiliary library"));
8930 break;
8931
8932 case DT_FILTER:
8933 printf (_("Filter library"));
8934 break;
8935
8936 case DT_CONFIG:
8937 printf (_("Configuration file"));
8938 break;
8939
8940 case DT_DEPAUDIT:
8941 printf (_("Dependency audit library"));
8942 break;
8943
8944 case DT_AUDIT:
8945 printf (_("Audit library"));
8946 break;
8947 }
8948
8949 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8950 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8951 else
8952 {
8953 printf (": ");
8954 print_vma (entry->d_un.d_val, PREFIX_HEX);
8955 putchar ('\n');
8956 }
8957 }
8958 break;
8959
8960 case DT_FEATURE:
8961 if (do_dynamic)
8962 {
8963 printf (_("Flags:"));
8964
8965 if (entry->d_un.d_val == 0)
8966 printf (_(" None\n"));
8967 else
8968 {
8969 unsigned long int val = entry->d_un.d_val;
8970
8971 if (val & DTF_1_PARINIT)
8972 {
8973 printf (" PARINIT");
8974 val ^= DTF_1_PARINIT;
8975 }
8976 if (val & DTF_1_CONFEXP)
8977 {
8978 printf (" CONFEXP");
8979 val ^= DTF_1_CONFEXP;
8980 }
8981 if (val != 0)
8982 printf (" %lx", val);
8983 puts ("");
8984 }
8985 }
8986 break;
8987
8988 case DT_POSFLAG_1:
8989 if (do_dynamic)
8990 {
8991 printf (_("Flags:"));
8992
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_P1_LAZYLOAD)
9000 {
9001 printf (" LAZYLOAD");
9002 val ^= DF_P1_LAZYLOAD;
9003 }
9004 if (val & DF_P1_GROUPPERM)
9005 {
9006 printf (" GROUPPERM");
9007 val ^= DF_P1_GROUPPERM;
9008 }
9009 if (val != 0)
9010 printf (" %lx", val);
9011 puts ("");
9012 }
9013 }
9014 break;
9015
9016 case DT_FLAGS_1:
9017 if (do_dynamic)
9018 {
9019 printf (_("Flags:"));
9020 if (entry->d_un.d_val == 0)
9021 printf (_(" None\n"));
9022 else
9023 {
9024 unsigned long int val = entry->d_un.d_val;
9025
9026 if (val & DF_1_NOW)
9027 {
9028 printf (" NOW");
9029 val ^= DF_1_NOW;
9030 }
9031 if (val & DF_1_GLOBAL)
9032 {
9033 printf (" GLOBAL");
9034 val ^= DF_1_GLOBAL;
9035 }
9036 if (val & DF_1_GROUP)
9037 {
9038 printf (" GROUP");
9039 val ^= DF_1_GROUP;
9040 }
9041 if (val & DF_1_NODELETE)
9042 {
9043 printf (" NODELETE");
9044 val ^= DF_1_NODELETE;
9045 }
9046 if (val & DF_1_LOADFLTR)
9047 {
9048 printf (" LOADFLTR");
9049 val ^= DF_1_LOADFLTR;
9050 }
9051 if (val & DF_1_INITFIRST)
9052 {
9053 printf (" INITFIRST");
9054 val ^= DF_1_INITFIRST;
9055 }
9056 if (val & DF_1_NOOPEN)
9057 {
9058 printf (" NOOPEN");
9059 val ^= DF_1_NOOPEN;
9060 }
9061 if (val & DF_1_ORIGIN)
9062 {
9063 printf (" ORIGIN");
9064 val ^= DF_1_ORIGIN;
9065 }
9066 if (val & DF_1_DIRECT)
9067 {
9068 printf (" DIRECT");
9069 val ^= DF_1_DIRECT;
9070 }
9071 if (val & DF_1_TRANS)
9072 {
9073 printf (" TRANS");
9074 val ^= DF_1_TRANS;
9075 }
9076 if (val & DF_1_INTERPOSE)
9077 {
9078 printf (" INTERPOSE");
9079 val ^= DF_1_INTERPOSE;
9080 }
9081 if (val & DF_1_NODEFLIB)
9082 {
9083 printf (" NODEFLIB");
9084 val ^= DF_1_NODEFLIB;
9085 }
9086 if (val & DF_1_NODUMP)
9087 {
9088 printf (" NODUMP");
9089 val ^= DF_1_NODUMP;
9090 }
9091 if (val & DF_1_CONFALT)
9092 {
9093 printf (" CONFALT");
9094 val ^= DF_1_CONFALT;
9095 }
9096 if (val & DF_1_ENDFILTEE)
9097 {
9098 printf (" ENDFILTEE");
9099 val ^= DF_1_ENDFILTEE;
9100 }
9101 if (val & DF_1_DISPRELDNE)
9102 {
9103 printf (" DISPRELDNE");
9104 val ^= DF_1_DISPRELDNE;
9105 }
9106 if (val & DF_1_DISPRELPND)
9107 {
9108 printf (" DISPRELPND");
9109 val ^= DF_1_DISPRELPND;
9110 }
9111 if (val & DF_1_NODIRECT)
9112 {
9113 printf (" NODIRECT");
9114 val ^= DF_1_NODIRECT;
9115 }
9116 if (val & DF_1_IGNMULDEF)
9117 {
9118 printf (" IGNMULDEF");
9119 val ^= DF_1_IGNMULDEF;
9120 }
9121 if (val & DF_1_NOKSYMS)
9122 {
9123 printf (" NOKSYMS");
9124 val ^= DF_1_NOKSYMS;
9125 }
9126 if (val & DF_1_NOHDR)
9127 {
9128 printf (" NOHDR");
9129 val ^= DF_1_NOHDR;
9130 }
9131 if (val & DF_1_EDITED)
9132 {
9133 printf (" EDITED");
9134 val ^= DF_1_EDITED;
9135 }
9136 if (val & DF_1_NORELOC)
9137 {
9138 printf (" NORELOC");
9139 val ^= DF_1_NORELOC;
9140 }
9141 if (val & DF_1_SYMINTPOSE)
9142 {
9143 printf (" SYMINTPOSE");
9144 val ^= DF_1_SYMINTPOSE;
9145 }
9146 if (val & DF_1_GLOBAUDIT)
9147 {
9148 printf (" GLOBAUDIT");
9149 val ^= DF_1_GLOBAUDIT;
9150 }
9151 if (val & DF_1_SINGLETON)
9152 {
9153 printf (" SINGLETON");
9154 val ^= DF_1_SINGLETON;
9155 }
9156 if (val != 0)
9157 printf (" %lx", val);
9158 puts ("");
9159 }
9160 }
9161 break;
9162
9163 case DT_PLTREL:
9164 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9165 if (do_dynamic)
9166 puts (get_dynamic_type (entry->d_un.d_val));
9167 break;
9168
9169 case DT_NULL :
9170 case DT_NEEDED :
9171 case DT_PLTGOT :
9172 case DT_HASH :
9173 case DT_STRTAB :
9174 case DT_SYMTAB :
9175 case DT_RELA :
9176 case DT_INIT :
9177 case DT_FINI :
9178 case DT_SONAME :
9179 case DT_RPATH :
9180 case DT_SYMBOLIC:
9181 case DT_REL :
9182 case DT_DEBUG :
9183 case DT_TEXTREL :
9184 case DT_JMPREL :
9185 case DT_RUNPATH :
9186 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9187
9188 if (do_dynamic)
9189 {
9190 char * name;
9191
9192 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9193 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9194 else
9195 name = NULL;
9196
9197 if (name)
9198 {
9199 switch (entry->d_tag)
9200 {
9201 case DT_NEEDED:
9202 printf (_("Shared library: [%s]"), name);
9203
9204 if (streq (name, program_interpreter))
9205 printf (_(" program interpreter"));
9206 break;
9207
9208 case DT_SONAME:
9209 printf (_("Library soname: [%s]"), name);
9210 break;
9211
9212 case DT_RPATH:
9213 printf (_("Library rpath: [%s]"), name);
9214 break;
9215
9216 case DT_RUNPATH:
9217 printf (_("Library runpath: [%s]"), name);
9218 break;
9219
9220 default:
9221 print_vma (entry->d_un.d_val, PREFIX_HEX);
9222 break;
9223 }
9224 }
9225 else
9226 print_vma (entry->d_un.d_val, PREFIX_HEX);
9227
9228 putchar ('\n');
9229 }
9230 break;
9231
9232 case DT_PLTRELSZ:
9233 case DT_RELASZ :
9234 case DT_STRSZ :
9235 case DT_RELSZ :
9236 case DT_RELAENT :
9237 case DT_SYMENT :
9238 case DT_RELENT :
9239 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9240 case DT_PLTPADSZ:
9241 case DT_MOVEENT :
9242 case DT_MOVESZ :
9243 case DT_INIT_ARRAYSZ:
9244 case DT_FINI_ARRAYSZ:
9245 case DT_GNU_CONFLICTSZ:
9246 case DT_GNU_LIBLISTSZ:
9247 if (do_dynamic)
9248 {
9249 print_vma (entry->d_un.d_val, UNSIGNED);
9250 printf (_(" (bytes)\n"));
9251 }
9252 break;
9253
9254 case DT_VERDEFNUM:
9255 case DT_VERNEEDNUM:
9256 case DT_RELACOUNT:
9257 case DT_RELCOUNT:
9258 if (do_dynamic)
9259 {
9260 print_vma (entry->d_un.d_val, UNSIGNED);
9261 putchar ('\n');
9262 }
9263 break;
9264
9265 case DT_SYMINSZ:
9266 case DT_SYMINENT:
9267 case DT_SYMINFO:
9268 case DT_USED:
9269 case DT_INIT_ARRAY:
9270 case DT_FINI_ARRAY:
9271 if (do_dynamic)
9272 {
9273 if (entry->d_tag == DT_USED
9274 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9275 {
9276 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9277
9278 if (*name)
9279 {
9280 printf (_("Not needed object: [%s]\n"), name);
9281 break;
9282 }
9283 }
9284
9285 print_vma (entry->d_un.d_val, PREFIX_HEX);
9286 putchar ('\n');
9287 }
9288 break;
9289
9290 case DT_BIND_NOW:
9291 /* The value of this entry is ignored. */
9292 if (do_dynamic)
9293 putchar ('\n');
9294 break;
9295
9296 case DT_GNU_PRELINKED:
9297 if (do_dynamic)
9298 {
9299 struct tm * tmp;
9300 time_t atime = entry->d_un.d_val;
9301
9302 tmp = gmtime (&atime);
9303 /* PR 17533 file: 041-1244816-0.004. */
9304 if (tmp == NULL)
9305 printf (_("<corrupt time val: %lx"),
9306 (unsigned long) atime);
9307 else
9308 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9309 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9310 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9311
9312 }
9313 break;
9314
9315 case DT_GNU_HASH:
9316 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9317 if (do_dynamic)
9318 {
9319 print_vma (entry->d_un.d_val, PREFIX_HEX);
9320 putchar ('\n');
9321 }
9322 break;
9323
9324 default:
9325 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9326 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9327 entry->d_un.d_val;
9328
9329 if (do_dynamic)
9330 {
9331 switch (elf_header.e_machine)
9332 {
9333 case EM_MIPS:
9334 case EM_MIPS_RS3_LE:
9335 dynamic_section_mips_val (entry);
9336 break;
9337 case EM_PARISC:
9338 dynamic_section_parisc_val (entry);
9339 break;
9340 case EM_IA_64:
9341 dynamic_section_ia64_val (entry);
9342 break;
9343 default:
9344 print_vma (entry->d_un.d_val, PREFIX_HEX);
9345 putchar ('\n');
9346 }
9347 }
9348 break;
9349 }
9350 }
9351
9352 return 1;
9353 }
9354
9355 static char *
9356 get_ver_flags (unsigned int flags)
9357 {
9358 static char buff[32];
9359
9360 buff[0] = 0;
9361
9362 if (flags == 0)
9363 return _("none");
9364
9365 if (flags & VER_FLG_BASE)
9366 strcat (buff, "BASE ");
9367
9368 if (flags & VER_FLG_WEAK)
9369 {
9370 if (flags & VER_FLG_BASE)
9371 strcat (buff, "| ");
9372
9373 strcat (buff, "WEAK ");
9374 }
9375
9376 if (flags & VER_FLG_INFO)
9377 {
9378 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9379 strcat (buff, "| ");
9380
9381 strcat (buff, "INFO ");
9382 }
9383
9384 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9385 strcat (buff, _("| <unknown>"));
9386
9387 return buff;
9388 }
9389
9390 /* Display the contents of the version sections. */
9391
9392 static int
9393 process_version_sections (FILE * file)
9394 {
9395 Elf_Internal_Shdr * section;
9396 unsigned i;
9397 int found = 0;
9398
9399 if (! do_version)
9400 return 1;
9401
9402 for (i = 0, section = section_headers;
9403 i < elf_header.e_shnum;
9404 i++, section++)
9405 {
9406 switch (section->sh_type)
9407 {
9408 case SHT_GNU_verdef:
9409 {
9410 Elf_External_Verdef * edefs;
9411 unsigned int idx;
9412 unsigned int cnt;
9413 char * endbuf;
9414
9415 found = 1;
9416
9417 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9418 printable_section_name (section),
9419 section->sh_info);
9420
9421 printf (_(" Addr: 0x"));
9422 printf_vma (section->sh_addr);
9423 printf (_(" Offset: %#08lx Link: %u (%s)"),
9424 (unsigned long) section->sh_offset, section->sh_link,
9425 printable_section_name_from_index (section->sh_link));
9426
9427 edefs = (Elf_External_Verdef *)
9428 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9429 _("version definition section"));
9430 if (!edefs)
9431 break;
9432 endbuf = (char *) edefs + section->sh_size;
9433
9434 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9435 {
9436 char * vstart;
9437 Elf_External_Verdef * edef;
9438 Elf_Internal_Verdef ent;
9439 Elf_External_Verdaux * eaux;
9440 Elf_Internal_Verdaux aux;
9441 int j;
9442 int isum;
9443
9444 /* Check for very large indicies. */
9445 if (idx > (size_t) (endbuf - (char *) edefs))
9446 break;
9447
9448 vstart = ((char *) edefs) + idx;
9449 if (vstart + sizeof (*edef) > endbuf)
9450 break;
9451
9452 edef = (Elf_External_Verdef *) vstart;
9453
9454 ent.vd_version = BYTE_GET (edef->vd_version);
9455 ent.vd_flags = BYTE_GET (edef->vd_flags);
9456 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9457 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9458 ent.vd_hash = BYTE_GET (edef->vd_hash);
9459 ent.vd_aux = BYTE_GET (edef->vd_aux);
9460 ent.vd_next = BYTE_GET (edef->vd_next);
9461
9462 printf (_(" %#06x: Rev: %d Flags: %s"),
9463 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9464
9465 printf (_(" Index: %d Cnt: %d "),
9466 ent.vd_ndx, ent.vd_cnt);
9467
9468 /* Check for overflow. */
9469 if (ent.vd_aux > (size_t) (endbuf - vstart))
9470 break;
9471
9472 vstart += ent.vd_aux;
9473
9474 eaux = (Elf_External_Verdaux *) vstart;
9475
9476 aux.vda_name = BYTE_GET (eaux->vda_name);
9477 aux.vda_next = BYTE_GET (eaux->vda_next);
9478
9479 if (VALID_DYNAMIC_NAME (aux.vda_name))
9480 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9481 else
9482 printf (_("Name index: %ld\n"), aux.vda_name);
9483
9484 isum = idx + ent.vd_aux;
9485
9486 for (j = 1; j < ent.vd_cnt; j++)
9487 {
9488 /* Check for overflow. */
9489 if (aux.vda_next > (size_t) (endbuf - vstart))
9490 break;
9491
9492 isum += aux.vda_next;
9493 vstart += aux.vda_next;
9494
9495 eaux = (Elf_External_Verdaux *) vstart;
9496 if (vstart + sizeof (*eaux) > endbuf)
9497 break;
9498
9499 aux.vda_name = BYTE_GET (eaux->vda_name);
9500 aux.vda_next = BYTE_GET (eaux->vda_next);
9501
9502 if (VALID_DYNAMIC_NAME (aux.vda_name))
9503 printf (_(" %#06x: Parent %d: %s\n"),
9504 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9505 else
9506 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9507 isum, j, aux.vda_name);
9508 }
9509
9510 if (j < ent.vd_cnt)
9511 printf (_(" Version def aux past end of section\n"));
9512
9513 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9514 if (idx + ent.vd_next <= idx)
9515 break;
9516
9517 idx += ent.vd_next;
9518 }
9519
9520 if (cnt < section->sh_info)
9521 printf (_(" Version definition past end of section\n"));
9522
9523 free (edefs);
9524 }
9525 break;
9526
9527 case SHT_GNU_verneed:
9528 {
9529 Elf_External_Verneed * eneed;
9530 unsigned int idx;
9531 unsigned int cnt;
9532 char * endbuf;
9533
9534 found = 1;
9535
9536 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9537 printable_section_name (section), section->sh_info);
9538
9539 printf (_(" Addr: 0x"));
9540 printf_vma (section->sh_addr);
9541 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9542 (unsigned long) section->sh_offset, section->sh_link,
9543 printable_section_name_from_index (section->sh_link));
9544
9545 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9546 section->sh_offset, 1,
9547 section->sh_size,
9548 _("Version Needs section"));
9549 if (!eneed)
9550 break;
9551 endbuf = (char *) eneed + section->sh_size;
9552
9553 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9554 {
9555 Elf_External_Verneed * entry;
9556 Elf_Internal_Verneed ent;
9557 int j;
9558 int isum;
9559 char * vstart;
9560
9561 if (idx > (size_t) (endbuf - (char *) eneed))
9562 break;
9563
9564 vstart = ((char *) eneed) + idx;
9565 if (vstart + sizeof (*entry) > endbuf)
9566 break;
9567
9568 entry = (Elf_External_Verneed *) vstart;
9569
9570 ent.vn_version = BYTE_GET (entry->vn_version);
9571 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9572 ent.vn_file = BYTE_GET (entry->vn_file);
9573 ent.vn_aux = BYTE_GET (entry->vn_aux);
9574 ent.vn_next = BYTE_GET (entry->vn_next);
9575
9576 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9577
9578 if (VALID_DYNAMIC_NAME (ent.vn_file))
9579 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9580 else
9581 printf (_(" File: %lx"), ent.vn_file);
9582
9583 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9584
9585 /* Check for overflow. */
9586 if (ent.vn_aux > (size_t) (endbuf - vstart))
9587 break;
9588 vstart += ent.vn_aux;
9589
9590 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9591 {
9592 Elf_External_Vernaux * eaux;
9593 Elf_Internal_Vernaux aux;
9594
9595 if (vstart + sizeof (*eaux) > endbuf)
9596 break;
9597 eaux = (Elf_External_Vernaux *) vstart;
9598
9599 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9600 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9601 aux.vna_other = BYTE_GET (eaux->vna_other);
9602 aux.vna_name = BYTE_GET (eaux->vna_name);
9603 aux.vna_next = BYTE_GET (eaux->vna_next);
9604
9605 if (VALID_DYNAMIC_NAME (aux.vna_name))
9606 printf (_(" %#06x: Name: %s"),
9607 isum, GET_DYNAMIC_NAME (aux.vna_name));
9608 else
9609 printf (_(" %#06x: Name index: %lx"),
9610 isum, aux.vna_name);
9611
9612 printf (_(" Flags: %s Version: %d\n"),
9613 get_ver_flags (aux.vna_flags), aux.vna_other);
9614
9615 /* Check for overflow. */
9616 if (aux.vna_next > (size_t) (endbuf - vstart)
9617 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9618 {
9619 warn (_("Invalid vna_next field of %lx\n"),
9620 aux.vna_next);
9621 j = ent.vn_cnt;
9622 break;
9623 }
9624 isum += aux.vna_next;
9625 vstart += aux.vna_next;
9626 }
9627
9628 if (j < ent.vn_cnt)
9629 warn (_("Missing Version Needs auxillary information\n"));
9630
9631 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9632 {
9633 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9634 cnt = section->sh_info;
9635 break;
9636 }
9637 idx += ent.vn_next;
9638 }
9639
9640 if (cnt < section->sh_info)
9641 warn (_("Missing Version Needs information\n"));
9642
9643 free (eneed);
9644 }
9645 break;
9646
9647 case SHT_GNU_versym:
9648 {
9649 Elf_Internal_Shdr * link_section;
9650 size_t total;
9651 unsigned int cnt;
9652 unsigned char * edata;
9653 unsigned short * data;
9654 char * strtab;
9655 Elf_Internal_Sym * symbols;
9656 Elf_Internal_Shdr * string_sec;
9657 unsigned long num_syms;
9658 long off;
9659
9660 if (section->sh_link >= elf_header.e_shnum)
9661 break;
9662
9663 link_section = section_headers + section->sh_link;
9664 total = section->sh_size / sizeof (Elf_External_Versym);
9665
9666 if (link_section->sh_link >= elf_header.e_shnum)
9667 break;
9668
9669 found = 1;
9670
9671 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9672 if (symbols == NULL)
9673 break;
9674
9675 string_sec = section_headers + link_section->sh_link;
9676
9677 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9678 string_sec->sh_size,
9679 _("version string table"));
9680 if (!strtab)
9681 {
9682 free (symbols);
9683 break;
9684 }
9685
9686 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9687 printable_section_name (section), (unsigned long) total);
9688
9689 printf (_(" Addr: "));
9690 printf_vma (section->sh_addr);
9691 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9692 (unsigned long) section->sh_offset, section->sh_link,
9693 printable_section_name (link_section));
9694
9695 off = offset_from_vma (file,
9696 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9697 total * sizeof (short));
9698 edata = (unsigned char *) get_data (NULL, file, off, total,
9699 sizeof (short),
9700 _("version symbol data"));
9701 if (!edata)
9702 {
9703 free (strtab);
9704 free (symbols);
9705 break;
9706 }
9707
9708 data = (short unsigned int *) cmalloc (total, sizeof (short));
9709
9710 for (cnt = total; cnt --;)
9711 data[cnt] = byte_get (edata + cnt * sizeof (short),
9712 sizeof (short));
9713
9714 free (edata);
9715
9716 for (cnt = 0; cnt < total; cnt += 4)
9717 {
9718 int j, nn;
9719 int check_def, check_need;
9720 char * name;
9721
9722 printf (" %03x:", cnt);
9723
9724 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9725 switch (data[cnt + j])
9726 {
9727 case 0:
9728 fputs (_(" 0 (*local*) "), stdout);
9729 break;
9730
9731 case 1:
9732 fputs (_(" 1 (*global*) "), stdout);
9733 break;
9734
9735 default:
9736 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9737 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9738
9739 /* If this index value is greater than the size of the symbols
9740 array, break to avoid an out-of-bounds read. */
9741 if ((unsigned long)(cnt + j) >= num_syms)
9742 {
9743 warn (_("invalid index into symbol array\n"));
9744 break;
9745 }
9746
9747 check_def = 1;
9748 check_need = 1;
9749 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9750 || section_headers[symbols[cnt + j].st_shndx].sh_type
9751 != SHT_NOBITS)
9752 {
9753 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9754 check_def = 0;
9755 else
9756 check_need = 0;
9757 }
9758
9759 if (check_need
9760 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9761 {
9762 Elf_Internal_Verneed ivn;
9763 unsigned long offset;
9764
9765 offset = offset_from_vma
9766 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9767 sizeof (Elf_External_Verneed));
9768
9769 do
9770 {
9771 Elf_Internal_Vernaux ivna;
9772 Elf_External_Verneed evn;
9773 Elf_External_Vernaux evna;
9774 unsigned long a_off;
9775
9776 if (get_data (&evn, file, offset, sizeof (evn), 1,
9777 _("version need")) == NULL)
9778 break;
9779
9780 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9781 ivn.vn_next = BYTE_GET (evn.vn_next);
9782
9783 a_off = offset + ivn.vn_aux;
9784
9785 do
9786 {
9787 if (get_data (&evna, file, a_off, sizeof (evna),
9788 1, _("version need aux (2)")) == NULL)
9789 {
9790 ivna.vna_next = 0;
9791 ivna.vna_other = 0;
9792 }
9793 else
9794 {
9795 ivna.vna_next = BYTE_GET (evna.vna_next);
9796 ivna.vna_other = BYTE_GET (evna.vna_other);
9797 }
9798
9799 a_off += ivna.vna_next;
9800 }
9801 while (ivna.vna_other != data[cnt + j]
9802 && ivna.vna_next != 0);
9803
9804 if (ivna.vna_other == data[cnt + j])
9805 {
9806 ivna.vna_name = BYTE_GET (evna.vna_name);
9807
9808 if (ivna.vna_name >= string_sec->sh_size)
9809 name = _("*invalid*");
9810 else
9811 name = strtab + ivna.vna_name;
9812 nn += printf ("(%s%-*s",
9813 name,
9814 12 - (int) strlen (name),
9815 ")");
9816 check_def = 0;
9817 break;
9818 }
9819
9820 offset += ivn.vn_next;
9821 }
9822 while (ivn.vn_next);
9823 }
9824
9825 if (check_def && data[cnt + j] != 0x8001
9826 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9827 {
9828 Elf_Internal_Verdef ivd;
9829 Elf_External_Verdef evd;
9830 unsigned long offset;
9831
9832 offset = offset_from_vma
9833 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9834 sizeof evd);
9835
9836 do
9837 {
9838 if (get_data (&evd, file, offset, sizeof (evd), 1,
9839 _("version def")) == NULL)
9840 {
9841 ivd.vd_next = 0;
9842 /* PR 17531: file: 046-1082287-0.004. */
9843 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
9844 break;
9845 }
9846 else
9847 {
9848 ivd.vd_next = BYTE_GET (evd.vd_next);
9849 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9850 }
9851
9852 offset += ivd.vd_next;
9853 }
9854 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9855 && ivd.vd_next != 0);
9856
9857 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9858 {
9859 Elf_External_Verdaux evda;
9860 Elf_Internal_Verdaux ivda;
9861
9862 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9863
9864 if (get_data (&evda, file,
9865 offset - ivd.vd_next + ivd.vd_aux,
9866 sizeof (evda), 1,
9867 _("version def aux")) == NULL)
9868 break;
9869
9870 ivda.vda_name = BYTE_GET (evda.vda_name);
9871
9872 if (ivda.vda_name >= string_sec->sh_size)
9873 name = _("*invalid*");
9874 else
9875 name = strtab + ivda.vda_name;
9876 nn += printf ("(%s%-*s",
9877 name,
9878 12 - (int) strlen (name),
9879 ")");
9880 }
9881 }
9882
9883 if (nn < 18)
9884 printf ("%*c", 18 - nn, ' ');
9885 }
9886
9887 putchar ('\n');
9888 }
9889
9890 free (data);
9891 free (strtab);
9892 free (symbols);
9893 }
9894 break;
9895
9896 default:
9897 break;
9898 }
9899 }
9900
9901 if (! found)
9902 printf (_("\nNo version information found in this file.\n"));
9903
9904 return 1;
9905 }
9906
9907 static const char *
9908 get_symbol_binding (unsigned int binding)
9909 {
9910 static char buff[32];
9911
9912 switch (binding)
9913 {
9914 case STB_LOCAL: return "LOCAL";
9915 case STB_GLOBAL: return "GLOBAL";
9916 case STB_WEAK: return "WEAK";
9917 default:
9918 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9919 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9920 binding);
9921 else if (binding >= STB_LOOS && binding <= STB_HIOS)
9922 {
9923 if (binding == STB_GNU_UNIQUE
9924 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9925 /* GNU is still using the default value 0. */
9926 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9927 return "UNIQUE";
9928 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9929 }
9930 else
9931 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9932 return buff;
9933 }
9934 }
9935
9936 static const char *
9937 get_symbol_type (unsigned int type)
9938 {
9939 static char buff[32];
9940
9941 switch (type)
9942 {
9943 case STT_NOTYPE: return "NOTYPE";
9944 case STT_OBJECT: return "OBJECT";
9945 case STT_FUNC: return "FUNC";
9946 case STT_SECTION: return "SECTION";
9947 case STT_FILE: return "FILE";
9948 case STT_COMMON: return "COMMON";
9949 case STT_TLS: return "TLS";
9950 case STT_RELC: return "RELC";
9951 case STT_SRELC: return "SRELC";
9952 default:
9953 if (type >= STT_LOPROC && type <= STT_HIPROC)
9954 {
9955 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9956 return "THUMB_FUNC";
9957
9958 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9959 return "REGISTER";
9960
9961 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9962 return "PARISC_MILLI";
9963
9964 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9965 }
9966 else if (type >= STT_LOOS && type <= STT_HIOS)
9967 {
9968 if (elf_header.e_machine == EM_PARISC)
9969 {
9970 if (type == STT_HP_OPAQUE)
9971 return "HP_OPAQUE";
9972 if (type == STT_HP_STUB)
9973 return "HP_STUB";
9974 }
9975
9976 if (type == STT_GNU_IFUNC
9977 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9978 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9979 /* GNU is still using the default value 0. */
9980 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9981 return "IFUNC";
9982
9983 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9984 }
9985 else
9986 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9987 return buff;
9988 }
9989 }
9990
9991 static const char *
9992 get_symbol_visibility (unsigned int visibility)
9993 {
9994 switch (visibility)
9995 {
9996 case STV_DEFAULT: return "DEFAULT";
9997 case STV_INTERNAL: return "INTERNAL";
9998 case STV_HIDDEN: return "HIDDEN";
9999 case STV_PROTECTED: return "PROTECTED";
10000 default:
10001 error (_("Unrecognized visibility value: %u"), visibility);
10002 return _("<unknown>");
10003 }
10004 }
10005
10006 static const char *
10007 get_mips_symbol_other (unsigned int other)
10008 {
10009 switch (other)
10010 {
10011 case STO_OPTIONAL:
10012 return "OPTIONAL";
10013 case STO_MIPS_PLT:
10014 return "MIPS PLT";
10015 case STO_MIPS_PIC:
10016 return "MIPS PIC";
10017 case STO_MICROMIPS:
10018 return "MICROMIPS";
10019 case STO_MICROMIPS | STO_MIPS_PIC:
10020 return "MICROMIPS, MIPS PIC";
10021 case STO_MIPS16:
10022 return "MIPS16";
10023 default:
10024 return NULL;
10025 }
10026 }
10027
10028 static const char *
10029 get_ia64_symbol_other (unsigned int other)
10030 {
10031 if (is_ia64_vms ())
10032 {
10033 static char res[32];
10034
10035 res[0] = 0;
10036
10037 /* Function types is for images and .STB files only. */
10038 switch (elf_header.e_type)
10039 {
10040 case ET_DYN:
10041 case ET_EXEC:
10042 switch (VMS_ST_FUNC_TYPE (other))
10043 {
10044 case VMS_SFT_CODE_ADDR:
10045 strcat (res, " CA");
10046 break;
10047 case VMS_SFT_SYMV_IDX:
10048 strcat (res, " VEC");
10049 break;
10050 case VMS_SFT_FD:
10051 strcat (res, " FD");
10052 break;
10053 case VMS_SFT_RESERVE:
10054 strcat (res, " RSV");
10055 break;
10056 default:
10057 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10058 VMS_ST_FUNC_TYPE (other));
10059 strcat (res, " <unknown>");
10060 break;
10061 }
10062 break;
10063 default:
10064 break;
10065 }
10066 switch (VMS_ST_LINKAGE (other))
10067 {
10068 case VMS_STL_IGNORE:
10069 strcat (res, " IGN");
10070 break;
10071 case VMS_STL_RESERVE:
10072 strcat (res, " RSV");
10073 break;
10074 case VMS_STL_STD:
10075 strcat (res, " STD");
10076 break;
10077 case VMS_STL_LNK:
10078 strcat (res, " LNK");
10079 break;
10080 default:
10081 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10082 VMS_ST_LINKAGE (other));
10083 strcat (res, " <unknown>");
10084 break;
10085 }
10086
10087 if (res[0] != 0)
10088 return res + 1;
10089 else
10090 return res;
10091 }
10092 return NULL;
10093 }
10094
10095 static const char *
10096 get_ppc64_symbol_other (unsigned int other)
10097 {
10098 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10099 {
10100 static char buf[32];
10101 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10102 PPC64_LOCAL_ENTRY_OFFSET (other));
10103 return buf;
10104 }
10105 return NULL;
10106 }
10107
10108 static const char *
10109 get_symbol_other (unsigned int other)
10110 {
10111 const char * result = NULL;
10112 static char buff [32];
10113
10114 if (other == 0)
10115 return "";
10116
10117 switch (elf_header.e_machine)
10118 {
10119 case EM_MIPS:
10120 result = get_mips_symbol_other (other);
10121 break;
10122 case EM_IA_64:
10123 result = get_ia64_symbol_other (other);
10124 break;
10125 case EM_PPC64:
10126 result = get_ppc64_symbol_other (other);
10127 break;
10128 default:
10129 break;
10130 }
10131
10132 if (result)
10133 return result;
10134
10135 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10136 return buff;
10137 }
10138
10139 static const char *
10140 get_symbol_index_type (unsigned int type)
10141 {
10142 static char buff[32];
10143
10144 switch (type)
10145 {
10146 case SHN_UNDEF: return "UND";
10147 case SHN_ABS: return "ABS";
10148 case SHN_COMMON: return "COM";
10149 default:
10150 if (type == SHN_IA_64_ANSI_COMMON
10151 && elf_header.e_machine == EM_IA_64
10152 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10153 return "ANSI_COM";
10154 else if ((elf_header.e_machine == EM_X86_64
10155 || elf_header.e_machine == EM_L1OM
10156 || elf_header.e_machine == EM_K1OM)
10157 && type == SHN_X86_64_LCOMMON)
10158 return "LARGE_COM";
10159 else if ((type == SHN_MIPS_SCOMMON
10160 && elf_header.e_machine == EM_MIPS)
10161 || (type == SHN_TIC6X_SCOMMON
10162 && elf_header.e_machine == EM_TI_C6000))
10163 return "SCOM";
10164 else if (type == SHN_MIPS_SUNDEFINED
10165 && elf_header.e_machine == EM_MIPS)
10166 return "SUND";
10167 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10168 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10169 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10170 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10171 else if (type >= SHN_LORESERVE)
10172 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10173 else if (type >= elf_header.e_shnum)
10174 sprintf (buff, _("bad section index[%3d]"), type);
10175 else
10176 sprintf (buff, "%3d", type);
10177 break;
10178 }
10179
10180 return buff;
10181 }
10182
10183 static bfd_vma *
10184 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10185 {
10186 unsigned char * e_data;
10187 bfd_vma * i_data;
10188
10189 /* If the size_t type is smaller than the bfd_size_type, eg because
10190 you are building a 32-bit tool on a 64-bit host, then make sure
10191 that when (number) is cast to (size_t) no information is lost. */
10192 if (sizeof (size_t) < sizeof (bfd_size_type)
10193 && (bfd_size_type) ((size_t) number) != number)
10194 {
10195 error (_("Size truncation prevents reading %llu elements of size %u\n"),
10196 (unsigned long long) number, ent_size);
10197 return NULL;
10198 }
10199
10200 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10201 attempting to allocate memory when the read is bound to fail. */
10202 if (ent_size * number > current_file_size)
10203 {
10204 error (_("Invalid number of dynamic entries: %llu\n"),
10205 (unsigned long long) number);
10206 return NULL;
10207 }
10208
10209 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10210 if (e_data == NULL)
10211 {
10212 error (_("Out of memory reading %llu dynamic entries\n"),
10213 (unsigned long long) number);
10214 return NULL;
10215 }
10216
10217 if (fread (e_data, ent_size, (size_t) number, file) != number)
10218 {
10219 error (_("Unable to read in %llu bytes of dynamic data\n"),
10220 (unsigned long long) (number * ent_size));
10221 free (e_data);
10222 return NULL;
10223 }
10224
10225 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10226 if (i_data == NULL)
10227 {
10228 error (_("Out of memory allocating space for %llu dynamic entries\n"),
10229 (unsigned long long) number);
10230 free (e_data);
10231 return NULL;
10232 }
10233
10234 while (number--)
10235 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10236
10237 free (e_data);
10238
10239 return i_data;
10240 }
10241
10242 static void
10243 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10244 {
10245 Elf_Internal_Sym * psym;
10246 int n;
10247
10248 n = print_vma (si, DEC_5);
10249 if (n < 5)
10250 fputs (&" "[n], stdout);
10251 printf (" %3lu: ", hn);
10252
10253 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10254 {
10255 printf (_("<No info available for dynamic symbol number %lu>\n"),
10256 (unsigned long) si);
10257 return;
10258 }
10259
10260 psym = dynamic_symbols + si;
10261 print_vma (psym->st_value, LONG_HEX);
10262 putchar (' ');
10263 print_vma (psym->st_size, DEC_5);
10264
10265 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10266 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10267 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10268 /* Check to see if any other bits in the st_other field are set.
10269 Note - displaying this information disrupts the layout of the
10270 table being generated, but for the moment this case is very
10271 rare. */
10272 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10273 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10274 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10275 if (VALID_DYNAMIC_NAME (psym->st_name))
10276 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10277 else
10278 printf (_(" <corrupt: %14ld>"), psym->st_name);
10279 putchar ('\n');
10280 }
10281
10282 static const char *
10283 get_symbol_version_string (FILE *file, int is_dynsym,
10284 const char *strtab,
10285 unsigned long int strtab_size,
10286 unsigned int si, Elf_Internal_Sym *psym,
10287 enum versioned_symbol_info *sym_info,
10288 unsigned short *vna_other)
10289 {
10290 const char *version_string = NULL;
10291
10292 if (is_dynsym
10293 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10294 {
10295 unsigned char data[2];
10296 unsigned short vers_data;
10297 unsigned long offset;
10298 int is_nobits;
10299 int check_def;
10300
10301 offset = offset_from_vma
10302 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10303 sizeof data + si * sizeof (vers_data));
10304
10305 if (get_data (&data, file, offset + si * sizeof (vers_data),
10306 sizeof (data), 1, _("version data")) == NULL)
10307 return NULL;
10308
10309 vers_data = byte_get (data, 2);
10310
10311 is_nobits = (section_headers != NULL
10312 && psym->st_shndx < elf_header.e_shnum
10313 && section_headers[psym->st_shndx].sh_type
10314 == SHT_NOBITS);
10315
10316 check_def = (psym->st_shndx != SHN_UNDEF);
10317
10318 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10319 {
10320 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10321 && (is_nobits || ! check_def))
10322 {
10323 Elf_External_Verneed evn;
10324 Elf_Internal_Verneed ivn;
10325 Elf_Internal_Vernaux ivna;
10326
10327 /* We must test both. */
10328 offset = offset_from_vma
10329 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10330 sizeof evn);
10331
10332 do
10333 {
10334 unsigned long vna_off;
10335
10336 if (get_data (&evn, file, offset, sizeof (evn), 1,
10337 _("version need")) == NULL)
10338 {
10339 ivna.vna_next = 0;
10340 ivna.vna_other = 0;
10341 ivna.vna_name = 0;
10342 break;
10343 }
10344
10345 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10346 ivn.vn_next = BYTE_GET (evn.vn_next);
10347
10348 vna_off = offset + ivn.vn_aux;
10349
10350 do
10351 {
10352 Elf_External_Vernaux evna;
10353
10354 if (get_data (&evna, file, vna_off,
10355 sizeof (evna), 1,
10356 _("version need aux (3)")) == NULL)
10357 {
10358 ivna.vna_next = 0;
10359 ivna.vna_other = 0;
10360 ivna.vna_name = 0;
10361 }
10362 else
10363 {
10364 ivna.vna_other = BYTE_GET (evna.vna_other);
10365 ivna.vna_next = BYTE_GET (evna.vna_next);
10366 ivna.vna_name = BYTE_GET (evna.vna_name);
10367 }
10368
10369 vna_off += ivna.vna_next;
10370 }
10371 while (ivna.vna_other != vers_data
10372 && ivna.vna_next != 0);
10373
10374 if (ivna.vna_other == vers_data)
10375 break;
10376
10377 offset += ivn.vn_next;
10378 }
10379 while (ivn.vn_next != 0);
10380
10381 if (ivna.vna_other == vers_data)
10382 {
10383 *sym_info = symbol_undefined;
10384 *vna_other = ivna.vna_other;
10385 version_string = (ivna.vna_name < strtab_size
10386 ? strtab + ivna.vna_name
10387 : _("<corrupt>"));
10388 check_def = 0;
10389 }
10390 else if (! is_nobits)
10391 error (_("bad dynamic symbol\n"));
10392 else
10393 check_def = 1;
10394 }
10395
10396 if (check_def)
10397 {
10398 if (vers_data != 0x8001
10399 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10400 {
10401 Elf_Internal_Verdef ivd;
10402 Elf_Internal_Verdaux ivda;
10403 Elf_External_Verdaux evda;
10404 unsigned long off;
10405
10406 off = offset_from_vma
10407 (file,
10408 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10409 sizeof (Elf_External_Verdef));
10410
10411 do
10412 {
10413 Elf_External_Verdef evd;
10414
10415 if (get_data (&evd, file, off, sizeof (evd),
10416 1, _("version def")) == NULL)
10417 {
10418 ivd.vd_ndx = 0;
10419 ivd.vd_aux = 0;
10420 ivd.vd_next = 0;
10421 }
10422 else
10423 {
10424 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10425 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10426 ivd.vd_next = BYTE_GET (evd.vd_next);
10427 }
10428
10429 off += ivd.vd_next;
10430 }
10431 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10432 && ivd.vd_next != 0);
10433
10434 off -= ivd.vd_next;
10435 off += ivd.vd_aux;
10436
10437 if (get_data (&evda, file, off, sizeof (evda),
10438 1, _("version def aux")) == NULL)
10439 return version_string;
10440
10441 ivda.vda_name = BYTE_GET (evda.vda_name);
10442
10443 if (psym->st_name != ivda.vda_name)
10444 {
10445 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10446 ? symbol_hidden : symbol_public);
10447 version_string = (ivda.vda_name < strtab_size
10448 ? strtab + ivda.vda_name
10449 : _("<corrupt>"));
10450 }
10451 }
10452 }
10453 }
10454 }
10455 return version_string;
10456 }
10457
10458 /* Dump the symbol table. */
10459 static int
10460 process_symbol_table (FILE * file)
10461 {
10462 Elf_Internal_Shdr * section;
10463 bfd_size_type nbuckets = 0;
10464 bfd_size_type nchains = 0;
10465 bfd_vma * buckets = NULL;
10466 bfd_vma * chains = NULL;
10467 bfd_vma ngnubuckets = 0;
10468 bfd_vma * gnubuckets = NULL;
10469 bfd_vma * gnuchains = NULL;
10470 bfd_vma gnusymidx = 0;
10471 bfd_size_type ngnuchains = 0;
10472
10473 if (!do_syms && !do_dyn_syms && !do_histogram)
10474 return 1;
10475
10476 if (dynamic_info[DT_HASH]
10477 && (do_histogram
10478 || (do_using_dynamic
10479 && !do_dyn_syms
10480 && dynamic_strings != NULL)))
10481 {
10482 unsigned char nb[8];
10483 unsigned char nc[8];
10484 unsigned int hash_ent_size = 4;
10485
10486 if ((elf_header.e_machine == EM_ALPHA
10487 || elf_header.e_machine == EM_S390
10488 || elf_header.e_machine == EM_S390_OLD)
10489 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10490 hash_ent_size = 8;
10491
10492 if (fseek (file,
10493 (archive_file_offset
10494 + offset_from_vma (file, dynamic_info[DT_HASH],
10495 sizeof nb + sizeof nc)),
10496 SEEK_SET))
10497 {
10498 error (_("Unable to seek to start of dynamic information\n"));
10499 goto no_hash;
10500 }
10501
10502 if (fread (nb, hash_ent_size, 1, file) != 1)
10503 {
10504 error (_("Failed to read in number of buckets\n"));
10505 goto no_hash;
10506 }
10507
10508 if (fread (nc, hash_ent_size, 1, file) != 1)
10509 {
10510 error (_("Failed to read in number of chains\n"));
10511 goto no_hash;
10512 }
10513
10514 nbuckets = byte_get (nb, hash_ent_size);
10515 nchains = byte_get (nc, hash_ent_size);
10516
10517 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10518 chains = get_dynamic_data (file, nchains, hash_ent_size);
10519
10520 no_hash:
10521 if (buckets == NULL || chains == NULL)
10522 {
10523 if (do_using_dynamic)
10524 return 0;
10525 free (buckets);
10526 free (chains);
10527 buckets = NULL;
10528 chains = NULL;
10529 nbuckets = 0;
10530 nchains = 0;
10531 }
10532 }
10533
10534 if (dynamic_info_DT_GNU_HASH
10535 && (do_histogram
10536 || (do_using_dynamic
10537 && !do_dyn_syms
10538 && dynamic_strings != NULL)))
10539 {
10540 unsigned char nb[16];
10541 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10542 bfd_vma buckets_vma;
10543
10544 if (fseek (file,
10545 (archive_file_offset
10546 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10547 sizeof nb)),
10548 SEEK_SET))
10549 {
10550 error (_("Unable to seek to start of dynamic information\n"));
10551 goto no_gnu_hash;
10552 }
10553
10554 if (fread (nb, 16, 1, file) != 1)
10555 {
10556 error (_("Failed to read in number of buckets\n"));
10557 goto no_gnu_hash;
10558 }
10559
10560 ngnubuckets = byte_get (nb, 4);
10561 gnusymidx = byte_get (nb + 4, 4);
10562 bitmaskwords = byte_get (nb + 8, 4);
10563 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10564 if (is_32bit_elf)
10565 buckets_vma += bitmaskwords * 4;
10566 else
10567 buckets_vma += bitmaskwords * 8;
10568
10569 if (fseek (file,
10570 (archive_file_offset
10571 + offset_from_vma (file, buckets_vma, 4)),
10572 SEEK_SET))
10573 {
10574 error (_("Unable to seek to start of dynamic information\n"));
10575 goto no_gnu_hash;
10576 }
10577
10578 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10579
10580 if (gnubuckets == NULL)
10581 goto no_gnu_hash;
10582
10583 for (i = 0; i < ngnubuckets; i++)
10584 if (gnubuckets[i] != 0)
10585 {
10586 if (gnubuckets[i] < gnusymidx)
10587 return 0;
10588
10589 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10590 maxchain = gnubuckets[i];
10591 }
10592
10593 if (maxchain == 0xffffffff)
10594 goto no_gnu_hash;
10595
10596 maxchain -= gnusymidx;
10597
10598 if (fseek (file,
10599 (archive_file_offset
10600 + offset_from_vma (file, buckets_vma
10601 + 4 * (ngnubuckets + maxchain), 4)),
10602 SEEK_SET))
10603 {
10604 error (_("Unable to seek to start of dynamic information\n"));
10605 goto no_gnu_hash;
10606 }
10607
10608 do
10609 {
10610 if (fread (nb, 4, 1, file) != 1)
10611 {
10612 error (_("Failed to determine last chain length\n"));
10613 goto no_gnu_hash;
10614 }
10615
10616 if (maxchain + 1 == 0)
10617 goto no_gnu_hash;
10618
10619 ++maxchain;
10620 }
10621 while ((byte_get (nb, 4) & 1) == 0);
10622
10623 if (fseek (file,
10624 (archive_file_offset
10625 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10626 SEEK_SET))
10627 {
10628 error (_("Unable to seek to start of dynamic information\n"));
10629 goto no_gnu_hash;
10630 }
10631
10632 gnuchains = get_dynamic_data (file, maxchain, 4);
10633 ngnuchains = maxchain;
10634
10635 no_gnu_hash:
10636 if (gnuchains == NULL)
10637 {
10638 free (gnubuckets);
10639 gnubuckets = NULL;
10640 ngnubuckets = 0;
10641 if (do_using_dynamic)
10642 return 0;
10643 }
10644 }
10645
10646 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10647 && do_syms
10648 && do_using_dynamic
10649 && dynamic_strings != NULL
10650 && dynamic_symbols != NULL)
10651 {
10652 unsigned long hn;
10653
10654 if (dynamic_info[DT_HASH])
10655 {
10656 bfd_vma si;
10657
10658 printf (_("\nSymbol table for image:\n"));
10659 if (is_32bit_elf)
10660 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10661 else
10662 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10663
10664 for (hn = 0; hn < nbuckets; hn++)
10665 {
10666 if (! buckets[hn])
10667 continue;
10668
10669 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10670 print_dynamic_symbol (si, hn);
10671 }
10672 }
10673
10674 if (dynamic_info_DT_GNU_HASH)
10675 {
10676 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10677 if (is_32bit_elf)
10678 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10679 else
10680 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10681
10682 for (hn = 0; hn < ngnubuckets; ++hn)
10683 if (gnubuckets[hn] != 0)
10684 {
10685 bfd_vma si = gnubuckets[hn];
10686 bfd_vma off = si - gnusymidx;
10687
10688 do
10689 {
10690 print_dynamic_symbol (si, hn);
10691 si++;
10692 }
10693 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10694 }
10695 }
10696 }
10697 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10698 && section_headers != NULL)
10699 {
10700 unsigned int i;
10701
10702 for (i = 0, section = section_headers;
10703 i < elf_header.e_shnum;
10704 i++, section++)
10705 {
10706 unsigned int si;
10707 char * strtab = NULL;
10708 unsigned long int strtab_size = 0;
10709 Elf_Internal_Sym * symtab;
10710 Elf_Internal_Sym * psym;
10711 unsigned long num_syms;
10712
10713 if ((section->sh_type != SHT_SYMTAB
10714 && section->sh_type != SHT_DYNSYM)
10715 || (!do_syms
10716 && section->sh_type == SHT_SYMTAB))
10717 continue;
10718
10719 if (section->sh_entsize == 0)
10720 {
10721 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10722 printable_section_name (section));
10723 continue;
10724 }
10725
10726 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10727 printable_section_name (section),
10728 (unsigned long) (section->sh_size / section->sh_entsize));
10729
10730 if (is_32bit_elf)
10731 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10732 else
10733 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10734
10735 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10736 if (symtab == NULL)
10737 continue;
10738
10739 if (section->sh_link == elf_header.e_shstrndx)
10740 {
10741 strtab = string_table;
10742 strtab_size = string_table_length;
10743 }
10744 else if (section->sh_link < elf_header.e_shnum)
10745 {
10746 Elf_Internal_Shdr * string_sec;
10747
10748 string_sec = section_headers + section->sh_link;
10749
10750 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10751 1, string_sec->sh_size,
10752 _("string table"));
10753 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10754 }
10755
10756 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10757 {
10758 const char *version_string;
10759 enum versioned_symbol_info sym_info;
10760 unsigned short vna_other;
10761
10762 printf ("%6d: ", si);
10763 print_vma (psym->st_value, LONG_HEX);
10764 putchar (' ');
10765 print_vma (psym->st_size, DEC_5);
10766 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10767 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10768 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10769 /* Check to see if any other bits in the st_other field are set.
10770 Note - displaying this information disrupts the layout of the
10771 table being generated, but for the moment this case is very rare. */
10772 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10773 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10774 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10775 print_symbol (25, psym->st_name < strtab_size
10776 ? strtab + psym->st_name : _("<corrupt>"));
10777
10778 version_string
10779 = get_symbol_version_string (file,
10780 section->sh_type == SHT_DYNSYM,
10781 strtab, strtab_size, si,
10782 psym, &sym_info, &vna_other);
10783 if (version_string)
10784 {
10785 if (sym_info == symbol_undefined)
10786 printf ("@%s (%d)", version_string, vna_other);
10787 else
10788 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10789 version_string);
10790 }
10791
10792 putchar ('\n');
10793 }
10794
10795 free (symtab);
10796 if (strtab != string_table)
10797 free (strtab);
10798 }
10799 }
10800 else if (do_syms)
10801 printf
10802 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10803
10804 if (do_histogram && buckets != NULL)
10805 {
10806 unsigned long * lengths;
10807 unsigned long * counts;
10808 unsigned long hn;
10809 bfd_vma si;
10810 unsigned long maxlength = 0;
10811 unsigned long nzero_counts = 0;
10812 unsigned long nsyms = 0;
10813 unsigned long chained;
10814
10815 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10816 (unsigned long) nbuckets);
10817
10818 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10819 if (lengths == NULL)
10820 {
10821 error (_("Out of memory allocating space for histogram buckets\n"));
10822 return 0;
10823 }
10824
10825 printf (_(" Length Number %% of total Coverage\n"));
10826 for (hn = 0; hn < nbuckets; ++hn)
10827 {
10828 for (si = buckets[hn], chained = 0;
10829 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
10830 si = chains[si], ++chained)
10831 {
10832 ++nsyms;
10833 if (maxlength < ++lengths[hn])
10834 ++maxlength;
10835 }
10836
10837 /* PR binutils/17531: A corrupt binary could contain broken
10838 histogram data. Do not go into an infinite loop trying
10839 to process it. */
10840 if (chained > nchains)
10841 {
10842 error (_("histogram chain is corrupt\n"));
10843 break;
10844 }
10845 }
10846
10847 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10848 if (counts == NULL)
10849 {
10850 free (lengths);
10851 error (_("Out of memory allocating space for histogram counts\n"));
10852 return 0;
10853 }
10854
10855 for (hn = 0; hn < nbuckets; ++hn)
10856 ++counts[lengths[hn]];
10857
10858 if (nbuckets > 0)
10859 {
10860 unsigned long i;
10861 printf (" 0 %-10lu (%5.1f%%)\n",
10862 counts[0], (counts[0] * 100.0) / nbuckets);
10863 for (i = 1; i <= maxlength; ++i)
10864 {
10865 nzero_counts += counts[i] * i;
10866 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10867 i, counts[i], (counts[i] * 100.0) / nbuckets,
10868 (nzero_counts * 100.0) / nsyms);
10869 }
10870 }
10871
10872 free (counts);
10873 free (lengths);
10874 }
10875
10876 if (buckets != NULL)
10877 {
10878 free (buckets);
10879 free (chains);
10880 }
10881
10882 if (do_histogram && gnubuckets != NULL)
10883 {
10884 unsigned long * lengths;
10885 unsigned long * counts;
10886 unsigned long hn;
10887 unsigned long maxlength = 0;
10888 unsigned long nzero_counts = 0;
10889 unsigned long nsyms = 0;
10890
10891 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10892 (unsigned long) ngnubuckets);
10893
10894 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10895 if (lengths == NULL)
10896 {
10897 error (_("Out of memory allocating space for gnu histogram buckets\n"));
10898 return 0;
10899 }
10900
10901 printf (_(" Length Number %% of total Coverage\n"));
10902
10903 for (hn = 0; hn < ngnubuckets; ++hn)
10904 if (gnubuckets[hn] != 0)
10905 {
10906 bfd_vma off, length = 1;
10907
10908 for (off = gnubuckets[hn] - gnusymidx;
10909 /* PR 17531 file: 010-77222-0.004. */
10910 off < ngnuchains && (gnuchains[off] & 1) == 0;
10911 ++off)
10912 ++length;
10913 lengths[hn] = length;
10914 if (length > maxlength)
10915 maxlength = length;
10916 nsyms += length;
10917 }
10918
10919 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10920 if (counts == NULL)
10921 {
10922 free (lengths);
10923 error (_("Out of memory allocating space for gnu histogram counts\n"));
10924 return 0;
10925 }
10926
10927 for (hn = 0; hn < ngnubuckets; ++hn)
10928 ++counts[lengths[hn]];
10929
10930 if (ngnubuckets > 0)
10931 {
10932 unsigned long j;
10933 printf (" 0 %-10lu (%5.1f%%)\n",
10934 counts[0], (counts[0] * 100.0) / ngnubuckets);
10935 for (j = 1; j <= maxlength; ++j)
10936 {
10937 nzero_counts += counts[j] * j;
10938 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10939 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10940 (nzero_counts * 100.0) / nsyms);
10941 }
10942 }
10943
10944 free (counts);
10945 free (lengths);
10946 free (gnubuckets);
10947 free (gnuchains);
10948 }
10949
10950 return 1;
10951 }
10952
10953 static int
10954 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10955 {
10956 unsigned int i;
10957
10958 if (dynamic_syminfo == NULL
10959 || !do_dynamic)
10960 /* No syminfo, this is ok. */
10961 return 1;
10962
10963 /* There better should be a dynamic symbol section. */
10964 if (dynamic_symbols == NULL || dynamic_strings == NULL)
10965 return 0;
10966
10967 if (dynamic_addr)
10968 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10969 dynamic_syminfo_offset, dynamic_syminfo_nent);
10970
10971 printf (_(" Num: Name BoundTo Flags\n"));
10972 for (i = 0; i < dynamic_syminfo_nent; ++i)
10973 {
10974 unsigned short int flags = dynamic_syminfo[i].si_flags;
10975
10976 printf ("%4d: ", i);
10977 if (i >= num_dynamic_syms)
10978 printf (_("<corrupt index>"));
10979 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10980 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10981 else
10982 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10983 putchar (' ');
10984
10985 switch (dynamic_syminfo[i].si_boundto)
10986 {
10987 case SYMINFO_BT_SELF:
10988 fputs ("SELF ", stdout);
10989 break;
10990 case SYMINFO_BT_PARENT:
10991 fputs ("PARENT ", stdout);
10992 break;
10993 default:
10994 if (dynamic_syminfo[i].si_boundto > 0
10995 && dynamic_syminfo[i].si_boundto < dynamic_nent
10996 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10997 {
10998 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10999 putchar (' ' );
11000 }
11001 else
11002 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11003 break;
11004 }
11005
11006 if (flags & SYMINFO_FLG_DIRECT)
11007 printf (" DIRECT");
11008 if (flags & SYMINFO_FLG_PASSTHRU)
11009 printf (" PASSTHRU");
11010 if (flags & SYMINFO_FLG_COPY)
11011 printf (" COPY");
11012 if (flags & SYMINFO_FLG_LAZYLOAD)
11013 printf (" LAZYLOAD");
11014
11015 puts ("");
11016 }
11017
11018 return 1;
11019 }
11020
11021 /* Check to see if the given reloc needs to be handled in a target specific
11022 manner. If so then process the reloc and return TRUE otherwise return
11023 FALSE. */
11024
11025 static bfd_boolean
11026 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11027 unsigned char * start,
11028 Elf_Internal_Sym * symtab)
11029 {
11030 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11031
11032 switch (elf_header.e_machine)
11033 {
11034 case EM_MSP430:
11035 case EM_MSP430_OLD:
11036 {
11037 static Elf_Internal_Sym * saved_sym = NULL;
11038
11039 switch (reloc_type)
11040 {
11041 case 10: /* R_MSP430_SYM_DIFF */
11042 if (uses_msp430x_relocs ())
11043 break;
11044 case 21: /* R_MSP430X_SYM_DIFF */
11045 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11046 return TRUE;
11047
11048 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11049 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11050 goto handle_sym_diff;
11051
11052 case 5: /* R_MSP430_16_BYTE */
11053 case 9: /* R_MSP430_8 */
11054 if (uses_msp430x_relocs ())
11055 break;
11056 goto handle_sym_diff;
11057
11058 case 2: /* R_MSP430_ABS16 */
11059 case 15: /* R_MSP430X_ABS16 */
11060 if (! uses_msp430x_relocs ())
11061 break;
11062 goto handle_sym_diff;
11063
11064 handle_sym_diff:
11065 if (saved_sym != NULL)
11066 {
11067 bfd_vma value;
11068
11069 value = reloc->r_addend
11070 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11071 - saved_sym->st_value);
11072
11073 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11074
11075 saved_sym = NULL;
11076 return TRUE;
11077 }
11078 break;
11079
11080 default:
11081 if (saved_sym != NULL)
11082 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11083 break;
11084 }
11085 break;
11086 }
11087
11088 case EM_MN10300:
11089 case EM_CYGNUS_MN10300:
11090 {
11091 static Elf_Internal_Sym * saved_sym = NULL;
11092
11093 switch (reloc_type)
11094 {
11095 case 34: /* R_MN10300_ALIGN */
11096 return TRUE;
11097 case 33: /* R_MN10300_SYM_DIFF */
11098 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11099 return TRUE;
11100 case 1: /* R_MN10300_32 */
11101 case 2: /* R_MN10300_16 */
11102 if (saved_sym != NULL)
11103 {
11104 bfd_vma value;
11105
11106 value = reloc->r_addend
11107 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11108 - saved_sym->st_value);
11109
11110 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11111
11112 saved_sym = NULL;
11113 return TRUE;
11114 }
11115 break;
11116 default:
11117 if (saved_sym != NULL)
11118 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11119 break;
11120 }
11121 break;
11122 }
11123 }
11124
11125 return FALSE;
11126 }
11127
11128 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11129 DWARF debug sections. This is a target specific test. Note - we do not
11130 go through the whole including-target-headers-multiple-times route, (as
11131 we have already done with <elf/h8.h>) because this would become very
11132 messy and even then this function would have to contain target specific
11133 information (the names of the relocs instead of their numeric values).
11134 FIXME: This is not the correct way to solve this problem. The proper way
11135 is to have target specific reloc sizing and typing functions created by
11136 the reloc-macros.h header, in the same way that it already creates the
11137 reloc naming functions. */
11138
11139 static bfd_boolean
11140 is_32bit_abs_reloc (unsigned int reloc_type)
11141 {
11142 switch (elf_header.e_machine)
11143 {
11144 case EM_386:
11145 case EM_486:
11146 return reloc_type == 1; /* R_386_32. */
11147 case EM_68K:
11148 return reloc_type == 1; /* R_68K_32. */
11149 case EM_860:
11150 return reloc_type == 1; /* R_860_32. */
11151 case EM_960:
11152 return reloc_type == 2; /* R_960_32. */
11153 case EM_AARCH64:
11154 return reloc_type == 258; /* R_AARCH64_ABS32 */
11155 case EM_ALPHA:
11156 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11157 case EM_ARC:
11158 return reloc_type == 1; /* R_ARC_32. */
11159 case EM_ARM:
11160 return reloc_type == 2; /* R_ARM_ABS32 */
11161 case EM_AVR_OLD:
11162 case EM_AVR:
11163 return reloc_type == 1;
11164 case EM_ADAPTEVA_EPIPHANY:
11165 return reloc_type == 3;
11166 case EM_BLACKFIN:
11167 return reloc_type == 0x12; /* R_byte4_data. */
11168 case EM_CRIS:
11169 return reloc_type == 3; /* R_CRIS_32. */
11170 case EM_CR16:
11171 return reloc_type == 3; /* R_CR16_NUM32. */
11172 case EM_CRX:
11173 return reloc_type == 15; /* R_CRX_NUM32. */
11174 case EM_CYGNUS_FRV:
11175 return reloc_type == 1;
11176 case EM_CYGNUS_D10V:
11177 case EM_D10V:
11178 return reloc_type == 6; /* R_D10V_32. */
11179 case EM_CYGNUS_D30V:
11180 case EM_D30V:
11181 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11182 case EM_DLX:
11183 return reloc_type == 3; /* R_DLX_RELOC_32. */
11184 case EM_CYGNUS_FR30:
11185 case EM_FR30:
11186 return reloc_type == 3; /* R_FR30_32. */
11187 case EM_FT32:
11188 return reloc_type == 1; /* R_FT32_32. */
11189 case EM_H8S:
11190 case EM_H8_300:
11191 case EM_H8_300H:
11192 return reloc_type == 1; /* R_H8_DIR32. */
11193 case EM_IA_64:
11194 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
11195 case EM_IP2K_OLD:
11196 case EM_IP2K:
11197 return reloc_type == 2; /* R_IP2K_32. */
11198 case EM_IQ2000:
11199 return reloc_type == 2; /* R_IQ2000_32. */
11200 case EM_LATTICEMICO32:
11201 return reloc_type == 3; /* R_LM32_32. */
11202 case EM_M32C_OLD:
11203 case EM_M32C:
11204 return reloc_type == 3; /* R_M32C_32. */
11205 case EM_M32R:
11206 return reloc_type == 34; /* R_M32R_32_RELA. */
11207 case EM_MCORE:
11208 return reloc_type == 1; /* R_MCORE_ADDR32. */
11209 case EM_CYGNUS_MEP:
11210 return reloc_type == 4; /* R_MEP_32. */
11211 case EM_METAG:
11212 return reloc_type == 2; /* R_METAG_ADDR32. */
11213 case EM_MICROBLAZE:
11214 return reloc_type == 1; /* R_MICROBLAZE_32. */
11215 case EM_MIPS:
11216 return reloc_type == 2; /* R_MIPS_32. */
11217 case EM_MMIX:
11218 return reloc_type == 4; /* R_MMIX_32. */
11219 case EM_CYGNUS_MN10200:
11220 case EM_MN10200:
11221 return reloc_type == 1; /* R_MN10200_32. */
11222 case EM_CYGNUS_MN10300:
11223 case EM_MN10300:
11224 return reloc_type == 1; /* R_MN10300_32. */
11225 case EM_MOXIE:
11226 return reloc_type == 1; /* R_MOXIE_32. */
11227 case EM_MSP430_OLD:
11228 case EM_MSP430:
11229 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11230 case EM_MT:
11231 return reloc_type == 2; /* R_MT_32. */
11232 case EM_NDS32:
11233 return reloc_type == 20; /* R_NDS32_RELA. */
11234 case EM_ALTERA_NIOS2:
11235 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11236 case EM_NIOS32:
11237 return reloc_type == 1; /* R_NIOS_32. */
11238 case EM_OR1K:
11239 return reloc_type == 1; /* R_OR1K_32. */
11240 case EM_PARISC:
11241 return (reloc_type == 1 /* R_PARISC_DIR32. */
11242 || reloc_type == 41); /* R_PARISC_SECREL32. */
11243 case EM_PJ:
11244 case EM_PJ_OLD:
11245 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11246 case EM_PPC64:
11247 return reloc_type == 1; /* R_PPC64_ADDR32. */
11248 case EM_PPC:
11249 return reloc_type == 1; /* R_PPC_ADDR32. */
11250 case EM_RL78:
11251 return reloc_type == 1; /* R_RL78_DIR32. */
11252 case EM_RX:
11253 return reloc_type == 1; /* R_RX_DIR32. */
11254 case EM_S370:
11255 return reloc_type == 1; /* R_I370_ADDR31. */
11256 case EM_S390_OLD:
11257 case EM_S390:
11258 return reloc_type == 4; /* R_S390_32. */
11259 case EM_SCORE:
11260 return reloc_type == 8; /* R_SCORE_ABS32. */
11261 case EM_SH:
11262 return reloc_type == 1; /* R_SH_DIR32. */
11263 case EM_SPARC32PLUS:
11264 case EM_SPARCV9:
11265 case EM_SPARC:
11266 return reloc_type == 3 /* R_SPARC_32. */
11267 || reloc_type == 23; /* R_SPARC_UA32. */
11268 case EM_SPU:
11269 return reloc_type == 6; /* R_SPU_ADDR32 */
11270 case EM_TI_C6000:
11271 return reloc_type == 1; /* R_C6000_ABS32. */
11272 case EM_TILEGX:
11273 return reloc_type == 2; /* R_TILEGX_32. */
11274 case EM_TILEPRO:
11275 return reloc_type == 1; /* R_TILEPRO_32. */
11276 case EM_CYGNUS_V850:
11277 case EM_V850:
11278 return reloc_type == 6; /* R_V850_ABS32. */
11279 case EM_V800:
11280 return reloc_type == 0x33; /* R_V810_WORD. */
11281 case EM_VAX:
11282 return reloc_type == 1; /* R_VAX_32. */
11283 case EM_VISIUM:
11284 return reloc_type == 3; /* R_VISIUM_32. */
11285 case EM_X86_64:
11286 case EM_L1OM:
11287 case EM_K1OM:
11288 return reloc_type == 10; /* R_X86_64_32. */
11289 case EM_XC16X:
11290 case EM_C166:
11291 return reloc_type == 3; /* R_XC16C_ABS_32. */
11292 case EM_XGATE:
11293 return reloc_type == 4; /* R_XGATE_32. */
11294 case EM_XSTORMY16:
11295 return reloc_type == 1; /* R_XSTROMY16_32. */
11296 case EM_XTENSA_OLD:
11297 case EM_XTENSA:
11298 return reloc_type == 1; /* R_XTENSA_32. */
11299 default:
11300 {
11301 static unsigned int prev_warn = 0;
11302
11303 /* Avoid repeating the same warning multiple times. */
11304 if (prev_warn != elf_header.e_machine)
11305 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11306 elf_header.e_machine);
11307 prev_warn = elf_header.e_machine;
11308 return FALSE;
11309 }
11310 }
11311 }
11312
11313 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11314 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11315
11316 static bfd_boolean
11317 is_32bit_pcrel_reloc (unsigned int reloc_type)
11318 {
11319 switch (elf_header.e_machine)
11320 {
11321 case EM_386:
11322 case EM_486:
11323 return reloc_type == 2; /* R_386_PC32. */
11324 case EM_68K:
11325 return reloc_type == 4; /* R_68K_PC32. */
11326 case EM_AARCH64:
11327 return reloc_type == 261; /* R_AARCH64_PREL32 */
11328 case EM_ADAPTEVA_EPIPHANY:
11329 return reloc_type == 6;
11330 case EM_ALPHA:
11331 return reloc_type == 10; /* R_ALPHA_SREL32. */
11332 case EM_ARM:
11333 return reloc_type == 3; /* R_ARM_REL32 */
11334 case EM_MICROBLAZE:
11335 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11336 case EM_OR1K:
11337 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11338 case EM_PARISC:
11339 return reloc_type == 9; /* R_PARISC_PCREL32. */
11340 case EM_PPC:
11341 return reloc_type == 26; /* R_PPC_REL32. */
11342 case EM_PPC64:
11343 return reloc_type == 26; /* R_PPC64_REL32. */
11344 case EM_S390_OLD:
11345 case EM_S390:
11346 return reloc_type == 5; /* R_390_PC32. */
11347 case EM_SH:
11348 return reloc_type == 2; /* R_SH_REL32. */
11349 case EM_SPARC32PLUS:
11350 case EM_SPARCV9:
11351 case EM_SPARC:
11352 return reloc_type == 6; /* R_SPARC_DISP32. */
11353 case EM_SPU:
11354 return reloc_type == 13; /* R_SPU_REL32. */
11355 case EM_TILEGX:
11356 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11357 case EM_TILEPRO:
11358 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11359 case EM_VISIUM:
11360 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11361 case EM_X86_64:
11362 case EM_L1OM:
11363 case EM_K1OM:
11364 return reloc_type == 2; /* R_X86_64_PC32. */
11365 case EM_XTENSA_OLD:
11366 case EM_XTENSA:
11367 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11368 default:
11369 /* Do not abort or issue an error message here. Not all targets use
11370 pc-relative 32-bit relocs in their DWARF debug information and we
11371 have already tested for target coverage in is_32bit_abs_reloc. A
11372 more helpful warning message will be generated by apply_relocations
11373 anyway, so just return. */
11374 return FALSE;
11375 }
11376 }
11377
11378 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11379 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11380
11381 static bfd_boolean
11382 is_64bit_abs_reloc (unsigned int reloc_type)
11383 {
11384 switch (elf_header.e_machine)
11385 {
11386 case EM_AARCH64:
11387 return reloc_type == 257; /* R_AARCH64_ABS64. */
11388 case EM_ALPHA:
11389 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11390 case EM_IA_64:
11391 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11392 case EM_PARISC:
11393 return reloc_type == 80; /* R_PARISC_DIR64. */
11394 case EM_PPC64:
11395 return reloc_type == 38; /* R_PPC64_ADDR64. */
11396 case EM_SPARC32PLUS:
11397 case EM_SPARCV9:
11398 case EM_SPARC:
11399 return reloc_type == 54; /* R_SPARC_UA64. */
11400 case EM_X86_64:
11401 case EM_L1OM:
11402 case EM_K1OM:
11403 return reloc_type == 1; /* R_X86_64_64. */
11404 case EM_S390_OLD:
11405 case EM_S390:
11406 return reloc_type == 22; /* R_S390_64. */
11407 case EM_TILEGX:
11408 return reloc_type == 1; /* R_TILEGX_64. */
11409 case EM_MIPS:
11410 return reloc_type == 18; /* R_MIPS_64. */
11411 default:
11412 return FALSE;
11413 }
11414 }
11415
11416 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11417 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11418
11419 static bfd_boolean
11420 is_64bit_pcrel_reloc (unsigned int reloc_type)
11421 {
11422 switch (elf_header.e_machine)
11423 {
11424 case EM_AARCH64:
11425 return reloc_type == 260; /* R_AARCH64_PREL64. */
11426 case EM_ALPHA:
11427 return reloc_type == 11; /* R_ALPHA_SREL64. */
11428 case EM_IA_64:
11429 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11430 case EM_PARISC:
11431 return reloc_type == 72; /* R_PARISC_PCREL64. */
11432 case EM_PPC64:
11433 return reloc_type == 44; /* R_PPC64_REL64. */
11434 case EM_SPARC32PLUS:
11435 case EM_SPARCV9:
11436 case EM_SPARC:
11437 return reloc_type == 46; /* R_SPARC_DISP64. */
11438 case EM_X86_64:
11439 case EM_L1OM:
11440 case EM_K1OM:
11441 return reloc_type == 24; /* R_X86_64_PC64. */
11442 case EM_S390_OLD:
11443 case EM_S390:
11444 return reloc_type == 23; /* R_S390_PC64. */
11445 case EM_TILEGX:
11446 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11447 default:
11448 return FALSE;
11449 }
11450 }
11451
11452 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11453 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11454
11455 static bfd_boolean
11456 is_24bit_abs_reloc (unsigned int reloc_type)
11457 {
11458 switch (elf_header.e_machine)
11459 {
11460 case EM_CYGNUS_MN10200:
11461 case EM_MN10200:
11462 return reloc_type == 4; /* R_MN10200_24. */
11463 default:
11464 return FALSE;
11465 }
11466 }
11467
11468 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11469 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11470
11471 static bfd_boolean
11472 is_16bit_abs_reloc (unsigned int reloc_type)
11473 {
11474 switch (elf_header.e_machine)
11475 {
11476 case EM_AVR_OLD:
11477 case EM_AVR:
11478 return reloc_type == 4; /* R_AVR_16. */
11479 case EM_ADAPTEVA_EPIPHANY:
11480 return reloc_type == 5;
11481 case EM_CYGNUS_D10V:
11482 case EM_D10V:
11483 return reloc_type == 3; /* R_D10V_16. */
11484 case EM_H8S:
11485 case EM_H8_300:
11486 case EM_H8_300H:
11487 return reloc_type == R_H8_DIR16;
11488 case EM_IP2K_OLD:
11489 case EM_IP2K:
11490 return reloc_type == 1; /* R_IP2K_16. */
11491 case EM_M32C_OLD:
11492 case EM_M32C:
11493 return reloc_type == 1; /* R_M32C_16 */
11494 case EM_MSP430:
11495 if (uses_msp430x_relocs ())
11496 return reloc_type == 2; /* R_MSP430_ABS16. */
11497 case EM_MSP430_OLD:
11498 return reloc_type == 5; /* R_MSP430_16_BYTE. */
11499 case EM_NDS32:
11500 return reloc_type == 19; /* R_NDS32_RELA. */
11501 case EM_ALTERA_NIOS2:
11502 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
11503 case EM_NIOS32:
11504 return reloc_type == 9; /* R_NIOS_16. */
11505 case EM_OR1K:
11506 return reloc_type == 2; /* R_OR1K_16. */
11507 case EM_TI_C6000:
11508 return reloc_type == 2; /* R_C6000_ABS16. */
11509 case EM_XC16X:
11510 case EM_C166:
11511 return reloc_type == 2; /* R_XC16C_ABS_16. */
11512 case EM_CYGNUS_MN10200:
11513 case EM_MN10200:
11514 return reloc_type == 2; /* R_MN10200_16. */
11515 case EM_CYGNUS_MN10300:
11516 case EM_MN10300:
11517 return reloc_type == 2; /* R_MN10300_16. */
11518 case EM_VISIUM:
11519 return reloc_type == 2; /* R_VISIUM_16. */
11520 case EM_XGATE:
11521 return reloc_type == 3; /* R_XGATE_16. */
11522 default:
11523 return FALSE;
11524 }
11525 }
11526
11527 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11528 relocation entries (possibly formerly used for SHT_GROUP sections). */
11529
11530 static bfd_boolean
11531 is_none_reloc (unsigned int reloc_type)
11532 {
11533 switch (elf_header.e_machine)
11534 {
11535 case EM_68K: /* R_68K_NONE. */
11536 case EM_386: /* R_386_NONE. */
11537 case EM_SPARC32PLUS:
11538 case EM_SPARCV9:
11539 case EM_SPARC: /* R_SPARC_NONE. */
11540 case EM_MIPS: /* R_MIPS_NONE. */
11541 case EM_PARISC: /* R_PARISC_NONE. */
11542 case EM_ALPHA: /* R_ALPHA_NONE. */
11543 case EM_ADAPTEVA_EPIPHANY:
11544 case EM_PPC: /* R_PPC_NONE. */
11545 case EM_PPC64: /* R_PPC64_NONE. */
11546 case EM_ARM: /* R_ARM_NONE. */
11547 case EM_IA_64: /* R_IA64_NONE. */
11548 case EM_SH: /* R_SH_NONE. */
11549 case EM_S390_OLD:
11550 case EM_S390: /* R_390_NONE. */
11551 case EM_CRIS: /* R_CRIS_NONE. */
11552 case EM_X86_64: /* R_X86_64_NONE. */
11553 case EM_L1OM: /* R_X86_64_NONE. */
11554 case EM_K1OM: /* R_X86_64_NONE. */
11555 case EM_MN10300: /* R_MN10300_NONE. */
11556 case EM_FT32: /* R_FT32_NONE. */
11557 case EM_MOXIE: /* R_MOXIE_NONE. */
11558 case EM_M32R: /* R_M32R_NONE. */
11559 case EM_TI_C6000:/* R_C6000_NONE. */
11560 case EM_TILEGX: /* R_TILEGX_NONE. */
11561 case EM_TILEPRO: /* R_TILEPRO_NONE. */
11562 case EM_XC16X:
11563 case EM_C166: /* R_XC16X_NONE. */
11564 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11565 case EM_NIOS32: /* R_NIOS_NONE. */
11566 case EM_OR1K: /* R_OR1K_NONE. */
11567 return reloc_type == 0;
11568 case EM_AARCH64:
11569 return reloc_type == 0 || reloc_type == 256;
11570 case EM_NDS32:
11571 return (reloc_type == 0 /* R_XTENSA_NONE. */
11572 || reloc_type == 204 /* R_NDS32_DIFF8. */
11573 || reloc_type == 205 /* R_NDS32_DIFF16. */
11574 || reloc_type == 206 /* R_NDS32_DIFF32. */
11575 || reloc_type == 207 /* R_NDS32_ULEB128. */);
11576 case EM_XTENSA_OLD:
11577 case EM_XTENSA:
11578 return (reloc_type == 0 /* R_XTENSA_NONE. */
11579 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11580 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11581 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
11582 case EM_METAG:
11583 return reloc_type == 3; /* R_METAG_NONE. */
11584 }
11585 return FALSE;
11586 }
11587
11588 /* Apply relocations to a section.
11589 Note: So far support has been added only for those relocations
11590 which can be found in debug sections.
11591 FIXME: Add support for more relocations ? */
11592
11593 static void
11594 apply_relocations (void * file,
11595 Elf_Internal_Shdr * section,
11596 unsigned char * start)
11597 {
11598 Elf_Internal_Shdr * relsec;
11599 unsigned char * end = start + section->sh_size;
11600
11601 if (elf_header.e_type != ET_REL)
11602 return;
11603
11604 /* Find the reloc section associated with the section. */
11605 for (relsec = section_headers;
11606 relsec < section_headers + elf_header.e_shnum;
11607 ++relsec)
11608 {
11609 bfd_boolean is_rela;
11610 unsigned long num_relocs;
11611 Elf_Internal_Rela * relocs;
11612 Elf_Internal_Rela * rp;
11613 Elf_Internal_Shdr * symsec;
11614 Elf_Internal_Sym * symtab;
11615 unsigned long num_syms;
11616 Elf_Internal_Sym * sym;
11617
11618 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11619 || relsec->sh_info >= elf_header.e_shnum
11620 || section_headers + relsec->sh_info != section
11621 || relsec->sh_size == 0
11622 || relsec->sh_link >= elf_header.e_shnum)
11623 continue;
11624
11625 is_rela = relsec->sh_type == SHT_RELA;
11626
11627 if (is_rela)
11628 {
11629 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11630 relsec->sh_size, & relocs, & num_relocs))
11631 return;
11632 }
11633 else
11634 {
11635 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11636 relsec->sh_size, & relocs, & num_relocs))
11637 return;
11638 }
11639
11640 /* SH uses RELA but uses in place value instead of the addend field. */
11641 if (elf_header.e_machine == EM_SH)
11642 is_rela = FALSE;
11643
11644 symsec = section_headers + relsec->sh_link;
11645 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11646
11647 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11648 {
11649 bfd_vma addend;
11650 unsigned int reloc_type;
11651 unsigned int reloc_size;
11652 unsigned char * rloc;
11653 unsigned long sym_index;
11654
11655 reloc_type = get_reloc_type (rp->r_info);
11656
11657 if (target_specific_reloc_handling (rp, start, symtab))
11658 continue;
11659 else if (is_none_reloc (reloc_type))
11660 continue;
11661 else if (is_32bit_abs_reloc (reloc_type)
11662 || is_32bit_pcrel_reloc (reloc_type))
11663 reloc_size = 4;
11664 else if (is_64bit_abs_reloc (reloc_type)
11665 || is_64bit_pcrel_reloc (reloc_type))
11666 reloc_size = 8;
11667 else if (is_24bit_abs_reloc (reloc_type))
11668 reloc_size = 3;
11669 else if (is_16bit_abs_reloc (reloc_type))
11670 reloc_size = 2;
11671 else
11672 {
11673 static unsigned int prev_reloc = 0;
11674 if (reloc_type != prev_reloc)
11675 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11676 reloc_type, printable_section_name (section));
11677 prev_reloc = reloc_type;
11678 continue;
11679 }
11680
11681 rloc = start + rp->r_offset;
11682 if ((rloc + reloc_size) > end || (rloc < start))
11683 {
11684 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11685 (unsigned long) rp->r_offset,
11686 printable_section_name (section));
11687 continue;
11688 }
11689
11690 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11691 if (sym_index >= num_syms)
11692 {
11693 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11694 sym_index, printable_section_name (section));
11695 continue;
11696 }
11697 sym = symtab + sym_index;
11698
11699 /* If the reloc has a symbol associated with it,
11700 make sure that it is of an appropriate type.
11701
11702 Relocations against symbols without type can happen.
11703 Gcc -feliminate-dwarf2-dups may generate symbols
11704 without type for debug info.
11705
11706 Icc generates relocations against function symbols
11707 instead of local labels.
11708
11709 Relocations against object symbols can happen, eg when
11710 referencing a global array. For an example of this see
11711 the _clz.o binary in libgcc.a. */
11712 if (sym != symtab
11713 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11714 {
11715 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11716 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11717 (long int)(rp - relocs),
11718 printable_section_name (relsec));
11719 continue;
11720 }
11721
11722 addend = 0;
11723 if (is_rela)
11724 addend += rp->r_addend;
11725 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11726 partial_inplace. */
11727 if (!is_rela
11728 || (elf_header.e_machine == EM_XTENSA
11729 && reloc_type == 1)
11730 || ((elf_header.e_machine == EM_PJ
11731 || elf_header.e_machine == EM_PJ_OLD)
11732 && reloc_type == 1)
11733 || ((elf_header.e_machine == EM_D30V
11734 || elf_header.e_machine == EM_CYGNUS_D30V)
11735 && reloc_type == 12))
11736 addend += byte_get (rloc, reloc_size);
11737
11738 if (is_32bit_pcrel_reloc (reloc_type)
11739 || is_64bit_pcrel_reloc (reloc_type))
11740 {
11741 /* On HPPA, all pc-relative relocations are biased by 8. */
11742 if (elf_header.e_machine == EM_PARISC)
11743 addend -= 8;
11744 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11745 reloc_size);
11746 }
11747 else
11748 byte_put (rloc, addend + sym->st_value, reloc_size);
11749 }
11750
11751 free (symtab);
11752 free (relocs);
11753 break;
11754 }
11755 }
11756
11757 #ifdef SUPPORT_DISASSEMBLY
11758 static int
11759 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11760 {
11761 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11762
11763 /* FIXME: XXX -- to be done --- XXX */
11764
11765 return 1;
11766 }
11767 #endif
11768
11769 /* Reads in the contents of SECTION from FILE, returning a pointer
11770 to a malloc'ed buffer or NULL if something went wrong. */
11771
11772 static char *
11773 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11774 {
11775 bfd_size_type num_bytes;
11776
11777 num_bytes = section->sh_size;
11778
11779 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11780 {
11781 printf (_("\nSection '%s' has no data to dump.\n"),
11782 printable_section_name (section));
11783 return NULL;
11784 }
11785
11786 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11787 _("section contents"));
11788 }
11789
11790
11791 static void
11792 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11793 {
11794 Elf_Internal_Shdr * relsec;
11795 bfd_size_type num_bytes;
11796 char * data;
11797 char * end;
11798 char * start;
11799 bfd_boolean some_strings_shown;
11800
11801 start = get_section_contents (section, file);
11802 if (start == NULL)
11803 return;
11804
11805 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11806
11807 /* If the section being dumped has relocations against it the user might
11808 be expecting these relocations to have been applied. Check for this
11809 case and issue a warning message in order to avoid confusion.
11810 FIXME: Maybe we ought to have an option that dumps a section with
11811 relocs applied ? */
11812 for (relsec = section_headers;
11813 relsec < section_headers + elf_header.e_shnum;
11814 ++relsec)
11815 {
11816 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11817 || relsec->sh_info >= elf_header.e_shnum
11818 || section_headers + relsec->sh_info != section
11819 || relsec->sh_size == 0
11820 || relsec->sh_link >= elf_header.e_shnum)
11821 continue;
11822
11823 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11824 break;
11825 }
11826
11827 num_bytes = section->sh_size;
11828 data = start;
11829 end = start + num_bytes;
11830 some_strings_shown = FALSE;
11831
11832 while (data < end)
11833 {
11834 while (!ISPRINT (* data))
11835 if (++ data >= end)
11836 break;
11837
11838 if (data < end)
11839 {
11840 size_t maxlen = end - data;
11841
11842 #ifndef __MSVCRT__
11843 /* PR 11128: Use two separate invocations in order to work
11844 around bugs in the Solaris 8 implementation of printf. */
11845 printf (" [%6tx] ", data - start);
11846 #else
11847 printf (" [%6Ix] ", (size_t) (data - start));
11848 #endif
11849 if (maxlen > 0)
11850 {
11851 print_symbol ((int) maxlen, data);
11852 putchar ('\n');
11853 data += strnlen (data, maxlen);
11854 }
11855 else
11856 {
11857 printf (_("<corrupt>\n"));
11858 data = end;
11859 }
11860 some_strings_shown = TRUE;
11861 }
11862 }
11863
11864 if (! some_strings_shown)
11865 printf (_(" No strings found in this section."));
11866
11867 free (start);
11868
11869 putchar ('\n');
11870 }
11871
11872 static void
11873 dump_section_as_bytes (Elf_Internal_Shdr * section,
11874 FILE * file,
11875 bfd_boolean relocate)
11876 {
11877 Elf_Internal_Shdr * relsec;
11878 bfd_size_type bytes;
11879 bfd_vma addr;
11880 unsigned char * data;
11881 unsigned char * start;
11882
11883 start = (unsigned char *) get_section_contents (section, file);
11884 if (start == NULL)
11885 return;
11886
11887 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11888
11889 if (relocate)
11890 {
11891 apply_relocations (file, section, start);
11892 }
11893 else
11894 {
11895 /* If the section being dumped has relocations against it the user might
11896 be expecting these relocations to have been applied. Check for this
11897 case and issue a warning message in order to avoid confusion.
11898 FIXME: Maybe we ought to have an option that dumps a section with
11899 relocs applied ? */
11900 for (relsec = section_headers;
11901 relsec < section_headers + elf_header.e_shnum;
11902 ++relsec)
11903 {
11904 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11905 || relsec->sh_info >= elf_header.e_shnum
11906 || section_headers + relsec->sh_info != section
11907 || relsec->sh_size == 0
11908 || relsec->sh_link >= elf_header.e_shnum)
11909 continue;
11910
11911 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11912 break;
11913 }
11914 }
11915
11916 addr = section->sh_addr;
11917 bytes = section->sh_size;
11918 data = start;
11919
11920 while (bytes)
11921 {
11922 int j;
11923 int k;
11924 int lbytes;
11925
11926 lbytes = (bytes > 16 ? 16 : bytes);
11927
11928 printf (" 0x%8.8lx ", (unsigned long) addr);
11929
11930 for (j = 0; j < 16; j++)
11931 {
11932 if (j < lbytes)
11933 printf ("%2.2x", data[j]);
11934 else
11935 printf (" ");
11936
11937 if ((j & 3) == 3)
11938 printf (" ");
11939 }
11940
11941 for (j = 0; j < lbytes; j++)
11942 {
11943 k = data[j];
11944 if (k >= ' ' && k < 0x7f)
11945 printf ("%c", k);
11946 else
11947 printf (".");
11948 }
11949
11950 putchar ('\n');
11951
11952 data += lbytes;
11953 addr += lbytes;
11954 bytes -= lbytes;
11955 }
11956
11957 free (start);
11958
11959 putchar ('\n');
11960 }
11961
11962 /* Uncompresses a section that was compressed using zlib, in place. */
11963
11964 static int
11965 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11966 dwarf_size_type *size ATTRIBUTE_UNUSED)
11967 {
11968 #ifndef HAVE_ZLIB_H
11969 return FALSE;
11970 #else
11971 dwarf_size_type compressed_size = *size;
11972 unsigned char * compressed_buffer = *buffer;
11973 dwarf_size_type uncompressed_size;
11974 unsigned char * uncompressed_buffer;
11975 z_stream strm;
11976 int rc;
11977 dwarf_size_type header_size = 12;
11978
11979 /* Read the zlib header. In this case, it should be "ZLIB" followed
11980 by the uncompressed section size, 8 bytes in big-endian order. */
11981 if (compressed_size < header_size
11982 || ! streq ((char *) compressed_buffer, "ZLIB"))
11983 return 0;
11984
11985 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11986 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11987 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11988 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11989 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11990 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11991 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11992 uncompressed_size += compressed_buffer[11];
11993
11994 /* It is possible the section consists of several compressed
11995 buffers concatenated together, so we uncompress in a loop. */
11996 strm.zalloc = NULL;
11997 strm.zfree = NULL;
11998 strm.opaque = NULL;
11999 strm.avail_in = compressed_size - header_size;
12000 strm.next_in = (Bytef *) compressed_buffer + header_size;
12001 strm.avail_out = uncompressed_size;
12002 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12003
12004 rc = inflateInit (& strm);
12005 while (strm.avail_in > 0)
12006 {
12007 if (rc != Z_OK)
12008 goto fail;
12009 strm.next_out = ((Bytef *) uncompressed_buffer
12010 + (uncompressed_size - strm.avail_out));
12011 rc = inflate (&strm, Z_FINISH);
12012 if (rc != Z_STREAM_END)
12013 goto fail;
12014 rc = inflateReset (& strm);
12015 }
12016 rc = inflateEnd (& strm);
12017 if (rc != Z_OK
12018 || strm.avail_out != 0)
12019 goto fail;
12020
12021 free (compressed_buffer);
12022 *buffer = uncompressed_buffer;
12023 *size = uncompressed_size;
12024 return 1;
12025
12026 fail:
12027 free (uncompressed_buffer);
12028 /* Indicate decompression failure. */
12029 *buffer = NULL;
12030 return 0;
12031 #endif /* HAVE_ZLIB_H */
12032 }
12033
12034 static int
12035 load_specific_debug_section (enum dwarf_section_display_enum debug,
12036 Elf_Internal_Shdr * sec, void * file)
12037 {
12038 struct dwarf_section * section = &debug_displays [debug].section;
12039 char buf [64];
12040
12041 /* If it is already loaded, do nothing. */
12042 if (section->start != NULL)
12043 return 1;
12044
12045 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12046 section->address = sec->sh_addr;
12047 section->user_data = NULL;
12048 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12049 sec->sh_offset, 1,
12050 sec->sh_size, buf);
12051 if (section->start == NULL)
12052 section->size = 0;
12053 else
12054 {
12055 section->size = sec->sh_size;
12056 if (uncompress_section_contents (&section->start, &section->size))
12057 sec->sh_size = section->size;
12058 }
12059
12060 if (section->start == NULL)
12061 return 0;
12062
12063 if (debug_displays [debug].relocate)
12064 apply_relocations ((FILE *) file, sec, section->start);
12065
12066 return 1;
12067 }
12068
12069 /* If this is not NULL, load_debug_section will only look for sections
12070 within the list of sections given here. */
12071 unsigned int *section_subset = NULL;
12072
12073 int
12074 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12075 {
12076 struct dwarf_section * section = &debug_displays [debug].section;
12077 Elf_Internal_Shdr * sec;
12078
12079 /* Locate the debug section. */
12080 sec = find_section_in_set (section->uncompressed_name, section_subset);
12081 if (sec != NULL)
12082 section->name = section->uncompressed_name;
12083 else
12084 {
12085 sec = find_section_in_set (section->compressed_name, section_subset);
12086 if (sec != NULL)
12087 section->name = section->compressed_name;
12088 }
12089 if (sec == NULL)
12090 return 0;
12091
12092 /* If we're loading from a subset of sections, and we've loaded
12093 a section matching this name before, it's likely that it's a
12094 different one. */
12095 if (section_subset != NULL)
12096 free_debug_section (debug);
12097
12098 return load_specific_debug_section (debug, sec, (FILE *) file);
12099 }
12100
12101 void
12102 free_debug_section (enum dwarf_section_display_enum debug)
12103 {
12104 struct dwarf_section * section = &debug_displays [debug].section;
12105
12106 if (section->start == NULL)
12107 return;
12108
12109 free ((char *) section->start);
12110 section->start = NULL;
12111 section->address = 0;
12112 section->size = 0;
12113 }
12114
12115 static int
12116 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12117 {
12118 char * name = SECTION_NAME (section);
12119 const char * print_name = printable_section_name (section);
12120 bfd_size_type length;
12121 int result = 1;
12122 int i;
12123
12124 length = section->sh_size;
12125 if (length == 0)
12126 {
12127 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12128 return 0;
12129 }
12130 if (section->sh_type == SHT_NOBITS)
12131 {
12132 /* There is no point in dumping the contents of a debugging section
12133 which has the NOBITS type - the bits in the file will be random.
12134 This can happen when a file containing a .eh_frame section is
12135 stripped with the --only-keep-debug command line option. */
12136 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12137 print_name);
12138 return 0;
12139 }
12140
12141 if (const_strneq (name, ".gnu.linkonce.wi."))
12142 name = ".debug_info";
12143
12144 /* See if we know how to display the contents of this section. */
12145 for (i = 0; i < max; i++)
12146 if (streq (debug_displays[i].section.uncompressed_name, name)
12147 || (i == line && const_strneq (name, ".debug_line."))
12148 || streq (debug_displays[i].section.compressed_name, name))
12149 {
12150 struct dwarf_section * sec = &debug_displays [i].section;
12151 int secondary = (section != find_section (name));
12152
12153 if (secondary)
12154 free_debug_section ((enum dwarf_section_display_enum) i);
12155
12156 if (i == line && const_strneq (name, ".debug_line."))
12157 sec->name = name;
12158 else if (streq (sec->uncompressed_name, name))
12159 sec->name = sec->uncompressed_name;
12160 else
12161 sec->name = sec->compressed_name;
12162 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12163 section, file))
12164 {
12165 /* If this debug section is part of a CU/TU set in a .dwp file,
12166 restrict load_debug_section to the sections in that set. */
12167 section_subset = find_cu_tu_set (file, shndx);
12168
12169 result &= debug_displays[i].display (sec, file);
12170
12171 section_subset = NULL;
12172
12173 if (secondary || (i != info && i != abbrev))
12174 free_debug_section ((enum dwarf_section_display_enum) i);
12175 }
12176
12177 break;
12178 }
12179
12180 if (i == max)
12181 {
12182 printf (_("Unrecognized debug section: %s\n"), print_name);
12183 result = 0;
12184 }
12185
12186 return result;
12187 }
12188
12189 /* Set DUMP_SECTS for all sections where dumps were requested
12190 based on section name. */
12191
12192 static void
12193 initialise_dumps_byname (void)
12194 {
12195 struct dump_list_entry * cur;
12196
12197 for (cur = dump_sects_byname; cur; cur = cur->next)
12198 {
12199 unsigned int i;
12200 int any;
12201
12202 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12203 if (streq (SECTION_NAME (section_headers + i), cur->name))
12204 {
12205 request_dump_bynumber (i, cur->type);
12206 any = 1;
12207 }
12208
12209 if (!any)
12210 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12211 cur->name);
12212 }
12213 }
12214
12215 static void
12216 process_section_contents (FILE * file)
12217 {
12218 Elf_Internal_Shdr * section;
12219 unsigned int i;
12220
12221 if (! do_dump)
12222 return;
12223
12224 initialise_dumps_byname ();
12225
12226 for (i = 0, section = section_headers;
12227 i < elf_header.e_shnum && i < num_dump_sects;
12228 i++, section++)
12229 {
12230 #ifdef SUPPORT_DISASSEMBLY
12231 if (dump_sects[i] & DISASS_DUMP)
12232 disassemble_section (section, file);
12233 #endif
12234 if (dump_sects[i] & HEX_DUMP)
12235 dump_section_as_bytes (section, file, FALSE);
12236
12237 if (dump_sects[i] & RELOC_DUMP)
12238 dump_section_as_bytes (section, file, TRUE);
12239
12240 if (dump_sects[i] & STRING_DUMP)
12241 dump_section_as_strings (section, file);
12242
12243 if (dump_sects[i] & DEBUG_DUMP)
12244 display_debug_section (i, section, file);
12245 }
12246
12247 /* Check to see if the user requested a
12248 dump of a section that does not exist. */
12249 while (i++ < num_dump_sects)
12250 if (dump_sects[i])
12251 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12252 }
12253
12254 static void
12255 process_mips_fpe_exception (int mask)
12256 {
12257 if (mask)
12258 {
12259 int first = 1;
12260 if (mask & OEX_FPU_INEX)
12261 fputs ("INEX", stdout), first = 0;
12262 if (mask & OEX_FPU_UFLO)
12263 printf ("%sUFLO", first ? "" : "|"), first = 0;
12264 if (mask & OEX_FPU_OFLO)
12265 printf ("%sOFLO", first ? "" : "|"), first = 0;
12266 if (mask & OEX_FPU_DIV0)
12267 printf ("%sDIV0", first ? "" : "|"), first = 0;
12268 if (mask & OEX_FPU_INVAL)
12269 printf ("%sINVAL", first ? "" : "|");
12270 }
12271 else
12272 fputs ("0", stdout);
12273 }
12274
12275 /* Display's the value of TAG at location P. If TAG is
12276 greater than 0 it is assumed to be an unknown tag, and
12277 a message is printed to this effect. Otherwise it is
12278 assumed that a message has already been printed.
12279
12280 If the bottom bit of TAG is set it assumed to have a
12281 string value, otherwise it is assumed to have an integer
12282 value.
12283
12284 Returns an updated P pointing to the first unread byte
12285 beyond the end of TAG's value.
12286
12287 Reads at or beyond END will not be made. */
12288
12289 static unsigned char *
12290 display_tag_value (int tag,
12291 unsigned char * p,
12292 const unsigned char * const end)
12293 {
12294 unsigned long val;
12295
12296 if (tag > 0)
12297 printf (" Tag_unknown_%d: ", tag);
12298
12299 if (p >= end)
12300 {
12301 warn (_("<corrupt tag>\n"));
12302 }
12303 else if (tag & 1)
12304 {
12305 /* PR 17531 file: 027-19978-0.004. */
12306 size_t maxlen = (end - p) - 1;
12307
12308 putchar ('"');
12309 if (maxlen > 0)
12310 {
12311 print_symbol ((int) maxlen, (const char *) p);
12312 p += strnlen ((char *) p, maxlen) + 1;
12313 }
12314 else
12315 {
12316 printf (_("<corrupt string tag>"));
12317 p = (unsigned char *) end;
12318 }
12319 printf ("\"\n");
12320 }
12321 else
12322 {
12323 unsigned int len;
12324
12325 val = read_uleb128 (p, &len, end);
12326 p += len;
12327 printf ("%ld (0x%lx)\n", val, val);
12328 }
12329
12330 assert (p <= end);
12331 return p;
12332 }
12333
12334 /* ARM EABI attributes section. */
12335 typedef struct
12336 {
12337 unsigned int tag;
12338 const char * name;
12339 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
12340 unsigned int type;
12341 const char ** table;
12342 } arm_attr_public_tag;
12343
12344 static const char * arm_attr_tag_CPU_arch[] =
12345 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12346 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12347 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12348 static const char * arm_attr_tag_THUMB_ISA_use[] =
12349 {"No", "Thumb-1", "Thumb-2"};
12350 static const char * arm_attr_tag_FP_arch[] =
12351 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12352 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12353 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12354 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12355 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12356 static const char * arm_attr_tag_PCS_config[] =
12357 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12358 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12359 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12360 {"V6", "SB", "TLS", "Unused"};
12361 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12362 {"Absolute", "PC-relative", "SB-relative", "None"};
12363 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12364 {"Absolute", "PC-relative", "None"};
12365 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12366 {"None", "direct", "GOT-indirect"};
12367 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12368 {"None", "??? 1", "2", "??? 3", "4"};
12369 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12370 static const char * arm_attr_tag_ABI_FP_denormal[] =
12371 {"Unused", "Needed", "Sign only"};
12372 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12373 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12374 static const char * arm_attr_tag_ABI_FP_number_model[] =
12375 {"Unused", "Finite", "RTABI", "IEEE 754"};
12376 static const char * arm_attr_tag_ABI_enum_size[] =
12377 {"Unused", "small", "int", "forced to int"};
12378 static const char * arm_attr_tag_ABI_HardFP_use[] =
12379 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12380 static const char * arm_attr_tag_ABI_VFP_args[] =
12381 {"AAPCS", "VFP registers", "custom", "compatible"};
12382 static const char * arm_attr_tag_ABI_WMMX_args[] =
12383 {"AAPCS", "WMMX registers", "custom"};
12384 static const char * arm_attr_tag_ABI_optimization_goals[] =
12385 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12386 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12387 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12388 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12389 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12390 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12391 static const char * arm_attr_tag_FP_HP_extension[] =
12392 {"Not Allowed", "Allowed"};
12393 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12394 {"None", "IEEE 754", "Alternative Format"};
12395 static const char * arm_attr_tag_MPextension_use[] =
12396 {"Not Allowed", "Allowed"};
12397 static const char * arm_attr_tag_DIV_use[] =
12398 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12399 "Allowed in v7-A with integer division extension"};
12400 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12401 static const char * arm_attr_tag_Virtualization_use[] =
12402 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12403 "TrustZone and Virtualization Extensions"};
12404 static const char * arm_attr_tag_MPextension_use_legacy[] =
12405 {"Not Allowed", "Allowed"};
12406
12407 #define LOOKUP(id, name) \
12408 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12409 static arm_attr_public_tag arm_attr_public_tags[] =
12410 {
12411 {4, "CPU_raw_name", 1, NULL},
12412 {5, "CPU_name", 1, NULL},
12413 LOOKUP(6, CPU_arch),
12414 {7, "CPU_arch_profile", 0, NULL},
12415 LOOKUP(8, ARM_ISA_use),
12416 LOOKUP(9, THUMB_ISA_use),
12417 LOOKUP(10, FP_arch),
12418 LOOKUP(11, WMMX_arch),
12419 LOOKUP(12, Advanced_SIMD_arch),
12420 LOOKUP(13, PCS_config),
12421 LOOKUP(14, ABI_PCS_R9_use),
12422 LOOKUP(15, ABI_PCS_RW_data),
12423 LOOKUP(16, ABI_PCS_RO_data),
12424 LOOKUP(17, ABI_PCS_GOT_use),
12425 LOOKUP(18, ABI_PCS_wchar_t),
12426 LOOKUP(19, ABI_FP_rounding),
12427 LOOKUP(20, ABI_FP_denormal),
12428 LOOKUP(21, ABI_FP_exceptions),
12429 LOOKUP(22, ABI_FP_user_exceptions),
12430 LOOKUP(23, ABI_FP_number_model),
12431 {24, "ABI_align_needed", 0, NULL},
12432 {25, "ABI_align_preserved", 0, NULL},
12433 LOOKUP(26, ABI_enum_size),
12434 LOOKUP(27, ABI_HardFP_use),
12435 LOOKUP(28, ABI_VFP_args),
12436 LOOKUP(29, ABI_WMMX_args),
12437 LOOKUP(30, ABI_optimization_goals),
12438 LOOKUP(31, ABI_FP_optimization_goals),
12439 {32, "compatibility", 0, NULL},
12440 LOOKUP(34, CPU_unaligned_access),
12441 LOOKUP(36, FP_HP_extension),
12442 LOOKUP(38, ABI_FP_16bit_format),
12443 LOOKUP(42, MPextension_use),
12444 LOOKUP(44, DIV_use),
12445 {64, "nodefaults", 0, NULL},
12446 {65, "also_compatible_with", 0, NULL},
12447 LOOKUP(66, T2EE_use),
12448 {67, "conformance", 1, NULL},
12449 LOOKUP(68, Virtualization_use),
12450 LOOKUP(70, MPextension_use_legacy)
12451 };
12452 #undef LOOKUP
12453
12454 static unsigned char *
12455 display_arm_attribute (unsigned char * p,
12456 const unsigned char * const end)
12457 {
12458 unsigned int tag;
12459 unsigned int len;
12460 unsigned int val;
12461 arm_attr_public_tag * attr;
12462 unsigned i;
12463 unsigned int type;
12464
12465 tag = read_uleb128 (p, &len, end);
12466 p += len;
12467 attr = NULL;
12468 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12469 {
12470 if (arm_attr_public_tags[i].tag == tag)
12471 {
12472 attr = &arm_attr_public_tags[i];
12473 break;
12474 }
12475 }
12476
12477 if (attr)
12478 {
12479 printf (" Tag_%s: ", attr->name);
12480 switch (attr->type)
12481 {
12482 case 0:
12483 switch (tag)
12484 {
12485 case 7: /* Tag_CPU_arch_profile. */
12486 val = read_uleb128 (p, &len, end);
12487 p += len;
12488 switch (val)
12489 {
12490 case 0: printf (_("None\n")); break;
12491 case 'A': printf (_("Application\n")); break;
12492 case 'R': printf (_("Realtime\n")); break;
12493 case 'M': printf (_("Microcontroller\n")); break;
12494 case 'S': printf (_("Application or Realtime\n")); break;
12495 default: printf ("??? (%d)\n", val); break;
12496 }
12497 break;
12498
12499 case 24: /* Tag_align_needed. */
12500 val = read_uleb128 (p, &len, end);
12501 p += len;
12502 switch (val)
12503 {
12504 case 0: printf (_("None\n")); break;
12505 case 1: printf (_("8-byte\n")); break;
12506 case 2: printf (_("4-byte\n")); break;
12507 case 3: printf ("??? 3\n"); break;
12508 default:
12509 if (val <= 12)
12510 printf (_("8-byte and up to %d-byte extended\n"),
12511 1 << val);
12512 else
12513 printf ("??? (%d)\n", val);
12514 break;
12515 }
12516 break;
12517
12518 case 25: /* Tag_align_preserved. */
12519 val = read_uleb128 (p, &len, end);
12520 p += len;
12521 switch (val)
12522 {
12523 case 0: printf (_("None\n")); break;
12524 case 1: printf (_("8-byte, except leaf SP\n")); break;
12525 case 2: printf (_("8-byte\n")); break;
12526 case 3: printf ("??? 3\n"); break;
12527 default:
12528 if (val <= 12)
12529 printf (_("8-byte and up to %d-byte extended\n"),
12530 1 << val);
12531 else
12532 printf ("??? (%d)\n", val);
12533 break;
12534 }
12535 break;
12536
12537 case 32: /* Tag_compatibility. */
12538 {
12539 val = read_uleb128 (p, &len, end);
12540 p += len;
12541 printf (_("flag = %d, vendor = "), val);
12542 if (p < end - 1)
12543 {
12544 size_t maxlen = (end - p) - 1;
12545
12546 print_symbol ((int) maxlen, (const char *) p);
12547 p += strnlen ((char *) p, maxlen) + 1;
12548 }
12549 else
12550 {
12551 printf (_("<corrupt>"));
12552 p = (unsigned char *) end;
12553 }
12554 putchar ('\n');
12555 }
12556 break;
12557
12558 case 64: /* Tag_nodefaults. */
12559 /* PR 17531: file: 001-505008-0.01. */
12560 if (p < end)
12561 p++;
12562 printf (_("True\n"));
12563 break;
12564
12565 case 65: /* Tag_also_compatible_with. */
12566 val = read_uleb128 (p, &len, end);
12567 p += len;
12568 if (val == 6 /* Tag_CPU_arch. */)
12569 {
12570 val = read_uleb128 (p, &len, end);
12571 p += len;
12572 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12573 printf ("??? (%d)\n", val);
12574 else
12575 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12576 }
12577 else
12578 printf ("???\n");
12579 while (p < end && *(p++) != '\0' /* NUL terminator. */)
12580 ;
12581 break;
12582
12583 default:
12584 printf (_("<unknown: %d>\n"), tag);
12585 break;
12586 }
12587 return p;
12588
12589 case 1:
12590 return display_tag_value (-1, p, end);
12591 case 2:
12592 return display_tag_value (0, p, end);
12593
12594 default:
12595 assert (attr->type & 0x80);
12596 val = read_uleb128 (p, &len, end);
12597 p += len;
12598 type = attr->type & 0x7f;
12599 if (val >= type)
12600 printf ("??? (%d)\n", val);
12601 else
12602 printf ("%s\n", attr->table[val]);
12603 return p;
12604 }
12605 }
12606
12607 return display_tag_value (tag, p, end);
12608 }
12609
12610 static unsigned char *
12611 display_gnu_attribute (unsigned char * p,
12612 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12613 const unsigned char * const end)
12614 {
12615 int tag;
12616 unsigned int len;
12617 int val;
12618
12619 tag = read_uleb128 (p, &len, end);
12620 p += len;
12621
12622 /* Tag_compatibility is the only generic GNU attribute defined at
12623 present. */
12624 if (tag == 32)
12625 {
12626 val = read_uleb128 (p, &len, end);
12627 p += len;
12628
12629 printf (_("flag = %d, vendor = "), val);
12630 if (p == end)
12631 {
12632 printf (_("<corrupt>\n"));
12633 warn (_("corrupt vendor attribute\n"));
12634 }
12635 else
12636 {
12637 if (p < end - 1)
12638 {
12639 size_t maxlen = (end - p) - 1;
12640
12641 print_symbol ((int) maxlen, (const char *) p);
12642 p += strnlen ((char *) p, maxlen) + 1;
12643 }
12644 else
12645 {
12646 printf (_("<corrupt>"));
12647 p = (unsigned char *) end;
12648 }
12649 putchar ('\n');
12650 }
12651 return p;
12652 }
12653
12654 if ((tag & 2) == 0 && display_proc_gnu_attribute)
12655 return display_proc_gnu_attribute (p, tag, end);
12656
12657 return display_tag_value (tag, p, end);
12658 }
12659
12660 static unsigned char *
12661 display_power_gnu_attribute (unsigned char * p,
12662 int tag,
12663 const unsigned char * const end)
12664 {
12665 unsigned int len;
12666 int val;
12667
12668 if (tag == Tag_GNU_Power_ABI_FP)
12669 {
12670 val = read_uleb128 (p, &len, end);
12671 p += len;
12672 printf (" Tag_GNU_Power_ABI_FP: ");
12673
12674 switch (val)
12675 {
12676 case 0:
12677 printf (_("Hard or soft float\n"));
12678 break;
12679 case 1:
12680 printf (_("Hard float\n"));
12681 break;
12682 case 2:
12683 printf (_("Soft float\n"));
12684 break;
12685 case 3:
12686 printf (_("Single-precision hard float\n"));
12687 break;
12688 default:
12689 printf ("??? (%d)\n", val);
12690 break;
12691 }
12692 return p;
12693 }
12694
12695 if (tag == Tag_GNU_Power_ABI_Vector)
12696 {
12697 val = read_uleb128 (p, &len, end);
12698 p += len;
12699 printf (" Tag_GNU_Power_ABI_Vector: ");
12700 switch (val)
12701 {
12702 case 0:
12703 printf (_("Any\n"));
12704 break;
12705 case 1:
12706 printf (_("Generic\n"));
12707 break;
12708 case 2:
12709 printf ("AltiVec\n");
12710 break;
12711 case 3:
12712 printf ("SPE\n");
12713 break;
12714 default:
12715 printf ("??? (%d)\n", val);
12716 break;
12717 }
12718 return p;
12719 }
12720
12721 if (tag == Tag_GNU_Power_ABI_Struct_Return)
12722 {
12723 if (p == end)
12724 {
12725 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12726 return p;
12727 }
12728
12729 val = read_uleb128 (p, &len, end);
12730 p += len;
12731 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
12732 switch (val)
12733 {
12734 case 0:
12735 printf (_("Any\n"));
12736 break;
12737 case 1:
12738 printf ("r3/r4\n");
12739 break;
12740 case 2:
12741 printf (_("Memory\n"));
12742 break;
12743 default:
12744 printf ("??? (%d)\n", val);
12745 break;
12746 }
12747 return p;
12748 }
12749
12750 return display_tag_value (tag & 1, p, end);
12751 }
12752
12753 static void
12754 display_sparc_hwcaps (int mask)
12755 {
12756 if (mask)
12757 {
12758 int first = 1;
12759
12760 if (mask & ELF_SPARC_HWCAP_MUL32)
12761 fputs ("mul32", stdout), first = 0;
12762 if (mask & ELF_SPARC_HWCAP_DIV32)
12763 printf ("%sdiv32", first ? "" : "|"), first = 0;
12764 if (mask & ELF_SPARC_HWCAP_FSMULD)
12765 printf ("%sfsmuld", first ? "" : "|"), first = 0;
12766 if (mask & ELF_SPARC_HWCAP_V8PLUS)
12767 printf ("%sv8plus", first ? "" : "|"), first = 0;
12768 if (mask & ELF_SPARC_HWCAP_POPC)
12769 printf ("%spopc", first ? "" : "|"), first = 0;
12770 if (mask & ELF_SPARC_HWCAP_VIS)
12771 printf ("%svis", first ? "" : "|"), first = 0;
12772 if (mask & ELF_SPARC_HWCAP_VIS2)
12773 printf ("%svis2", first ? "" : "|"), first = 0;
12774 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12775 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12776 if (mask & ELF_SPARC_HWCAP_FMAF)
12777 printf ("%sfmaf", first ? "" : "|"), first = 0;
12778 if (mask & ELF_SPARC_HWCAP_VIS3)
12779 printf ("%svis3", first ? "" : "|"), first = 0;
12780 if (mask & ELF_SPARC_HWCAP_HPC)
12781 printf ("%shpc", first ? "" : "|"), first = 0;
12782 if (mask & ELF_SPARC_HWCAP_RANDOM)
12783 printf ("%srandom", first ? "" : "|"), first = 0;
12784 if (mask & ELF_SPARC_HWCAP_TRANS)
12785 printf ("%strans", first ? "" : "|"), first = 0;
12786 if (mask & ELF_SPARC_HWCAP_FJFMAU)
12787 printf ("%sfjfmau", first ? "" : "|"), first = 0;
12788 if (mask & ELF_SPARC_HWCAP_IMA)
12789 printf ("%sima", first ? "" : "|"), first = 0;
12790 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12791 printf ("%scspare", first ? "" : "|"), first = 0;
12792 }
12793 else
12794 fputc ('0', stdout);
12795 fputc ('\n', stdout);
12796 }
12797
12798 static void
12799 display_sparc_hwcaps2 (int mask)
12800 {
12801 if (mask)
12802 {
12803 int first = 1;
12804
12805 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12806 fputs ("fjathplus", stdout), first = 0;
12807 if (mask & ELF_SPARC_HWCAP2_VIS3B)
12808 printf ("%svis3b", first ? "" : "|"), first = 0;
12809 if (mask & ELF_SPARC_HWCAP2_ADP)
12810 printf ("%sadp", first ? "" : "|"), first = 0;
12811 if (mask & ELF_SPARC_HWCAP2_SPARC5)
12812 printf ("%ssparc5", first ? "" : "|"), first = 0;
12813 if (mask & ELF_SPARC_HWCAP2_MWAIT)
12814 printf ("%smwait", first ? "" : "|"), first = 0;
12815 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12816 printf ("%sxmpmul", first ? "" : "|"), first = 0;
12817 if (mask & ELF_SPARC_HWCAP2_XMONT)
12818 printf ("%sxmont2", first ? "" : "|"), first = 0;
12819 if (mask & ELF_SPARC_HWCAP2_NSEC)
12820 printf ("%snsec", first ? "" : "|"), first = 0;
12821 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12822 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12823 if (mask & ELF_SPARC_HWCAP2_FJDES)
12824 printf ("%sfjdes", first ? "" : "|"), first = 0;
12825 if (mask & ELF_SPARC_HWCAP2_FJAES)
12826 printf ("%sfjaes", first ? "" : "|"), first = 0;
12827 }
12828 else
12829 fputc ('0', stdout);
12830 fputc ('\n', stdout);
12831 }
12832
12833 static unsigned char *
12834 display_sparc_gnu_attribute (unsigned char * p,
12835 int tag,
12836 const unsigned char * const end)
12837 {
12838 unsigned int len;
12839 int val;
12840
12841 if (tag == Tag_GNU_Sparc_HWCAPS)
12842 {
12843 val = read_uleb128 (p, &len, end);
12844 p += len;
12845 printf (" Tag_GNU_Sparc_HWCAPS: ");
12846 display_sparc_hwcaps (val);
12847 return p;
12848 }
12849 if (tag == Tag_GNU_Sparc_HWCAPS2)
12850 {
12851 val = read_uleb128 (p, &len, end);
12852 p += len;
12853 printf (" Tag_GNU_Sparc_HWCAPS2: ");
12854 display_sparc_hwcaps2 (val);
12855 return p;
12856 }
12857
12858 return display_tag_value (tag, p, end);
12859 }
12860
12861 static void
12862 print_mips_fp_abi_value (int val)
12863 {
12864 switch (val)
12865 {
12866 case Val_GNU_MIPS_ABI_FP_ANY:
12867 printf (_("Hard or soft float\n"));
12868 break;
12869 case Val_GNU_MIPS_ABI_FP_DOUBLE:
12870 printf (_("Hard float (double precision)\n"));
12871 break;
12872 case Val_GNU_MIPS_ABI_FP_SINGLE:
12873 printf (_("Hard float (single precision)\n"));
12874 break;
12875 case Val_GNU_MIPS_ABI_FP_SOFT:
12876 printf (_("Soft float\n"));
12877 break;
12878 case Val_GNU_MIPS_ABI_FP_OLD_64:
12879 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12880 break;
12881 case Val_GNU_MIPS_ABI_FP_XX:
12882 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12883 break;
12884 case Val_GNU_MIPS_ABI_FP_64:
12885 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12886 break;
12887 case Val_GNU_MIPS_ABI_FP_64A:
12888 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12889 break;
12890 default:
12891 printf ("??? (%d)\n", val);
12892 break;
12893 }
12894 }
12895
12896 static unsigned char *
12897 display_mips_gnu_attribute (unsigned char * p,
12898 int tag,
12899 const unsigned char * const end)
12900 {
12901 if (tag == Tag_GNU_MIPS_ABI_FP)
12902 {
12903 unsigned int len;
12904 int val;
12905
12906 val = read_uleb128 (p, &len, end);
12907 p += len;
12908 printf (" Tag_GNU_MIPS_ABI_FP: ");
12909
12910 print_mips_fp_abi_value (val);
12911
12912 return p;
12913 }
12914
12915 if (tag == Tag_GNU_MIPS_ABI_MSA)
12916 {
12917 unsigned int len;
12918 int val;
12919
12920 val = read_uleb128 (p, &len, end);
12921 p += len;
12922 printf (" Tag_GNU_MIPS_ABI_MSA: ");
12923
12924 switch (val)
12925 {
12926 case Val_GNU_MIPS_ABI_MSA_ANY:
12927 printf (_("Any MSA or not\n"));
12928 break;
12929 case Val_GNU_MIPS_ABI_MSA_128:
12930 printf (_("128-bit MSA\n"));
12931 break;
12932 default:
12933 printf ("??? (%d)\n", val);
12934 break;
12935 }
12936 return p;
12937 }
12938
12939 return display_tag_value (tag & 1, p, end);
12940 }
12941
12942 static unsigned char *
12943 display_tic6x_attribute (unsigned char * p,
12944 const unsigned char * const end)
12945 {
12946 int tag;
12947 unsigned int len;
12948 int val;
12949
12950 tag = read_uleb128 (p, &len, end);
12951 p += len;
12952
12953 switch (tag)
12954 {
12955 case Tag_ISA:
12956 val = read_uleb128 (p, &len, end);
12957 p += len;
12958 printf (" Tag_ISA: ");
12959
12960 switch (val)
12961 {
12962 case C6XABI_Tag_ISA_none:
12963 printf (_("None\n"));
12964 break;
12965 case C6XABI_Tag_ISA_C62X:
12966 printf ("C62x\n");
12967 break;
12968 case C6XABI_Tag_ISA_C67X:
12969 printf ("C67x\n");
12970 break;
12971 case C6XABI_Tag_ISA_C67XP:
12972 printf ("C67x+\n");
12973 break;
12974 case C6XABI_Tag_ISA_C64X:
12975 printf ("C64x\n");
12976 break;
12977 case C6XABI_Tag_ISA_C64XP:
12978 printf ("C64x+\n");
12979 break;
12980 case C6XABI_Tag_ISA_C674X:
12981 printf ("C674x\n");
12982 break;
12983 default:
12984 printf ("??? (%d)\n", val);
12985 break;
12986 }
12987 return p;
12988
12989 case Tag_ABI_wchar_t:
12990 val = read_uleb128 (p, &len, end);
12991 p += len;
12992 printf (" Tag_ABI_wchar_t: ");
12993 switch (val)
12994 {
12995 case 0:
12996 printf (_("Not used\n"));
12997 break;
12998 case 1:
12999 printf (_("2 bytes\n"));
13000 break;
13001 case 2:
13002 printf (_("4 bytes\n"));
13003 break;
13004 default:
13005 printf ("??? (%d)\n", val);
13006 break;
13007 }
13008 return p;
13009
13010 case Tag_ABI_stack_align_needed:
13011 val = read_uleb128 (p, &len, end);
13012 p += len;
13013 printf (" Tag_ABI_stack_align_needed: ");
13014 switch (val)
13015 {
13016 case 0:
13017 printf (_("8-byte\n"));
13018 break;
13019 case 1:
13020 printf (_("16-byte\n"));
13021 break;
13022 default:
13023 printf ("??? (%d)\n", val);
13024 break;
13025 }
13026 return p;
13027
13028 case Tag_ABI_stack_align_preserved:
13029 val = read_uleb128 (p, &len, end);
13030 p += len;
13031 printf (" Tag_ABI_stack_align_preserved: ");
13032 switch (val)
13033 {
13034 case 0:
13035 printf (_("8-byte\n"));
13036 break;
13037 case 1:
13038 printf (_("16-byte\n"));
13039 break;
13040 default:
13041 printf ("??? (%d)\n", val);
13042 break;
13043 }
13044 return p;
13045
13046 case Tag_ABI_DSBT:
13047 val = read_uleb128 (p, &len, end);
13048 p += len;
13049 printf (" Tag_ABI_DSBT: ");
13050 switch (val)
13051 {
13052 case 0:
13053 printf (_("DSBT addressing not used\n"));
13054 break;
13055 case 1:
13056 printf (_("DSBT addressing used\n"));
13057 break;
13058 default:
13059 printf ("??? (%d)\n", val);
13060 break;
13061 }
13062 return p;
13063
13064 case Tag_ABI_PID:
13065 val = read_uleb128 (p, &len, end);
13066 p += len;
13067 printf (" Tag_ABI_PID: ");
13068 switch (val)
13069 {
13070 case 0:
13071 printf (_("Data addressing position-dependent\n"));
13072 break;
13073 case 1:
13074 printf (_("Data addressing position-independent, GOT near DP\n"));
13075 break;
13076 case 2:
13077 printf (_("Data addressing position-independent, GOT far from DP\n"));
13078 break;
13079 default:
13080 printf ("??? (%d)\n", val);
13081 break;
13082 }
13083 return p;
13084
13085 case Tag_ABI_PIC:
13086 val = read_uleb128 (p, &len, end);
13087 p += len;
13088 printf (" Tag_ABI_PIC: ");
13089 switch (val)
13090 {
13091 case 0:
13092 printf (_("Code addressing position-dependent\n"));
13093 break;
13094 case 1:
13095 printf (_("Code addressing position-independent\n"));
13096 break;
13097 default:
13098 printf ("??? (%d)\n", val);
13099 break;
13100 }
13101 return p;
13102
13103 case Tag_ABI_array_object_alignment:
13104 val = read_uleb128 (p, &len, end);
13105 p += len;
13106 printf (" Tag_ABI_array_object_alignment: ");
13107 switch (val)
13108 {
13109 case 0:
13110 printf (_("8-byte\n"));
13111 break;
13112 case 1:
13113 printf (_("4-byte\n"));
13114 break;
13115 case 2:
13116 printf (_("16-byte\n"));
13117 break;
13118 default:
13119 printf ("??? (%d)\n", val);
13120 break;
13121 }
13122 return p;
13123
13124 case Tag_ABI_array_object_align_expected:
13125 val = read_uleb128 (p, &len, end);
13126 p += len;
13127 printf (" Tag_ABI_array_object_align_expected: ");
13128 switch (val)
13129 {
13130 case 0:
13131 printf (_("8-byte\n"));
13132 break;
13133 case 1:
13134 printf (_("4-byte\n"));
13135 break;
13136 case 2:
13137 printf (_("16-byte\n"));
13138 break;
13139 default:
13140 printf ("??? (%d)\n", val);
13141 break;
13142 }
13143 return p;
13144
13145 case Tag_ABI_compatibility:
13146 {
13147 val = read_uleb128 (p, &len, end);
13148 p += len;
13149 printf (" Tag_ABI_compatibility: ");
13150 printf (_("flag = %d, vendor = "), val);
13151 if (p < end - 1)
13152 {
13153 size_t maxlen = (end - p) - 1;
13154
13155 print_symbol ((int) maxlen, (const char *) p);
13156 p += strnlen ((char *) p, maxlen) + 1;
13157 }
13158 else
13159 {
13160 printf (_("<corrupt>"));
13161 p = (unsigned char *) end;
13162 }
13163 putchar ('\n');
13164 return p;
13165 }
13166
13167 case Tag_ABI_conformance:
13168 {
13169 printf (" Tag_ABI_conformance: \"");
13170 if (p < end - 1)
13171 {
13172 size_t maxlen = (end - p) - 1;
13173
13174 print_symbol ((int) maxlen, (const char *) p);
13175 p += strnlen ((char *) p, maxlen) + 1;
13176 }
13177 else
13178 {
13179 printf (_("<corrupt>"));
13180 p = (unsigned char *) end;
13181 }
13182 printf ("\"\n");
13183 return p;
13184 }
13185 }
13186
13187 return display_tag_value (tag, p, end);
13188 }
13189
13190 static void
13191 display_raw_attribute (unsigned char * p, unsigned char * end)
13192 {
13193 unsigned long addr = 0;
13194 size_t bytes = end - p;
13195
13196 assert (end > p);
13197 while (bytes)
13198 {
13199 int j;
13200 int k;
13201 int lbytes = (bytes > 16 ? 16 : bytes);
13202
13203 printf (" 0x%8.8lx ", addr);
13204
13205 for (j = 0; j < 16; j++)
13206 {
13207 if (j < lbytes)
13208 printf ("%2.2x", p[j]);
13209 else
13210 printf (" ");
13211
13212 if ((j & 3) == 3)
13213 printf (" ");
13214 }
13215
13216 for (j = 0; j < lbytes; j++)
13217 {
13218 k = p[j];
13219 if (k >= ' ' && k < 0x7f)
13220 printf ("%c", k);
13221 else
13222 printf (".");
13223 }
13224
13225 putchar ('\n');
13226
13227 p += lbytes;
13228 bytes -= lbytes;
13229 addr += lbytes;
13230 }
13231
13232 putchar ('\n');
13233 }
13234
13235 static unsigned char *
13236 display_msp430x_attribute (unsigned char * p,
13237 const unsigned char * const end)
13238 {
13239 unsigned int len;
13240 int val;
13241 int tag;
13242
13243 tag = read_uleb128 (p, & len, end);
13244 p += len;
13245
13246 switch (tag)
13247 {
13248 case OFBA_MSPABI_Tag_ISA:
13249 val = read_uleb128 (p, &len, end);
13250 p += len;
13251 printf (" Tag_ISA: ");
13252 switch (val)
13253 {
13254 case 0: printf (_("None\n")); break;
13255 case 1: printf (_("MSP430\n")); break;
13256 case 2: printf (_("MSP430X\n")); break;
13257 default: printf ("??? (%d)\n", val); break;
13258 }
13259 break;
13260
13261 case OFBA_MSPABI_Tag_Code_Model:
13262 val = read_uleb128 (p, &len, end);
13263 p += len;
13264 printf (" Tag_Code_Model: ");
13265 switch (val)
13266 {
13267 case 0: printf (_("None\n")); break;
13268 case 1: printf (_("Small\n")); break;
13269 case 2: printf (_("Large\n")); break;
13270 default: printf ("??? (%d)\n", val); break;
13271 }
13272 break;
13273
13274 case OFBA_MSPABI_Tag_Data_Model:
13275 val = read_uleb128 (p, &len, end);
13276 p += len;
13277 printf (" Tag_Data_Model: ");
13278 switch (val)
13279 {
13280 case 0: printf (_("None\n")); break;
13281 case 1: printf (_("Small\n")); break;
13282 case 2: printf (_("Large\n")); break;
13283 case 3: printf (_("Restricted Large\n")); break;
13284 default: printf ("??? (%d)\n", val); break;
13285 }
13286 break;
13287
13288 default:
13289 printf (_(" <unknown tag %d>: "), tag);
13290
13291 if (tag & 1)
13292 {
13293 putchar ('"');
13294 if (p < end - 1)
13295 {
13296 size_t maxlen = (end - p) - 1;
13297
13298 print_symbol ((int) maxlen, (const char *) p);
13299 p += strnlen ((char *) p, maxlen) + 1;
13300 }
13301 else
13302 {
13303 printf (_("<corrupt>"));
13304 p = (unsigned char *) end;
13305 }
13306 printf ("\"\n");
13307 }
13308 else
13309 {
13310 val = read_uleb128 (p, &len, end);
13311 p += len;
13312 printf ("%d (0x%x)\n", val, val);
13313 }
13314 break;
13315 }
13316
13317 assert (p <= end);
13318 return p;
13319 }
13320
13321 static int
13322 process_attributes (FILE * file,
13323 const char * public_name,
13324 unsigned int proc_type,
13325 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13326 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13327 {
13328 Elf_Internal_Shdr * sect;
13329 unsigned i;
13330
13331 /* Find the section header so that we get the size. */
13332 for (i = 0, sect = section_headers;
13333 i < elf_header.e_shnum;
13334 i++, sect++)
13335 {
13336 unsigned char * contents;
13337 unsigned char * p;
13338
13339 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13340 continue;
13341
13342 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13343 sect->sh_size, _("attributes"));
13344 if (contents == NULL)
13345 continue;
13346
13347 p = contents;
13348 if (*p == 'A')
13349 {
13350 bfd_vma section_len;
13351
13352 section_len = sect->sh_size - 1;
13353 p++;
13354
13355 while (section_len > 0)
13356 {
13357 bfd_vma attr_len;
13358 unsigned int namelen;
13359 bfd_boolean public_section;
13360 bfd_boolean gnu_section;
13361
13362 if (section_len <= 4)
13363 {
13364 error (_("Tag section ends prematurely\n"));
13365 break;
13366 }
13367 attr_len = byte_get (p, 4);
13368 p += 4;
13369
13370 if (attr_len > section_len)
13371 {
13372 error (_("Bad attribute length (%u > %u)\n"),
13373 (unsigned) attr_len, (unsigned) section_len);
13374 attr_len = section_len;
13375 }
13376 /* PR 17531: file: 001-101425-0.004 */
13377 else if (attr_len < 5)
13378 {
13379 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13380 break;
13381 }
13382
13383 section_len -= attr_len;
13384 attr_len -= 4;
13385
13386 namelen = strnlen ((char *) p, attr_len) + 1;
13387 if (namelen == 0 || namelen >= attr_len)
13388 {
13389 error (_("Corrupt attribute section name\n"));
13390 break;
13391 }
13392
13393 printf (_("Attribute Section: "));
13394 print_symbol (INT_MAX, (const char *) p);
13395 putchar ('\n');
13396
13397 if (public_name && streq ((char *) p, public_name))
13398 public_section = TRUE;
13399 else
13400 public_section = FALSE;
13401
13402 if (streq ((char *) p, "gnu"))
13403 gnu_section = TRUE;
13404 else
13405 gnu_section = FALSE;
13406
13407 p += namelen;
13408 attr_len -= namelen;
13409
13410 while (attr_len > 0 && p < contents + sect->sh_size)
13411 {
13412 int tag;
13413 int val;
13414 bfd_vma size;
13415 unsigned char * end;
13416
13417 /* PR binutils/17531: Safe handling of corrupt files. */
13418 if (attr_len < 6)
13419 {
13420 error (_("Unused bytes at end of section\n"));
13421 section_len = 0;
13422 break;
13423 }
13424
13425 tag = *(p++);
13426 size = byte_get (p, 4);
13427 if (size > attr_len)
13428 {
13429 error (_("Bad subsection length (%u > %u)\n"),
13430 (unsigned) size, (unsigned) attr_len);
13431 size = attr_len;
13432 }
13433 /* PR binutils/17531: Safe handling of corrupt files. */
13434 if (size < 6)
13435 {
13436 error (_("Bad subsection length (%u < 6)\n"),
13437 (unsigned) size);
13438 section_len = 0;
13439 break;
13440 }
13441
13442 attr_len -= size;
13443 end = p + size - 1;
13444 assert (end <= contents + sect->sh_size);
13445 p += 4;
13446
13447 switch (tag)
13448 {
13449 case 1:
13450 printf (_("File Attributes\n"));
13451 break;
13452 case 2:
13453 printf (_("Section Attributes:"));
13454 goto do_numlist;
13455 case 3:
13456 printf (_("Symbol Attributes:"));
13457 do_numlist:
13458 for (;;)
13459 {
13460 unsigned int j;
13461
13462 val = read_uleb128 (p, &j, end);
13463 p += j;
13464 if (val == 0)
13465 break;
13466 printf (" %d", val);
13467 }
13468 printf ("\n");
13469 break;
13470 default:
13471 printf (_("Unknown tag: %d\n"), tag);
13472 public_section = FALSE;
13473 break;
13474 }
13475
13476 if (public_section && display_pub_attribute != NULL)
13477 {
13478 while (p < end)
13479 p = display_pub_attribute (p, end);
13480 assert (p <= end);
13481 }
13482 else if (gnu_section && display_proc_gnu_attribute != NULL)
13483 {
13484 while (p < end)
13485 p = display_gnu_attribute (p,
13486 display_proc_gnu_attribute,
13487 end);
13488 assert (p <= end);
13489 }
13490 else if (p < end)
13491 {
13492 printf (_(" Unknown attribute:\n"));
13493 display_raw_attribute (p, end);
13494 p = end;
13495 }
13496 else
13497 attr_len = 0;
13498 }
13499 }
13500 }
13501 else
13502 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13503
13504 free (contents);
13505 }
13506 return 1;
13507 }
13508
13509 static int
13510 process_arm_specific (FILE * file)
13511 {
13512 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13513 display_arm_attribute, NULL);
13514 }
13515
13516 static int
13517 process_power_specific (FILE * file)
13518 {
13519 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13520 display_power_gnu_attribute);
13521 }
13522
13523 static int
13524 process_sparc_specific (FILE * file)
13525 {
13526 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13527 display_sparc_gnu_attribute);
13528 }
13529
13530 static int
13531 process_tic6x_specific (FILE * file)
13532 {
13533 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13534 display_tic6x_attribute, NULL);
13535 }
13536
13537 static int
13538 process_msp430x_specific (FILE * file)
13539 {
13540 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13541 display_msp430x_attribute, NULL);
13542 }
13543
13544 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13545 Print the Address, Access and Initial fields of an entry at VMA ADDR
13546 and return the VMA of the next entry, or -1 if there was a problem.
13547 Does not read from DATA_END or beyond. */
13548
13549 static bfd_vma
13550 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
13551 unsigned char * data_end)
13552 {
13553 printf (" ");
13554 print_vma (addr, LONG_HEX);
13555 printf (" ");
13556 if (addr < pltgot + 0xfff0)
13557 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13558 else
13559 printf ("%10s", "");
13560 printf (" ");
13561 if (data == NULL)
13562 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13563 else
13564 {
13565 bfd_vma entry;
13566 unsigned char * from = data + addr - pltgot;
13567
13568 if (from + (is_32bit_elf ? 4 : 8) > data_end)
13569 {
13570 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
13571 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
13572 return (bfd_vma) -1;
13573 }
13574 else
13575 {
13576 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13577 print_vma (entry, LONG_HEX);
13578 }
13579 }
13580 return addr + (is_32bit_elf ? 4 : 8);
13581 }
13582
13583 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13584 PLTGOT. Print the Address and Initial fields of an entry at VMA
13585 ADDR and return the VMA of the next entry. */
13586
13587 static bfd_vma
13588 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13589 {
13590 printf (" ");
13591 print_vma (addr, LONG_HEX);
13592 printf (" ");
13593 if (data == NULL)
13594 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13595 else
13596 {
13597 bfd_vma entry;
13598
13599 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13600 print_vma (entry, LONG_HEX);
13601 }
13602 return addr + (is_32bit_elf ? 4 : 8);
13603 }
13604
13605 static void
13606 print_mips_ases (unsigned int mask)
13607 {
13608 if (mask & AFL_ASE_DSP)
13609 fputs ("\n\tDSP ASE", stdout);
13610 if (mask & AFL_ASE_DSPR2)
13611 fputs ("\n\tDSP R2 ASE", stdout);
13612 if (mask & AFL_ASE_EVA)
13613 fputs ("\n\tEnhanced VA Scheme", stdout);
13614 if (mask & AFL_ASE_MCU)
13615 fputs ("\n\tMCU (MicroController) ASE", stdout);
13616 if (mask & AFL_ASE_MDMX)
13617 fputs ("\n\tMDMX ASE", stdout);
13618 if (mask & AFL_ASE_MIPS3D)
13619 fputs ("\n\tMIPS-3D ASE", stdout);
13620 if (mask & AFL_ASE_MT)
13621 fputs ("\n\tMT ASE", stdout);
13622 if (mask & AFL_ASE_SMARTMIPS)
13623 fputs ("\n\tSmartMIPS ASE", stdout);
13624 if (mask & AFL_ASE_VIRT)
13625 fputs ("\n\tVZ ASE", stdout);
13626 if (mask & AFL_ASE_MSA)
13627 fputs ("\n\tMSA ASE", stdout);
13628 if (mask & AFL_ASE_MIPS16)
13629 fputs ("\n\tMIPS16 ASE", stdout);
13630 if (mask & AFL_ASE_MICROMIPS)
13631 fputs ("\n\tMICROMIPS ASE", stdout);
13632 if (mask & AFL_ASE_XPA)
13633 fputs ("\n\tXPA ASE", stdout);
13634 if (mask == 0)
13635 fprintf (stdout, "\n\t%s", _("None"));
13636 else if ((mask & ~AFL_ASE_MASK) != 0)
13637 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13638 }
13639
13640 static void
13641 print_mips_isa_ext (unsigned int isa_ext)
13642 {
13643 switch (isa_ext)
13644 {
13645 case 0:
13646 fputs (_("None"), stdout);
13647 break;
13648 case AFL_EXT_XLR:
13649 fputs ("RMI XLR", stdout);
13650 break;
13651 case AFL_EXT_OCTEON3:
13652 fputs ("Cavium Networks Octeon3", stdout);
13653 break;
13654 case AFL_EXT_OCTEON2:
13655 fputs ("Cavium Networks Octeon2", stdout);
13656 break;
13657 case AFL_EXT_OCTEONP:
13658 fputs ("Cavium Networks OcteonP", stdout);
13659 break;
13660 case AFL_EXT_LOONGSON_3A:
13661 fputs ("Loongson 3A", stdout);
13662 break;
13663 case AFL_EXT_OCTEON:
13664 fputs ("Cavium Networks Octeon", stdout);
13665 break;
13666 case AFL_EXT_5900:
13667 fputs ("Toshiba R5900", stdout);
13668 break;
13669 case AFL_EXT_4650:
13670 fputs ("MIPS R4650", stdout);
13671 break;
13672 case AFL_EXT_4010:
13673 fputs ("LSI R4010", stdout);
13674 break;
13675 case AFL_EXT_4100:
13676 fputs ("NEC VR4100", stdout);
13677 break;
13678 case AFL_EXT_3900:
13679 fputs ("Toshiba R3900", stdout);
13680 break;
13681 case AFL_EXT_10000:
13682 fputs ("MIPS R10000", stdout);
13683 break;
13684 case AFL_EXT_SB1:
13685 fputs ("Broadcom SB-1", stdout);
13686 break;
13687 case AFL_EXT_4111:
13688 fputs ("NEC VR4111/VR4181", stdout);
13689 break;
13690 case AFL_EXT_4120:
13691 fputs ("NEC VR4120", stdout);
13692 break;
13693 case AFL_EXT_5400:
13694 fputs ("NEC VR5400", stdout);
13695 break;
13696 case AFL_EXT_5500:
13697 fputs ("NEC VR5500", stdout);
13698 break;
13699 case AFL_EXT_LOONGSON_2E:
13700 fputs ("ST Microelectronics Loongson 2E", stdout);
13701 break;
13702 case AFL_EXT_LOONGSON_2F:
13703 fputs ("ST Microelectronics Loongson 2F", stdout);
13704 break;
13705 default:
13706 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13707 }
13708 }
13709
13710 static int
13711 get_mips_reg_size (int reg_size)
13712 {
13713 return (reg_size == AFL_REG_NONE) ? 0
13714 : (reg_size == AFL_REG_32) ? 32
13715 : (reg_size == AFL_REG_64) ? 64
13716 : (reg_size == AFL_REG_128) ? 128
13717 : -1;
13718 }
13719
13720 static int
13721 process_mips_specific (FILE * file)
13722 {
13723 Elf_Internal_Dyn * entry;
13724 Elf_Internal_Shdr *sect = NULL;
13725 size_t liblist_offset = 0;
13726 size_t liblistno = 0;
13727 size_t conflictsno = 0;
13728 size_t options_offset = 0;
13729 size_t conflicts_offset = 0;
13730 size_t pltrelsz = 0;
13731 size_t pltrel = 0;
13732 bfd_vma pltgot = 0;
13733 bfd_vma mips_pltgot = 0;
13734 bfd_vma jmprel = 0;
13735 bfd_vma local_gotno = 0;
13736 bfd_vma gotsym = 0;
13737 bfd_vma symtabno = 0;
13738
13739 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13740 display_mips_gnu_attribute);
13741
13742 sect = find_section (".MIPS.abiflags");
13743
13744 if (sect != NULL)
13745 {
13746 Elf_External_ABIFlags_v0 *abiflags_ext;
13747 Elf_Internal_ABIFlags_v0 abiflags_in;
13748
13749 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13750 fputs ("\nCorrupt ABI Flags section.\n", stdout);
13751 else
13752 {
13753 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13754 sect->sh_size, _("MIPS ABI Flags section"));
13755 if (abiflags_ext)
13756 {
13757 abiflags_in.version = BYTE_GET (abiflags_ext->version);
13758 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13759 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13760 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13761 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13762 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13763 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13764 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13765 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13766 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13767 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13768
13769 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13770 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13771 if (abiflags_in.isa_rev > 1)
13772 printf ("r%d", abiflags_in.isa_rev);
13773 printf ("\nGPR size: %d",
13774 get_mips_reg_size (abiflags_in.gpr_size));
13775 printf ("\nCPR1 size: %d",
13776 get_mips_reg_size (abiflags_in.cpr1_size));
13777 printf ("\nCPR2 size: %d",
13778 get_mips_reg_size (abiflags_in.cpr2_size));
13779 fputs ("\nFP ABI: ", stdout);
13780 print_mips_fp_abi_value (abiflags_in.fp_abi);
13781 fputs ("ISA Extension: ", stdout);
13782 print_mips_isa_ext (abiflags_in.isa_ext);
13783 fputs ("\nASEs:", stdout);
13784 print_mips_ases (abiflags_in.ases);
13785 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13786 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13787 fputc ('\n', stdout);
13788 free (abiflags_ext);
13789 }
13790 }
13791 }
13792
13793 /* We have a lot of special sections. Thanks SGI! */
13794 if (dynamic_section == NULL)
13795 /* No information available. */
13796 return 0;
13797
13798 for (entry = dynamic_section;
13799 /* PR 17531 file: 012-50589-0.004. */
13800 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13801 ++entry)
13802 switch (entry->d_tag)
13803 {
13804 case DT_MIPS_LIBLIST:
13805 liblist_offset
13806 = offset_from_vma (file, entry->d_un.d_val,
13807 liblistno * sizeof (Elf32_External_Lib));
13808 break;
13809 case DT_MIPS_LIBLISTNO:
13810 liblistno = entry->d_un.d_val;
13811 break;
13812 case DT_MIPS_OPTIONS:
13813 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13814 break;
13815 case DT_MIPS_CONFLICT:
13816 conflicts_offset
13817 = offset_from_vma (file, entry->d_un.d_val,
13818 conflictsno * sizeof (Elf32_External_Conflict));
13819 break;
13820 case DT_MIPS_CONFLICTNO:
13821 conflictsno = entry->d_un.d_val;
13822 break;
13823 case DT_PLTGOT:
13824 pltgot = entry->d_un.d_ptr;
13825 break;
13826 case DT_MIPS_LOCAL_GOTNO:
13827 local_gotno = entry->d_un.d_val;
13828 break;
13829 case DT_MIPS_GOTSYM:
13830 gotsym = entry->d_un.d_val;
13831 break;
13832 case DT_MIPS_SYMTABNO:
13833 symtabno = entry->d_un.d_val;
13834 break;
13835 case DT_MIPS_PLTGOT:
13836 mips_pltgot = entry->d_un.d_ptr;
13837 break;
13838 case DT_PLTREL:
13839 pltrel = entry->d_un.d_val;
13840 break;
13841 case DT_PLTRELSZ:
13842 pltrelsz = entry->d_un.d_val;
13843 break;
13844 case DT_JMPREL:
13845 jmprel = entry->d_un.d_ptr;
13846 break;
13847 default:
13848 break;
13849 }
13850
13851 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13852 {
13853 Elf32_External_Lib * elib;
13854 size_t cnt;
13855
13856 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13857 liblistno,
13858 sizeof (Elf32_External_Lib),
13859 _("liblist section data"));
13860 if (elib)
13861 {
13862 printf (_("\nSection '.liblist' contains %lu entries:\n"),
13863 (unsigned long) liblistno);
13864 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
13865 stdout);
13866
13867 for (cnt = 0; cnt < liblistno; ++cnt)
13868 {
13869 Elf32_Lib liblist;
13870 time_t atime;
13871 char timebuf[20];
13872 struct tm * tmp;
13873
13874 liblist.l_name = BYTE_GET (elib[cnt].l_name);
13875 atime = BYTE_GET (elib[cnt].l_time_stamp);
13876 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13877 liblist.l_version = BYTE_GET (elib[cnt].l_version);
13878 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13879
13880 tmp = gmtime (&atime);
13881 snprintf (timebuf, sizeof (timebuf),
13882 "%04u-%02u-%02uT%02u:%02u:%02u",
13883 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13884 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13885
13886 printf ("%3lu: ", (unsigned long) cnt);
13887 if (VALID_DYNAMIC_NAME (liblist.l_name))
13888 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13889 else
13890 printf (_("<corrupt: %9ld>"), liblist.l_name);
13891 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13892 liblist.l_version);
13893
13894 if (liblist.l_flags == 0)
13895 puts (_(" NONE"));
13896 else
13897 {
13898 static const struct
13899 {
13900 const char * name;
13901 int bit;
13902 }
13903 l_flags_vals[] =
13904 {
13905 { " EXACT_MATCH", LL_EXACT_MATCH },
13906 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13907 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13908 { " EXPORTS", LL_EXPORTS },
13909 { " DELAY_LOAD", LL_DELAY_LOAD },
13910 { " DELTA", LL_DELTA }
13911 };
13912 int flags = liblist.l_flags;
13913 size_t fcnt;
13914
13915 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13916 if ((flags & l_flags_vals[fcnt].bit) != 0)
13917 {
13918 fputs (l_flags_vals[fcnt].name, stdout);
13919 flags ^= l_flags_vals[fcnt].bit;
13920 }
13921 if (flags != 0)
13922 printf (" %#x", (unsigned int) flags);
13923
13924 puts ("");
13925 }
13926 }
13927
13928 free (elib);
13929 }
13930 }
13931
13932 if (options_offset != 0)
13933 {
13934 Elf_External_Options * eopt;
13935 Elf_Internal_Options * iopt;
13936 Elf_Internal_Options * option;
13937 size_t offset;
13938 int cnt;
13939 sect = section_headers;
13940
13941 /* Find the section header so that we get the size. */
13942 sect = find_section_by_type (SHT_MIPS_OPTIONS);
13943 /* PR 17533 file: 012-277276-0.004. */
13944 if (sect == NULL)
13945 {
13946 error (_("No MIPS_OPTIONS header found\n"));
13947 return 0;
13948 }
13949
13950 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13951 sect->sh_size, _("options"));
13952 if (eopt)
13953 {
13954 iopt = (Elf_Internal_Options *)
13955 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13956 if (iopt == NULL)
13957 {
13958 error (_("Out of memory allocatinf space for MIPS options\n"));
13959 return 0;
13960 }
13961
13962 offset = cnt = 0;
13963 option = iopt;
13964
13965 while (offset <= sect->sh_size - sizeof (* eopt))
13966 {
13967 Elf_External_Options * eoption;
13968
13969 eoption = (Elf_External_Options *) ((char *) eopt + offset);
13970
13971 option->kind = BYTE_GET (eoption->kind);
13972 option->size = BYTE_GET (eoption->size);
13973 option->section = BYTE_GET (eoption->section);
13974 option->info = BYTE_GET (eoption->info);
13975
13976 /* PR 17531: file: ffa0fa3b. */
13977 if (option->size < sizeof (* eopt)
13978 || offset + option->size > sect->sh_size)
13979 {
13980 error (_("Invalid size (%u) for MIPS option\n"), option->size);
13981 return 0;
13982 }
13983 offset += option->size;
13984
13985 ++option;
13986 ++cnt;
13987 }
13988
13989 printf (_("\nSection '%s' contains %d entries:\n"),
13990 printable_section_name (sect), cnt);
13991
13992 option = iopt;
13993 offset = 0;
13994
13995 while (cnt-- > 0)
13996 {
13997 size_t len;
13998
13999 switch (option->kind)
14000 {
14001 case ODK_NULL:
14002 /* This shouldn't happen. */
14003 printf (" NULL %d %lx", option->section, option->info);
14004 break;
14005 case ODK_REGINFO:
14006 printf (" REGINFO ");
14007 if (elf_header.e_machine == EM_MIPS)
14008 {
14009 /* 32bit form. */
14010 Elf32_External_RegInfo * ereg;
14011 Elf32_RegInfo reginfo;
14012
14013 ereg = (Elf32_External_RegInfo *) (option + 1);
14014 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14015 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14016 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14017 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14018 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14019 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14020
14021 printf ("GPR %08lx GP 0x%lx\n",
14022 reginfo.ri_gprmask,
14023 (unsigned long) reginfo.ri_gp_value);
14024 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14025 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14026 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14027 }
14028 else
14029 {
14030 /* 64 bit form. */
14031 Elf64_External_RegInfo * ereg;
14032 Elf64_Internal_RegInfo reginfo;
14033
14034 ereg = (Elf64_External_RegInfo *) (option + 1);
14035 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14036 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14037 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14038 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14039 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14040 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14041
14042 printf ("GPR %08lx GP 0x",
14043 reginfo.ri_gprmask);
14044 printf_vma (reginfo.ri_gp_value);
14045 printf ("\n");
14046
14047 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14048 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14049 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14050 }
14051 ++option;
14052 continue;
14053 case ODK_EXCEPTIONS:
14054 fputs (" EXCEPTIONS fpe_min(", stdout);
14055 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14056 fputs (") fpe_max(", stdout);
14057 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14058 fputs (")", stdout);
14059
14060 if (option->info & OEX_PAGE0)
14061 fputs (" PAGE0", stdout);
14062 if (option->info & OEX_SMM)
14063 fputs (" SMM", stdout);
14064 if (option->info & OEX_FPDBUG)
14065 fputs (" FPDBUG", stdout);
14066 if (option->info & OEX_DISMISS)
14067 fputs (" DISMISS", stdout);
14068 break;
14069 case ODK_PAD:
14070 fputs (" PAD ", stdout);
14071 if (option->info & OPAD_PREFIX)
14072 fputs (" PREFIX", stdout);
14073 if (option->info & OPAD_POSTFIX)
14074 fputs (" POSTFIX", stdout);
14075 if (option->info & OPAD_SYMBOL)
14076 fputs (" SYMBOL", stdout);
14077 break;
14078 case ODK_HWPATCH:
14079 fputs (" HWPATCH ", stdout);
14080 if (option->info & OHW_R4KEOP)
14081 fputs (" R4KEOP", stdout);
14082 if (option->info & OHW_R8KPFETCH)
14083 fputs (" R8KPFETCH", stdout);
14084 if (option->info & OHW_R5KEOP)
14085 fputs (" R5KEOP", stdout);
14086 if (option->info & OHW_R5KCVTL)
14087 fputs (" R5KCVTL", stdout);
14088 break;
14089 case ODK_FILL:
14090 fputs (" FILL ", stdout);
14091 /* XXX Print content of info word? */
14092 break;
14093 case ODK_TAGS:
14094 fputs (" TAGS ", stdout);
14095 /* XXX Print content of info word? */
14096 break;
14097 case ODK_HWAND:
14098 fputs (" HWAND ", stdout);
14099 if (option->info & OHWA0_R4KEOP_CHECKED)
14100 fputs (" R4KEOP_CHECKED", stdout);
14101 if (option->info & OHWA0_R4KEOP_CLEAN)
14102 fputs (" R4KEOP_CLEAN", stdout);
14103 break;
14104 case ODK_HWOR:
14105 fputs (" HWOR ", stdout);
14106 if (option->info & OHWA0_R4KEOP_CHECKED)
14107 fputs (" R4KEOP_CHECKED", stdout);
14108 if (option->info & OHWA0_R4KEOP_CLEAN)
14109 fputs (" R4KEOP_CLEAN", stdout);
14110 break;
14111 case ODK_GP_GROUP:
14112 printf (" GP_GROUP %#06lx self-contained %#06lx",
14113 option->info & OGP_GROUP,
14114 (option->info & OGP_SELF) >> 16);
14115 break;
14116 case ODK_IDENT:
14117 printf (" IDENT %#06lx self-contained %#06lx",
14118 option->info & OGP_GROUP,
14119 (option->info & OGP_SELF) >> 16);
14120 break;
14121 default:
14122 /* This shouldn't happen. */
14123 printf (" %3d ??? %d %lx",
14124 option->kind, option->section, option->info);
14125 break;
14126 }
14127
14128 len = sizeof (* eopt);
14129 while (len < option->size)
14130 {
14131 char datum = * ((char *) eopt + offset + len);
14132
14133 if (ISPRINT (datum))
14134 printf ("%c", datum);
14135 else
14136 printf ("\\%03o", datum);
14137 len ++;
14138 }
14139 fputs ("\n", stdout);
14140
14141 offset += option->size;
14142 ++option;
14143 }
14144
14145 free (eopt);
14146 }
14147 }
14148
14149 if (conflicts_offset != 0 && conflictsno != 0)
14150 {
14151 Elf32_Conflict * iconf;
14152 size_t cnt;
14153
14154 if (dynamic_symbols == NULL)
14155 {
14156 error (_("conflict list found without a dynamic symbol table\n"));
14157 return 0;
14158 }
14159
14160 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14161 if (iconf == NULL)
14162 {
14163 error (_("Out of memory allocating space for dynamic conflicts\n"));
14164 return 0;
14165 }
14166
14167 if (is_32bit_elf)
14168 {
14169 Elf32_External_Conflict * econf32;
14170
14171 econf32 = (Elf32_External_Conflict *)
14172 get_data (NULL, file, conflicts_offset, conflictsno,
14173 sizeof (* econf32), _("conflict"));
14174 if (!econf32)
14175 return 0;
14176
14177 for (cnt = 0; cnt < conflictsno; ++cnt)
14178 iconf[cnt] = BYTE_GET (econf32[cnt]);
14179
14180 free (econf32);
14181 }
14182 else
14183 {
14184 Elf64_External_Conflict * econf64;
14185
14186 econf64 = (Elf64_External_Conflict *)
14187 get_data (NULL, file, conflicts_offset, conflictsno,
14188 sizeof (* econf64), _("conflict"));
14189 if (!econf64)
14190 return 0;
14191
14192 for (cnt = 0; cnt < conflictsno; ++cnt)
14193 iconf[cnt] = BYTE_GET (econf64[cnt]);
14194
14195 free (econf64);
14196 }
14197
14198 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14199 (unsigned long) conflictsno);
14200 puts (_(" Num: Index Value Name"));
14201
14202 for (cnt = 0; cnt < conflictsno; ++cnt)
14203 {
14204 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14205
14206 if (iconf[cnt] >= num_dynamic_syms)
14207 printf (_("<corrupt symbol index>"));
14208 else
14209 {
14210 Elf_Internal_Sym * psym;
14211
14212 psym = & dynamic_symbols[iconf[cnt]];
14213 print_vma (psym->st_value, FULL_HEX);
14214 putchar (' ');
14215 if (VALID_DYNAMIC_NAME (psym->st_name))
14216 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14217 else
14218 printf (_("<corrupt: %14ld>"), psym->st_name);
14219 }
14220 putchar ('\n');
14221 }
14222
14223 free (iconf);
14224 }
14225
14226 if (pltgot != 0 && local_gotno != 0)
14227 {
14228 bfd_vma ent, local_end, global_end;
14229 size_t i, offset;
14230 unsigned char * data;
14231 unsigned char * data_end;
14232 int addr_size;
14233
14234 ent = pltgot;
14235 addr_size = (is_32bit_elf ? 4 : 8);
14236 local_end = pltgot + local_gotno * addr_size;
14237
14238 /* PR binutils/17533 file: 012-111227-0.004 */
14239 if (symtabno < gotsym)
14240 {
14241 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14242 (unsigned long) gotsym, (unsigned long) symtabno);
14243 return 0;
14244 }
14245
14246 global_end = local_end + (symtabno - gotsym) * addr_size;
14247 /* PR 17531: file: 54c91a34. */
14248 if (global_end < local_end)
14249 {
14250 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14251 return 0;
14252 }
14253
14254 offset = offset_from_vma (file, pltgot, global_end - pltgot);
14255 data = (unsigned char *) get_data (NULL, file, offset,
14256 global_end - pltgot, 1,
14257 _("Global Offset Table data"));
14258 if (data == NULL)
14259 return 0;
14260 data_end = data + (global_end - pltgot);
14261
14262 printf (_("\nPrimary GOT:\n"));
14263 printf (_(" Canonical gp value: "));
14264 print_vma (pltgot + 0x7ff0, LONG_HEX);
14265 printf ("\n\n");
14266
14267 printf (_(" Reserved entries:\n"));
14268 printf (_(" %*s %10s %*s Purpose\n"),
14269 addr_size * 2, _("Address"), _("Access"),
14270 addr_size * 2, _("Initial"));
14271 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14272 printf (_(" Lazy resolver\n"));
14273 if (ent == (bfd_vma) -1)
14274 goto got_print_fail;
14275 if (data
14276 && (byte_get (data + ent - pltgot, addr_size)
14277 >> (addr_size * 8 - 1)) != 0)
14278 {
14279 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14280 printf (_(" Module pointer (GNU extension)\n"));
14281 if (ent == (bfd_vma) -1)
14282 goto got_print_fail;
14283 }
14284 printf ("\n");
14285
14286 if (ent < local_end)
14287 {
14288 printf (_(" Local entries:\n"));
14289 printf (" %*s %10s %*s\n",
14290 addr_size * 2, _("Address"), _("Access"),
14291 addr_size * 2, _("Initial"));
14292 while (ent < local_end)
14293 {
14294 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14295 printf ("\n");
14296 if (ent == (bfd_vma) -1)
14297 goto got_print_fail;
14298 }
14299 printf ("\n");
14300 }
14301
14302 if (gotsym < symtabno)
14303 {
14304 int sym_width;
14305
14306 printf (_(" Global entries:\n"));
14307 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
14308 addr_size * 2, _("Address"),
14309 _("Access"),
14310 addr_size * 2, _("Initial"),
14311 addr_size * 2, _("Sym.Val."),
14312 _("Type"),
14313 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14314 _("Ndx"), _("Name"));
14315
14316 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14317
14318 for (i = gotsym; i < symtabno; i++)
14319 {
14320 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14321 printf (" ");
14322
14323 if (dynamic_symbols == NULL)
14324 printf (_("<no dynamic symbols>"));
14325 else if (i < num_dynamic_syms)
14326 {
14327 Elf_Internal_Sym * psym = dynamic_symbols + i;
14328
14329 print_vma (psym->st_value, LONG_HEX);
14330 printf (" %-7s %3s ",
14331 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14332 get_symbol_index_type (psym->st_shndx));
14333
14334 if (VALID_DYNAMIC_NAME (psym->st_name))
14335 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14336 else
14337 printf (_("<corrupt: %14ld>"), psym->st_name);
14338 }
14339 else
14340 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14341 (unsigned long) i);
14342
14343 printf ("\n");
14344 if (ent == (bfd_vma) -1)
14345 break;
14346 }
14347 printf ("\n");
14348 }
14349
14350 got_print_fail:
14351 if (data)
14352 free (data);
14353 }
14354
14355 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14356 {
14357 bfd_vma ent, end;
14358 size_t offset, rel_offset;
14359 unsigned long count, i;
14360 unsigned char * data;
14361 int addr_size, sym_width;
14362 Elf_Internal_Rela * rels;
14363
14364 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14365 if (pltrel == DT_RELA)
14366 {
14367 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14368 return 0;
14369 }
14370 else
14371 {
14372 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14373 return 0;
14374 }
14375
14376 ent = mips_pltgot;
14377 addr_size = (is_32bit_elf ? 4 : 8);
14378 end = mips_pltgot + (2 + count) * addr_size;
14379
14380 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14381 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14382 1, _("Procedure Linkage Table data"));
14383 if (data == NULL)
14384 return 0;
14385
14386 printf ("\nPLT GOT:\n\n");
14387 printf (_(" Reserved entries:\n"));
14388 printf (_(" %*s %*s Purpose\n"),
14389 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14390 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14391 printf (_(" PLT lazy resolver\n"));
14392 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14393 printf (_(" Module pointer\n"));
14394 printf ("\n");
14395
14396 printf (_(" Entries:\n"));
14397 printf (" %*s %*s %*s %-7s %3s %s\n",
14398 addr_size * 2, _("Address"),
14399 addr_size * 2, _("Initial"),
14400 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14401 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14402 for (i = 0; i < count; i++)
14403 {
14404 unsigned long idx = get_reloc_symindex (rels[i].r_info);
14405
14406 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14407 printf (" ");
14408
14409 if (idx >= num_dynamic_syms)
14410 printf (_("<corrupt symbol index: %lu>"), idx);
14411 else
14412 {
14413 Elf_Internal_Sym * psym = dynamic_symbols + idx;
14414
14415 print_vma (psym->st_value, LONG_HEX);
14416 printf (" %-7s %3s ",
14417 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14418 get_symbol_index_type (psym->st_shndx));
14419 if (VALID_DYNAMIC_NAME (psym->st_name))
14420 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14421 else
14422 printf (_("<corrupt: %14ld>"), psym->st_name);
14423 }
14424 printf ("\n");
14425 }
14426 printf ("\n");
14427
14428 if (data)
14429 free (data);
14430 free (rels);
14431 }
14432
14433 return 1;
14434 }
14435
14436 static int
14437 process_nds32_specific (FILE * file)
14438 {
14439 Elf_Internal_Shdr *sect = NULL;
14440
14441 sect = find_section (".nds32_e_flags");
14442 if (sect != NULL)
14443 {
14444 unsigned int *flag;
14445
14446 printf ("\nNDS32 elf flags section:\n");
14447 flag = get_data (NULL, file, sect->sh_offset, 1,
14448 sect->sh_size, _("NDS32 elf flags section"));
14449
14450 switch ((*flag) & 0x3)
14451 {
14452 case 0:
14453 printf ("(VEC_SIZE):\tNo entry.\n");
14454 break;
14455 case 1:
14456 printf ("(VEC_SIZE):\t4 bytes\n");
14457 break;
14458 case 2:
14459 printf ("(VEC_SIZE):\t16 bytes\n");
14460 break;
14461 case 3:
14462 printf ("(VEC_SIZE):\treserved\n");
14463 break;
14464 }
14465 }
14466
14467 return TRUE;
14468 }
14469
14470 static int
14471 process_gnu_liblist (FILE * file)
14472 {
14473 Elf_Internal_Shdr * section;
14474 Elf_Internal_Shdr * string_sec;
14475 Elf32_External_Lib * elib;
14476 char * strtab;
14477 size_t strtab_size;
14478 size_t cnt;
14479 unsigned i;
14480
14481 if (! do_arch)
14482 return 0;
14483
14484 for (i = 0, section = section_headers;
14485 i < elf_header.e_shnum;
14486 i++, section++)
14487 {
14488 switch (section->sh_type)
14489 {
14490 case SHT_GNU_LIBLIST:
14491 if (section->sh_link >= elf_header.e_shnum)
14492 break;
14493
14494 elib = (Elf32_External_Lib *)
14495 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14496 _("liblist section data"));
14497
14498 if (elib == NULL)
14499 break;
14500 string_sec = section_headers + section->sh_link;
14501
14502 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14503 string_sec->sh_size,
14504 _("liblist string table"));
14505 if (strtab == NULL
14506 || section->sh_entsize != sizeof (Elf32_External_Lib))
14507 {
14508 free (elib);
14509 free (strtab);
14510 break;
14511 }
14512 strtab_size = string_sec->sh_size;
14513
14514 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14515 printable_section_name (section),
14516 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14517
14518 puts (_(" Library Time Stamp Checksum Version Flags"));
14519
14520 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14521 ++cnt)
14522 {
14523 Elf32_Lib liblist;
14524 time_t atime;
14525 char timebuf[20];
14526 struct tm * tmp;
14527
14528 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14529 atime = BYTE_GET (elib[cnt].l_time_stamp);
14530 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14531 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14532 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14533
14534 tmp = gmtime (&atime);
14535 snprintf (timebuf, sizeof (timebuf),
14536 "%04u-%02u-%02uT%02u:%02u:%02u",
14537 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14538 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14539
14540 printf ("%3lu: ", (unsigned long) cnt);
14541 if (do_wide)
14542 printf ("%-20s", liblist.l_name < strtab_size
14543 ? strtab + liblist.l_name : _("<corrupt>"));
14544 else
14545 printf ("%-20.20s", liblist.l_name < strtab_size
14546 ? strtab + liblist.l_name : _("<corrupt>"));
14547 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14548 liblist.l_version, liblist.l_flags);
14549 }
14550
14551 free (elib);
14552 free (strtab);
14553 }
14554 }
14555
14556 return 1;
14557 }
14558
14559 static const char *
14560 get_note_type (unsigned e_type)
14561 {
14562 static char buff[64];
14563
14564 if (elf_header.e_type == ET_CORE)
14565 switch (e_type)
14566 {
14567 case NT_AUXV:
14568 return _("NT_AUXV (auxiliary vector)");
14569 case NT_PRSTATUS:
14570 return _("NT_PRSTATUS (prstatus structure)");
14571 case NT_FPREGSET:
14572 return _("NT_FPREGSET (floating point registers)");
14573 case NT_PRPSINFO:
14574 return _("NT_PRPSINFO (prpsinfo structure)");
14575 case NT_TASKSTRUCT:
14576 return _("NT_TASKSTRUCT (task structure)");
14577 case NT_PRXFPREG:
14578 return _("NT_PRXFPREG (user_xfpregs structure)");
14579 case NT_PPC_VMX:
14580 return _("NT_PPC_VMX (ppc Altivec registers)");
14581 case NT_PPC_VSX:
14582 return _("NT_PPC_VSX (ppc VSX registers)");
14583 case NT_386_TLS:
14584 return _("NT_386_TLS (x86 TLS information)");
14585 case NT_386_IOPERM:
14586 return _("NT_386_IOPERM (x86 I/O permissions)");
14587 case NT_X86_XSTATE:
14588 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14589 case NT_S390_HIGH_GPRS:
14590 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14591 case NT_S390_TIMER:
14592 return _("NT_S390_TIMER (s390 timer register)");
14593 case NT_S390_TODCMP:
14594 return _("NT_S390_TODCMP (s390 TOD comparator register)");
14595 case NT_S390_TODPREG:
14596 return _("NT_S390_TODPREG (s390 TOD programmable register)");
14597 case NT_S390_CTRS:
14598 return _("NT_S390_CTRS (s390 control registers)");
14599 case NT_S390_PREFIX:
14600 return _("NT_S390_PREFIX (s390 prefix register)");
14601 case NT_S390_LAST_BREAK:
14602 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14603 case NT_S390_SYSTEM_CALL:
14604 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14605 case NT_S390_TDB:
14606 return _("NT_S390_TDB (s390 transaction diagnostic block)");
14607 case NT_S390_VXRS_LOW:
14608 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
14609 case NT_S390_VXRS_HIGH:
14610 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
14611 case NT_ARM_VFP:
14612 return _("NT_ARM_VFP (arm VFP registers)");
14613 case NT_ARM_TLS:
14614 return _("NT_ARM_TLS (AArch TLS registers)");
14615 case NT_ARM_HW_BREAK:
14616 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14617 case NT_ARM_HW_WATCH:
14618 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14619 case NT_PSTATUS:
14620 return _("NT_PSTATUS (pstatus structure)");
14621 case NT_FPREGS:
14622 return _("NT_FPREGS (floating point registers)");
14623 case NT_PSINFO:
14624 return _("NT_PSINFO (psinfo structure)");
14625 case NT_LWPSTATUS:
14626 return _("NT_LWPSTATUS (lwpstatus_t structure)");
14627 case NT_LWPSINFO:
14628 return _("NT_LWPSINFO (lwpsinfo_t structure)");
14629 case NT_WIN32PSTATUS:
14630 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14631 case NT_SIGINFO:
14632 return _("NT_SIGINFO (siginfo_t data)");
14633 case NT_FILE:
14634 return _("NT_FILE (mapped files)");
14635 default:
14636 break;
14637 }
14638 else
14639 switch (e_type)
14640 {
14641 case NT_VERSION:
14642 return _("NT_VERSION (version)");
14643 case NT_ARCH:
14644 return _("NT_ARCH (architecture)");
14645 default:
14646 break;
14647 }
14648
14649 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14650 return buff;
14651 }
14652
14653 static int
14654 print_core_note (Elf_Internal_Note *pnote)
14655 {
14656 unsigned int addr_size = is_32bit_elf ? 4 : 8;
14657 bfd_vma count, page_size;
14658 unsigned char *descdata, *filenames, *descend;
14659
14660 if (pnote->type != NT_FILE)
14661 return 1;
14662
14663 #ifndef BFD64
14664 if (!is_32bit_elf)
14665 {
14666 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
14667 /* Still "successful". */
14668 return 1;
14669 }
14670 #endif
14671
14672 if (pnote->descsz < 2 * addr_size)
14673 {
14674 printf (_(" Malformed note - too short for header\n"));
14675 return 0;
14676 }
14677
14678 descdata = (unsigned char *) pnote->descdata;
14679 descend = descdata + pnote->descsz;
14680
14681 if (descdata[pnote->descsz - 1] != '\0')
14682 {
14683 printf (_(" Malformed note - does not end with \\0\n"));
14684 return 0;
14685 }
14686
14687 count = byte_get (descdata, addr_size);
14688 descdata += addr_size;
14689
14690 page_size = byte_get (descdata, addr_size);
14691 descdata += addr_size;
14692
14693 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14694 {
14695 printf (_(" Malformed note - too short for supplied file count\n"));
14696 return 0;
14697 }
14698
14699 printf (_(" Page size: "));
14700 print_vma (page_size, DEC);
14701 printf ("\n");
14702
14703 printf (_(" %*s%*s%*s\n"),
14704 (int) (2 + 2 * addr_size), _("Start"),
14705 (int) (4 + 2 * addr_size), _("End"),
14706 (int) (4 + 2 * addr_size), _("Page Offset"));
14707 filenames = descdata + count * 3 * addr_size;
14708 while (--count > 0)
14709 {
14710 bfd_vma start, end, file_ofs;
14711
14712 if (filenames == descend)
14713 {
14714 printf (_(" Malformed note - filenames end too early\n"));
14715 return 0;
14716 }
14717
14718 start = byte_get (descdata, addr_size);
14719 descdata += addr_size;
14720 end = byte_get (descdata, addr_size);
14721 descdata += addr_size;
14722 file_ofs = byte_get (descdata, addr_size);
14723 descdata += addr_size;
14724
14725 printf (" ");
14726 print_vma (start, FULL_HEX);
14727 printf (" ");
14728 print_vma (end, FULL_HEX);
14729 printf (" ");
14730 print_vma (file_ofs, FULL_HEX);
14731 printf ("\n %s\n", filenames);
14732
14733 filenames += 1 + strlen ((char *) filenames);
14734 }
14735
14736 return 1;
14737 }
14738
14739 static const char *
14740 get_gnu_elf_note_type (unsigned e_type)
14741 {
14742 static char buff[64];
14743
14744 switch (e_type)
14745 {
14746 case NT_GNU_ABI_TAG:
14747 return _("NT_GNU_ABI_TAG (ABI version tag)");
14748 case NT_GNU_HWCAP:
14749 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14750 case NT_GNU_BUILD_ID:
14751 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14752 case NT_GNU_GOLD_VERSION:
14753 return _("NT_GNU_GOLD_VERSION (gold version)");
14754 default:
14755 break;
14756 }
14757
14758 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14759 return buff;
14760 }
14761
14762 static int
14763 print_gnu_note (Elf_Internal_Note *pnote)
14764 {
14765 switch (pnote->type)
14766 {
14767 case NT_GNU_BUILD_ID:
14768 {
14769 unsigned long i;
14770
14771 printf (_(" Build ID: "));
14772 for (i = 0; i < pnote->descsz; ++i)
14773 printf ("%02x", pnote->descdata[i] & 0xff);
14774 printf ("\n");
14775 }
14776 break;
14777
14778 case NT_GNU_ABI_TAG:
14779 {
14780 unsigned long os, major, minor, subminor;
14781 const char *osname;
14782
14783 /* PR 17531: file: 030-599401-0.004. */
14784 if (pnote->descsz < 16)
14785 {
14786 printf (_(" <corrupt GNU_ABI_TAG>\n"));
14787 break;
14788 }
14789
14790 os = byte_get ((unsigned char *) pnote->descdata, 4);
14791 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14792 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14793 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14794
14795 switch (os)
14796 {
14797 case GNU_ABI_TAG_LINUX:
14798 osname = "Linux";
14799 break;
14800 case GNU_ABI_TAG_HURD:
14801 osname = "Hurd";
14802 break;
14803 case GNU_ABI_TAG_SOLARIS:
14804 osname = "Solaris";
14805 break;
14806 case GNU_ABI_TAG_FREEBSD:
14807 osname = "FreeBSD";
14808 break;
14809 case GNU_ABI_TAG_NETBSD:
14810 osname = "NetBSD";
14811 break;
14812 default:
14813 osname = "Unknown";
14814 break;
14815 }
14816
14817 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14818 major, minor, subminor);
14819 }
14820 break;
14821
14822 case NT_GNU_GOLD_VERSION:
14823 {
14824 unsigned long i;
14825
14826 printf (_(" Version: "));
14827 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14828 printf ("%c", pnote->descdata[i]);
14829 printf ("\n");
14830 }
14831 break;
14832 }
14833
14834 return 1;
14835 }
14836
14837 static const char *
14838 get_v850_elf_note_type (enum v850_notes n_type)
14839 {
14840 static char buff[64];
14841
14842 switch (n_type)
14843 {
14844 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
14845 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
14846 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
14847 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
14848 case V850_NOTE_CACHE_INFO: return _("Use of cache");
14849 case V850_NOTE_MMU_INFO: return _("Use of MMU");
14850 default:
14851 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
14852 return buff;
14853 }
14854 }
14855
14856 static int
14857 print_v850_note (Elf_Internal_Note * pnote)
14858 {
14859 unsigned int val;
14860
14861 if (pnote->descsz != 4)
14862 return 0;
14863 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
14864
14865 if (val == 0)
14866 {
14867 printf (_("not set\n"));
14868 return 1;
14869 }
14870
14871 switch (pnote->type)
14872 {
14873 case V850_NOTE_ALIGNMENT:
14874 switch (val)
14875 {
14876 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
14877 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
14878 }
14879 break;
14880
14881 case V850_NOTE_DATA_SIZE:
14882 switch (val)
14883 {
14884 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
14885 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
14886 }
14887 break;
14888
14889 case V850_NOTE_FPU_INFO:
14890 switch (val)
14891 {
14892 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
14893 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
14894 }
14895 break;
14896
14897 case V850_NOTE_MMU_INFO:
14898 case V850_NOTE_CACHE_INFO:
14899 case V850_NOTE_SIMD_INFO:
14900 if (val == EF_RH850_SIMD)
14901 {
14902 printf (_("yes\n"));
14903 return 1;
14904 }
14905 break;
14906
14907 default:
14908 /* An 'unknown note type' message will already have been displayed. */
14909 break;
14910 }
14911
14912 printf (_("unknown value: %x\n"), val);
14913 return 0;
14914 }
14915
14916 static const char *
14917 get_netbsd_elfcore_note_type (unsigned e_type)
14918 {
14919 static char buff[64];
14920
14921 if (e_type == NT_NETBSDCORE_PROCINFO)
14922 {
14923 /* NetBSD core "procinfo" structure. */
14924 return _("NetBSD procinfo structure");
14925 }
14926
14927 /* As of Jan 2002 there are no other machine-independent notes
14928 defined for NetBSD core files. If the note type is less
14929 than the start of the machine-dependent note types, we don't
14930 understand it. */
14931
14932 if (e_type < NT_NETBSDCORE_FIRSTMACH)
14933 {
14934 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14935 return buff;
14936 }
14937
14938 switch (elf_header.e_machine)
14939 {
14940 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14941 and PT_GETFPREGS == mach+2. */
14942
14943 case EM_OLD_ALPHA:
14944 case EM_ALPHA:
14945 case EM_SPARC:
14946 case EM_SPARC32PLUS:
14947 case EM_SPARCV9:
14948 switch (e_type)
14949 {
14950 case NT_NETBSDCORE_FIRSTMACH + 0:
14951 return _("PT_GETREGS (reg structure)");
14952 case NT_NETBSDCORE_FIRSTMACH + 2:
14953 return _("PT_GETFPREGS (fpreg structure)");
14954 default:
14955 break;
14956 }
14957 break;
14958
14959 /* On all other arch's, PT_GETREGS == mach+1 and
14960 PT_GETFPREGS == mach+3. */
14961 default:
14962 switch (e_type)
14963 {
14964 case NT_NETBSDCORE_FIRSTMACH + 1:
14965 return _("PT_GETREGS (reg structure)");
14966 case NT_NETBSDCORE_FIRSTMACH + 3:
14967 return _("PT_GETFPREGS (fpreg structure)");
14968 default:
14969 break;
14970 }
14971 }
14972
14973 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14974 e_type - NT_NETBSDCORE_FIRSTMACH);
14975 return buff;
14976 }
14977
14978 static const char *
14979 get_stapsdt_note_type (unsigned e_type)
14980 {
14981 static char buff[64];
14982
14983 switch (e_type)
14984 {
14985 case NT_STAPSDT:
14986 return _("NT_STAPSDT (SystemTap probe descriptors)");
14987
14988 default:
14989 break;
14990 }
14991
14992 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14993 return buff;
14994 }
14995
14996 static int
14997 print_stapsdt_note (Elf_Internal_Note *pnote)
14998 {
14999 int addr_size = is_32bit_elf ? 4 : 8;
15000 char *data = pnote->descdata;
15001 char *data_end = pnote->descdata + pnote->descsz;
15002 bfd_vma pc, base_addr, semaphore;
15003 char *provider, *probe, *arg_fmt;
15004
15005 pc = byte_get ((unsigned char *) data, addr_size);
15006 data += addr_size;
15007 base_addr = byte_get ((unsigned char *) data, addr_size);
15008 data += addr_size;
15009 semaphore = byte_get ((unsigned char *) data, addr_size);
15010 data += addr_size;
15011
15012 provider = data;
15013 data += strlen (data) + 1;
15014 probe = data;
15015 data += strlen (data) + 1;
15016 arg_fmt = data;
15017 data += strlen (data) + 1;
15018
15019 printf (_(" Provider: %s\n"), provider);
15020 printf (_(" Name: %s\n"), probe);
15021 printf (_(" Location: "));
15022 print_vma (pc, FULL_HEX);
15023 printf (_(", Base: "));
15024 print_vma (base_addr, FULL_HEX);
15025 printf (_(", Semaphore: "));
15026 print_vma (semaphore, FULL_HEX);
15027 printf ("\n");
15028 printf (_(" Arguments: %s\n"), arg_fmt);
15029
15030 return data == data_end;
15031 }
15032
15033 static const char *
15034 get_ia64_vms_note_type (unsigned e_type)
15035 {
15036 static char buff[64];
15037
15038 switch (e_type)
15039 {
15040 case NT_VMS_MHD:
15041 return _("NT_VMS_MHD (module header)");
15042 case NT_VMS_LNM:
15043 return _("NT_VMS_LNM (language name)");
15044 case NT_VMS_SRC:
15045 return _("NT_VMS_SRC (source files)");
15046 case NT_VMS_TITLE:
15047 return "NT_VMS_TITLE";
15048 case NT_VMS_EIDC:
15049 return _("NT_VMS_EIDC (consistency check)");
15050 case NT_VMS_FPMODE:
15051 return _("NT_VMS_FPMODE (FP mode)");
15052 case NT_VMS_LINKTIME:
15053 return "NT_VMS_LINKTIME";
15054 case NT_VMS_IMGNAM:
15055 return _("NT_VMS_IMGNAM (image name)");
15056 case NT_VMS_IMGID:
15057 return _("NT_VMS_IMGID (image id)");
15058 case NT_VMS_LINKID:
15059 return _("NT_VMS_LINKID (link id)");
15060 case NT_VMS_IMGBID:
15061 return _("NT_VMS_IMGBID (build id)");
15062 case NT_VMS_GSTNAM:
15063 return _("NT_VMS_GSTNAM (sym table name)");
15064 case NT_VMS_ORIG_DYN:
15065 return "NT_VMS_ORIG_DYN";
15066 case NT_VMS_PATCHTIME:
15067 return "NT_VMS_PATCHTIME";
15068 default:
15069 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15070 return buff;
15071 }
15072 }
15073
15074 static int
15075 print_ia64_vms_note (Elf_Internal_Note * pnote)
15076 {
15077 switch (pnote->type)
15078 {
15079 case NT_VMS_MHD:
15080 if (pnote->descsz > 36)
15081 {
15082 size_t l = strlen (pnote->descdata + 34);
15083 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15084 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15085 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15086 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15087 }
15088 else
15089 printf (_(" Invalid size\n"));
15090 break;
15091 case NT_VMS_LNM:
15092 printf (_(" Language: %s\n"), pnote->descdata);
15093 break;
15094 #ifdef BFD64
15095 case NT_VMS_FPMODE:
15096 printf (_(" Floating Point mode: "));
15097 printf ("0x%016" BFD_VMA_FMT "x\n",
15098 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15099 break;
15100 case NT_VMS_LINKTIME:
15101 printf (_(" Link time: "));
15102 print_vms_time
15103 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15104 printf ("\n");
15105 break;
15106 case NT_VMS_PATCHTIME:
15107 printf (_(" Patch time: "));
15108 print_vms_time
15109 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15110 printf ("\n");
15111 break;
15112 case NT_VMS_ORIG_DYN:
15113 printf (_(" Major id: %u, minor id: %u\n"),
15114 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15115 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15116 printf (_(" Last modified : "));
15117 print_vms_time
15118 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15119 printf (_("\n Link flags : "));
15120 printf ("0x%016" BFD_VMA_FMT "x\n",
15121 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15122 printf (_(" Header flags: 0x%08x\n"),
15123 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15124 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15125 break;
15126 #endif
15127 case NT_VMS_IMGNAM:
15128 printf (_(" Image name: %s\n"), pnote->descdata);
15129 break;
15130 case NT_VMS_GSTNAM:
15131 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15132 break;
15133 case NT_VMS_IMGID:
15134 printf (_(" Image id: %s\n"), pnote->descdata);
15135 break;
15136 case NT_VMS_LINKID:
15137 printf (_(" Linker id: %s\n"), pnote->descdata);
15138 break;
15139 default:
15140 break;
15141 }
15142 return 1;
15143 }
15144
15145 /* Note that by the ELF standard, the name field is already null byte
15146 terminated, and namesz includes the terminating null byte.
15147 I.E. the value of namesz for the name "FSF" is 4.
15148
15149 If the value of namesz is zero, there is no name present. */
15150 static int
15151 process_note (Elf_Internal_Note * pnote)
15152 {
15153 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15154 const char * nt;
15155
15156 if (pnote->namesz == 0)
15157 /* If there is no note name, then use the default set of
15158 note type strings. */
15159 nt = get_note_type (pnote->type);
15160
15161 else if (const_strneq (pnote->namedata, "GNU"))
15162 /* GNU-specific object file notes. */
15163 nt = get_gnu_elf_note_type (pnote->type);
15164
15165 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15166 /* NetBSD-specific core file notes. */
15167 nt = get_netbsd_elfcore_note_type (pnote->type);
15168
15169 else if (strneq (pnote->namedata, "SPU/", 4))
15170 {
15171 /* SPU-specific core file notes. */
15172 nt = pnote->namedata + 4;
15173 name = "SPU";
15174 }
15175
15176 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15177 /* VMS/ia64-specific file notes. */
15178 nt = get_ia64_vms_note_type (pnote->type);
15179
15180 else if (const_strneq (pnote->namedata, "stapsdt"))
15181 nt = get_stapsdt_note_type (pnote->type);
15182
15183 else
15184 /* Don't recognize this note name; just use the default set of
15185 note type strings. */
15186 nt = get_note_type (pnote->type);
15187
15188 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15189
15190 if (const_strneq (pnote->namedata, "IPF/VMS"))
15191 return print_ia64_vms_note (pnote);
15192 else if (const_strneq (pnote->namedata, "GNU"))
15193 return print_gnu_note (pnote);
15194 else if (const_strneq (pnote->namedata, "stapsdt"))
15195 return print_stapsdt_note (pnote);
15196 else if (const_strneq (pnote->namedata, "CORE"))
15197 return print_core_note (pnote);
15198 else
15199 return 1;
15200 }
15201
15202
15203 static int
15204 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15205 {
15206 Elf_External_Note * pnotes;
15207 Elf_External_Note * external;
15208 int res = 1;
15209
15210 if (length <= 0)
15211 return 0;
15212
15213 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15214 _("notes"));
15215 if (pnotes == NULL)
15216 return 0;
15217
15218 external = pnotes;
15219
15220 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15221 (unsigned long) offset, (unsigned long) length);
15222 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15223
15224 while ((char *) external < (char *) pnotes + length)
15225 {
15226 Elf_Internal_Note inote;
15227 size_t min_notesz;
15228 char *next;
15229 char * temp = NULL;
15230 size_t data_remaining = ((char *) pnotes + length) - (char *) external;
15231
15232 if (!is_ia64_vms ())
15233 {
15234 /* PR binutils/15191
15235 Make sure that there is enough data to read. */
15236 min_notesz = offsetof (Elf_External_Note, name);
15237 if (data_remaining < min_notesz)
15238 {
15239 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15240 (int) data_remaining);
15241 break;
15242 }
15243 inote.type = BYTE_GET (external->type);
15244 inote.namesz = BYTE_GET (external->namesz);
15245 inote.namedata = external->name;
15246 inote.descsz = BYTE_GET (external->descsz);
15247 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15248 /* PR 17531: file: 3443835e. */
15249 if (inote.descdata < (char *) pnotes)
15250 {
15251 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15252 inote.descdata = inote.namedata;
15253 inote.namesz = 0;
15254 }
15255 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15256 next = inote.descdata + align_power (inote.descsz, 2);
15257 }
15258 else
15259 {
15260 Elf64_External_VMS_Note *vms_external;
15261
15262 /* PR binutils/15191
15263 Make sure that there is enough data to read. */
15264 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15265 if (data_remaining < min_notesz)
15266 {
15267 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15268 (int) data_remaining);
15269 break;
15270 }
15271
15272 vms_external = (Elf64_External_VMS_Note *) external;
15273 inote.type = BYTE_GET (vms_external->type);
15274 inote.namesz = BYTE_GET (vms_external->namesz);
15275 inote.namedata = vms_external->name;
15276 inote.descsz = BYTE_GET (vms_external->descsz);
15277 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15278 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15279 next = inote.descdata + align_power (inote.descsz, 3);
15280 }
15281
15282 if (inote.descdata < (char *) external + min_notesz
15283 || next < (char *) external + min_notesz
15284 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15285 || inote.namedata + inote.namesz < inote.namedata
15286 || inote.descdata + inote.descsz < inote.descdata
15287 || data_remaining < (size_t)(next - (char *) external))
15288 {
15289 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15290 (unsigned long) ((char *) external - (char *) pnotes));
15291 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15292 inote.type, inote.namesz, inote.descsz);
15293 break;
15294 }
15295
15296 external = (Elf_External_Note *) next;
15297
15298 /* Verify that name is null terminated. It appears that at least
15299 one version of Linux (RedHat 6.0) generates corefiles that don't
15300 comply with the ELF spec by failing to include the null byte in
15301 namesz. */
15302 if (inote.namedata[inote.namesz - 1] != '\0')
15303 {
15304 temp = (char *) malloc (inote.namesz + 1);
15305 if (temp == NULL)
15306 {
15307 error (_("Out of memory allocating space for inote name\n"));
15308 res = 0;
15309 break;
15310 }
15311
15312 strncpy (temp, inote.namedata, inote.namesz);
15313 temp[inote.namesz] = 0;
15314
15315 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15316 inote.namedata = temp;
15317 }
15318
15319 res &= process_note (& inote);
15320
15321 if (temp != NULL)
15322 {
15323 free (temp);
15324 temp = NULL;
15325 }
15326 }
15327
15328 free (pnotes);
15329
15330 return res;
15331 }
15332
15333 static int
15334 process_corefile_note_segments (FILE * file)
15335 {
15336 Elf_Internal_Phdr * segment;
15337 unsigned int i;
15338 int res = 1;
15339
15340 if (! get_program_headers (file))
15341 return 0;
15342
15343 for (i = 0, segment = program_headers;
15344 i < elf_header.e_phnum;
15345 i++, segment++)
15346 {
15347 if (segment->p_type == PT_NOTE)
15348 res &= process_corefile_note_segment (file,
15349 (bfd_vma) segment->p_offset,
15350 (bfd_vma) segment->p_filesz);
15351 }
15352
15353 return res;
15354 }
15355
15356 static int
15357 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15358 {
15359 Elf_External_Note * pnotes;
15360 Elf_External_Note * external;
15361 int res = 1;
15362
15363 if (length <= 0)
15364 return 0;
15365
15366 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15367 _("v850 notes"));
15368 if (pnotes == NULL)
15369 return 0;
15370
15371 external = pnotes;
15372
15373 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15374 (unsigned long) offset, (unsigned long) length);
15375
15376 while (external < (Elf_External_Note *) ((char *) pnotes + length))
15377 {
15378 Elf_External_Note * next;
15379 Elf_Internal_Note inote;
15380
15381 inote.type = BYTE_GET (external->type);
15382 inote.namesz = BYTE_GET (external->namesz);
15383 inote.namedata = external->name;
15384 inote.descsz = BYTE_GET (external->descsz);
15385 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15386 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15387
15388 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15389
15390 if ( ((char *) next > ((char *) pnotes) + length)
15391 || ((char *) next < (char *) pnotes))
15392 {
15393 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15394 (unsigned long) ((char *) external - (char *) pnotes));
15395 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15396 inote.type, inote.namesz, inote.descsz);
15397 break;
15398 }
15399
15400 external = next;
15401
15402 /* Prevent out-of-bounds indexing. */
15403 if ( inote.namedata + inote.namesz > (char *) pnotes + length
15404 || inote.namedata + inote.namesz < inote.namedata)
15405 {
15406 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15407 (unsigned long) ((char *) external - (char *) pnotes));
15408 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15409 inote.type, inote.namesz, inote.descsz);
15410 break;
15411 }
15412
15413 printf (" %s: ", get_v850_elf_note_type (inote.type));
15414
15415 if (! print_v850_note (& inote))
15416 {
15417 res = 0;
15418 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15419 inote.namesz, inote.descsz);
15420 }
15421 }
15422
15423 free (pnotes);
15424
15425 return res;
15426 }
15427
15428 static int
15429 process_note_sections (FILE * file)
15430 {
15431 Elf_Internal_Shdr * section;
15432 unsigned long i;
15433 int n = 0;
15434 int res = 1;
15435
15436 for (i = 0, section = section_headers;
15437 i < elf_header.e_shnum && section != NULL;
15438 i++, section++)
15439 {
15440 if (section->sh_type == SHT_NOTE)
15441 {
15442 res &= process_corefile_note_segment (file,
15443 (bfd_vma) section->sh_offset,
15444 (bfd_vma) section->sh_size);
15445 n++;
15446 }
15447
15448 if (( elf_header.e_machine == EM_V800
15449 || elf_header.e_machine == EM_V850
15450 || elf_header.e_machine == EM_CYGNUS_V850)
15451 && section->sh_type == SHT_RENESAS_INFO)
15452 {
15453 res &= process_v850_notes (file,
15454 (bfd_vma) section->sh_offset,
15455 (bfd_vma) section->sh_size);
15456 n++;
15457 }
15458 }
15459
15460 if (n == 0)
15461 /* Try processing NOTE segments instead. */
15462 return process_corefile_note_segments (file);
15463
15464 return res;
15465 }
15466
15467 static int
15468 process_notes (FILE * file)
15469 {
15470 /* If we have not been asked to display the notes then do nothing. */
15471 if (! do_notes)
15472 return 1;
15473
15474 if (elf_header.e_type != ET_CORE)
15475 return process_note_sections (file);
15476
15477 /* No program headers means no NOTE segment. */
15478 if (elf_header.e_phnum > 0)
15479 return process_corefile_note_segments (file);
15480
15481 printf (_("No note segments present in the core file.\n"));
15482 return 1;
15483 }
15484
15485 static int
15486 process_arch_specific (FILE * file)
15487 {
15488 if (! do_arch)
15489 return 1;
15490
15491 switch (elf_header.e_machine)
15492 {
15493 case EM_ARM:
15494 return process_arm_specific (file);
15495 case EM_MIPS:
15496 case EM_MIPS_RS3_LE:
15497 return process_mips_specific (file);
15498 break;
15499 case EM_NDS32:
15500 return process_nds32_specific (file);
15501 break;
15502 case EM_PPC:
15503 return process_power_specific (file);
15504 break;
15505 case EM_SPARC:
15506 case EM_SPARC32PLUS:
15507 case EM_SPARCV9:
15508 return process_sparc_specific (file);
15509 break;
15510 case EM_TI_C6000:
15511 return process_tic6x_specific (file);
15512 break;
15513 case EM_MSP430:
15514 return process_msp430x_specific (file);
15515 default:
15516 break;
15517 }
15518 return 1;
15519 }
15520
15521 static int
15522 get_file_header (FILE * file)
15523 {
15524 /* Read in the identity array. */
15525 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
15526 return 0;
15527
15528 /* Determine how to read the rest of the header. */
15529 switch (elf_header.e_ident[EI_DATA])
15530 {
15531 default: /* fall through */
15532 case ELFDATANONE: /* fall through */
15533 case ELFDATA2LSB:
15534 byte_get = byte_get_little_endian;
15535 byte_put = byte_put_little_endian;
15536 break;
15537 case ELFDATA2MSB:
15538 byte_get = byte_get_big_endian;
15539 byte_put = byte_put_big_endian;
15540 break;
15541 }
15542
15543 /* For now we only support 32 bit and 64 bit ELF files. */
15544 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
15545
15546 /* Read in the rest of the header. */
15547 if (is_32bit_elf)
15548 {
15549 Elf32_External_Ehdr ehdr32;
15550
15551 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15552 return 0;
15553
15554 elf_header.e_type = BYTE_GET (ehdr32.e_type);
15555 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
15556 elf_header.e_version = BYTE_GET (ehdr32.e_version);
15557 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
15558 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
15559 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
15560 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
15561 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
15562 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15563 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
15564 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15565 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
15566 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
15567 }
15568 else
15569 {
15570 Elf64_External_Ehdr ehdr64;
15571
15572 /* If we have been compiled with sizeof (bfd_vma) == 4, then
15573 we will not be able to cope with the 64bit data found in
15574 64 ELF files. Detect this now and abort before we start
15575 overwriting things. */
15576 if (sizeof (bfd_vma) < 8)
15577 {
15578 error (_("This instance of readelf has been built without support for a\n\
15579 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15580 return 0;
15581 }
15582
15583 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15584 return 0;
15585
15586 elf_header.e_type = BYTE_GET (ehdr64.e_type);
15587 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
15588 elf_header.e_version = BYTE_GET (ehdr64.e_version);
15589 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
15590 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
15591 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
15592 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
15593 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
15594 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15595 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
15596 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15597 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
15598 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
15599 }
15600
15601 if (elf_header.e_shoff)
15602 {
15603 /* There may be some extensions in the first section header. Don't
15604 bomb if we can't read it. */
15605 if (is_32bit_elf)
15606 get_32bit_section_headers (file, TRUE);
15607 else
15608 get_64bit_section_headers (file, TRUE);
15609 }
15610
15611 return 1;
15612 }
15613
15614 /* Process one ELF object file according to the command line options.
15615 This file may actually be stored in an archive. The file is
15616 positioned at the start of the ELF object. */
15617
15618 static int
15619 process_object (char * file_name, FILE * file)
15620 {
15621 unsigned int i;
15622
15623 if (! get_file_header (file))
15624 {
15625 error (_("%s: Failed to read file header\n"), file_name);
15626 return 1;
15627 }
15628
15629 /* Initialise per file variables. */
15630 for (i = ARRAY_SIZE (version_info); i--;)
15631 version_info[i] = 0;
15632
15633 for (i = ARRAY_SIZE (dynamic_info); i--;)
15634 dynamic_info[i] = 0;
15635 dynamic_info_DT_GNU_HASH = 0;
15636
15637 /* Process the file. */
15638 if (show_name)
15639 printf (_("\nFile: %s\n"), file_name);
15640
15641 /* Initialise the dump_sects array from the cmdline_dump_sects array.
15642 Note we do this even if cmdline_dump_sects is empty because we
15643 must make sure that the dump_sets array is zeroed out before each
15644 object file is processed. */
15645 if (num_dump_sects > num_cmdline_dump_sects)
15646 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15647
15648 if (num_cmdline_dump_sects > 0)
15649 {
15650 if (num_dump_sects == 0)
15651 /* A sneaky way of allocating the dump_sects array. */
15652 request_dump_bynumber (num_cmdline_dump_sects, 0);
15653
15654 assert (num_dump_sects >= num_cmdline_dump_sects);
15655 memcpy (dump_sects, cmdline_dump_sects,
15656 num_cmdline_dump_sects * sizeof (* dump_sects));
15657 }
15658
15659 if (! process_file_header ())
15660 return 1;
15661
15662 if (! process_section_headers (file))
15663 {
15664 /* Without loaded section headers we cannot process lots of
15665 things. */
15666 do_unwind = do_version = do_dump = do_arch = 0;
15667
15668 if (! do_using_dynamic)
15669 do_syms = do_dyn_syms = do_reloc = 0;
15670 }
15671
15672 if (! process_section_groups (file))
15673 {
15674 /* Without loaded section groups we cannot process unwind. */
15675 do_unwind = 0;
15676 }
15677
15678 if (process_program_headers (file))
15679 process_dynamic_section (file);
15680
15681 process_relocs (file);
15682
15683 process_unwind (file);
15684
15685 process_symbol_table (file);
15686
15687 process_syminfo (file);
15688
15689 process_version_sections (file);
15690
15691 process_section_contents (file);
15692
15693 process_notes (file);
15694
15695 process_gnu_liblist (file);
15696
15697 process_arch_specific (file);
15698
15699 if (program_headers)
15700 {
15701 free (program_headers);
15702 program_headers = NULL;
15703 }
15704
15705 if (section_headers)
15706 {
15707 free (section_headers);
15708 section_headers = NULL;
15709 }
15710
15711 if (string_table)
15712 {
15713 free (string_table);
15714 string_table = NULL;
15715 string_table_length = 0;
15716 }
15717
15718 if (dynamic_strings)
15719 {
15720 free (dynamic_strings);
15721 dynamic_strings = NULL;
15722 dynamic_strings_length = 0;
15723 }
15724
15725 if (dynamic_symbols)
15726 {
15727 free (dynamic_symbols);
15728 dynamic_symbols = NULL;
15729 num_dynamic_syms = 0;
15730 }
15731
15732 if (dynamic_syminfo)
15733 {
15734 free (dynamic_syminfo);
15735 dynamic_syminfo = NULL;
15736 }
15737
15738 if (dynamic_section)
15739 {
15740 free (dynamic_section);
15741 dynamic_section = NULL;
15742 }
15743
15744 if (section_headers_groups)
15745 {
15746 free (section_headers_groups);
15747 section_headers_groups = NULL;
15748 }
15749
15750 if (section_groups)
15751 {
15752 struct group_list * g;
15753 struct group_list * next;
15754
15755 for (i = 0; i < group_count; i++)
15756 {
15757 for (g = section_groups [i].root; g != NULL; g = next)
15758 {
15759 next = g->next;
15760 free (g);
15761 }
15762 }
15763
15764 free (section_groups);
15765 section_groups = NULL;
15766 }
15767
15768 free_debug_memory ();
15769
15770 return 0;
15771 }
15772
15773 /* Process an ELF archive.
15774 On entry the file is positioned just after the ARMAG string. */
15775
15776 static int
15777 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15778 {
15779 struct archive_info arch;
15780 struct archive_info nested_arch;
15781 size_t got;
15782 int ret;
15783
15784 show_name = 1;
15785
15786 /* The ARCH structure is used to hold information about this archive. */
15787 arch.file_name = NULL;
15788 arch.file = NULL;
15789 arch.index_array = NULL;
15790 arch.sym_table = NULL;
15791 arch.longnames = NULL;
15792
15793 /* The NESTED_ARCH structure is used as a single-item cache of information
15794 about a nested archive (when members of a thin archive reside within
15795 another regular archive file). */
15796 nested_arch.file_name = NULL;
15797 nested_arch.file = NULL;
15798 nested_arch.index_array = NULL;
15799 nested_arch.sym_table = NULL;
15800 nested_arch.longnames = NULL;
15801
15802 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15803 {
15804 ret = 1;
15805 goto out;
15806 }
15807
15808 if (do_archive_index)
15809 {
15810 if (arch.sym_table == NULL)
15811 error (_("%s: unable to dump the index as none was found\n"), file_name);
15812 else
15813 {
15814 unsigned long i, l;
15815 unsigned long current_pos;
15816
15817 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
15818 file_name, (unsigned long) arch.index_num, arch.sym_size);
15819 current_pos = ftell (file);
15820
15821 for (i = l = 0; i < arch.index_num; i++)
15822 {
15823 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15824 {
15825 char * member_name;
15826
15827 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15828
15829 if (member_name != NULL)
15830 {
15831 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15832
15833 if (qualified_name != NULL)
15834 {
15835 printf (_("Contents of binary %s at offset "), qualified_name);
15836 (void) print_vma (arch.index_array[i], PREFIX_HEX);
15837 putchar ('\n');
15838 free (qualified_name);
15839 }
15840 }
15841 }
15842
15843 if (l >= arch.sym_size)
15844 {
15845 error (_("%s: end of the symbol table reached before the end of the index\n"),
15846 file_name);
15847 break;
15848 }
15849 /* PR 17531: file: 0b6630b2. */
15850 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
15851 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
15852 }
15853
15854 if (arch.uses_64bit_indicies)
15855 l = (l + 7) & ~ 7;
15856 else
15857 l += l & 1;
15858
15859 if (l < arch.sym_size)
15860 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15861 file_name, arch.sym_size - l);
15862
15863 if (fseek (file, current_pos, SEEK_SET) != 0)
15864 {
15865 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15866 ret = 1;
15867 goto out;
15868 }
15869 }
15870
15871 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15872 && !do_segments && !do_header && !do_dump && !do_version
15873 && !do_histogram && !do_debugging && !do_arch && !do_notes
15874 && !do_section_groups && !do_dyn_syms)
15875 {
15876 ret = 0; /* Archive index only. */
15877 goto out;
15878 }
15879 }
15880
15881 ret = 0;
15882
15883 while (1)
15884 {
15885 char * name;
15886 size_t namelen;
15887 char * qualified_name;
15888
15889 /* Read the next archive header. */
15890 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15891 {
15892 error (_("%s: failed to seek to next archive header\n"), file_name);
15893 return 1;
15894 }
15895 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15896 if (got != sizeof arch.arhdr)
15897 {
15898 if (got == 0)
15899 break;
15900 error (_("%s: failed to read archive header\n"), file_name);
15901 ret = 1;
15902 break;
15903 }
15904 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15905 {
15906 error (_("%s: did not find a valid archive header\n"), arch.file_name);
15907 ret = 1;
15908 break;
15909 }
15910
15911 arch.next_arhdr_offset += sizeof arch.arhdr;
15912
15913 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15914 if (archive_file_size & 01)
15915 ++archive_file_size;
15916
15917 name = get_archive_member_name (&arch, &nested_arch);
15918 if (name == NULL)
15919 {
15920 error (_("%s: bad archive file name\n"), file_name);
15921 ret = 1;
15922 break;
15923 }
15924 namelen = strlen (name);
15925
15926 qualified_name = make_qualified_name (&arch, &nested_arch, name);
15927 if (qualified_name == NULL)
15928 {
15929 error (_("%s: bad archive file name\n"), file_name);
15930 ret = 1;
15931 break;
15932 }
15933
15934 if (is_thin_archive && arch.nested_member_origin == 0)
15935 {
15936 /* This is a proxy for an external member of a thin archive. */
15937 FILE * member_file;
15938 char * member_file_name = adjust_relative_path (file_name, name, namelen);
15939 if (member_file_name == NULL)
15940 {
15941 ret = 1;
15942 break;
15943 }
15944
15945 member_file = fopen (member_file_name, "rb");
15946 if (member_file == NULL)
15947 {
15948 error (_("Input file '%s' is not readable.\n"), member_file_name);
15949 free (member_file_name);
15950 ret = 1;
15951 break;
15952 }
15953
15954 archive_file_offset = arch.nested_member_origin;
15955
15956 ret |= process_object (qualified_name, member_file);
15957
15958 fclose (member_file);
15959 free (member_file_name);
15960 }
15961 else if (is_thin_archive)
15962 {
15963 /* PR 15140: Allow for corrupt thin archives. */
15964 if (nested_arch.file == NULL)
15965 {
15966 error (_("%s: contains corrupt thin archive: %s\n"),
15967 file_name, name);
15968 ret = 1;
15969 break;
15970 }
15971
15972 /* This is a proxy for a member of a nested archive. */
15973 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15974
15975 /* The nested archive file will have been opened and setup by
15976 get_archive_member_name. */
15977 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15978 {
15979 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15980 ret = 1;
15981 break;
15982 }
15983
15984 ret |= process_object (qualified_name, nested_arch.file);
15985 }
15986 else
15987 {
15988 archive_file_offset = arch.next_arhdr_offset;
15989 arch.next_arhdr_offset += archive_file_size;
15990
15991 ret |= process_object (qualified_name, file);
15992 }
15993
15994 if (dump_sects != NULL)
15995 {
15996 free (dump_sects);
15997 dump_sects = NULL;
15998 num_dump_sects = 0;
15999 }
16000
16001 free (qualified_name);
16002 }
16003
16004 out:
16005 if (nested_arch.file != NULL)
16006 fclose (nested_arch.file);
16007 release_archive (&nested_arch);
16008 release_archive (&arch);
16009
16010 return ret;
16011 }
16012
16013 static int
16014 process_file (char * file_name)
16015 {
16016 FILE * file;
16017 struct stat statbuf;
16018 char armag[SARMAG];
16019 int ret;
16020
16021 if (stat (file_name, &statbuf) < 0)
16022 {
16023 if (errno == ENOENT)
16024 error (_("'%s': No such file\n"), file_name);
16025 else
16026 error (_("Could not locate '%s'. System error message: %s\n"),
16027 file_name, strerror (errno));
16028 return 1;
16029 }
16030
16031 if (! S_ISREG (statbuf.st_mode))
16032 {
16033 error (_("'%s' is not an ordinary file\n"), file_name);
16034 return 1;
16035 }
16036
16037 file = fopen (file_name, "rb");
16038 if (file == NULL)
16039 {
16040 error (_("Input file '%s' is not readable.\n"), file_name);
16041 return 1;
16042 }
16043
16044 if (fread (armag, SARMAG, 1, file) != 1)
16045 {
16046 error (_("%s: Failed to read file's magic number\n"), file_name);
16047 fclose (file);
16048 return 1;
16049 }
16050
16051 current_file_size = (bfd_size_type) statbuf.st_size;
16052
16053 if (memcmp (armag, ARMAG, SARMAG) == 0)
16054 ret = process_archive (file_name, file, FALSE);
16055 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16056 ret = process_archive (file_name, file, TRUE);
16057 else
16058 {
16059 if (do_archive_index)
16060 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16061 file_name);
16062
16063 rewind (file);
16064 archive_file_size = archive_file_offset = 0;
16065 ret = process_object (file_name, file);
16066 }
16067
16068 fclose (file);
16069
16070 current_file_size = 0;
16071 return ret;
16072 }
16073
16074 #ifdef SUPPORT_DISASSEMBLY
16075 /* Needed by the i386 disassembler. For extra credit, someone could
16076 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16077 symbols. */
16078
16079 void
16080 print_address (unsigned int addr, FILE * outfile)
16081 {
16082 fprintf (outfile,"0x%8.8x", addr);
16083 }
16084
16085 /* Needed by the i386 disassembler. */
16086 void
16087 db_task_printsym (unsigned int addr)
16088 {
16089 print_address (addr, stderr);
16090 }
16091 #endif
16092
16093 int
16094 main (int argc, char ** argv)
16095 {
16096 int err;
16097
16098 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16099 setlocale (LC_MESSAGES, "");
16100 #endif
16101 #if defined (HAVE_SETLOCALE)
16102 setlocale (LC_CTYPE, "");
16103 #endif
16104 bindtextdomain (PACKAGE, LOCALEDIR);
16105 textdomain (PACKAGE);
16106
16107 expandargv (&argc, &argv);
16108
16109 parse_args (argc, argv);
16110
16111 if (num_dump_sects > 0)
16112 {
16113 /* Make a copy of the dump_sects array. */
16114 cmdline_dump_sects = (dump_type *)
16115 malloc (num_dump_sects * sizeof (* dump_sects));
16116 if (cmdline_dump_sects == NULL)
16117 error (_("Out of memory allocating dump request table.\n"));
16118 else
16119 {
16120 memcpy (cmdline_dump_sects, dump_sects,
16121 num_dump_sects * sizeof (* dump_sects));
16122 num_cmdline_dump_sects = num_dump_sects;
16123 }
16124 }
16125
16126 if (optind < (argc - 1))
16127 show_name = 1;
16128
16129 err = 0;
16130 while (optind < argc)
16131 err |= process_file (argv[optind++]);
16132
16133 if (dump_sects != NULL)
16134 free (dump_sects);
16135 if (cmdline_dump_sects != NULL)
16136 free (cmdline_dump_sects);
16137
16138 return err;
16139 }