Re-work RISC-V gas flags: now we just support -mabi and -march
[binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2016 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 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h. */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/riscv.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/visium.h"
153 #include "elf/x86-64.h"
154 #include "elf/xc16x.h"
155 #include "elf/xgate.h"
156 #include "elf/xstormy16.h"
157 #include "elf/xtensa.h"
158
159 #include "getopt.h"
160 #include "libiberty.h"
161 #include "safe-ctype.h"
162 #include "filenames.h"
163
164 #ifndef offsetof
165 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166 #endif
167
168 typedef struct elf_section_list
169 {
170 Elf_Internal_Shdr * hdr;
171 struct elf_section_list * next;
172 } elf_section_list;
173
174 char * program_name = "readelf";
175 static unsigned long archive_file_offset;
176 static unsigned long archive_file_size;
177 static bfd_size_type current_file_size;
178 static unsigned long dynamic_addr;
179 static bfd_size_type dynamic_size;
180 static size_t dynamic_nent;
181 static char * dynamic_strings;
182 static unsigned long dynamic_strings_length;
183 static char * string_table;
184 static unsigned long string_table_length;
185 static unsigned long num_dynamic_syms;
186 static Elf_Internal_Sym * dynamic_symbols;
187 static Elf_Internal_Syminfo * dynamic_syminfo;
188 static unsigned long dynamic_syminfo_offset;
189 static unsigned int dynamic_syminfo_nent;
190 static char program_interpreter[PATH_MAX];
191 static bfd_vma dynamic_info[DT_ENCODING];
192 static bfd_vma dynamic_info_DT_GNU_HASH;
193 static bfd_vma version_info[16];
194 static Elf_Internal_Ehdr elf_header;
195 static Elf_Internal_Shdr * section_headers;
196 static Elf_Internal_Phdr * program_headers;
197 static Elf_Internal_Dyn * dynamic_section;
198 static elf_section_list * symtab_shndx_list;
199 static int show_name;
200 static int do_dynamic;
201 static int do_syms;
202 static int do_dyn_syms;
203 static int do_reloc;
204 static int do_sections;
205 static int do_section_groups;
206 static int do_section_details;
207 static int do_segments;
208 static int do_unwind;
209 static int do_using_dynamic;
210 static int do_header;
211 static int do_dump;
212 static int do_version;
213 static int do_histogram;
214 static int do_debugging;
215 static int do_arch;
216 static int do_notes;
217 static int do_archive_index;
218 static int is_32bit_elf;
219 static int decompress_dumps;
220
221 struct group_list
222 {
223 struct group_list * next;
224 unsigned int section_index;
225 };
226
227 struct group
228 {
229 struct group_list * root;
230 unsigned int group_index;
231 };
232
233 static size_t group_count;
234 static struct group * section_groups;
235 static struct group ** section_headers_groups;
236
237
238 /* Flag bits indicating particular types of dump. */
239 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
240 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
241 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
242 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
243 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
244
245 typedef unsigned char dump_type;
246
247 /* A linked list of the section names for which dumps were requested. */
248 struct dump_list_entry
249 {
250 char * name;
251 dump_type type;
252 struct dump_list_entry * next;
253 };
254 static struct dump_list_entry * dump_sects_byname;
255
256 /* A dynamic array of flags indicating for which sections a dump
257 has been requested via command line switches. */
258 static dump_type * cmdline_dump_sects = NULL;
259 static unsigned int num_cmdline_dump_sects = 0;
260
261 /* A dynamic array of flags indicating for which sections a dump of
262 some kind has been requested. It is reset on a per-object file
263 basis and then initialised from the cmdline_dump_sects array,
264 the results of interpreting the -w switch, and the
265 dump_sects_byname list. */
266 static dump_type * dump_sects = NULL;
267 static unsigned int num_dump_sects = 0;
268
269
270 /* How to print a vma value. */
271 typedef enum print_mode
272 {
273 HEX,
274 DEC,
275 DEC_5,
276 UNSIGNED,
277 PREFIX_HEX,
278 FULL_HEX,
279 LONG_HEX
280 }
281 print_mode;
282
283 /* Versioned symbol info. */
284 enum versioned_symbol_info
285 {
286 symbol_undefined,
287 symbol_hidden,
288 symbol_public
289 };
290
291 static const char *get_symbol_version_string
292 (FILE *file, int is_dynsym, const char *strtab,
293 unsigned long int strtab_size, unsigned int si,
294 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
295 unsigned short *vna_other);
296
297 #define UNKNOWN -1
298
299 #define SECTION_NAME(X) \
300 ((X) == NULL ? _("<none>") \
301 : string_table == NULL ? _("<no-name>") \
302 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
303 : string_table + (X)->sh_name))
304
305 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
306
307 #define GET_ELF_SYMBOLS(file, section, sym_count) \
308 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
309 : get_64bit_elf_symbols (file, section, sym_count))
310
311 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
312 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
313 already been called and verified that the string exists. */
314 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
315
316 #define REMOVE_ARCH_BITS(ADDR) \
317 do \
318 { \
319 if (elf_header.e_machine == EM_ARM) \
320 (ADDR) &= ~1; \
321 } \
322 while (0)
323 \f
324 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
325 the offset of the current archive member, if we are examining an archive.
326 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
327 using malloc and fill that. In either case return the pointer to the start of
328 the retrieved data or NULL if something went wrong. If something does go wrong
329 and REASON is not NULL then emit an error message using REASON as part of the
330 context. */
331
332 static void *
333 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
334 bfd_size_type nmemb, const char * reason)
335 {
336 void * mvar;
337 bfd_size_type amt = size * nmemb;
338
339 if (size == 0 || nmemb == 0)
340 return NULL;
341
342 /* If the size_t type is smaller than the bfd_size_type, eg because
343 you are building a 32-bit tool on a 64-bit host, then make sure
344 that when the sizes are cast to (size_t) no information is lost. */
345 if (sizeof (size_t) < sizeof (bfd_size_type)
346 && ( (bfd_size_type) ((size_t) size) != size
347 || (bfd_size_type) ((size_t) nmemb) != nmemb))
348 {
349 if (reason)
350 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
351 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
352 nmemb, size, reason);
353 return NULL;
354 }
355
356 /* Check for size overflow. */
357 if (amt < nmemb)
358 {
359 if (reason)
360 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
361 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
362 nmemb, size, reason);
363 return NULL;
364 }
365
366 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
367 attempting to allocate memory when the read is bound to fail. */
368 if (amt > current_file_size
369 || offset + archive_file_offset + amt > current_file_size)
370 {
371 if (reason)
372 error (_("Reading 0x%" BFD_VMA_FMT "x"
373 " bytes extends past end of file for %s\n"),
374 amt, reason);
375 return NULL;
376 }
377
378 if (fseek (file, archive_file_offset + offset, SEEK_SET))
379 {
380 if (reason)
381 error (_("Unable to seek to 0x%lx for %s\n"),
382 archive_file_offset + offset, reason);
383 return NULL;
384 }
385
386 mvar = var;
387 if (mvar == NULL)
388 {
389 /* Check for overflow. */
390 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
391 /* + 1 so that we can '\0' terminate invalid string table sections. */
392 mvar = malloc ((size_t) amt + 1);
393
394 if (mvar == NULL)
395 {
396 if (reason)
397 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
398 " bytes for %s\n"),
399 amt, reason);
400 return NULL;
401 }
402
403 ((char *) mvar)[amt] = '\0';
404 }
405
406 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
407 {
408 if (reason)
409 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
410 amt, reason);
411 if (mvar != var)
412 free (mvar);
413 return NULL;
414 }
415
416 return mvar;
417 }
418
419 /* Print a VMA value. */
420
421 static int
422 print_vma (bfd_vma vma, print_mode mode)
423 {
424 int nc = 0;
425
426 switch (mode)
427 {
428 case FULL_HEX:
429 nc = printf ("0x");
430 /* Fall through. */
431
432 case LONG_HEX:
433 #ifdef BFD64
434 if (is_32bit_elf)
435 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
436 #endif
437 printf_vma (vma);
438 return nc + 16;
439
440 case DEC_5:
441 if (vma <= 99999)
442 return printf ("%5" BFD_VMA_FMT "d", vma);
443 /* Fall through. */
444
445 case PREFIX_HEX:
446 nc = printf ("0x");
447 /* Fall through. */
448
449 case HEX:
450 return nc + printf ("%" BFD_VMA_FMT "x", vma);
451
452 case DEC:
453 return printf ("%" BFD_VMA_FMT "d", vma);
454
455 case UNSIGNED:
456 return printf ("%" BFD_VMA_FMT "u", vma);
457 }
458 return 0;
459 }
460
461 /* Display a symbol on stdout. Handles the display of control characters and
462 multibye characters (assuming the host environment supports them).
463
464 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465
466 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
467 padding as necessary.
468
469 Returns the number of emitted characters. */
470
471 static unsigned int
472 print_symbol (int width, const char *symbol)
473 {
474 bfd_boolean extra_padding = FALSE;
475 int num_printed = 0;
476 #ifdef HAVE_MBSTATE_T
477 mbstate_t state;
478 #endif
479 int width_remaining;
480
481 if (width < 0)
482 {
483 /* Keep the width positive. This also helps. */
484 width = - width;
485 extra_padding = TRUE;
486 }
487 assert (width != 0);
488
489 if (do_wide)
490 /* Set the remaining width to a very large value.
491 This simplifies the code below. */
492 width_remaining = INT_MAX;
493 else
494 width_remaining = width;
495
496 #ifdef HAVE_MBSTATE_T
497 /* Initialise the multibyte conversion state. */
498 memset (& state, 0, sizeof (state));
499 #endif
500
501 while (width_remaining)
502 {
503 size_t n;
504 const char c = *symbol++;
505
506 if (c == 0)
507 break;
508
509 /* Do not print control characters directly as they can affect terminal
510 settings. Such characters usually appear in the names generated
511 by the assembler for local labels. */
512 if (ISCNTRL (c))
513 {
514 if (width_remaining < 2)
515 break;
516
517 printf ("^%c", c + 0x40);
518 width_remaining -= 2;
519 num_printed += 2;
520 }
521 else if (ISPRINT (c))
522 {
523 putchar (c);
524 width_remaining --;
525 num_printed ++;
526 }
527 else
528 {
529 #ifdef HAVE_MBSTATE_T
530 wchar_t w;
531 #endif
532 /* Let printf do the hard work of displaying multibyte characters. */
533 printf ("%.1s", symbol - 1);
534 width_remaining --;
535 num_printed ++;
536
537 #ifdef HAVE_MBSTATE_T
538 /* Try to find out how many bytes made up the character that was
539 just printed. Advance the symbol pointer past the bytes that
540 were displayed. */
541 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
542 #else
543 n = 1;
544 #endif
545 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
546 symbol += (n - 1);
547 }
548 }
549
550 if (extra_padding && num_printed < width)
551 {
552 /* Fill in the remaining spaces. */
553 printf ("%-*s", width - num_printed, " ");
554 num_printed = width;
555 }
556
557 return num_printed;
558 }
559
560 /* Returns a pointer to a static buffer containing a printable version of
561 the given section's name. Like print_symbol, except that it does not try
562 to print multibyte characters, it just interprets them as hex values. */
563
564 static const char *
565 printable_section_name (const Elf_Internal_Shdr * sec)
566 {
567 #define MAX_PRINT_SEC_NAME_LEN 128
568 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
569 const char * name = SECTION_NAME (sec);
570 char * buf = sec_name_buf;
571 char c;
572 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
573
574 while ((c = * name ++) != 0)
575 {
576 if (ISCNTRL (c))
577 {
578 if (remaining < 2)
579 break;
580
581 * buf ++ = '^';
582 * buf ++ = c + 0x40;
583 remaining -= 2;
584 }
585 else if (ISPRINT (c))
586 {
587 * buf ++ = c;
588 remaining -= 1;
589 }
590 else
591 {
592 static char hex[17] = "0123456789ABCDEF";
593
594 if (remaining < 4)
595 break;
596 * buf ++ = '<';
597 * buf ++ = hex[(c & 0xf0) >> 4];
598 * buf ++ = hex[c & 0x0f];
599 * buf ++ = '>';
600 remaining -= 4;
601 }
602
603 if (remaining == 0)
604 break;
605 }
606
607 * buf = 0;
608 return sec_name_buf;
609 }
610
611 static const char *
612 printable_section_name_from_index (unsigned long ndx)
613 {
614 if (ndx >= elf_header.e_shnum)
615 return _("<corrupt>");
616
617 return printable_section_name (section_headers + ndx);
618 }
619
620 /* Return a pointer to section NAME, or NULL if no such section exists. */
621
622 static Elf_Internal_Shdr *
623 find_section (const char * name)
624 {
625 unsigned int i;
626
627 for (i = 0; i < elf_header.e_shnum; i++)
628 if (streq (SECTION_NAME (section_headers + i), name))
629 return section_headers + i;
630
631 return NULL;
632 }
633
634 /* Return a pointer to a section containing ADDR, or NULL if no such
635 section exists. */
636
637 static Elf_Internal_Shdr *
638 find_section_by_address (bfd_vma addr)
639 {
640 unsigned int i;
641
642 for (i = 0; i < elf_header.e_shnum; i++)
643 {
644 Elf_Internal_Shdr *sec = section_headers + i;
645 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
646 return sec;
647 }
648
649 return NULL;
650 }
651
652 static Elf_Internal_Shdr *
653 find_section_by_type (unsigned int type)
654 {
655 unsigned int i;
656
657 for (i = 0; i < elf_header.e_shnum; i++)
658 {
659 Elf_Internal_Shdr *sec = section_headers + i;
660 if (sec->sh_type == type)
661 return sec;
662 }
663
664 return NULL;
665 }
666
667 /* Return a pointer to section NAME, or NULL if no such section exists,
668 restricted to the list of sections given in SET. */
669
670 static Elf_Internal_Shdr *
671 find_section_in_set (const char * name, unsigned int * set)
672 {
673 unsigned int i;
674
675 if (set != NULL)
676 {
677 while ((i = *set++) > 0)
678 if (streq (SECTION_NAME (section_headers + i), name))
679 return section_headers + i;
680 }
681
682 return find_section (name);
683 }
684
685 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
686 bytes read. */
687
688 static inline unsigned long
689 read_uleb128 (unsigned char *data,
690 unsigned int *length_return,
691 const unsigned char * const end)
692 {
693 return read_leb128 (data, length_return, FALSE, end);
694 }
695
696 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
697 This OS has so many departures from the ELF standard that we test it at
698 many places. */
699
700 static inline int
701 is_ia64_vms (void)
702 {
703 return elf_header.e_machine == EM_IA_64
704 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
705 }
706
707 /* Guess the relocation size commonly used by the specific machines. */
708
709 static int
710 guess_is_rela (unsigned int e_machine)
711 {
712 switch (e_machine)
713 {
714 /* Targets that use REL relocations. */
715 case EM_386:
716 case EM_IAMCU:
717 case EM_960:
718 case EM_ARM:
719 case EM_D10V:
720 case EM_CYGNUS_D10V:
721 case EM_DLX:
722 case EM_MIPS:
723 case EM_MIPS_RS3_LE:
724 case EM_CYGNUS_M32R:
725 case EM_SCORE:
726 case EM_XGATE:
727 return FALSE;
728
729 /* Targets that use RELA relocations. */
730 case EM_68K:
731 case EM_860:
732 case EM_AARCH64:
733 case EM_ADAPTEVA_EPIPHANY:
734 case EM_ALPHA:
735 case EM_ALTERA_NIOS2:
736 case EM_ARC:
737 case EM_ARC_COMPACT:
738 case EM_ARC_COMPACT2:
739 case EM_AVR:
740 case EM_AVR_OLD:
741 case EM_BLACKFIN:
742 case EM_CR16:
743 case EM_CRIS:
744 case EM_CRX:
745 case EM_D30V:
746 case EM_CYGNUS_D30V:
747 case EM_FR30:
748 case EM_FT32:
749 case EM_CYGNUS_FR30:
750 case EM_CYGNUS_FRV:
751 case EM_H8S:
752 case EM_H8_300:
753 case EM_H8_300H:
754 case EM_IA_64:
755 case EM_IP2K:
756 case EM_IP2K_OLD:
757 case EM_IQ2000:
758 case EM_LATTICEMICO32:
759 case EM_M32C_OLD:
760 case EM_M32C:
761 case EM_M32R:
762 case EM_MCORE:
763 case EM_CYGNUS_MEP:
764 case EM_METAG:
765 case EM_MMIX:
766 case EM_MN10200:
767 case EM_CYGNUS_MN10200:
768 case EM_MN10300:
769 case EM_CYGNUS_MN10300:
770 case EM_MOXIE:
771 case EM_MSP430:
772 case EM_MSP430_OLD:
773 case EM_MT:
774 case EM_NDS32:
775 case EM_NIOS32:
776 case EM_OR1K:
777 case EM_PPC64:
778 case EM_PPC:
779 case EM_RISCV:
780 case EM_RL78:
781 case EM_RX:
782 case EM_S390:
783 case EM_S390_OLD:
784 case EM_SH:
785 case EM_SPARC:
786 case EM_SPARC32PLUS:
787 case EM_SPARCV9:
788 case EM_SPU:
789 case EM_TI_C6000:
790 case EM_TILEGX:
791 case EM_TILEPRO:
792 case EM_V800:
793 case EM_V850:
794 case EM_CYGNUS_V850:
795 case EM_VAX:
796 case EM_VISIUM:
797 case EM_X86_64:
798 case EM_L1OM:
799 case EM_K1OM:
800 case EM_XSTORMY16:
801 case EM_XTENSA:
802 case EM_XTENSA_OLD:
803 case EM_MICROBLAZE:
804 case EM_MICROBLAZE_OLD:
805 return TRUE;
806
807 case EM_68HC05:
808 case EM_68HC08:
809 case EM_68HC11:
810 case EM_68HC16:
811 case EM_FX66:
812 case EM_ME16:
813 case EM_MMA:
814 case EM_NCPU:
815 case EM_NDR1:
816 case EM_PCP:
817 case EM_ST100:
818 case EM_ST19:
819 case EM_ST7:
820 case EM_ST9PLUS:
821 case EM_STARCORE:
822 case EM_SVX:
823 case EM_TINYJ:
824 default:
825 warn (_("Don't know about relocations on this machine architecture\n"));
826 return FALSE;
827 }
828 }
829
830 static int
831 slurp_rela_relocs (FILE * file,
832 unsigned long rel_offset,
833 unsigned long rel_size,
834 Elf_Internal_Rela ** relasp,
835 unsigned long * nrelasp)
836 {
837 Elf_Internal_Rela * relas;
838 size_t nrelas;
839 unsigned int i;
840
841 if (is_32bit_elf)
842 {
843 Elf32_External_Rela * erelas;
844
845 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
846 rel_size, _("32-bit relocation data"));
847 if (!erelas)
848 return 0;
849
850 nrelas = rel_size / sizeof (Elf32_External_Rela);
851
852 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
853 sizeof (Elf_Internal_Rela));
854
855 if (relas == NULL)
856 {
857 free (erelas);
858 error (_("out of memory parsing relocs\n"));
859 return 0;
860 }
861
862 for (i = 0; i < nrelas; i++)
863 {
864 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
865 relas[i].r_info = BYTE_GET (erelas[i].r_info);
866 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
867 }
868
869 free (erelas);
870 }
871 else
872 {
873 Elf64_External_Rela * erelas;
874
875 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
876 rel_size, _("64-bit relocation data"));
877 if (!erelas)
878 return 0;
879
880 nrelas = rel_size / sizeof (Elf64_External_Rela);
881
882 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
883 sizeof (Elf_Internal_Rela));
884
885 if (relas == NULL)
886 {
887 free (erelas);
888 error (_("out of memory parsing relocs\n"));
889 return 0;
890 }
891
892 for (i = 0; i < nrelas; i++)
893 {
894 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
895 relas[i].r_info = BYTE_GET (erelas[i].r_info);
896 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
897
898 /* The #ifdef BFD64 below is to prevent a compile time
899 warning. We know that if we do not have a 64 bit data
900 type that we will never execute this code anyway. */
901 #ifdef BFD64
902 if (elf_header.e_machine == EM_MIPS
903 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
904 {
905 /* In little-endian objects, r_info isn't really a
906 64-bit little-endian value: it has a 32-bit
907 little-endian symbol index followed by four
908 individual byte fields. Reorder INFO
909 accordingly. */
910 bfd_vma inf = relas[i].r_info;
911 inf = (((inf & 0xffffffff) << 32)
912 | ((inf >> 56) & 0xff)
913 | ((inf >> 40) & 0xff00)
914 | ((inf >> 24) & 0xff0000)
915 | ((inf >> 8) & 0xff000000));
916 relas[i].r_info = inf;
917 }
918 #endif /* BFD64 */
919 }
920
921 free (erelas);
922 }
923 *relasp = relas;
924 *nrelasp = nrelas;
925 return 1;
926 }
927
928 static int
929 slurp_rel_relocs (FILE * file,
930 unsigned long rel_offset,
931 unsigned long rel_size,
932 Elf_Internal_Rela ** relsp,
933 unsigned long * nrelsp)
934 {
935 Elf_Internal_Rela * rels;
936 size_t nrels;
937 unsigned int i;
938
939 if (is_32bit_elf)
940 {
941 Elf32_External_Rel * erels;
942
943 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
944 rel_size, _("32-bit relocation data"));
945 if (!erels)
946 return 0;
947
948 nrels = rel_size / sizeof (Elf32_External_Rel);
949
950 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
951
952 if (rels == NULL)
953 {
954 free (erels);
955 error (_("out of memory parsing relocs\n"));
956 return 0;
957 }
958
959 for (i = 0; i < nrels; i++)
960 {
961 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
962 rels[i].r_info = BYTE_GET (erels[i].r_info);
963 rels[i].r_addend = 0;
964 }
965
966 free (erels);
967 }
968 else
969 {
970 Elf64_External_Rel * erels;
971
972 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
973 rel_size, _("64-bit relocation data"));
974 if (!erels)
975 return 0;
976
977 nrels = rel_size / sizeof (Elf64_External_Rel);
978
979 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
980
981 if (rels == NULL)
982 {
983 free (erels);
984 error (_("out of memory parsing relocs\n"));
985 return 0;
986 }
987
988 for (i = 0; i < nrels; i++)
989 {
990 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
991 rels[i].r_info = BYTE_GET (erels[i].r_info);
992 rels[i].r_addend = 0;
993
994 /* The #ifdef BFD64 below is to prevent a compile time
995 warning. We know that if we do not have a 64 bit data
996 type that we will never execute this code anyway. */
997 #ifdef BFD64
998 if (elf_header.e_machine == EM_MIPS
999 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1000 {
1001 /* In little-endian objects, r_info isn't really a
1002 64-bit little-endian value: it has a 32-bit
1003 little-endian symbol index followed by four
1004 individual byte fields. Reorder INFO
1005 accordingly. */
1006 bfd_vma inf = rels[i].r_info;
1007 inf = (((inf & 0xffffffff) << 32)
1008 | ((inf >> 56) & 0xff)
1009 | ((inf >> 40) & 0xff00)
1010 | ((inf >> 24) & 0xff0000)
1011 | ((inf >> 8) & 0xff000000));
1012 rels[i].r_info = inf;
1013 }
1014 #endif /* BFD64 */
1015 }
1016
1017 free (erels);
1018 }
1019 *relsp = rels;
1020 *nrelsp = nrels;
1021 return 1;
1022 }
1023
1024 /* Returns the reloc type extracted from the reloc info field. */
1025
1026 static unsigned int
1027 get_reloc_type (bfd_vma reloc_info)
1028 {
1029 if (is_32bit_elf)
1030 return ELF32_R_TYPE (reloc_info);
1031
1032 switch (elf_header.e_machine)
1033 {
1034 case EM_MIPS:
1035 /* Note: We assume that reloc_info has already been adjusted for us. */
1036 return ELF64_MIPS_R_TYPE (reloc_info);
1037
1038 case EM_SPARCV9:
1039 return ELF64_R_TYPE_ID (reloc_info);
1040
1041 default:
1042 return ELF64_R_TYPE (reloc_info);
1043 }
1044 }
1045
1046 /* Return the symbol index extracted from the reloc info field. */
1047
1048 static bfd_vma
1049 get_reloc_symindex (bfd_vma reloc_info)
1050 {
1051 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1052 }
1053
1054 static inline bfd_boolean
1055 uses_msp430x_relocs (void)
1056 {
1057 return
1058 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1059 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1060 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1061 /* TI compiler uses ELFOSABI_NONE. */
1062 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1063 }
1064
1065 /* Display the contents of the relocation data found at the specified
1066 offset. */
1067
1068 static void
1069 dump_relocations (FILE * file,
1070 unsigned long rel_offset,
1071 unsigned long rel_size,
1072 Elf_Internal_Sym * symtab,
1073 unsigned long nsyms,
1074 char * strtab,
1075 unsigned long strtablen,
1076 int is_rela,
1077 int is_dynsym)
1078 {
1079 unsigned int i;
1080 Elf_Internal_Rela * rels;
1081
1082 if (is_rela == UNKNOWN)
1083 is_rela = guess_is_rela (elf_header.e_machine);
1084
1085 if (is_rela)
1086 {
1087 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1088 return;
1089 }
1090 else
1091 {
1092 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1093 return;
1094 }
1095
1096 if (is_32bit_elf)
1097 {
1098 if (is_rela)
1099 {
1100 if (do_wide)
1101 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1102 else
1103 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1104 }
1105 else
1106 {
1107 if (do_wide)
1108 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1109 else
1110 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1111 }
1112 }
1113 else
1114 {
1115 if (is_rela)
1116 {
1117 if (do_wide)
1118 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1119 else
1120 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1121 }
1122 else
1123 {
1124 if (do_wide)
1125 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1126 else
1127 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1128 }
1129 }
1130
1131 for (i = 0; i < rel_size; i++)
1132 {
1133 const char * rtype;
1134 bfd_vma offset;
1135 bfd_vma inf;
1136 bfd_vma symtab_index;
1137 bfd_vma type;
1138
1139 offset = rels[i].r_offset;
1140 inf = rels[i].r_info;
1141
1142 type = get_reloc_type (inf);
1143 symtab_index = get_reloc_symindex (inf);
1144
1145 if (is_32bit_elf)
1146 {
1147 printf ("%8.8lx %8.8lx ",
1148 (unsigned long) offset & 0xffffffff,
1149 (unsigned long) inf & 0xffffffff);
1150 }
1151 else
1152 {
1153 #if BFD_HOST_64BIT_LONG
1154 printf (do_wide
1155 ? "%16.16lx %16.16lx "
1156 : "%12.12lx %12.12lx ",
1157 offset, inf);
1158 #elif BFD_HOST_64BIT_LONG_LONG
1159 #ifndef __MSVCRT__
1160 printf (do_wide
1161 ? "%16.16llx %16.16llx "
1162 : "%12.12llx %12.12llx ",
1163 offset, inf);
1164 #else
1165 printf (do_wide
1166 ? "%16.16I64x %16.16I64x "
1167 : "%12.12I64x %12.12I64x ",
1168 offset, inf);
1169 #endif
1170 #else
1171 printf (do_wide
1172 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1173 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1174 _bfd_int64_high (offset),
1175 _bfd_int64_low (offset),
1176 _bfd_int64_high (inf),
1177 _bfd_int64_low (inf));
1178 #endif
1179 }
1180
1181 switch (elf_header.e_machine)
1182 {
1183 default:
1184 rtype = NULL;
1185 break;
1186
1187 case EM_AARCH64:
1188 rtype = elf_aarch64_reloc_type (type);
1189 break;
1190
1191 case EM_M32R:
1192 case EM_CYGNUS_M32R:
1193 rtype = elf_m32r_reloc_type (type);
1194 break;
1195
1196 case EM_386:
1197 case EM_IAMCU:
1198 rtype = elf_i386_reloc_type (type);
1199 break;
1200
1201 case EM_68HC11:
1202 case EM_68HC12:
1203 rtype = elf_m68hc11_reloc_type (type);
1204 break;
1205
1206 case EM_68K:
1207 rtype = elf_m68k_reloc_type (type);
1208 break;
1209
1210 case EM_960:
1211 rtype = elf_i960_reloc_type (type);
1212 break;
1213
1214 case EM_AVR:
1215 case EM_AVR_OLD:
1216 rtype = elf_avr_reloc_type (type);
1217 break;
1218
1219 case EM_OLD_SPARCV9:
1220 case EM_SPARC32PLUS:
1221 case EM_SPARCV9:
1222 case EM_SPARC:
1223 rtype = elf_sparc_reloc_type (type);
1224 break;
1225
1226 case EM_SPU:
1227 rtype = elf_spu_reloc_type (type);
1228 break;
1229
1230 case EM_V800:
1231 rtype = v800_reloc_type (type);
1232 break;
1233 case EM_V850:
1234 case EM_CYGNUS_V850:
1235 rtype = v850_reloc_type (type);
1236 break;
1237
1238 case EM_D10V:
1239 case EM_CYGNUS_D10V:
1240 rtype = elf_d10v_reloc_type (type);
1241 break;
1242
1243 case EM_D30V:
1244 case EM_CYGNUS_D30V:
1245 rtype = elf_d30v_reloc_type (type);
1246 break;
1247
1248 case EM_DLX:
1249 rtype = elf_dlx_reloc_type (type);
1250 break;
1251
1252 case EM_SH:
1253 rtype = elf_sh_reloc_type (type);
1254 break;
1255
1256 case EM_MN10300:
1257 case EM_CYGNUS_MN10300:
1258 rtype = elf_mn10300_reloc_type (type);
1259 break;
1260
1261 case EM_MN10200:
1262 case EM_CYGNUS_MN10200:
1263 rtype = elf_mn10200_reloc_type (type);
1264 break;
1265
1266 case EM_FR30:
1267 case EM_CYGNUS_FR30:
1268 rtype = elf_fr30_reloc_type (type);
1269 break;
1270
1271 case EM_CYGNUS_FRV:
1272 rtype = elf_frv_reloc_type (type);
1273 break;
1274
1275 case EM_FT32:
1276 rtype = elf_ft32_reloc_type (type);
1277 break;
1278
1279 case EM_MCORE:
1280 rtype = elf_mcore_reloc_type (type);
1281 break;
1282
1283 case EM_MMIX:
1284 rtype = elf_mmix_reloc_type (type);
1285 break;
1286
1287 case EM_MOXIE:
1288 rtype = elf_moxie_reloc_type (type);
1289 break;
1290
1291 case EM_MSP430:
1292 if (uses_msp430x_relocs ())
1293 {
1294 rtype = elf_msp430x_reloc_type (type);
1295 break;
1296 }
1297 /* Fall through. */
1298 case EM_MSP430_OLD:
1299 rtype = elf_msp430_reloc_type (type);
1300 break;
1301
1302 case EM_NDS32:
1303 rtype = elf_nds32_reloc_type (type);
1304 break;
1305
1306 case EM_PPC:
1307 rtype = elf_ppc_reloc_type (type);
1308 break;
1309
1310 case EM_PPC64:
1311 rtype = elf_ppc64_reloc_type (type);
1312 break;
1313
1314 case EM_MIPS:
1315 case EM_MIPS_RS3_LE:
1316 rtype = elf_mips_reloc_type (type);
1317 break;
1318
1319 case EM_RISCV:
1320 rtype = elf_riscv_reloc_type (type);
1321 break;
1322
1323 case EM_ALPHA:
1324 rtype = elf_alpha_reloc_type (type);
1325 break;
1326
1327 case EM_ARM:
1328 rtype = elf_arm_reloc_type (type);
1329 break;
1330
1331 case EM_ARC:
1332 case EM_ARC_COMPACT:
1333 case EM_ARC_COMPACT2:
1334 rtype = elf_arc_reloc_type (type);
1335 break;
1336
1337 case EM_PARISC:
1338 rtype = elf_hppa_reloc_type (type);
1339 break;
1340
1341 case EM_H8_300:
1342 case EM_H8_300H:
1343 case EM_H8S:
1344 rtype = elf_h8_reloc_type (type);
1345 break;
1346
1347 case EM_OR1K:
1348 rtype = elf_or1k_reloc_type (type);
1349 break;
1350
1351 case EM_PJ:
1352 case EM_PJ_OLD:
1353 rtype = elf_pj_reloc_type (type);
1354 break;
1355 case EM_IA_64:
1356 rtype = elf_ia64_reloc_type (type);
1357 break;
1358
1359 case EM_CRIS:
1360 rtype = elf_cris_reloc_type (type);
1361 break;
1362
1363 case EM_860:
1364 rtype = elf_i860_reloc_type (type);
1365 break;
1366
1367 case EM_X86_64:
1368 case EM_L1OM:
1369 case EM_K1OM:
1370 rtype = elf_x86_64_reloc_type (type);
1371 break;
1372
1373 case EM_S370:
1374 rtype = i370_reloc_type (type);
1375 break;
1376
1377 case EM_S390_OLD:
1378 case EM_S390:
1379 rtype = elf_s390_reloc_type (type);
1380 break;
1381
1382 case EM_SCORE:
1383 rtype = elf_score_reloc_type (type);
1384 break;
1385
1386 case EM_XSTORMY16:
1387 rtype = elf_xstormy16_reloc_type (type);
1388 break;
1389
1390 case EM_CRX:
1391 rtype = elf_crx_reloc_type (type);
1392 break;
1393
1394 case EM_VAX:
1395 rtype = elf_vax_reloc_type (type);
1396 break;
1397
1398 case EM_VISIUM:
1399 rtype = elf_visium_reloc_type (type);
1400 break;
1401
1402 case EM_ADAPTEVA_EPIPHANY:
1403 rtype = elf_epiphany_reloc_type (type);
1404 break;
1405
1406 case EM_IP2K:
1407 case EM_IP2K_OLD:
1408 rtype = elf_ip2k_reloc_type (type);
1409 break;
1410
1411 case EM_IQ2000:
1412 rtype = elf_iq2000_reloc_type (type);
1413 break;
1414
1415 case EM_XTENSA_OLD:
1416 case EM_XTENSA:
1417 rtype = elf_xtensa_reloc_type (type);
1418 break;
1419
1420 case EM_LATTICEMICO32:
1421 rtype = elf_lm32_reloc_type (type);
1422 break;
1423
1424 case EM_M32C_OLD:
1425 case EM_M32C:
1426 rtype = elf_m32c_reloc_type (type);
1427 break;
1428
1429 case EM_MT:
1430 rtype = elf_mt_reloc_type (type);
1431 break;
1432
1433 case EM_BLACKFIN:
1434 rtype = elf_bfin_reloc_type (type);
1435 break;
1436
1437 case EM_CYGNUS_MEP:
1438 rtype = elf_mep_reloc_type (type);
1439 break;
1440
1441 case EM_CR16:
1442 rtype = elf_cr16_reloc_type (type);
1443 break;
1444
1445 case EM_MICROBLAZE:
1446 case EM_MICROBLAZE_OLD:
1447 rtype = elf_microblaze_reloc_type (type);
1448 break;
1449
1450 case EM_RL78:
1451 rtype = elf_rl78_reloc_type (type);
1452 break;
1453
1454 case EM_RX:
1455 rtype = elf_rx_reloc_type (type);
1456 break;
1457
1458 case EM_METAG:
1459 rtype = elf_metag_reloc_type (type);
1460 break;
1461
1462 case EM_XC16X:
1463 case EM_C166:
1464 rtype = elf_xc16x_reloc_type (type);
1465 break;
1466
1467 case EM_TI_C6000:
1468 rtype = elf_tic6x_reloc_type (type);
1469 break;
1470
1471 case EM_TILEGX:
1472 rtype = elf_tilegx_reloc_type (type);
1473 break;
1474
1475 case EM_TILEPRO:
1476 rtype = elf_tilepro_reloc_type (type);
1477 break;
1478
1479 case EM_XGATE:
1480 rtype = elf_xgate_reloc_type (type);
1481 break;
1482
1483 case EM_ALTERA_NIOS2:
1484 rtype = elf_nios2_reloc_type (type);
1485 break;
1486 }
1487
1488 if (rtype == NULL)
1489 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1490 else
1491 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1492
1493 if (elf_header.e_machine == EM_ALPHA
1494 && rtype != NULL
1495 && streq (rtype, "R_ALPHA_LITUSE")
1496 && is_rela)
1497 {
1498 switch (rels[i].r_addend)
1499 {
1500 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1501 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1502 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1503 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1504 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1505 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1506 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1507 default: rtype = NULL;
1508 }
1509 if (rtype)
1510 printf (" (%s)", rtype);
1511 else
1512 {
1513 putchar (' ');
1514 printf (_("<unknown addend: %lx>"),
1515 (unsigned long) rels[i].r_addend);
1516 }
1517 }
1518 else if (symtab_index)
1519 {
1520 if (symtab == NULL || symtab_index >= nsyms)
1521 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1522 else
1523 {
1524 Elf_Internal_Sym * psym;
1525 const char * version_string;
1526 enum versioned_symbol_info sym_info;
1527 unsigned short vna_other;
1528
1529 psym = symtab + symtab_index;
1530
1531 version_string
1532 = get_symbol_version_string (file, is_dynsym,
1533 strtab, strtablen,
1534 symtab_index,
1535 psym,
1536 &sym_info,
1537 &vna_other);
1538
1539 printf (" ");
1540
1541 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1542 {
1543 const char * name;
1544 unsigned int len;
1545 unsigned int width = is_32bit_elf ? 8 : 14;
1546
1547 /* Relocations against GNU_IFUNC symbols do not use the value
1548 of the symbol as the address to relocate against. Instead
1549 they invoke the function named by the symbol and use its
1550 result as the address for relocation.
1551
1552 To indicate this to the user, do not display the value of
1553 the symbol in the "Symbols's Value" field. Instead show
1554 its name followed by () as a hint that the symbol is
1555 invoked. */
1556
1557 if (strtab == NULL
1558 || psym->st_name == 0
1559 || psym->st_name >= strtablen)
1560 name = "??";
1561 else
1562 name = strtab + psym->st_name;
1563
1564 len = print_symbol (width, name);
1565 if (version_string)
1566 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1567 version_string);
1568 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1569 }
1570 else
1571 {
1572 print_vma (psym->st_value, LONG_HEX);
1573
1574 printf (is_32bit_elf ? " " : " ");
1575 }
1576
1577 if (psym->st_name == 0)
1578 {
1579 const char * sec_name = "<null>";
1580 char name_buf[40];
1581
1582 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1583 {
1584 if (psym->st_shndx < elf_header.e_shnum)
1585 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1586 else if (psym->st_shndx == SHN_ABS)
1587 sec_name = "ABS";
1588 else if (psym->st_shndx == SHN_COMMON)
1589 sec_name = "COMMON";
1590 else if ((elf_header.e_machine == EM_MIPS
1591 && psym->st_shndx == SHN_MIPS_SCOMMON)
1592 || (elf_header.e_machine == EM_TI_C6000
1593 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1594 sec_name = "SCOMMON";
1595 else if (elf_header.e_machine == EM_MIPS
1596 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1597 sec_name = "SUNDEF";
1598 else if ((elf_header.e_machine == EM_X86_64
1599 || elf_header.e_machine == EM_L1OM
1600 || elf_header.e_machine == EM_K1OM)
1601 && psym->st_shndx == SHN_X86_64_LCOMMON)
1602 sec_name = "LARGE_COMMON";
1603 else if (elf_header.e_machine == EM_IA_64
1604 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1605 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1606 sec_name = "ANSI_COM";
1607 else if (is_ia64_vms ()
1608 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1609 sec_name = "VMS_SYMVEC";
1610 else
1611 {
1612 sprintf (name_buf, "<section 0x%x>",
1613 (unsigned int) psym->st_shndx);
1614 sec_name = name_buf;
1615 }
1616 }
1617 print_symbol (22, sec_name);
1618 }
1619 else if (strtab == NULL)
1620 printf (_("<string table index: %3ld>"), psym->st_name);
1621 else if (psym->st_name >= strtablen)
1622 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1623 else
1624 {
1625 print_symbol (22, strtab + psym->st_name);
1626 if (version_string)
1627 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1628 version_string);
1629 }
1630
1631 if (is_rela)
1632 {
1633 bfd_vma off = rels[i].r_addend;
1634
1635 if ((bfd_signed_vma) off < 0)
1636 printf (" - %" BFD_VMA_FMT "x", - off);
1637 else
1638 printf (" + %" BFD_VMA_FMT "x", off);
1639 }
1640 }
1641 }
1642 else if (is_rela)
1643 {
1644 bfd_vma off = rels[i].r_addend;
1645
1646 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1647 if ((bfd_signed_vma) off < 0)
1648 printf ("-%" BFD_VMA_FMT "x", - off);
1649 else
1650 printf ("%" BFD_VMA_FMT "x", off);
1651 }
1652
1653 if (elf_header.e_machine == EM_SPARCV9
1654 && rtype != NULL
1655 && streq (rtype, "R_SPARC_OLO10"))
1656 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1657
1658 putchar ('\n');
1659
1660 #ifdef BFD64
1661 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1662 {
1663 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1664 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1665 const char * rtype2 = elf_mips_reloc_type (type2);
1666 const char * rtype3 = elf_mips_reloc_type (type3);
1667
1668 printf (" Type2: ");
1669
1670 if (rtype2 == NULL)
1671 printf (_("unrecognized: %-7lx"),
1672 (unsigned long) type2 & 0xffffffff);
1673 else
1674 printf ("%-17.17s", rtype2);
1675
1676 printf ("\n Type3: ");
1677
1678 if (rtype3 == NULL)
1679 printf (_("unrecognized: %-7lx"),
1680 (unsigned long) type3 & 0xffffffff);
1681 else
1682 printf ("%-17.17s", rtype3);
1683
1684 putchar ('\n');
1685 }
1686 #endif /* BFD64 */
1687 }
1688
1689 free (rels);
1690 }
1691
1692 static const char *
1693 get_mips_dynamic_type (unsigned long type)
1694 {
1695 switch (type)
1696 {
1697 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1698 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1699 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1700 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1701 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1702 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1703 case DT_MIPS_MSYM: return "MIPS_MSYM";
1704 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1705 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1706 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1707 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1708 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1709 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1710 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1711 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1712 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1713 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1714 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1715 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1716 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1717 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1718 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1719 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1720 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1721 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1722 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1723 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1724 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1725 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1726 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1727 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1728 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1729 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1730 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1731 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1732 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1733 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1734 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1735 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1736 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1737 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1738 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1739 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1740 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1741 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1742 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1743 default:
1744 return NULL;
1745 }
1746 }
1747
1748 static const char *
1749 get_sparc64_dynamic_type (unsigned long type)
1750 {
1751 switch (type)
1752 {
1753 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1754 default:
1755 return NULL;
1756 }
1757 }
1758
1759 static const char *
1760 get_ppc_dynamic_type (unsigned long type)
1761 {
1762 switch (type)
1763 {
1764 case DT_PPC_GOT: return "PPC_GOT";
1765 case DT_PPC_OPT: return "PPC_OPT";
1766 default:
1767 return NULL;
1768 }
1769 }
1770
1771 static const char *
1772 get_ppc64_dynamic_type (unsigned long type)
1773 {
1774 switch (type)
1775 {
1776 case DT_PPC64_GLINK: return "PPC64_GLINK";
1777 case DT_PPC64_OPD: return "PPC64_OPD";
1778 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1779 case DT_PPC64_OPT: return "PPC64_OPT";
1780 default:
1781 return NULL;
1782 }
1783 }
1784
1785 static const char *
1786 get_parisc_dynamic_type (unsigned long type)
1787 {
1788 switch (type)
1789 {
1790 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1791 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1792 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1793 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1794 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1795 case DT_HP_PREINIT: return "HP_PREINIT";
1796 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1797 case DT_HP_NEEDED: return "HP_NEEDED";
1798 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1799 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1800 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1801 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1802 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1803 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1804 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1805 case DT_HP_FILTERED: return "HP_FILTERED";
1806 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1807 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1808 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1809 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1810 case DT_PLT: return "PLT";
1811 case DT_PLT_SIZE: return "PLT_SIZE";
1812 case DT_DLT: return "DLT";
1813 case DT_DLT_SIZE: return "DLT_SIZE";
1814 default:
1815 return NULL;
1816 }
1817 }
1818
1819 static const char *
1820 get_ia64_dynamic_type (unsigned long type)
1821 {
1822 switch (type)
1823 {
1824 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1825 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1826 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1827 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1828 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1829 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1830 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1831 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1832 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1833 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1834 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1835 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1836 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1837 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1838 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1839 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1840 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1841 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1842 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1843 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1844 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1845 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1846 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1847 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1848 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1849 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1850 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1851 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1852 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1853 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1854 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1855 default:
1856 return NULL;
1857 }
1858 }
1859
1860 static const char *
1861 get_solaris_section_type (unsigned long type)
1862 {
1863 switch (type)
1864 {
1865 case 0x6fffffee: return "SUNW_ancillary";
1866 case 0x6fffffef: return "SUNW_capchain";
1867 case 0x6ffffff0: return "SUNW_capinfo";
1868 case 0x6ffffff1: return "SUNW_symsort";
1869 case 0x6ffffff2: return "SUNW_tlssort";
1870 case 0x6ffffff3: return "SUNW_LDYNSYM";
1871 case 0x6ffffff4: return "SUNW_dof";
1872 case 0x6ffffff5: return "SUNW_cap";
1873 case 0x6ffffff6: return "SUNW_SIGNATURE";
1874 case 0x6ffffff7: return "SUNW_ANNOTATE";
1875 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1876 case 0x6ffffff9: return "SUNW_DEBUG";
1877 case 0x6ffffffa: return "SUNW_move";
1878 case 0x6ffffffb: return "SUNW_COMDAT";
1879 case 0x6ffffffc: return "SUNW_syminfo";
1880 case 0x6ffffffd: return "SUNW_verdef";
1881 case 0x6ffffffe: return "SUNW_verneed";
1882 case 0x6fffffff: return "SUNW_versym";
1883 case 0x70000000: return "SPARC_GOTDATA";
1884 default: return NULL;
1885 }
1886 }
1887
1888 static const char *
1889 get_alpha_dynamic_type (unsigned long type)
1890 {
1891 switch (type)
1892 {
1893 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1894 default:
1895 return NULL;
1896 }
1897 }
1898
1899 static const char *
1900 get_score_dynamic_type (unsigned long type)
1901 {
1902 switch (type)
1903 {
1904 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1905 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1906 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1907 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1908 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1909 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1910 default:
1911 return NULL;
1912 }
1913 }
1914
1915 static const char *
1916 get_tic6x_dynamic_type (unsigned long type)
1917 {
1918 switch (type)
1919 {
1920 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1921 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1922 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1923 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1924 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1925 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1926 default:
1927 return NULL;
1928 }
1929 }
1930
1931 static const char *
1932 get_nios2_dynamic_type (unsigned long type)
1933 {
1934 switch (type)
1935 {
1936 case DT_NIOS2_GP: return "NIOS2_GP";
1937 default:
1938 return NULL;
1939 }
1940 }
1941
1942 static const char *
1943 get_solaris_dynamic_type (unsigned long type)
1944 {
1945 switch (type)
1946 {
1947 case 0x6000000d: return "SUNW_AUXILIARY";
1948 case 0x6000000e: return "SUNW_RTLDINF";
1949 case 0x6000000f: return "SUNW_FILTER";
1950 case 0x60000010: return "SUNW_CAP";
1951 case 0x60000011: return "SUNW_SYMTAB";
1952 case 0x60000012: return "SUNW_SYMSZ";
1953 case 0x60000013: return "SUNW_SORTENT";
1954 case 0x60000014: return "SUNW_SYMSORT";
1955 case 0x60000015: return "SUNW_SYMSORTSZ";
1956 case 0x60000016: return "SUNW_TLSSORT";
1957 case 0x60000017: return "SUNW_TLSSORTSZ";
1958 case 0x60000018: return "SUNW_CAPINFO";
1959 case 0x60000019: return "SUNW_STRPAD";
1960 case 0x6000001a: return "SUNW_CAPCHAIN";
1961 case 0x6000001b: return "SUNW_LDMACH";
1962 case 0x6000001d: return "SUNW_CAPCHAINENT";
1963 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1964 case 0x60000021: return "SUNW_PARENT";
1965 case 0x60000023: return "SUNW_ASLR";
1966 case 0x60000025: return "SUNW_RELAX";
1967 case 0x60000029: return "SUNW_NXHEAP";
1968 case 0x6000002b: return "SUNW_NXSTACK";
1969
1970 case 0x70000001: return "SPARC_REGISTER";
1971 case 0x7ffffffd: return "AUXILIARY";
1972 case 0x7ffffffe: return "USED";
1973 case 0x7fffffff: return "FILTER";
1974
1975 default: return NULL;
1976 }
1977 }
1978
1979 static const char *
1980 get_dynamic_type (unsigned long type)
1981 {
1982 static char buff[64];
1983
1984 switch (type)
1985 {
1986 case DT_NULL: return "NULL";
1987 case DT_NEEDED: return "NEEDED";
1988 case DT_PLTRELSZ: return "PLTRELSZ";
1989 case DT_PLTGOT: return "PLTGOT";
1990 case DT_HASH: return "HASH";
1991 case DT_STRTAB: return "STRTAB";
1992 case DT_SYMTAB: return "SYMTAB";
1993 case DT_RELA: return "RELA";
1994 case DT_RELASZ: return "RELASZ";
1995 case DT_RELAENT: return "RELAENT";
1996 case DT_STRSZ: return "STRSZ";
1997 case DT_SYMENT: return "SYMENT";
1998 case DT_INIT: return "INIT";
1999 case DT_FINI: return "FINI";
2000 case DT_SONAME: return "SONAME";
2001 case DT_RPATH: return "RPATH";
2002 case DT_SYMBOLIC: return "SYMBOLIC";
2003 case DT_REL: return "REL";
2004 case DT_RELSZ: return "RELSZ";
2005 case DT_RELENT: return "RELENT";
2006 case DT_PLTREL: return "PLTREL";
2007 case DT_DEBUG: return "DEBUG";
2008 case DT_TEXTREL: return "TEXTREL";
2009 case DT_JMPREL: return "JMPREL";
2010 case DT_BIND_NOW: return "BIND_NOW";
2011 case DT_INIT_ARRAY: return "INIT_ARRAY";
2012 case DT_FINI_ARRAY: return "FINI_ARRAY";
2013 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2014 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2015 case DT_RUNPATH: return "RUNPATH";
2016 case DT_FLAGS: return "FLAGS";
2017
2018 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2019 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2020 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2021
2022 case DT_CHECKSUM: return "CHECKSUM";
2023 case DT_PLTPADSZ: return "PLTPADSZ";
2024 case DT_MOVEENT: return "MOVEENT";
2025 case DT_MOVESZ: return "MOVESZ";
2026 case DT_FEATURE: return "FEATURE";
2027 case DT_POSFLAG_1: return "POSFLAG_1";
2028 case DT_SYMINSZ: return "SYMINSZ";
2029 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2030
2031 case DT_ADDRRNGLO: return "ADDRRNGLO";
2032 case DT_CONFIG: return "CONFIG";
2033 case DT_DEPAUDIT: return "DEPAUDIT";
2034 case DT_AUDIT: return "AUDIT";
2035 case DT_PLTPAD: return "PLTPAD";
2036 case DT_MOVETAB: return "MOVETAB";
2037 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2038
2039 case DT_VERSYM: return "VERSYM";
2040
2041 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2042 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2043 case DT_RELACOUNT: return "RELACOUNT";
2044 case DT_RELCOUNT: return "RELCOUNT";
2045 case DT_FLAGS_1: return "FLAGS_1";
2046 case DT_VERDEF: return "VERDEF";
2047 case DT_VERDEFNUM: return "VERDEFNUM";
2048 case DT_VERNEED: return "VERNEED";
2049 case DT_VERNEEDNUM: return "VERNEEDNUM";
2050
2051 case DT_AUXILIARY: return "AUXILIARY";
2052 case DT_USED: return "USED";
2053 case DT_FILTER: return "FILTER";
2054
2055 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2056 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2057 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2058 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2059 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2060 case DT_GNU_HASH: return "GNU_HASH";
2061
2062 default:
2063 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2064 {
2065 const char * result;
2066
2067 switch (elf_header.e_machine)
2068 {
2069 case EM_MIPS:
2070 case EM_MIPS_RS3_LE:
2071 result = get_mips_dynamic_type (type);
2072 break;
2073 case EM_SPARCV9:
2074 result = get_sparc64_dynamic_type (type);
2075 break;
2076 case EM_PPC:
2077 result = get_ppc_dynamic_type (type);
2078 break;
2079 case EM_PPC64:
2080 result = get_ppc64_dynamic_type (type);
2081 break;
2082 case EM_IA_64:
2083 result = get_ia64_dynamic_type (type);
2084 break;
2085 case EM_ALPHA:
2086 result = get_alpha_dynamic_type (type);
2087 break;
2088 case EM_SCORE:
2089 result = get_score_dynamic_type (type);
2090 break;
2091 case EM_TI_C6000:
2092 result = get_tic6x_dynamic_type (type);
2093 break;
2094 case EM_ALTERA_NIOS2:
2095 result = get_nios2_dynamic_type (type);
2096 break;
2097 default:
2098 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2099 result = get_solaris_dynamic_type (type);
2100 else
2101 result = NULL;
2102 break;
2103 }
2104
2105 if (result != NULL)
2106 return result;
2107
2108 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2109 }
2110 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2111 || (elf_header.e_machine == EM_PARISC
2112 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2113 {
2114 const char * result;
2115
2116 switch (elf_header.e_machine)
2117 {
2118 case EM_PARISC:
2119 result = get_parisc_dynamic_type (type);
2120 break;
2121 case EM_IA_64:
2122 result = get_ia64_dynamic_type (type);
2123 break;
2124 default:
2125 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2126 result = get_solaris_dynamic_type (type);
2127 else
2128 result = NULL;
2129 break;
2130 }
2131
2132 if (result != NULL)
2133 return result;
2134
2135 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2136 type);
2137 }
2138 else
2139 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2140
2141 return buff;
2142 }
2143 }
2144
2145 static char *
2146 get_file_type (unsigned e_type)
2147 {
2148 static char buff[32];
2149
2150 switch (e_type)
2151 {
2152 case ET_NONE: return _("NONE (None)");
2153 case ET_REL: return _("REL (Relocatable file)");
2154 case ET_EXEC: return _("EXEC (Executable file)");
2155 case ET_DYN: return _("DYN (Shared object file)");
2156 case ET_CORE: return _("CORE (Core file)");
2157
2158 default:
2159 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2160 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2161 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2162 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2163 else
2164 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2165 return buff;
2166 }
2167 }
2168
2169 static char *
2170 get_machine_name (unsigned e_machine)
2171 {
2172 static char buff[64]; /* XXX */
2173
2174 switch (e_machine)
2175 {
2176 case EM_NONE: return _("None");
2177 case EM_AARCH64: return "AArch64";
2178 case EM_M32: return "WE32100";
2179 case EM_SPARC: return "Sparc";
2180 case EM_SPU: return "SPU";
2181 case EM_386: return "Intel 80386";
2182 case EM_68K: return "MC68000";
2183 case EM_88K: return "MC88000";
2184 case EM_IAMCU: return "Intel MCU";
2185 case EM_860: return "Intel 80860";
2186 case EM_MIPS: return "MIPS R3000";
2187 case EM_S370: return "IBM System/370";
2188 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2189 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2190 case EM_PARISC: return "HPPA";
2191 case EM_PPC_OLD: return "Power PC (old)";
2192 case EM_SPARC32PLUS: return "Sparc v8+" ;
2193 case EM_960: return "Intel 90860";
2194 case EM_PPC: return "PowerPC";
2195 case EM_PPC64: return "PowerPC64";
2196 case EM_FR20: return "Fujitsu FR20";
2197 case EM_FT32: return "FTDI FT32";
2198 case EM_RH32: return "TRW RH32";
2199 case EM_MCORE: return "MCORE";
2200 case EM_ARM: return "ARM";
2201 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2202 case EM_SH: return "Renesas / SuperH SH";
2203 case EM_SPARCV9: return "Sparc v9";
2204 case EM_TRICORE: return "Siemens Tricore";
2205 case EM_ARC: return "ARC";
2206 case EM_ARC_COMPACT: return "ARCompact";
2207 case EM_ARC_COMPACT2: return "ARCv2";
2208 case EM_H8_300: return "Renesas H8/300";
2209 case EM_H8_300H: return "Renesas H8/300H";
2210 case EM_H8S: return "Renesas H8S";
2211 case EM_H8_500: return "Renesas H8/500";
2212 case EM_IA_64: return "Intel IA-64";
2213 case EM_MIPS_X: return "Stanford MIPS-X";
2214 case EM_COLDFIRE: return "Motorola Coldfire";
2215 case EM_ALPHA: return "Alpha";
2216 case EM_CYGNUS_D10V:
2217 case EM_D10V: return "d10v";
2218 case EM_CYGNUS_D30V:
2219 case EM_D30V: return "d30v";
2220 case EM_CYGNUS_M32R:
2221 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2222 case EM_CYGNUS_V850:
2223 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2224 case EM_V850: return "Renesas V850";
2225 case EM_CYGNUS_MN10300:
2226 case EM_MN10300: return "mn10300";
2227 case EM_CYGNUS_MN10200:
2228 case EM_MN10200: return "mn10200";
2229 case EM_MOXIE: return "Moxie";
2230 case EM_CYGNUS_FR30:
2231 case EM_FR30: return "Fujitsu FR30";
2232 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2233 case EM_PJ_OLD:
2234 case EM_PJ: return "picoJava";
2235 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2236 case EM_PCP: return "Siemens PCP";
2237 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2238 case EM_NDR1: return "Denso NDR1 microprocesspr";
2239 case EM_STARCORE: return "Motorola Star*Core processor";
2240 case EM_ME16: return "Toyota ME16 processor";
2241 case EM_ST100: return "STMicroelectronics ST100 processor";
2242 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2243 case EM_PDSP: return "Sony DSP processor";
2244 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2245 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2246 case EM_FX66: return "Siemens FX66 microcontroller";
2247 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2248 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2249 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2250 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2251 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2252 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2253 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2254 case EM_SVX: return "Silicon Graphics SVx";
2255 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2256 case EM_VAX: return "Digital VAX";
2257 case EM_VISIUM: return "CDS VISIUMcore processor";
2258 case EM_AVR_OLD:
2259 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2260 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2261 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2262 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2263 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2264 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2265 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2266 case EM_PRISM: return "Vitesse Prism";
2267 case EM_X86_64: return "Advanced Micro Devices X86-64";
2268 case EM_L1OM: return "Intel L1OM";
2269 case EM_K1OM: return "Intel K1OM";
2270 case EM_S390_OLD:
2271 case EM_S390: return "IBM S/390";
2272 case EM_SCORE: return "SUNPLUS S+Core";
2273 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2274 case EM_OR1K: return "OpenRISC 1000";
2275 case EM_CRX: return "National Semiconductor CRX microprocessor";
2276 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2277 case EM_DLX: return "OpenDLX";
2278 case EM_IP2K_OLD:
2279 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2280 case EM_IQ2000: return "Vitesse IQ2000";
2281 case EM_XTENSA_OLD:
2282 case EM_XTENSA: return "Tensilica Xtensa Processor";
2283 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2284 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2285 case EM_NS32K: return "National Semiconductor 32000 series";
2286 case EM_TPC: return "Tenor Network TPC processor";
2287 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2288 case EM_MAX: return "MAX Processor";
2289 case EM_CR: return "National Semiconductor CompactRISC";
2290 case EM_F2MC16: return "Fujitsu F2MC16";
2291 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2292 case EM_LATTICEMICO32: return "Lattice Mico32";
2293 case EM_M32C_OLD:
2294 case EM_M32C: return "Renesas M32c";
2295 case EM_MT: return "Morpho Techologies MT processor";
2296 case EM_BLACKFIN: return "Analog Devices Blackfin";
2297 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2298 case EM_SEP: return "Sharp embedded microprocessor";
2299 case EM_ARCA: return "Arca RISC microprocessor";
2300 case EM_UNICORE: return "Unicore";
2301 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2302 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2303 case EM_NIOS32: return "Altera Nios";
2304 case EM_ALTERA_NIOS2: return "Altera Nios II";
2305 case EM_C166:
2306 case EM_XC16X: return "Infineon Technologies xc16x";
2307 case EM_M16C: return "Renesas M16C series microprocessors";
2308 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2309 case EM_CE: return "Freescale Communication Engine RISC core";
2310 case EM_TSK3000: return "Altium TSK3000 core";
2311 case EM_RS08: return "Freescale RS08 embedded processor";
2312 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2313 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2314 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2315 case EM_SE_C17: return "Seiko Epson C17 family";
2316 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2317 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2318 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2319 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2320 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2321 case EM_R32C: return "Renesas R32C series microprocessors";
2322 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2323 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2324 case EM_8051: return "Intel 8051 and variants";
2325 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2326 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2327 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2328 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2329 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2330 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2331 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2332 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2333 case EM_CR16:
2334 case EM_MICROBLAZE:
2335 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2336 case EM_RISCV: return "RISC-V";
2337 case EM_RL78: return "Renesas RL78";
2338 case EM_RX: return "Renesas RX";
2339 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2340 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2341 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2342 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2343 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2344 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2345 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2346 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2347 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2348 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2349 case EM_CUDA: return "NVIDIA CUDA architecture";
2350 case EM_XGATE: return "Motorola XGATE embedded processor";
2351 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2352 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2353 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2354 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2355 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2356 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2357 case EM_BA1: return "Beyond BA1 CPU architecture";
2358 case EM_BA2: return "Beyond BA2 CPU architecture";
2359 case EM_XCORE: return "XMOS xCORE processor family";
2360 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2361 case EM_KM32: return "KM211 KM32 32-bit processor";
2362 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2363 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2364 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2365 case EM_KVARC: return "KM211 KVARC processor";
2366 case EM_CDP: return "Paneve CDP architecture family";
2367 case EM_COGE: return "Cognitive Smart Memory Processor";
2368 case EM_COOL: return "Bluechip Systems CoolEngine";
2369 case EM_NORC: return "Nanoradio Optimized RISC";
2370 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2371 case EM_Z80: return "Zilog Z80";
2372 case EM_AMDGPU: return "AMD GPU architecture";
2373 default:
2374 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2375 return buff;
2376 }
2377 }
2378
2379 static void
2380 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2381 {
2382 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2383 other compilers don't a specific architecture type in the e_flags, and
2384 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2385 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2386 architectures.
2387
2388 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2389 but also sets a specific architecture type in the e_flags field.
2390
2391 However, when decoding the flags we don't worry if we see an
2392 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2393 ARCEM architecture type. */
2394
2395 switch (e_flags & EF_ARC_MACH_MSK)
2396 {
2397 /* We only expect these to occur for EM_ARC_COMPACT2. */
2398 case EF_ARC_CPU_ARCV2EM:
2399 strcat (buf, ", ARC EM");
2400 break;
2401 case EF_ARC_CPU_ARCV2HS:
2402 strcat (buf, ", ARC HS");
2403 break;
2404
2405 /* We only expect these to occur for EM_ARC_COMPACT. */
2406 case E_ARC_MACH_ARC600:
2407 strcat (buf, ", ARC600");
2408 break;
2409 case E_ARC_MACH_ARC601:
2410 strcat (buf, ", ARC601");
2411 break;
2412 case E_ARC_MACH_ARC700:
2413 strcat (buf, ", ARC700");
2414 break;
2415
2416 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2417 new ELF with new architecture being read by an old version of
2418 readelf, or (c) An ELF built with non-GNU compiler that does not
2419 set the architecture in the e_flags. */
2420 default:
2421 if (e_machine == EM_ARC_COMPACT)
2422 strcat (buf, ", Unknown ARCompact");
2423 else
2424 strcat (buf, ", Unknown ARC");
2425 break;
2426 }
2427
2428 switch (e_flags & EF_ARC_OSABI_MSK)
2429 {
2430 case E_ARC_OSABI_ORIG:
2431 strcat (buf, ", (ABI:legacy)");
2432 break;
2433 case E_ARC_OSABI_V2:
2434 strcat (buf, ", (ABI:v2)");
2435 break;
2436 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2437 case E_ARC_OSABI_V3:
2438 strcat (buf, ", v3 no-legacy-syscalls ABI");
2439 break;
2440 default:
2441 strcat (buf, ", unrecognised ARC OSABI flag");
2442 break;
2443 }
2444 }
2445
2446 static void
2447 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2448 {
2449 unsigned eabi;
2450 int unknown = 0;
2451
2452 eabi = EF_ARM_EABI_VERSION (e_flags);
2453 e_flags &= ~ EF_ARM_EABIMASK;
2454
2455 /* Handle "generic" ARM flags. */
2456 if (e_flags & EF_ARM_RELEXEC)
2457 {
2458 strcat (buf, ", relocatable executable");
2459 e_flags &= ~ EF_ARM_RELEXEC;
2460 }
2461
2462 /* Now handle EABI specific flags. */
2463 switch (eabi)
2464 {
2465 default:
2466 strcat (buf, ", <unrecognized EABI>");
2467 if (e_flags)
2468 unknown = 1;
2469 break;
2470
2471 case EF_ARM_EABI_VER1:
2472 strcat (buf, ", Version1 EABI");
2473 while (e_flags)
2474 {
2475 unsigned flag;
2476
2477 /* Process flags one bit at a time. */
2478 flag = e_flags & - e_flags;
2479 e_flags &= ~ flag;
2480
2481 switch (flag)
2482 {
2483 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2484 strcat (buf, ", sorted symbol tables");
2485 break;
2486
2487 default:
2488 unknown = 1;
2489 break;
2490 }
2491 }
2492 break;
2493
2494 case EF_ARM_EABI_VER2:
2495 strcat (buf, ", Version2 EABI");
2496 while (e_flags)
2497 {
2498 unsigned flag;
2499
2500 /* Process flags one bit at a time. */
2501 flag = e_flags & - e_flags;
2502 e_flags &= ~ flag;
2503
2504 switch (flag)
2505 {
2506 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2507 strcat (buf, ", sorted symbol tables");
2508 break;
2509
2510 case EF_ARM_DYNSYMSUSESEGIDX:
2511 strcat (buf, ", dynamic symbols use segment index");
2512 break;
2513
2514 case EF_ARM_MAPSYMSFIRST:
2515 strcat (buf, ", mapping symbols precede others");
2516 break;
2517
2518 default:
2519 unknown = 1;
2520 break;
2521 }
2522 }
2523 break;
2524
2525 case EF_ARM_EABI_VER3:
2526 strcat (buf, ", Version3 EABI");
2527 break;
2528
2529 case EF_ARM_EABI_VER4:
2530 strcat (buf, ", Version4 EABI");
2531 while (e_flags)
2532 {
2533 unsigned flag;
2534
2535 /* Process flags one bit at a time. */
2536 flag = e_flags & - e_flags;
2537 e_flags &= ~ flag;
2538
2539 switch (flag)
2540 {
2541 case EF_ARM_BE8:
2542 strcat (buf, ", BE8");
2543 break;
2544
2545 case EF_ARM_LE8:
2546 strcat (buf, ", LE8");
2547 break;
2548
2549 default:
2550 unknown = 1;
2551 break;
2552 }
2553 break;
2554 }
2555 break;
2556
2557 case EF_ARM_EABI_VER5:
2558 strcat (buf, ", Version5 EABI");
2559 while (e_flags)
2560 {
2561 unsigned flag;
2562
2563 /* Process flags one bit at a time. */
2564 flag = e_flags & - e_flags;
2565 e_flags &= ~ flag;
2566
2567 switch (flag)
2568 {
2569 case EF_ARM_BE8:
2570 strcat (buf, ", BE8");
2571 break;
2572
2573 case EF_ARM_LE8:
2574 strcat (buf, ", LE8");
2575 break;
2576
2577 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2578 strcat (buf, ", soft-float ABI");
2579 break;
2580
2581 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2582 strcat (buf, ", hard-float ABI");
2583 break;
2584
2585 default:
2586 unknown = 1;
2587 break;
2588 }
2589 }
2590 break;
2591
2592 case EF_ARM_EABI_UNKNOWN:
2593 strcat (buf, ", GNU EABI");
2594 while (e_flags)
2595 {
2596 unsigned flag;
2597
2598 /* Process flags one bit at a time. */
2599 flag = e_flags & - e_flags;
2600 e_flags &= ~ flag;
2601
2602 switch (flag)
2603 {
2604 case EF_ARM_INTERWORK:
2605 strcat (buf, ", interworking enabled");
2606 break;
2607
2608 case EF_ARM_APCS_26:
2609 strcat (buf, ", uses APCS/26");
2610 break;
2611
2612 case EF_ARM_APCS_FLOAT:
2613 strcat (buf, ", uses APCS/float");
2614 break;
2615
2616 case EF_ARM_PIC:
2617 strcat (buf, ", position independent");
2618 break;
2619
2620 case EF_ARM_ALIGN8:
2621 strcat (buf, ", 8 bit structure alignment");
2622 break;
2623
2624 case EF_ARM_NEW_ABI:
2625 strcat (buf, ", uses new ABI");
2626 break;
2627
2628 case EF_ARM_OLD_ABI:
2629 strcat (buf, ", uses old ABI");
2630 break;
2631
2632 case EF_ARM_SOFT_FLOAT:
2633 strcat (buf, ", software FP");
2634 break;
2635
2636 case EF_ARM_VFP_FLOAT:
2637 strcat (buf, ", VFP");
2638 break;
2639
2640 case EF_ARM_MAVERICK_FLOAT:
2641 strcat (buf, ", Maverick FP");
2642 break;
2643
2644 default:
2645 unknown = 1;
2646 break;
2647 }
2648 }
2649 }
2650
2651 if (unknown)
2652 strcat (buf,_(", <unknown>"));
2653 }
2654
2655 static void
2656 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2657 {
2658 --size; /* Leave space for null terminator. */
2659
2660 switch (e_flags & EF_AVR_MACH)
2661 {
2662 case E_AVR_MACH_AVR1:
2663 strncat (buf, ", avr:1", size);
2664 break;
2665 case E_AVR_MACH_AVR2:
2666 strncat (buf, ", avr:2", size);
2667 break;
2668 case E_AVR_MACH_AVR25:
2669 strncat (buf, ", avr:25", size);
2670 break;
2671 case E_AVR_MACH_AVR3:
2672 strncat (buf, ", avr:3", size);
2673 break;
2674 case E_AVR_MACH_AVR31:
2675 strncat (buf, ", avr:31", size);
2676 break;
2677 case E_AVR_MACH_AVR35:
2678 strncat (buf, ", avr:35", size);
2679 break;
2680 case E_AVR_MACH_AVR4:
2681 strncat (buf, ", avr:4", size);
2682 break;
2683 case E_AVR_MACH_AVR5:
2684 strncat (buf, ", avr:5", size);
2685 break;
2686 case E_AVR_MACH_AVR51:
2687 strncat (buf, ", avr:51", size);
2688 break;
2689 case E_AVR_MACH_AVR6:
2690 strncat (buf, ", avr:6", size);
2691 break;
2692 case E_AVR_MACH_AVRTINY:
2693 strncat (buf, ", avr:100", size);
2694 break;
2695 case E_AVR_MACH_XMEGA1:
2696 strncat (buf, ", avr:101", size);
2697 break;
2698 case E_AVR_MACH_XMEGA2:
2699 strncat (buf, ", avr:102", size);
2700 break;
2701 case E_AVR_MACH_XMEGA3:
2702 strncat (buf, ", avr:103", size);
2703 break;
2704 case E_AVR_MACH_XMEGA4:
2705 strncat (buf, ", avr:104", size);
2706 break;
2707 case E_AVR_MACH_XMEGA5:
2708 strncat (buf, ", avr:105", size);
2709 break;
2710 case E_AVR_MACH_XMEGA6:
2711 strncat (buf, ", avr:106", size);
2712 break;
2713 case E_AVR_MACH_XMEGA7:
2714 strncat (buf, ", avr:107", size);
2715 break;
2716 default:
2717 strncat (buf, ", avr:<unknown>", size);
2718 break;
2719 }
2720
2721 size -= strlen (buf);
2722 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2723 strncat (buf, ", link-relax", size);
2724 }
2725
2726 static void
2727 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2728 {
2729 unsigned abi;
2730 unsigned arch;
2731 unsigned config;
2732 unsigned version;
2733 int has_fpu = 0;
2734 int r = 0;
2735
2736 static const char *ABI_STRINGS[] =
2737 {
2738 "ABI v0", /* use r5 as return register; only used in N1213HC */
2739 "ABI v1", /* use r0 as return register */
2740 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2741 "ABI v2fp", /* for FPU */
2742 "AABI",
2743 "ABI2 FP+"
2744 };
2745 static const char *VER_STRINGS[] =
2746 {
2747 "Andes ELF V1.3 or older",
2748 "Andes ELF V1.3.1",
2749 "Andes ELF V1.4"
2750 };
2751 static const char *ARCH_STRINGS[] =
2752 {
2753 "",
2754 "Andes Star v1.0",
2755 "Andes Star v2.0",
2756 "Andes Star v3.0",
2757 "Andes Star v3.0m"
2758 };
2759
2760 abi = EF_NDS_ABI & e_flags;
2761 arch = EF_NDS_ARCH & e_flags;
2762 config = EF_NDS_INST & e_flags;
2763 version = EF_NDS32_ELF_VERSION & e_flags;
2764
2765 memset (buf, 0, size);
2766
2767 switch (abi)
2768 {
2769 case E_NDS_ABI_V0:
2770 case E_NDS_ABI_V1:
2771 case E_NDS_ABI_V2:
2772 case E_NDS_ABI_V2FP:
2773 case E_NDS_ABI_AABI:
2774 case E_NDS_ABI_V2FP_PLUS:
2775 /* In case there are holes in the array. */
2776 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2777 break;
2778
2779 default:
2780 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2781 break;
2782 }
2783
2784 switch (version)
2785 {
2786 case E_NDS32_ELF_VER_1_2:
2787 case E_NDS32_ELF_VER_1_3:
2788 case E_NDS32_ELF_VER_1_4:
2789 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2790 break;
2791
2792 default:
2793 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2794 break;
2795 }
2796
2797 if (E_NDS_ABI_V0 == abi)
2798 {
2799 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2800 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2801 if (arch == E_NDS_ARCH_STAR_V1_0)
2802 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2803 return;
2804 }
2805
2806 switch (arch)
2807 {
2808 case E_NDS_ARCH_STAR_V1_0:
2809 case E_NDS_ARCH_STAR_V2_0:
2810 case E_NDS_ARCH_STAR_V3_0:
2811 case E_NDS_ARCH_STAR_V3_M:
2812 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2813 break;
2814
2815 default:
2816 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2817 /* ARCH version determines how the e_flags are interpreted.
2818 If it is unknown, we cannot proceed. */
2819 return;
2820 }
2821
2822 /* Newer ABI; Now handle architecture specific flags. */
2823 if (arch == E_NDS_ARCH_STAR_V1_0)
2824 {
2825 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2826 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2827
2828 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2829 r += snprintf (buf + r, size -r, ", MAC");
2830
2831 if (config & E_NDS32_HAS_DIV_INST)
2832 r += snprintf (buf + r, size -r, ", DIV");
2833
2834 if (config & E_NDS32_HAS_16BIT_INST)
2835 r += snprintf (buf + r, size -r, ", 16b");
2836 }
2837 else
2838 {
2839 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2840 {
2841 if (version <= E_NDS32_ELF_VER_1_3)
2842 r += snprintf (buf + r, size -r, ", [B8]");
2843 else
2844 r += snprintf (buf + r, size -r, ", EX9");
2845 }
2846
2847 if (config & E_NDS32_HAS_MAC_DX_INST)
2848 r += snprintf (buf + r, size -r, ", MAC_DX");
2849
2850 if (config & E_NDS32_HAS_DIV_DX_INST)
2851 r += snprintf (buf + r, size -r, ", DIV_DX");
2852
2853 if (config & E_NDS32_HAS_16BIT_INST)
2854 {
2855 if (version <= E_NDS32_ELF_VER_1_3)
2856 r += snprintf (buf + r, size -r, ", 16b");
2857 else
2858 r += snprintf (buf + r, size -r, ", IFC");
2859 }
2860 }
2861
2862 if (config & E_NDS32_HAS_EXT_INST)
2863 r += snprintf (buf + r, size -r, ", PERF1");
2864
2865 if (config & E_NDS32_HAS_EXT2_INST)
2866 r += snprintf (buf + r, size -r, ", PERF2");
2867
2868 if (config & E_NDS32_HAS_FPU_INST)
2869 {
2870 has_fpu = 1;
2871 r += snprintf (buf + r, size -r, ", FPU_SP");
2872 }
2873
2874 if (config & E_NDS32_HAS_FPU_DP_INST)
2875 {
2876 has_fpu = 1;
2877 r += snprintf (buf + r, size -r, ", FPU_DP");
2878 }
2879
2880 if (config & E_NDS32_HAS_FPU_MAC_INST)
2881 {
2882 has_fpu = 1;
2883 r += snprintf (buf + r, size -r, ", FPU_MAC");
2884 }
2885
2886 if (has_fpu)
2887 {
2888 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2889 {
2890 case E_NDS32_FPU_REG_8SP_4DP:
2891 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2892 break;
2893 case E_NDS32_FPU_REG_16SP_8DP:
2894 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2895 break;
2896 case E_NDS32_FPU_REG_32SP_16DP:
2897 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2898 break;
2899 case E_NDS32_FPU_REG_32SP_32DP:
2900 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2901 break;
2902 }
2903 }
2904
2905 if (config & E_NDS32_HAS_AUDIO_INST)
2906 r += snprintf (buf + r, size -r, ", AUDIO");
2907
2908 if (config & E_NDS32_HAS_STRING_INST)
2909 r += snprintf (buf + r, size -r, ", STR");
2910
2911 if (config & E_NDS32_HAS_REDUCED_REGS)
2912 r += snprintf (buf + r, size -r, ", 16REG");
2913
2914 if (config & E_NDS32_HAS_VIDEO_INST)
2915 {
2916 if (version <= E_NDS32_ELF_VER_1_3)
2917 r += snprintf (buf + r, size -r, ", VIDEO");
2918 else
2919 r += snprintf (buf + r, size -r, ", SATURATION");
2920 }
2921
2922 if (config & E_NDS32_HAS_ENCRIPT_INST)
2923 r += snprintf (buf + r, size -r, ", ENCRP");
2924
2925 if (config & E_NDS32_HAS_L2C_INST)
2926 r += snprintf (buf + r, size -r, ", L2C");
2927 }
2928
2929 static char *
2930 get_machine_flags (unsigned e_flags, unsigned e_machine)
2931 {
2932 static char buf[1024];
2933
2934 buf[0] = '\0';
2935
2936 if (e_flags)
2937 {
2938 switch (e_machine)
2939 {
2940 default:
2941 break;
2942
2943 case EM_ARC_COMPACT2:
2944 case EM_ARC_COMPACT:
2945 decode_ARC_machine_flags (e_flags, e_machine, buf);
2946 break;
2947
2948 case EM_ARM:
2949 decode_ARM_machine_flags (e_flags, buf);
2950 break;
2951
2952 case EM_AVR:
2953 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2954 break;
2955
2956 case EM_BLACKFIN:
2957 if (e_flags & EF_BFIN_PIC)
2958 strcat (buf, ", PIC");
2959
2960 if (e_flags & EF_BFIN_FDPIC)
2961 strcat (buf, ", FDPIC");
2962
2963 if (e_flags & EF_BFIN_CODE_IN_L1)
2964 strcat (buf, ", code in L1");
2965
2966 if (e_flags & EF_BFIN_DATA_IN_L1)
2967 strcat (buf, ", data in L1");
2968
2969 break;
2970
2971 case EM_CYGNUS_FRV:
2972 switch (e_flags & EF_FRV_CPU_MASK)
2973 {
2974 case EF_FRV_CPU_GENERIC:
2975 break;
2976
2977 default:
2978 strcat (buf, ", fr???");
2979 break;
2980
2981 case EF_FRV_CPU_FR300:
2982 strcat (buf, ", fr300");
2983 break;
2984
2985 case EF_FRV_CPU_FR400:
2986 strcat (buf, ", fr400");
2987 break;
2988 case EF_FRV_CPU_FR405:
2989 strcat (buf, ", fr405");
2990 break;
2991
2992 case EF_FRV_CPU_FR450:
2993 strcat (buf, ", fr450");
2994 break;
2995
2996 case EF_FRV_CPU_FR500:
2997 strcat (buf, ", fr500");
2998 break;
2999 case EF_FRV_CPU_FR550:
3000 strcat (buf, ", fr550");
3001 break;
3002
3003 case EF_FRV_CPU_SIMPLE:
3004 strcat (buf, ", simple");
3005 break;
3006 case EF_FRV_CPU_TOMCAT:
3007 strcat (buf, ", tomcat");
3008 break;
3009 }
3010 break;
3011
3012 case EM_68K:
3013 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3014 strcat (buf, ", m68000");
3015 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3016 strcat (buf, ", cpu32");
3017 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3018 strcat (buf, ", fido_a");
3019 else
3020 {
3021 char const * isa = _("unknown");
3022 char const * mac = _("unknown mac");
3023 char const * additional = NULL;
3024
3025 switch (e_flags & EF_M68K_CF_ISA_MASK)
3026 {
3027 case EF_M68K_CF_ISA_A_NODIV:
3028 isa = "A";
3029 additional = ", nodiv";
3030 break;
3031 case EF_M68K_CF_ISA_A:
3032 isa = "A";
3033 break;
3034 case EF_M68K_CF_ISA_A_PLUS:
3035 isa = "A+";
3036 break;
3037 case EF_M68K_CF_ISA_B_NOUSP:
3038 isa = "B";
3039 additional = ", nousp";
3040 break;
3041 case EF_M68K_CF_ISA_B:
3042 isa = "B";
3043 break;
3044 case EF_M68K_CF_ISA_C:
3045 isa = "C";
3046 break;
3047 case EF_M68K_CF_ISA_C_NODIV:
3048 isa = "C";
3049 additional = ", nodiv";
3050 break;
3051 }
3052 strcat (buf, ", cf, isa ");
3053 strcat (buf, isa);
3054 if (additional)
3055 strcat (buf, additional);
3056 if (e_flags & EF_M68K_CF_FLOAT)
3057 strcat (buf, ", float");
3058 switch (e_flags & EF_M68K_CF_MAC_MASK)
3059 {
3060 case 0:
3061 mac = NULL;
3062 break;
3063 case EF_M68K_CF_MAC:
3064 mac = "mac";
3065 break;
3066 case EF_M68K_CF_EMAC:
3067 mac = "emac";
3068 break;
3069 case EF_M68K_CF_EMAC_B:
3070 mac = "emac_b";
3071 break;
3072 }
3073 if (mac)
3074 {
3075 strcat (buf, ", ");
3076 strcat (buf, mac);
3077 }
3078 }
3079 break;
3080
3081 case EM_CYGNUS_MEP:
3082 switch (e_flags & EF_MEP_CPU_MASK)
3083 {
3084 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3085 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3086 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3087 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3088 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3089 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3090 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3091 }
3092
3093 switch (e_flags & EF_MEP_COP_MASK)
3094 {
3095 case EF_MEP_COP_NONE: break;
3096 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3097 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3098 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3099 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3100 default: strcat (buf, _("<unknown MeP copro type>")); break;
3101 }
3102
3103 if (e_flags & EF_MEP_LIBRARY)
3104 strcat (buf, ", Built for Library");
3105
3106 if (e_flags & EF_MEP_INDEX_MASK)
3107 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3108 e_flags & EF_MEP_INDEX_MASK);
3109
3110 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3111 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3112 e_flags & ~ EF_MEP_ALL_FLAGS);
3113 break;
3114
3115 case EM_PPC:
3116 if (e_flags & EF_PPC_EMB)
3117 strcat (buf, ", emb");
3118
3119 if (e_flags & EF_PPC_RELOCATABLE)
3120 strcat (buf, _(", relocatable"));
3121
3122 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3123 strcat (buf, _(", relocatable-lib"));
3124 break;
3125
3126 case EM_PPC64:
3127 if (e_flags & EF_PPC64_ABI)
3128 {
3129 char abi[] = ", abiv0";
3130
3131 abi[6] += e_flags & EF_PPC64_ABI;
3132 strcat (buf, abi);
3133 }
3134 break;
3135
3136 case EM_V800:
3137 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3138 strcat (buf, ", RH850 ABI");
3139
3140 if (e_flags & EF_V800_850E3)
3141 strcat (buf, ", V3 architecture");
3142
3143 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3144 strcat (buf, ", FPU not used");
3145
3146 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3147 strcat (buf, ", regmode: COMMON");
3148
3149 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3150 strcat (buf, ", r4 not used");
3151
3152 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3153 strcat (buf, ", r30 not used");
3154
3155 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3156 strcat (buf, ", r5 not used");
3157
3158 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3159 strcat (buf, ", r2 not used");
3160
3161 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3162 {
3163 switch (e_flags & - e_flags)
3164 {
3165 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3166 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3167 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3168 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3169 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3170 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3171 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3172 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3173 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3174 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3175 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3176 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3177 default: break;
3178 }
3179 }
3180 break;
3181
3182 case EM_V850:
3183 case EM_CYGNUS_V850:
3184 switch (e_flags & EF_V850_ARCH)
3185 {
3186 case E_V850E3V5_ARCH:
3187 strcat (buf, ", v850e3v5");
3188 break;
3189 case E_V850E2V3_ARCH:
3190 strcat (buf, ", v850e2v3");
3191 break;
3192 case E_V850E2_ARCH:
3193 strcat (buf, ", v850e2");
3194 break;
3195 case E_V850E1_ARCH:
3196 strcat (buf, ", v850e1");
3197 break;
3198 case E_V850E_ARCH:
3199 strcat (buf, ", v850e");
3200 break;
3201 case E_V850_ARCH:
3202 strcat (buf, ", v850");
3203 break;
3204 default:
3205 strcat (buf, _(", unknown v850 architecture variant"));
3206 break;
3207 }
3208 break;
3209
3210 case EM_M32R:
3211 case EM_CYGNUS_M32R:
3212 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3213 strcat (buf, ", m32r");
3214 break;
3215
3216 case EM_MIPS:
3217 case EM_MIPS_RS3_LE:
3218 if (e_flags & EF_MIPS_NOREORDER)
3219 strcat (buf, ", noreorder");
3220
3221 if (e_flags & EF_MIPS_PIC)
3222 strcat (buf, ", pic");
3223
3224 if (e_flags & EF_MIPS_CPIC)
3225 strcat (buf, ", cpic");
3226
3227 if (e_flags & EF_MIPS_UCODE)
3228 strcat (buf, ", ugen_reserved");
3229
3230 if (e_flags & EF_MIPS_ABI2)
3231 strcat (buf, ", abi2");
3232
3233 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3234 strcat (buf, ", odk first");
3235
3236 if (e_flags & EF_MIPS_32BITMODE)
3237 strcat (buf, ", 32bitmode");
3238
3239 if (e_flags & EF_MIPS_NAN2008)
3240 strcat (buf, ", nan2008");
3241
3242 if (e_flags & EF_MIPS_FP64)
3243 strcat (buf, ", fp64");
3244
3245 switch ((e_flags & EF_MIPS_MACH))
3246 {
3247 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3248 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3249 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3250 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3251 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3252 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3253 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3254 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3255 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3256 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3257 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3258 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3259 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3260 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3261 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3262 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3263 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3264 case 0:
3265 /* We simply ignore the field in this case to avoid confusion:
3266 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3267 extension. */
3268 break;
3269 default: strcat (buf, _(", unknown CPU")); break;
3270 }
3271
3272 switch ((e_flags & EF_MIPS_ABI))
3273 {
3274 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3275 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3276 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3277 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3278 case 0:
3279 /* We simply ignore the field in this case to avoid confusion:
3280 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3281 This means it is likely to be an o32 file, but not for
3282 sure. */
3283 break;
3284 default: strcat (buf, _(", unknown ABI")); break;
3285 }
3286
3287 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3288 strcat (buf, ", mdmx");
3289
3290 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3291 strcat (buf, ", mips16");
3292
3293 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3294 strcat (buf, ", micromips");
3295
3296 switch ((e_flags & EF_MIPS_ARCH))
3297 {
3298 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3299 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3300 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3301 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3302 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3303 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3304 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3305 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3306 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3307 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3308 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3309 default: strcat (buf, _(", unknown ISA")); break;
3310 }
3311 break;
3312
3313 case EM_NDS32:
3314 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3315 break;
3316
3317 case EM_RISCV:
3318 if (e_flags & EF_RISCV_RVC)
3319 strcat (buf, ", RVC");
3320
3321 switch (e_flags & EF_RISCV_FLOAT_ABI)
3322 {
3323 case EF_RISCV_FLOAT_ABI_SOFT:
3324 strcat (buf, ", soft-float ABI");
3325 break;
3326
3327 case EF_RISCV_FLOAT_ABI_SINGLE:
3328 strcat (buf, ", single-float ABI");
3329 break;
3330
3331 case EF_RISCV_FLOAT_ABI_DOUBLE:
3332 strcat (buf, ", double-float ABI");
3333 break;
3334
3335 case EF_RISCV_FLOAT_ABI_QUAD:
3336 strcat (buf, ", quad-float ABI");
3337 break;
3338 }
3339 break;
3340
3341 case EM_SH:
3342 switch ((e_flags & EF_SH_MACH_MASK))
3343 {
3344 case EF_SH1: strcat (buf, ", sh1"); break;
3345 case EF_SH2: strcat (buf, ", sh2"); break;
3346 case EF_SH3: strcat (buf, ", sh3"); break;
3347 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3348 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3349 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3350 case EF_SH3E: strcat (buf, ", sh3e"); break;
3351 case EF_SH4: strcat (buf, ", sh4"); break;
3352 case EF_SH5: strcat (buf, ", sh5"); break;
3353 case EF_SH2E: strcat (buf, ", sh2e"); break;
3354 case EF_SH4A: strcat (buf, ", sh4a"); break;
3355 case EF_SH2A: strcat (buf, ", sh2a"); break;
3356 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3357 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3358 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3359 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3360 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3361 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3362 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3363 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3364 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3365 default: strcat (buf, _(", unknown ISA")); break;
3366 }
3367
3368 if (e_flags & EF_SH_PIC)
3369 strcat (buf, ", pic");
3370
3371 if (e_flags & EF_SH_FDPIC)
3372 strcat (buf, ", fdpic");
3373 break;
3374
3375 case EM_OR1K:
3376 if (e_flags & EF_OR1K_NODELAY)
3377 strcat (buf, ", no delay");
3378 break;
3379
3380 case EM_SPARCV9:
3381 if (e_flags & EF_SPARC_32PLUS)
3382 strcat (buf, ", v8+");
3383
3384 if (e_flags & EF_SPARC_SUN_US1)
3385 strcat (buf, ", ultrasparcI");
3386
3387 if (e_flags & EF_SPARC_SUN_US3)
3388 strcat (buf, ", ultrasparcIII");
3389
3390 if (e_flags & EF_SPARC_HAL_R1)
3391 strcat (buf, ", halr1");
3392
3393 if (e_flags & EF_SPARC_LEDATA)
3394 strcat (buf, ", ledata");
3395
3396 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3397 strcat (buf, ", tso");
3398
3399 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3400 strcat (buf, ", pso");
3401
3402 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3403 strcat (buf, ", rmo");
3404 break;
3405
3406 case EM_PARISC:
3407 switch (e_flags & EF_PARISC_ARCH)
3408 {
3409 case EFA_PARISC_1_0:
3410 strcpy (buf, ", PA-RISC 1.0");
3411 break;
3412 case EFA_PARISC_1_1:
3413 strcpy (buf, ", PA-RISC 1.1");
3414 break;
3415 case EFA_PARISC_2_0:
3416 strcpy (buf, ", PA-RISC 2.0");
3417 break;
3418 default:
3419 break;
3420 }
3421 if (e_flags & EF_PARISC_TRAPNIL)
3422 strcat (buf, ", trapnil");
3423 if (e_flags & EF_PARISC_EXT)
3424 strcat (buf, ", ext");
3425 if (e_flags & EF_PARISC_LSB)
3426 strcat (buf, ", lsb");
3427 if (e_flags & EF_PARISC_WIDE)
3428 strcat (buf, ", wide");
3429 if (e_flags & EF_PARISC_NO_KABP)
3430 strcat (buf, ", no kabp");
3431 if (e_flags & EF_PARISC_LAZYSWAP)
3432 strcat (buf, ", lazyswap");
3433 break;
3434
3435 case EM_PJ:
3436 case EM_PJ_OLD:
3437 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3438 strcat (buf, ", new calling convention");
3439
3440 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3441 strcat (buf, ", gnu calling convention");
3442 break;
3443
3444 case EM_IA_64:
3445 if ((e_flags & EF_IA_64_ABI64))
3446 strcat (buf, ", 64-bit");
3447 else
3448 strcat (buf, ", 32-bit");
3449 if ((e_flags & EF_IA_64_REDUCEDFP))
3450 strcat (buf, ", reduced fp model");
3451 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3452 strcat (buf, ", no function descriptors, constant gp");
3453 else if ((e_flags & EF_IA_64_CONS_GP))
3454 strcat (buf, ", constant gp");
3455 if ((e_flags & EF_IA_64_ABSOLUTE))
3456 strcat (buf, ", absolute");
3457 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3458 {
3459 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3460 strcat (buf, ", vms_linkages");
3461 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3462 {
3463 case EF_IA_64_VMS_COMCOD_SUCCESS:
3464 break;
3465 case EF_IA_64_VMS_COMCOD_WARNING:
3466 strcat (buf, ", warning");
3467 break;
3468 case EF_IA_64_VMS_COMCOD_ERROR:
3469 strcat (buf, ", error");
3470 break;
3471 case EF_IA_64_VMS_COMCOD_ABORT:
3472 strcat (buf, ", abort");
3473 break;
3474 default:
3475 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3476 e_flags & EF_IA_64_VMS_COMCOD);
3477 strcat (buf, ", <unknown>");
3478 }
3479 }
3480 break;
3481
3482 case EM_VAX:
3483 if ((e_flags & EF_VAX_NONPIC))
3484 strcat (buf, ", non-PIC");
3485 if ((e_flags & EF_VAX_DFLOAT))
3486 strcat (buf, ", D-Float");
3487 if ((e_flags & EF_VAX_GFLOAT))
3488 strcat (buf, ", G-Float");
3489 break;
3490
3491 case EM_VISIUM:
3492 if (e_flags & EF_VISIUM_ARCH_MCM)
3493 strcat (buf, ", mcm");
3494 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3495 strcat (buf, ", mcm24");
3496 if (e_flags & EF_VISIUM_ARCH_GR6)
3497 strcat (buf, ", gr6");
3498 break;
3499
3500 case EM_RL78:
3501 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3502 {
3503 case E_FLAG_RL78_ANY_CPU: break;
3504 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3505 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3506 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3507 }
3508 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3509 strcat (buf, ", 64-bit doubles");
3510 break;
3511
3512 case EM_RX:
3513 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3514 strcat (buf, ", 64-bit doubles");
3515 if (e_flags & E_FLAG_RX_DSP)
3516 strcat (buf, ", dsp");
3517 if (e_flags & E_FLAG_RX_PID)
3518 strcat (buf, ", pid");
3519 if (e_flags & E_FLAG_RX_ABI)
3520 strcat (buf, ", RX ABI");
3521 if (e_flags & E_FLAG_RX_SINSNS_SET)
3522 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3523 ? ", uses String instructions" : ", bans String instructions");
3524 if (e_flags & E_FLAG_RX_V2)
3525 strcat (buf, ", V2");
3526 break;
3527
3528 case EM_S390:
3529 if (e_flags & EF_S390_HIGH_GPRS)
3530 strcat (buf, ", highgprs");
3531 break;
3532
3533 case EM_TI_C6000:
3534 if ((e_flags & EF_C6000_REL))
3535 strcat (buf, ", relocatable module");
3536 break;
3537
3538 case EM_MSP430:
3539 strcat (buf, _(": architecture variant: "));
3540 switch (e_flags & EF_MSP430_MACH)
3541 {
3542 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3543 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3544 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3545 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3546 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3547 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3548 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3549 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3550 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3551 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3552 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3553 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3554 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3555 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3556 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3557 default:
3558 strcat (buf, _(": unknown")); break;
3559 }
3560
3561 if (e_flags & ~ EF_MSP430_MACH)
3562 strcat (buf, _(": unknown extra flag bits also present"));
3563 }
3564 }
3565
3566 return buf;
3567 }
3568
3569 static const char *
3570 get_osabi_name (unsigned int osabi)
3571 {
3572 static char buff[32];
3573
3574 switch (osabi)
3575 {
3576 case ELFOSABI_NONE: return "UNIX - System V";
3577 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3578 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3579 case ELFOSABI_GNU: return "UNIX - GNU";
3580 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3581 case ELFOSABI_AIX: return "UNIX - AIX";
3582 case ELFOSABI_IRIX: return "UNIX - IRIX";
3583 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3584 case ELFOSABI_TRU64: return "UNIX - TRU64";
3585 case ELFOSABI_MODESTO: return "Novell - Modesto";
3586 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3587 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3588 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3589 case ELFOSABI_AROS: return "AROS";
3590 case ELFOSABI_FENIXOS: return "FenixOS";
3591 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3592 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3593 default:
3594 if (osabi >= 64)
3595 switch (elf_header.e_machine)
3596 {
3597 case EM_ARM:
3598 switch (osabi)
3599 {
3600 case ELFOSABI_ARM: return "ARM";
3601 default:
3602 break;
3603 }
3604 break;
3605
3606 case EM_MSP430:
3607 case EM_MSP430_OLD:
3608 case EM_VISIUM:
3609 switch (osabi)
3610 {
3611 case ELFOSABI_STANDALONE: return _("Standalone App");
3612 default:
3613 break;
3614 }
3615 break;
3616
3617 case EM_TI_C6000:
3618 switch (osabi)
3619 {
3620 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3621 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3622 default:
3623 break;
3624 }
3625 break;
3626
3627 default:
3628 break;
3629 }
3630 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3631 return buff;
3632 }
3633 }
3634
3635 static const char *
3636 get_aarch64_segment_type (unsigned long type)
3637 {
3638 switch (type)
3639 {
3640 case PT_AARCH64_ARCHEXT:
3641 return "AARCH64_ARCHEXT";
3642 default:
3643 break;
3644 }
3645
3646 return NULL;
3647 }
3648
3649 static const char *
3650 get_arm_segment_type (unsigned long type)
3651 {
3652 switch (type)
3653 {
3654 case PT_ARM_EXIDX:
3655 return "EXIDX";
3656 default:
3657 break;
3658 }
3659
3660 return NULL;
3661 }
3662
3663 static const char *
3664 get_mips_segment_type (unsigned long type)
3665 {
3666 switch (type)
3667 {
3668 case PT_MIPS_REGINFO:
3669 return "REGINFO";
3670 case PT_MIPS_RTPROC:
3671 return "RTPROC";
3672 case PT_MIPS_OPTIONS:
3673 return "OPTIONS";
3674 case PT_MIPS_ABIFLAGS:
3675 return "ABIFLAGS";
3676 default:
3677 break;
3678 }
3679
3680 return NULL;
3681 }
3682
3683 static const char *
3684 get_parisc_segment_type (unsigned long type)
3685 {
3686 switch (type)
3687 {
3688 case PT_HP_TLS: return "HP_TLS";
3689 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3690 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3691 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3692 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3693 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3694 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3695 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3696 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3697 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3698 case PT_HP_PARALLEL: return "HP_PARALLEL";
3699 case PT_HP_FASTBIND: return "HP_FASTBIND";
3700 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3701 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3702 case PT_HP_STACK: return "HP_STACK";
3703 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3704 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3705 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3706 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3707 default:
3708 break;
3709 }
3710
3711 return NULL;
3712 }
3713
3714 static const char *
3715 get_ia64_segment_type (unsigned long type)
3716 {
3717 switch (type)
3718 {
3719 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3720 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3721 case PT_HP_TLS: return "HP_TLS";
3722 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3723 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3724 case PT_IA_64_HP_STACK: return "HP_STACK";
3725 default:
3726 break;
3727 }
3728
3729 return NULL;
3730 }
3731
3732 static const char *
3733 get_tic6x_segment_type (unsigned long type)
3734 {
3735 switch (type)
3736 {
3737 case PT_C6000_PHATTR: return "C6000_PHATTR";
3738 default:
3739 break;
3740 }
3741
3742 return NULL;
3743 }
3744
3745 static const char *
3746 get_solaris_segment_type (unsigned long type)
3747 {
3748 switch (type)
3749 {
3750 case 0x6464e550: return "PT_SUNW_UNWIND";
3751 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3752 case 0x6ffffff7: return "PT_LOSUNW";
3753 case 0x6ffffffa: return "PT_SUNWBSS";
3754 case 0x6ffffffb: return "PT_SUNWSTACK";
3755 case 0x6ffffffc: return "PT_SUNWDTRACE";
3756 case 0x6ffffffd: return "PT_SUNWCAP";
3757 case 0x6fffffff: return "PT_HISUNW";
3758 default: return NULL;
3759 }
3760 }
3761
3762 static const char *
3763 get_segment_type (unsigned long p_type)
3764 {
3765 static char buff[32];
3766
3767 switch (p_type)
3768 {
3769 case PT_NULL: return "NULL";
3770 case PT_LOAD: return "LOAD";
3771 case PT_DYNAMIC: return "DYNAMIC";
3772 case PT_INTERP: return "INTERP";
3773 case PT_NOTE: return "NOTE";
3774 case PT_SHLIB: return "SHLIB";
3775 case PT_PHDR: return "PHDR";
3776 case PT_TLS: return "TLS";
3777
3778 case PT_GNU_EH_FRAME:
3779 return "GNU_EH_FRAME";
3780 case PT_GNU_STACK: return "GNU_STACK";
3781 case PT_GNU_RELRO: return "GNU_RELRO";
3782
3783 default:
3784 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3785 {
3786 const char * result;
3787
3788 switch (elf_header.e_machine)
3789 {
3790 case EM_AARCH64:
3791 result = get_aarch64_segment_type (p_type);
3792 break;
3793 case EM_ARM:
3794 result = get_arm_segment_type (p_type);
3795 break;
3796 case EM_MIPS:
3797 case EM_MIPS_RS3_LE:
3798 result = get_mips_segment_type (p_type);
3799 break;
3800 case EM_PARISC:
3801 result = get_parisc_segment_type (p_type);
3802 break;
3803 case EM_IA_64:
3804 result = get_ia64_segment_type (p_type);
3805 break;
3806 case EM_TI_C6000:
3807 result = get_tic6x_segment_type (p_type);
3808 break;
3809 default:
3810 result = NULL;
3811 break;
3812 }
3813
3814 if (result != NULL)
3815 return result;
3816
3817 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3818 }
3819 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3820 {
3821 const char * result;
3822
3823 switch (elf_header.e_machine)
3824 {
3825 case EM_PARISC:
3826 result = get_parisc_segment_type (p_type);
3827 break;
3828 case EM_IA_64:
3829 result = get_ia64_segment_type (p_type);
3830 break;
3831 default:
3832 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3833 result = get_solaris_segment_type (p_type);
3834 else
3835 result = NULL;
3836 break;
3837 }
3838
3839 if (result != NULL)
3840 return result;
3841
3842 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3843 }
3844 else
3845 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3846
3847 return buff;
3848 }
3849 }
3850
3851 static const char *
3852 get_mips_section_type_name (unsigned int sh_type)
3853 {
3854 switch (sh_type)
3855 {
3856 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3857 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3858 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3859 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3860 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3861 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3862 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3863 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3864 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3865 case SHT_MIPS_RELD: return "MIPS_RELD";
3866 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3867 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3868 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3869 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3870 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3871 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3872 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3873 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3874 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3875 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3876 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3877 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3878 case SHT_MIPS_LINE: return "MIPS_LINE";
3879 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3880 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3881 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3882 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3883 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3884 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3885 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3886 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3887 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3888 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3889 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3890 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3891 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3892 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3893 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3894 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3895 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3896 default:
3897 break;
3898 }
3899 return NULL;
3900 }
3901
3902 static const char *
3903 get_parisc_section_type_name (unsigned int sh_type)
3904 {
3905 switch (sh_type)
3906 {
3907 case SHT_PARISC_EXT: return "PARISC_EXT";
3908 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3909 case SHT_PARISC_DOC: return "PARISC_DOC";
3910 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3911 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3912 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3913 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3914 default:
3915 break;
3916 }
3917 return NULL;
3918 }
3919
3920 static const char *
3921 get_ia64_section_type_name (unsigned int sh_type)
3922 {
3923 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3924 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3925 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3926
3927 switch (sh_type)
3928 {
3929 case SHT_IA_64_EXT: return "IA_64_EXT";
3930 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3931 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3932 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3933 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3934 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3935 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3936 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3937 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3938 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3939 default:
3940 break;
3941 }
3942 return NULL;
3943 }
3944
3945 static const char *
3946 get_x86_64_section_type_name (unsigned int sh_type)
3947 {
3948 switch (sh_type)
3949 {
3950 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3951 default:
3952 break;
3953 }
3954 return NULL;
3955 }
3956
3957 static const char *
3958 get_aarch64_section_type_name (unsigned int sh_type)
3959 {
3960 switch (sh_type)
3961 {
3962 case SHT_AARCH64_ATTRIBUTES:
3963 return "AARCH64_ATTRIBUTES";
3964 default:
3965 break;
3966 }
3967 return NULL;
3968 }
3969
3970 static const char *
3971 get_arm_section_type_name (unsigned int sh_type)
3972 {
3973 switch (sh_type)
3974 {
3975 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3976 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3977 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3978 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3979 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3980 default:
3981 break;
3982 }
3983 return NULL;
3984 }
3985
3986 static const char *
3987 get_tic6x_section_type_name (unsigned int sh_type)
3988 {
3989 switch (sh_type)
3990 {
3991 case SHT_C6000_UNWIND:
3992 return "C6000_UNWIND";
3993 case SHT_C6000_PREEMPTMAP:
3994 return "C6000_PREEMPTMAP";
3995 case SHT_C6000_ATTRIBUTES:
3996 return "C6000_ATTRIBUTES";
3997 case SHT_TI_ICODE:
3998 return "TI_ICODE";
3999 case SHT_TI_XREF:
4000 return "TI_XREF";
4001 case SHT_TI_HANDLER:
4002 return "TI_HANDLER";
4003 case SHT_TI_INITINFO:
4004 return "TI_INITINFO";
4005 case SHT_TI_PHATTRS:
4006 return "TI_PHATTRS";
4007 default:
4008 break;
4009 }
4010 return NULL;
4011 }
4012
4013 static const char *
4014 get_msp430x_section_type_name (unsigned int sh_type)
4015 {
4016 switch (sh_type)
4017 {
4018 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4019 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4020 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4021 default: return NULL;
4022 }
4023 }
4024
4025 static const char *
4026 get_v850_section_type_name (unsigned int sh_type)
4027 {
4028 switch (sh_type)
4029 {
4030 case SHT_V850_SCOMMON: return "V850 Small Common";
4031 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4032 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4033 case SHT_RENESAS_IOP: return "RENESAS IOP";
4034 case SHT_RENESAS_INFO: return "RENESAS INFO";
4035 default: return NULL;
4036 }
4037 }
4038
4039 static const char *
4040 get_section_type_name (unsigned int sh_type)
4041 {
4042 static char buff[32];
4043 const char * result;
4044
4045 switch (sh_type)
4046 {
4047 case SHT_NULL: return "NULL";
4048 case SHT_PROGBITS: return "PROGBITS";
4049 case SHT_SYMTAB: return "SYMTAB";
4050 case SHT_STRTAB: return "STRTAB";
4051 case SHT_RELA: return "RELA";
4052 case SHT_HASH: return "HASH";
4053 case SHT_DYNAMIC: return "DYNAMIC";
4054 case SHT_NOTE: return "NOTE";
4055 case SHT_NOBITS: return "NOBITS";
4056 case SHT_REL: return "REL";
4057 case SHT_SHLIB: return "SHLIB";
4058 case SHT_DYNSYM: return "DYNSYM";
4059 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4060 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4061 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4062 case SHT_GNU_HASH: return "GNU_HASH";
4063 case SHT_GROUP: return "GROUP";
4064 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4065 case SHT_GNU_verdef: return "VERDEF";
4066 case SHT_GNU_verneed: return "VERNEED";
4067 case SHT_GNU_versym: return "VERSYM";
4068 case 0x6ffffff0: return "VERSYM";
4069 case 0x6ffffffc: return "VERDEF";
4070 case 0x7ffffffd: return "AUXILIARY";
4071 case 0x7fffffff: return "FILTER";
4072 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4073
4074 default:
4075 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4076 {
4077 switch (elf_header.e_machine)
4078 {
4079 case EM_MIPS:
4080 case EM_MIPS_RS3_LE:
4081 result = get_mips_section_type_name (sh_type);
4082 break;
4083 case EM_PARISC:
4084 result = get_parisc_section_type_name (sh_type);
4085 break;
4086 case EM_IA_64:
4087 result = get_ia64_section_type_name (sh_type);
4088 break;
4089 case EM_X86_64:
4090 case EM_L1OM:
4091 case EM_K1OM:
4092 result = get_x86_64_section_type_name (sh_type);
4093 break;
4094 case EM_AARCH64:
4095 result = get_aarch64_section_type_name (sh_type);
4096 break;
4097 case EM_ARM:
4098 result = get_arm_section_type_name (sh_type);
4099 break;
4100 case EM_TI_C6000:
4101 result = get_tic6x_section_type_name (sh_type);
4102 break;
4103 case EM_MSP430:
4104 result = get_msp430x_section_type_name (sh_type);
4105 break;
4106 case EM_V800:
4107 case EM_V850:
4108 case EM_CYGNUS_V850:
4109 result = get_v850_section_type_name (sh_type);
4110 break;
4111 default:
4112 result = NULL;
4113 break;
4114 }
4115
4116 if (result != NULL)
4117 return result;
4118
4119 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4120 }
4121 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4122 {
4123 switch (elf_header.e_machine)
4124 {
4125 case EM_IA_64:
4126 result = get_ia64_section_type_name (sh_type);
4127 break;
4128 default:
4129 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4130 result = get_solaris_section_type (sh_type);
4131 else
4132 result = NULL;
4133 break;
4134 }
4135
4136 if (result != NULL)
4137 return result;
4138
4139 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4140 }
4141 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4142 {
4143 switch (elf_header.e_machine)
4144 {
4145 case EM_V800:
4146 case EM_V850:
4147 case EM_CYGNUS_V850:
4148 result = get_v850_section_type_name (sh_type);
4149 break;
4150 default:
4151 result = NULL;
4152 break;
4153 }
4154
4155 if (result != NULL)
4156 return result;
4157
4158 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4159 }
4160 else
4161 /* This message is probably going to be displayed in a 15
4162 character wide field, so put the hex value first. */
4163 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4164
4165 return buff;
4166 }
4167 }
4168
4169 #define OPTION_DEBUG_DUMP 512
4170 #define OPTION_DYN_SYMS 513
4171 #define OPTION_DWARF_DEPTH 514
4172 #define OPTION_DWARF_START 515
4173 #define OPTION_DWARF_CHECK 516
4174
4175 static struct option options[] =
4176 {
4177 {"all", no_argument, 0, 'a'},
4178 {"file-header", no_argument, 0, 'h'},
4179 {"program-headers", no_argument, 0, 'l'},
4180 {"headers", no_argument, 0, 'e'},
4181 {"histogram", no_argument, 0, 'I'},
4182 {"segments", no_argument, 0, 'l'},
4183 {"sections", no_argument, 0, 'S'},
4184 {"section-headers", no_argument, 0, 'S'},
4185 {"section-groups", no_argument, 0, 'g'},
4186 {"section-details", no_argument, 0, 't'},
4187 {"full-section-name",no_argument, 0, 'N'},
4188 {"symbols", no_argument, 0, 's'},
4189 {"syms", no_argument, 0, 's'},
4190 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4191 {"relocs", no_argument, 0, 'r'},
4192 {"notes", no_argument, 0, 'n'},
4193 {"dynamic", no_argument, 0, 'd'},
4194 {"arch-specific", no_argument, 0, 'A'},
4195 {"version-info", no_argument, 0, 'V'},
4196 {"use-dynamic", no_argument, 0, 'D'},
4197 {"unwind", no_argument, 0, 'u'},
4198 {"archive-index", no_argument, 0, 'c'},
4199 {"hex-dump", required_argument, 0, 'x'},
4200 {"relocated-dump", required_argument, 0, 'R'},
4201 {"string-dump", required_argument, 0, 'p'},
4202 {"decompress", no_argument, 0, 'z'},
4203 #ifdef SUPPORT_DISASSEMBLY
4204 {"instruction-dump", required_argument, 0, 'i'},
4205 #endif
4206 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4207
4208 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4209 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4210 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4211
4212 {"version", no_argument, 0, 'v'},
4213 {"wide", no_argument, 0, 'W'},
4214 {"help", no_argument, 0, 'H'},
4215 {0, no_argument, 0, 0}
4216 };
4217
4218 static void
4219 usage (FILE * stream)
4220 {
4221 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4222 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4223 fprintf (stream, _(" Options are:\n\
4224 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4225 -h --file-header Display the ELF file header\n\
4226 -l --program-headers Display the program headers\n\
4227 --segments An alias for --program-headers\n\
4228 -S --section-headers Display the sections' header\n\
4229 --sections An alias for --section-headers\n\
4230 -g --section-groups Display the section groups\n\
4231 -t --section-details Display the section details\n\
4232 -e --headers Equivalent to: -h -l -S\n\
4233 -s --syms Display the symbol table\n\
4234 --symbols An alias for --syms\n\
4235 --dyn-syms Display the dynamic symbol table\n\
4236 -n --notes Display the core notes (if present)\n\
4237 -r --relocs Display the relocations (if present)\n\
4238 -u --unwind Display the unwind info (if present)\n\
4239 -d --dynamic Display the dynamic section (if present)\n\
4240 -V --version-info Display the version sections (if present)\n\
4241 -A --arch-specific Display architecture specific information (if any)\n\
4242 -c --archive-index Display the symbol/file index in an archive\n\
4243 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4244 -x --hex-dump=<number|name>\n\
4245 Dump the contents of section <number|name> as bytes\n\
4246 -p --string-dump=<number|name>\n\
4247 Dump the contents of section <number|name> as strings\n\
4248 -R --relocated-dump=<number|name>\n\
4249 Dump the contents of section <number|name> as relocated bytes\n\
4250 -z --decompress Decompress section before dumping it\n\
4251 -w[lLiaprmfFsoRt] or\n\
4252 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4253 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4254 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4255 =addr,=cu_index]\n\
4256 Display the contents of DWARF2 debug sections\n"));
4257 fprintf (stream, _("\
4258 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4259 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4260 or deeper\n"));
4261 #ifdef SUPPORT_DISASSEMBLY
4262 fprintf (stream, _("\
4263 -i --instruction-dump=<number|name>\n\
4264 Disassemble the contents of section <number|name>\n"));
4265 #endif
4266 fprintf (stream, _("\
4267 -I --histogram Display histogram of bucket list lengths\n\
4268 -W --wide Allow output width to exceed 80 characters\n\
4269 @<file> Read options from <file>\n\
4270 -H --help Display this information\n\
4271 -v --version Display the version number of readelf\n"));
4272
4273 if (REPORT_BUGS_TO[0] && stream == stdout)
4274 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4275
4276 exit (stream == stdout ? 0 : 1);
4277 }
4278
4279 /* Record the fact that the user wants the contents of section number
4280 SECTION to be displayed using the method(s) encoded as flags bits
4281 in TYPE. Note, TYPE can be zero if we are creating the array for
4282 the first time. */
4283
4284 static void
4285 request_dump_bynumber (unsigned int section, dump_type type)
4286 {
4287 if (section >= num_dump_sects)
4288 {
4289 dump_type * new_dump_sects;
4290
4291 new_dump_sects = (dump_type *) calloc (section + 1,
4292 sizeof (* dump_sects));
4293
4294 if (new_dump_sects == NULL)
4295 error (_("Out of memory allocating dump request table.\n"));
4296 else
4297 {
4298 if (dump_sects)
4299 {
4300 /* Copy current flag settings. */
4301 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4302
4303 free (dump_sects);
4304 }
4305
4306 dump_sects = new_dump_sects;
4307 num_dump_sects = section + 1;
4308 }
4309 }
4310
4311 if (dump_sects)
4312 dump_sects[section] |= type;
4313
4314 return;
4315 }
4316
4317 /* Request a dump by section name. */
4318
4319 static void
4320 request_dump_byname (const char * section, dump_type type)
4321 {
4322 struct dump_list_entry * new_request;
4323
4324 new_request = (struct dump_list_entry *)
4325 malloc (sizeof (struct dump_list_entry));
4326 if (!new_request)
4327 error (_("Out of memory allocating dump request table.\n"));
4328
4329 new_request->name = strdup (section);
4330 if (!new_request->name)
4331 error (_("Out of memory allocating dump request table.\n"));
4332
4333 new_request->type = type;
4334
4335 new_request->next = dump_sects_byname;
4336 dump_sects_byname = new_request;
4337 }
4338
4339 static inline void
4340 request_dump (dump_type type)
4341 {
4342 int section;
4343 char * cp;
4344
4345 do_dump++;
4346 section = strtoul (optarg, & cp, 0);
4347
4348 if (! *cp && section >= 0)
4349 request_dump_bynumber (section, type);
4350 else
4351 request_dump_byname (optarg, type);
4352 }
4353
4354
4355 static void
4356 parse_args (int argc, char ** argv)
4357 {
4358 int c;
4359
4360 if (argc < 2)
4361 usage (stderr);
4362
4363 while ((c = getopt_long
4364 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4365 {
4366 switch (c)
4367 {
4368 case 0:
4369 /* Long options. */
4370 break;
4371 case 'H':
4372 usage (stdout);
4373 break;
4374
4375 case 'a':
4376 do_syms++;
4377 do_reloc++;
4378 do_unwind++;
4379 do_dynamic++;
4380 do_header++;
4381 do_sections++;
4382 do_section_groups++;
4383 do_segments++;
4384 do_version++;
4385 do_histogram++;
4386 do_arch++;
4387 do_notes++;
4388 break;
4389 case 'g':
4390 do_section_groups++;
4391 break;
4392 case 't':
4393 case 'N':
4394 do_sections++;
4395 do_section_details++;
4396 break;
4397 case 'e':
4398 do_header++;
4399 do_sections++;
4400 do_segments++;
4401 break;
4402 case 'A':
4403 do_arch++;
4404 break;
4405 case 'D':
4406 do_using_dynamic++;
4407 break;
4408 case 'r':
4409 do_reloc++;
4410 break;
4411 case 'u':
4412 do_unwind++;
4413 break;
4414 case 'h':
4415 do_header++;
4416 break;
4417 case 'l':
4418 do_segments++;
4419 break;
4420 case 's':
4421 do_syms++;
4422 break;
4423 case 'S':
4424 do_sections++;
4425 break;
4426 case 'd':
4427 do_dynamic++;
4428 break;
4429 case 'I':
4430 do_histogram++;
4431 break;
4432 case 'n':
4433 do_notes++;
4434 break;
4435 case 'c':
4436 do_archive_index++;
4437 break;
4438 case 'x':
4439 request_dump (HEX_DUMP);
4440 break;
4441 case 'p':
4442 request_dump (STRING_DUMP);
4443 break;
4444 case 'R':
4445 request_dump (RELOC_DUMP);
4446 break;
4447 case 'z':
4448 decompress_dumps++;
4449 break;
4450 case 'w':
4451 do_dump++;
4452 if (optarg == 0)
4453 {
4454 do_debugging = 1;
4455 dwarf_select_sections_all ();
4456 }
4457 else
4458 {
4459 do_debugging = 0;
4460 dwarf_select_sections_by_letters (optarg);
4461 }
4462 break;
4463 case OPTION_DEBUG_DUMP:
4464 do_dump++;
4465 if (optarg == 0)
4466 do_debugging = 1;
4467 else
4468 {
4469 do_debugging = 0;
4470 dwarf_select_sections_by_names (optarg);
4471 }
4472 break;
4473 case OPTION_DWARF_DEPTH:
4474 {
4475 char *cp;
4476
4477 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4478 }
4479 break;
4480 case OPTION_DWARF_START:
4481 {
4482 char *cp;
4483
4484 dwarf_start_die = strtoul (optarg, & cp, 0);
4485 }
4486 break;
4487 case OPTION_DWARF_CHECK:
4488 dwarf_check = 1;
4489 break;
4490 case OPTION_DYN_SYMS:
4491 do_dyn_syms++;
4492 break;
4493 #ifdef SUPPORT_DISASSEMBLY
4494 case 'i':
4495 request_dump (DISASS_DUMP);
4496 break;
4497 #endif
4498 case 'v':
4499 print_version (program_name);
4500 break;
4501 case 'V':
4502 do_version++;
4503 break;
4504 case 'W':
4505 do_wide++;
4506 break;
4507 default:
4508 /* xgettext:c-format */
4509 error (_("Invalid option '-%c'\n"), c);
4510 /* Fall through. */
4511 case '?':
4512 usage (stderr);
4513 }
4514 }
4515
4516 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4517 && !do_segments && !do_header && !do_dump && !do_version
4518 && !do_histogram && !do_debugging && !do_arch && !do_notes
4519 && !do_section_groups && !do_archive_index
4520 && !do_dyn_syms)
4521 usage (stderr);
4522 }
4523
4524 static const char *
4525 get_elf_class (unsigned int elf_class)
4526 {
4527 static char buff[32];
4528
4529 switch (elf_class)
4530 {
4531 case ELFCLASSNONE: return _("none");
4532 case ELFCLASS32: return "ELF32";
4533 case ELFCLASS64: return "ELF64";
4534 default:
4535 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4536 return buff;
4537 }
4538 }
4539
4540 static const char *
4541 get_data_encoding (unsigned int encoding)
4542 {
4543 static char buff[32];
4544
4545 switch (encoding)
4546 {
4547 case ELFDATANONE: return _("none");
4548 case ELFDATA2LSB: return _("2's complement, little endian");
4549 case ELFDATA2MSB: return _("2's complement, big endian");
4550 default:
4551 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4552 return buff;
4553 }
4554 }
4555
4556 /* Decode the data held in 'elf_header'. */
4557
4558 static int
4559 process_file_header (void)
4560 {
4561 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4562 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4563 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4564 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4565 {
4566 error
4567 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4568 return 0;
4569 }
4570
4571 init_dwarf_regnames (elf_header.e_machine);
4572
4573 if (do_header)
4574 {
4575 int i;
4576
4577 printf (_("ELF Header:\n"));
4578 printf (_(" Magic: "));
4579 for (i = 0; i < EI_NIDENT; i++)
4580 printf ("%2.2x ", elf_header.e_ident[i]);
4581 printf ("\n");
4582 printf (_(" Class: %s\n"),
4583 get_elf_class (elf_header.e_ident[EI_CLASS]));
4584 printf (_(" Data: %s\n"),
4585 get_data_encoding (elf_header.e_ident[EI_DATA]));
4586 printf (_(" Version: %d %s\n"),
4587 elf_header.e_ident[EI_VERSION],
4588 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4589 ? "(current)"
4590 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4591 ? _("<unknown: %lx>")
4592 : "")));
4593 printf (_(" OS/ABI: %s\n"),
4594 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4595 printf (_(" ABI Version: %d\n"),
4596 elf_header.e_ident[EI_ABIVERSION]);
4597 printf (_(" Type: %s\n"),
4598 get_file_type (elf_header.e_type));
4599 printf (_(" Machine: %s\n"),
4600 get_machine_name (elf_header.e_machine));
4601 printf (_(" Version: 0x%lx\n"),
4602 (unsigned long) elf_header.e_version);
4603
4604 printf (_(" Entry point address: "));
4605 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4606 printf (_("\n Start of program headers: "));
4607 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4608 printf (_(" (bytes into file)\n Start of section headers: "));
4609 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4610 printf (_(" (bytes into file)\n"));
4611
4612 printf (_(" Flags: 0x%lx%s\n"),
4613 (unsigned long) elf_header.e_flags,
4614 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4615 printf (_(" Size of this header: %ld (bytes)\n"),
4616 (long) elf_header.e_ehsize);
4617 printf (_(" Size of program headers: %ld (bytes)\n"),
4618 (long) elf_header.e_phentsize);
4619 printf (_(" Number of program headers: %ld"),
4620 (long) elf_header.e_phnum);
4621 if (section_headers != NULL
4622 && elf_header.e_phnum == PN_XNUM
4623 && section_headers[0].sh_info != 0)
4624 printf (" (%ld)", (long) section_headers[0].sh_info);
4625 putc ('\n', stdout);
4626 printf (_(" Size of section headers: %ld (bytes)\n"),
4627 (long) elf_header.e_shentsize);
4628 printf (_(" Number of section headers: %ld"),
4629 (long) elf_header.e_shnum);
4630 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4631 printf (" (%ld)", (long) section_headers[0].sh_size);
4632 putc ('\n', stdout);
4633 printf (_(" Section header string table index: %ld"),
4634 (long) elf_header.e_shstrndx);
4635 if (section_headers != NULL
4636 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4637 printf (" (%u)", section_headers[0].sh_link);
4638 else if (elf_header.e_shstrndx != SHN_UNDEF
4639 && elf_header.e_shstrndx >= elf_header.e_shnum)
4640 printf (_(" <corrupt: out of range>"));
4641 putc ('\n', stdout);
4642 }
4643
4644 if (section_headers != NULL)
4645 {
4646 if (elf_header.e_phnum == PN_XNUM
4647 && section_headers[0].sh_info != 0)
4648 elf_header.e_phnum = section_headers[0].sh_info;
4649 if (elf_header.e_shnum == SHN_UNDEF)
4650 elf_header.e_shnum = section_headers[0].sh_size;
4651 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4652 elf_header.e_shstrndx = section_headers[0].sh_link;
4653 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4654 elf_header.e_shstrndx = SHN_UNDEF;
4655 free (section_headers);
4656 section_headers = NULL;
4657 }
4658
4659 return 1;
4660 }
4661
4662 static bfd_boolean
4663 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4664 {
4665 Elf32_External_Phdr * phdrs;
4666 Elf32_External_Phdr * external;
4667 Elf_Internal_Phdr * internal;
4668 unsigned int i;
4669 unsigned int size = elf_header.e_phentsize;
4670 unsigned int num = elf_header.e_phnum;
4671
4672 /* PR binutils/17531: Cope with unexpected section header sizes. */
4673 if (size == 0 || num == 0)
4674 return FALSE;
4675 if (size < sizeof * phdrs)
4676 {
4677 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4678 return FALSE;
4679 }
4680 if (size > sizeof * phdrs)
4681 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4682
4683 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4684 size, num, _("program headers"));
4685 if (phdrs == NULL)
4686 return FALSE;
4687
4688 for (i = 0, internal = pheaders, external = phdrs;
4689 i < elf_header.e_phnum;
4690 i++, internal++, external++)
4691 {
4692 internal->p_type = BYTE_GET (external->p_type);
4693 internal->p_offset = BYTE_GET (external->p_offset);
4694 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4695 internal->p_paddr = BYTE_GET (external->p_paddr);
4696 internal->p_filesz = BYTE_GET (external->p_filesz);
4697 internal->p_memsz = BYTE_GET (external->p_memsz);
4698 internal->p_flags = BYTE_GET (external->p_flags);
4699 internal->p_align = BYTE_GET (external->p_align);
4700 }
4701
4702 free (phdrs);
4703 return TRUE;
4704 }
4705
4706 static bfd_boolean
4707 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4708 {
4709 Elf64_External_Phdr * phdrs;
4710 Elf64_External_Phdr * external;
4711 Elf_Internal_Phdr * internal;
4712 unsigned int i;
4713 unsigned int size = elf_header.e_phentsize;
4714 unsigned int num = elf_header.e_phnum;
4715
4716 /* PR binutils/17531: Cope with unexpected section header sizes. */
4717 if (size == 0 || num == 0)
4718 return FALSE;
4719 if (size < sizeof * phdrs)
4720 {
4721 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4722 return FALSE;
4723 }
4724 if (size > sizeof * phdrs)
4725 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4726
4727 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4728 size, num, _("program headers"));
4729 if (!phdrs)
4730 return FALSE;
4731
4732 for (i = 0, internal = pheaders, external = phdrs;
4733 i < elf_header.e_phnum;
4734 i++, internal++, external++)
4735 {
4736 internal->p_type = BYTE_GET (external->p_type);
4737 internal->p_flags = BYTE_GET (external->p_flags);
4738 internal->p_offset = BYTE_GET (external->p_offset);
4739 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4740 internal->p_paddr = BYTE_GET (external->p_paddr);
4741 internal->p_filesz = BYTE_GET (external->p_filesz);
4742 internal->p_memsz = BYTE_GET (external->p_memsz);
4743 internal->p_align = BYTE_GET (external->p_align);
4744 }
4745
4746 free (phdrs);
4747 return TRUE;
4748 }
4749
4750 /* Returns 1 if the program headers were read into `program_headers'. */
4751
4752 static int
4753 get_program_headers (FILE * file)
4754 {
4755 Elf_Internal_Phdr * phdrs;
4756
4757 /* Check cache of prior read. */
4758 if (program_headers != NULL)
4759 return 1;
4760
4761 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4762 sizeof (Elf_Internal_Phdr));
4763
4764 if (phdrs == NULL)
4765 {
4766 error (_("Out of memory reading %u program headers\n"),
4767 elf_header.e_phnum);
4768 return 0;
4769 }
4770
4771 if (is_32bit_elf
4772 ? get_32bit_program_headers (file, phdrs)
4773 : get_64bit_program_headers (file, phdrs))
4774 {
4775 program_headers = phdrs;
4776 return 1;
4777 }
4778
4779 free (phdrs);
4780 return 0;
4781 }
4782
4783 /* Returns 1 if the program headers were loaded. */
4784
4785 static int
4786 process_program_headers (FILE * file)
4787 {
4788 Elf_Internal_Phdr * segment;
4789 unsigned int i;
4790 Elf_Internal_Phdr * previous_load = NULL;
4791
4792 if (elf_header.e_phnum == 0)
4793 {
4794 /* PR binutils/12467. */
4795 if (elf_header.e_phoff != 0)
4796 warn (_("possibly corrupt ELF header - it has a non-zero program"
4797 " header offset, but no program headers\n"));
4798 else if (do_segments)
4799 printf (_("\nThere are no program headers in this file.\n"));
4800 return 0;
4801 }
4802
4803 if (do_segments && !do_header)
4804 {
4805 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4806 printf (_("Entry point "));
4807 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4808 printf (_("\nThere are %d program headers, starting at offset "),
4809 elf_header.e_phnum);
4810 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4811 printf ("\n");
4812 }
4813
4814 if (! get_program_headers (file))
4815 return 0;
4816
4817 if (do_segments)
4818 {
4819 if (elf_header.e_phnum > 1)
4820 printf (_("\nProgram Headers:\n"));
4821 else
4822 printf (_("\nProgram Headers:\n"));
4823
4824 if (is_32bit_elf)
4825 printf
4826 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4827 else if (do_wide)
4828 printf
4829 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4830 else
4831 {
4832 printf
4833 (_(" Type Offset VirtAddr PhysAddr\n"));
4834 printf
4835 (_(" FileSiz MemSiz Flags Align\n"));
4836 }
4837 }
4838
4839 dynamic_addr = 0;
4840 dynamic_size = 0;
4841
4842 for (i = 0, segment = program_headers;
4843 i < elf_header.e_phnum;
4844 i++, segment++)
4845 {
4846 if (do_segments)
4847 {
4848 printf (" %-14.14s ", get_segment_type (segment->p_type));
4849
4850 if (is_32bit_elf)
4851 {
4852 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4853 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4854 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4855 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4856 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4857 printf ("%c%c%c ",
4858 (segment->p_flags & PF_R ? 'R' : ' '),
4859 (segment->p_flags & PF_W ? 'W' : ' '),
4860 (segment->p_flags & PF_X ? 'E' : ' '));
4861 printf ("%#lx", (unsigned long) segment->p_align);
4862 }
4863 else if (do_wide)
4864 {
4865 if ((unsigned long) segment->p_offset == segment->p_offset)
4866 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4867 else
4868 {
4869 print_vma (segment->p_offset, FULL_HEX);
4870 putchar (' ');
4871 }
4872
4873 print_vma (segment->p_vaddr, FULL_HEX);
4874 putchar (' ');
4875 print_vma (segment->p_paddr, FULL_HEX);
4876 putchar (' ');
4877
4878 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4879 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4880 else
4881 {
4882 print_vma (segment->p_filesz, FULL_HEX);
4883 putchar (' ');
4884 }
4885
4886 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4887 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4888 else
4889 {
4890 print_vma (segment->p_memsz, FULL_HEX);
4891 }
4892
4893 printf (" %c%c%c ",
4894 (segment->p_flags & PF_R ? 'R' : ' '),
4895 (segment->p_flags & PF_W ? 'W' : ' '),
4896 (segment->p_flags & PF_X ? 'E' : ' '));
4897
4898 if ((unsigned long) segment->p_align == segment->p_align)
4899 printf ("%#lx", (unsigned long) segment->p_align);
4900 else
4901 {
4902 print_vma (segment->p_align, PREFIX_HEX);
4903 }
4904 }
4905 else
4906 {
4907 print_vma (segment->p_offset, FULL_HEX);
4908 putchar (' ');
4909 print_vma (segment->p_vaddr, FULL_HEX);
4910 putchar (' ');
4911 print_vma (segment->p_paddr, FULL_HEX);
4912 printf ("\n ");
4913 print_vma (segment->p_filesz, FULL_HEX);
4914 putchar (' ');
4915 print_vma (segment->p_memsz, FULL_HEX);
4916 printf (" %c%c%c ",
4917 (segment->p_flags & PF_R ? 'R' : ' '),
4918 (segment->p_flags & PF_W ? 'W' : ' '),
4919 (segment->p_flags & PF_X ? 'E' : ' '));
4920 print_vma (segment->p_align, PREFIX_HEX);
4921 }
4922
4923 putc ('\n', stdout);
4924 }
4925
4926 switch (segment->p_type)
4927 {
4928 case PT_LOAD:
4929 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
4930 required by the ELF standard, several programs, including the Linux
4931 kernel, make use of non-ordered segments. */
4932 if (previous_load
4933 && previous_load->p_vaddr > segment->p_vaddr)
4934 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
4935 #endif
4936 if (segment->p_memsz < segment->p_filesz)
4937 error (_("the segment's file size is larger than its memory size\n"));
4938 previous_load = segment;
4939 break;
4940
4941 case PT_PHDR:
4942 /* PR 20815 - Verify that the program header is loaded into memory. */
4943 if (i > 0 && previous_load != NULL)
4944 error (_("the PHDR segment must occur before any LOAD segment\n"));
4945 if (elf_header.e_machine != EM_PARISC)
4946 {
4947 unsigned int j;
4948
4949 for (j = 1; j < elf_header.e_phnum; j++)
4950 if (program_headers[j].p_vaddr <= segment->p_vaddr
4951 && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4952 >= (segment->p_vaddr + segment->p_filesz))
4953 break;
4954 if (j == elf_header.e_phnum)
4955 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4956 }
4957 break;
4958
4959 case PT_DYNAMIC:
4960 if (dynamic_addr)
4961 error (_("more than one dynamic segment\n"));
4962
4963 /* By default, assume that the .dynamic section is the first
4964 section in the DYNAMIC segment. */
4965 dynamic_addr = segment->p_offset;
4966 dynamic_size = segment->p_filesz;
4967 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4968 if (dynamic_addr + dynamic_size >= current_file_size)
4969 {
4970 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4971 dynamic_addr = dynamic_size = 0;
4972 }
4973
4974 /* Try to locate the .dynamic section. If there is
4975 a section header table, we can easily locate it. */
4976 if (section_headers != NULL)
4977 {
4978 Elf_Internal_Shdr * sec;
4979
4980 sec = find_section (".dynamic");
4981 if (sec == NULL || sec->sh_size == 0)
4982 {
4983 /* A corresponding .dynamic section is expected, but on
4984 IA-64/OpenVMS it is OK for it to be missing. */
4985 if (!is_ia64_vms ())
4986 error (_("no .dynamic section in the dynamic segment\n"));
4987 break;
4988 }
4989
4990 if (sec->sh_type == SHT_NOBITS)
4991 {
4992 dynamic_size = 0;
4993 break;
4994 }
4995
4996 dynamic_addr = sec->sh_offset;
4997 dynamic_size = sec->sh_size;
4998
4999 if (dynamic_addr < segment->p_offset
5000 || dynamic_addr > segment->p_offset + segment->p_filesz)
5001 warn (_("the .dynamic section is not contained"
5002 " within the dynamic segment\n"));
5003 else if (dynamic_addr > segment->p_offset)
5004 warn (_("the .dynamic section is not the first section"
5005 " in the dynamic segment.\n"));
5006 }
5007 break;
5008
5009 case PT_INTERP:
5010 if (fseek (file, archive_file_offset + (long) segment->p_offset,
5011 SEEK_SET))
5012 error (_("Unable to find program interpreter name\n"));
5013 else
5014 {
5015 char fmt [32];
5016 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5017
5018 if (ret >= (int) sizeof (fmt) || ret < 0)
5019 error (_("Internal error: failed to create format string to display program interpreter\n"));
5020
5021 program_interpreter[0] = 0;
5022 if (fscanf (file, fmt, program_interpreter) <= 0)
5023 error (_("Unable to read program interpreter name\n"));
5024
5025 if (do_segments)
5026 printf (_(" [Requesting program interpreter: %s]\n"),
5027 program_interpreter);
5028 }
5029 break;
5030 }
5031 }
5032
5033 if (do_segments && section_headers != NULL && string_table != NULL)
5034 {
5035 printf (_("\n Section to Segment mapping:\n"));
5036 printf (_(" Segment Sections...\n"));
5037
5038 for (i = 0; i < elf_header.e_phnum; i++)
5039 {
5040 unsigned int j;
5041 Elf_Internal_Shdr * section;
5042
5043 segment = program_headers + i;
5044 section = section_headers + 1;
5045
5046 printf (" %2.2d ", i);
5047
5048 for (j = 1; j < elf_header.e_shnum; j++, section++)
5049 {
5050 if (!ELF_TBSS_SPECIAL (section, segment)
5051 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5052 printf ("%s ", printable_section_name (section));
5053 }
5054
5055 putc ('\n',stdout);
5056 }
5057 }
5058
5059 return 1;
5060 }
5061
5062
5063 /* Find the file offset corresponding to VMA by using the program headers. */
5064
5065 static long
5066 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
5067 {
5068 Elf_Internal_Phdr * seg;
5069
5070 if (! get_program_headers (file))
5071 {
5072 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5073 return (long) vma;
5074 }
5075
5076 for (seg = program_headers;
5077 seg < program_headers + elf_header.e_phnum;
5078 ++seg)
5079 {
5080 if (seg->p_type != PT_LOAD)
5081 continue;
5082
5083 if (vma >= (seg->p_vaddr & -seg->p_align)
5084 && vma + size <= seg->p_vaddr + seg->p_filesz)
5085 return vma - seg->p_vaddr + seg->p_offset;
5086 }
5087
5088 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5089 (unsigned long) vma);
5090 return (long) vma;
5091 }
5092
5093
5094 /* Allocate memory and load the sections headers into the global pointer
5095 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5096 generate any error messages if the load fails. */
5097
5098 static bfd_boolean
5099 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5100 {
5101 Elf32_External_Shdr * shdrs;
5102 Elf_Internal_Shdr * internal;
5103 unsigned int i;
5104 unsigned int size = elf_header.e_shentsize;
5105 unsigned int num = probe ? 1 : elf_header.e_shnum;
5106
5107 /* PR binutils/17531: Cope with unexpected section header sizes. */
5108 if (size == 0 || num == 0)
5109 return FALSE;
5110 if (size < sizeof * shdrs)
5111 {
5112 if (! probe)
5113 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5114 return FALSE;
5115 }
5116 if (!probe && size > sizeof * shdrs)
5117 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5118
5119 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5120 size, num,
5121 probe ? NULL : _("section headers"));
5122 if (shdrs == NULL)
5123 return FALSE;
5124
5125 if (section_headers != NULL)
5126 free (section_headers);
5127 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5128 sizeof (Elf_Internal_Shdr));
5129 if (section_headers == NULL)
5130 {
5131 if (!probe)
5132 error (_("Out of memory reading %u section headers\n"), num);
5133 return FALSE;
5134 }
5135
5136 for (i = 0, internal = section_headers;
5137 i < num;
5138 i++, internal++)
5139 {
5140 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5141 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5142 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5143 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5144 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5145 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5146 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5147 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5148 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5149 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5150 if (!probe && internal->sh_link > num)
5151 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5152 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5153 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5154 }
5155
5156 free (shdrs);
5157 return TRUE;
5158 }
5159
5160 static bfd_boolean
5161 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5162 {
5163 Elf64_External_Shdr * shdrs;
5164 Elf_Internal_Shdr * internal;
5165 unsigned int i;
5166 unsigned int size = elf_header.e_shentsize;
5167 unsigned int num = probe ? 1 : elf_header.e_shnum;
5168
5169 /* PR binutils/17531: Cope with unexpected section header sizes. */
5170 if (size == 0 || num == 0)
5171 return FALSE;
5172 if (size < sizeof * shdrs)
5173 {
5174 if (! probe)
5175 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5176 return FALSE;
5177 }
5178 if (! probe && size > sizeof * shdrs)
5179 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5180
5181 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5182 size, num,
5183 probe ? NULL : _("section headers"));
5184 if (shdrs == NULL)
5185 return FALSE;
5186
5187 if (section_headers != NULL)
5188 free (section_headers);
5189 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5190 sizeof (Elf_Internal_Shdr));
5191 if (section_headers == NULL)
5192 {
5193 if (! probe)
5194 error (_("Out of memory reading %u section headers\n"), num);
5195 return FALSE;
5196 }
5197
5198 for (i = 0, internal = section_headers;
5199 i < num;
5200 i++, internal++)
5201 {
5202 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5203 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5204 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5205 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5206 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5207 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5208 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5209 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5210 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5211 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5212 if (!probe && internal->sh_link > num)
5213 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5214 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5215 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5216 }
5217
5218 free (shdrs);
5219 return TRUE;
5220 }
5221
5222 static Elf_Internal_Sym *
5223 get_32bit_elf_symbols (FILE * file,
5224 Elf_Internal_Shdr * section,
5225 unsigned long * num_syms_return)
5226 {
5227 unsigned long number = 0;
5228 Elf32_External_Sym * esyms = NULL;
5229 Elf_External_Sym_Shndx * shndx = NULL;
5230 Elf_Internal_Sym * isyms = NULL;
5231 Elf_Internal_Sym * psym;
5232 unsigned int j;
5233
5234 if (section->sh_size == 0)
5235 {
5236 if (num_syms_return != NULL)
5237 * num_syms_return = 0;
5238 return NULL;
5239 }
5240
5241 /* Run some sanity checks first. */
5242 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5243 {
5244 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5245 printable_section_name (section), (unsigned long) section->sh_entsize);
5246 goto exit_point;
5247 }
5248
5249 if (section->sh_size > current_file_size)
5250 {
5251 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5252 printable_section_name (section), (unsigned long) section->sh_size);
5253 goto exit_point;
5254 }
5255
5256 number = section->sh_size / section->sh_entsize;
5257
5258 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5259 {
5260 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5261 (unsigned long) section->sh_size,
5262 printable_section_name (section),
5263 (unsigned long) section->sh_entsize);
5264 goto exit_point;
5265 }
5266
5267 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5268 section->sh_size, _("symbols"));
5269 if (esyms == NULL)
5270 goto exit_point;
5271
5272 {
5273 elf_section_list * entry;
5274
5275 shndx = NULL;
5276 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5277 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5278 {
5279 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5280 entry->hdr->sh_offset,
5281 1, entry->hdr->sh_size,
5282 _("symbol table section indicies"));
5283 if (shndx == NULL)
5284 goto exit_point;
5285 /* PR17531: file: heap-buffer-overflow */
5286 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5287 {
5288 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5289 printable_section_name (entry->hdr),
5290 (unsigned long) entry->hdr->sh_size,
5291 (unsigned long) section->sh_size);
5292 goto exit_point;
5293 }
5294 }
5295 }
5296
5297 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5298
5299 if (isyms == NULL)
5300 {
5301 error (_("Out of memory reading %lu symbols\n"),
5302 (unsigned long) number);
5303 goto exit_point;
5304 }
5305
5306 for (j = 0, psym = isyms; j < number; j++, psym++)
5307 {
5308 psym->st_name = BYTE_GET (esyms[j].st_name);
5309 psym->st_value = BYTE_GET (esyms[j].st_value);
5310 psym->st_size = BYTE_GET (esyms[j].st_size);
5311 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5312 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5313 psym->st_shndx
5314 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5315 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5316 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5317 psym->st_info = BYTE_GET (esyms[j].st_info);
5318 psym->st_other = BYTE_GET (esyms[j].st_other);
5319 }
5320
5321 exit_point:
5322 if (shndx != NULL)
5323 free (shndx);
5324 if (esyms != NULL)
5325 free (esyms);
5326
5327 if (num_syms_return != NULL)
5328 * num_syms_return = isyms == NULL ? 0 : number;
5329
5330 return isyms;
5331 }
5332
5333 static Elf_Internal_Sym *
5334 get_64bit_elf_symbols (FILE * file,
5335 Elf_Internal_Shdr * section,
5336 unsigned long * num_syms_return)
5337 {
5338 unsigned long number = 0;
5339 Elf64_External_Sym * esyms = NULL;
5340 Elf_External_Sym_Shndx * shndx = NULL;
5341 Elf_Internal_Sym * isyms = NULL;
5342 Elf_Internal_Sym * psym;
5343 unsigned int j;
5344
5345 if (section->sh_size == 0)
5346 {
5347 if (num_syms_return != NULL)
5348 * num_syms_return = 0;
5349 return NULL;
5350 }
5351
5352 /* Run some sanity checks first. */
5353 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5354 {
5355 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5356 printable_section_name (section),
5357 (unsigned long) section->sh_entsize);
5358 goto exit_point;
5359 }
5360
5361 if (section->sh_size > current_file_size)
5362 {
5363 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5364 printable_section_name (section),
5365 (unsigned long) section->sh_size);
5366 goto exit_point;
5367 }
5368
5369 number = section->sh_size / section->sh_entsize;
5370
5371 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5372 {
5373 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5374 (unsigned long) section->sh_size,
5375 printable_section_name (section),
5376 (unsigned long) section->sh_entsize);
5377 goto exit_point;
5378 }
5379
5380 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5381 section->sh_size, _("symbols"));
5382 if (!esyms)
5383 goto exit_point;
5384
5385 {
5386 elf_section_list * entry;
5387
5388 shndx = NULL;
5389 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5390 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5391 {
5392 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5393 entry->hdr->sh_offset,
5394 1, entry->hdr->sh_size,
5395 _("symbol table section indicies"));
5396 if (shndx == NULL)
5397 goto exit_point;
5398 /* PR17531: file: heap-buffer-overflow */
5399 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5400 {
5401 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5402 printable_section_name (entry->hdr),
5403 (unsigned long) entry->hdr->sh_size,
5404 (unsigned long) section->sh_size);
5405 goto exit_point;
5406 }
5407 }
5408 }
5409
5410 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5411
5412 if (isyms == NULL)
5413 {
5414 error (_("Out of memory reading %lu symbols\n"),
5415 (unsigned long) number);
5416 goto exit_point;
5417 }
5418
5419 for (j = 0, psym = isyms; j < number; j++, psym++)
5420 {
5421 psym->st_name = BYTE_GET (esyms[j].st_name);
5422 psym->st_info = BYTE_GET (esyms[j].st_info);
5423 psym->st_other = BYTE_GET (esyms[j].st_other);
5424 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5425
5426 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5427 psym->st_shndx
5428 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5429 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5430 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5431
5432 psym->st_value = BYTE_GET (esyms[j].st_value);
5433 psym->st_size = BYTE_GET (esyms[j].st_size);
5434 }
5435
5436 exit_point:
5437 if (shndx != NULL)
5438 free (shndx);
5439 if (esyms != NULL)
5440 free (esyms);
5441
5442 if (num_syms_return != NULL)
5443 * num_syms_return = isyms == NULL ? 0 : number;
5444
5445 return isyms;
5446 }
5447
5448 static const char *
5449 get_elf_section_flags (bfd_vma sh_flags)
5450 {
5451 static char buff[1024];
5452 char * p = buff;
5453 int field_size = is_32bit_elf ? 8 : 16;
5454 int sindex;
5455 int size = sizeof (buff) - (field_size + 4 + 1);
5456 bfd_vma os_flags = 0;
5457 bfd_vma proc_flags = 0;
5458 bfd_vma unknown_flags = 0;
5459 static const struct
5460 {
5461 const char * str;
5462 int len;
5463 }
5464 flags [] =
5465 {
5466 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5467 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5468 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5469 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5470 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5471 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5472 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5473 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5474 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5475 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5476 /* IA-64 specific. */
5477 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5478 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5479 /* IA-64 OpenVMS specific. */
5480 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5481 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5482 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5483 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5484 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5485 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5486 /* Generic. */
5487 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5488 /* SPARC specific. */
5489 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5490 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5491 /* ARM specific. */
5492 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5493 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5494 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5495 };
5496
5497 if (do_section_details)
5498 {
5499 sprintf (buff, "[%*.*lx]: ",
5500 field_size, field_size, (unsigned long) sh_flags);
5501 p += field_size + 4;
5502 }
5503
5504 while (sh_flags)
5505 {
5506 bfd_vma flag;
5507
5508 flag = sh_flags & - sh_flags;
5509 sh_flags &= ~ flag;
5510
5511 if (do_section_details)
5512 {
5513 switch (flag)
5514 {
5515 case SHF_WRITE: sindex = 0; break;
5516 case SHF_ALLOC: sindex = 1; break;
5517 case SHF_EXECINSTR: sindex = 2; break;
5518 case SHF_MERGE: sindex = 3; break;
5519 case SHF_STRINGS: sindex = 4; break;
5520 case SHF_INFO_LINK: sindex = 5; break;
5521 case SHF_LINK_ORDER: sindex = 6; break;
5522 case SHF_OS_NONCONFORMING: sindex = 7; break;
5523 case SHF_GROUP: sindex = 8; break;
5524 case SHF_TLS: sindex = 9; break;
5525 case SHF_EXCLUDE: sindex = 18; break;
5526 case SHF_COMPRESSED: sindex = 20; break;
5527
5528 default:
5529 sindex = -1;
5530 switch (elf_header.e_machine)
5531 {
5532 case EM_IA_64:
5533 if (flag == SHF_IA_64_SHORT)
5534 sindex = 10;
5535 else if (flag == SHF_IA_64_NORECOV)
5536 sindex = 11;
5537 #ifdef BFD64
5538 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5539 switch (flag)
5540 {
5541 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5542 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5543 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5544 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5545 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5546 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5547 default: break;
5548 }
5549 #endif
5550 break;
5551
5552 case EM_386:
5553 case EM_IAMCU:
5554 case EM_X86_64:
5555 case EM_L1OM:
5556 case EM_K1OM:
5557 case EM_OLD_SPARCV9:
5558 case EM_SPARC32PLUS:
5559 case EM_SPARCV9:
5560 case EM_SPARC:
5561 if (flag == SHF_ORDERED)
5562 sindex = 19;
5563 break;
5564
5565 case EM_ARM:
5566 switch (flag)
5567 {
5568 case SHF_ENTRYSECT: sindex = 21; break;
5569 case SHF_ARM_PURECODE: sindex = 22; break;
5570 case SHF_COMDEF: sindex = 23; break;
5571 default: break;
5572 }
5573 break;
5574
5575 default:
5576 break;
5577 }
5578 }
5579
5580 if (sindex != -1)
5581 {
5582 if (p != buff + field_size + 4)
5583 {
5584 if (size < (10 + 2))
5585 {
5586 warn (_("Internal error: not enough buffer room for section flag info"));
5587 return _("<unknown>");
5588 }
5589 size -= 2;
5590 *p++ = ',';
5591 *p++ = ' ';
5592 }
5593
5594 size -= flags [sindex].len;
5595 p = stpcpy (p, flags [sindex].str);
5596 }
5597 else if (flag & SHF_MASKOS)
5598 os_flags |= flag;
5599 else if (flag & SHF_MASKPROC)
5600 proc_flags |= flag;
5601 else
5602 unknown_flags |= flag;
5603 }
5604 else
5605 {
5606 switch (flag)
5607 {
5608 case SHF_WRITE: *p = 'W'; break;
5609 case SHF_ALLOC: *p = 'A'; break;
5610 case SHF_EXECINSTR: *p = 'X'; break;
5611 case SHF_MERGE: *p = 'M'; break;
5612 case SHF_STRINGS: *p = 'S'; break;
5613 case SHF_INFO_LINK: *p = 'I'; break;
5614 case SHF_LINK_ORDER: *p = 'L'; break;
5615 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5616 case SHF_GROUP: *p = 'G'; break;
5617 case SHF_TLS: *p = 'T'; break;
5618 case SHF_EXCLUDE: *p = 'E'; break;
5619 case SHF_COMPRESSED: *p = 'C'; break;
5620
5621 default:
5622 if ((elf_header.e_machine == EM_X86_64
5623 || elf_header.e_machine == EM_L1OM
5624 || elf_header.e_machine == EM_K1OM)
5625 && flag == SHF_X86_64_LARGE)
5626 *p = 'l';
5627 else if (elf_header.e_machine == EM_ARM
5628 && flag == SHF_ARM_PURECODE)
5629 *p = 'y';
5630 else if (flag & SHF_MASKOS)
5631 {
5632 *p = 'o';
5633 sh_flags &= ~ SHF_MASKOS;
5634 }
5635 else if (flag & SHF_MASKPROC)
5636 {
5637 *p = 'p';
5638 sh_flags &= ~ SHF_MASKPROC;
5639 }
5640 else
5641 *p = 'x';
5642 break;
5643 }
5644 p++;
5645 }
5646 }
5647
5648 if (do_section_details)
5649 {
5650 if (os_flags)
5651 {
5652 size -= 5 + field_size;
5653 if (p != buff + field_size + 4)
5654 {
5655 if (size < (2 + 1))
5656 {
5657 warn (_("Internal error: not enough buffer room for section flag info"));
5658 return _("<unknown>");
5659 }
5660 size -= 2;
5661 *p++ = ',';
5662 *p++ = ' ';
5663 }
5664 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5665 (unsigned long) os_flags);
5666 p += 5 + field_size;
5667 }
5668 if (proc_flags)
5669 {
5670 size -= 7 + field_size;
5671 if (p != buff + field_size + 4)
5672 {
5673 if (size < (2 + 1))
5674 {
5675 warn (_("Internal error: not enough buffer room for section flag info"));
5676 return _("<unknown>");
5677 }
5678 size -= 2;
5679 *p++ = ',';
5680 *p++ = ' ';
5681 }
5682 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5683 (unsigned long) proc_flags);
5684 p += 7 + field_size;
5685 }
5686 if (unknown_flags)
5687 {
5688 size -= 10 + field_size;
5689 if (p != buff + field_size + 4)
5690 {
5691 if (size < (2 + 1))
5692 {
5693 warn (_("Internal error: not enough buffer room for section flag info"));
5694 return _("<unknown>");
5695 }
5696 size -= 2;
5697 *p++ = ',';
5698 *p++ = ' ';
5699 }
5700 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5701 (unsigned long) unknown_flags);
5702 p += 10 + field_size;
5703 }
5704 }
5705
5706 *p = '\0';
5707 return buff;
5708 }
5709
5710 static unsigned int
5711 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5712 {
5713 if (is_32bit_elf)
5714 {
5715 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5716
5717 chdr->ch_type = BYTE_GET (echdr->ch_type);
5718 chdr->ch_size = BYTE_GET (echdr->ch_size);
5719 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5720 return sizeof (*echdr);
5721 }
5722 else
5723 {
5724 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5725
5726 chdr->ch_type = BYTE_GET (echdr->ch_type);
5727 chdr->ch_size = BYTE_GET (echdr->ch_size);
5728 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5729 return sizeof (*echdr);
5730 }
5731 }
5732
5733 static int
5734 process_section_headers (FILE * file)
5735 {
5736 Elf_Internal_Shdr * section;
5737 unsigned int i;
5738
5739 section_headers = NULL;
5740
5741 if (elf_header.e_shnum == 0)
5742 {
5743 /* PR binutils/12467. */
5744 if (elf_header.e_shoff != 0)
5745 warn (_("possibly corrupt ELF file header - it has a non-zero"
5746 " section header offset, but no section headers\n"));
5747 else if (do_sections)
5748 printf (_("\nThere are no sections in this file.\n"));
5749
5750 return 1;
5751 }
5752
5753 if (do_sections && !do_header)
5754 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5755 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5756
5757 if (is_32bit_elf)
5758 {
5759 if (! get_32bit_section_headers (file, FALSE))
5760 return 0;
5761 }
5762 else if (! get_64bit_section_headers (file, FALSE))
5763 return 0;
5764
5765 /* Read in the string table, so that we have names to display. */
5766 if (elf_header.e_shstrndx != SHN_UNDEF
5767 && elf_header.e_shstrndx < elf_header.e_shnum)
5768 {
5769 section = section_headers + elf_header.e_shstrndx;
5770
5771 if (section->sh_size != 0)
5772 {
5773 string_table = (char *) get_data (NULL, file, section->sh_offset,
5774 1, section->sh_size,
5775 _("string table"));
5776
5777 string_table_length = string_table != NULL ? section->sh_size : 0;
5778 }
5779 }
5780
5781 /* Scan the sections for the dynamic symbol table
5782 and dynamic string table and debug sections. */
5783 dynamic_symbols = NULL;
5784 dynamic_strings = NULL;
5785 dynamic_syminfo = NULL;
5786 symtab_shndx_list = NULL;
5787
5788 eh_addr_size = is_32bit_elf ? 4 : 8;
5789 switch (elf_header.e_machine)
5790 {
5791 case EM_MIPS:
5792 case EM_MIPS_RS3_LE:
5793 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5794 FDE addresses. However, the ABI also has a semi-official ILP32
5795 variant for which the normal FDE address size rules apply.
5796
5797 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5798 section, where XX is the size of longs in bits. Unfortunately,
5799 earlier compilers provided no way of distinguishing ILP32 objects
5800 from LP64 objects, so if there's any doubt, we should assume that
5801 the official LP64 form is being used. */
5802 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5803 && find_section (".gcc_compiled_long32") == NULL)
5804 eh_addr_size = 8;
5805 break;
5806
5807 case EM_H8_300:
5808 case EM_H8_300H:
5809 switch (elf_header.e_flags & EF_H8_MACH)
5810 {
5811 case E_H8_MACH_H8300:
5812 case E_H8_MACH_H8300HN:
5813 case E_H8_MACH_H8300SN:
5814 case E_H8_MACH_H8300SXN:
5815 eh_addr_size = 2;
5816 break;
5817 case E_H8_MACH_H8300H:
5818 case E_H8_MACH_H8300S:
5819 case E_H8_MACH_H8300SX:
5820 eh_addr_size = 4;
5821 break;
5822 }
5823 break;
5824
5825 case EM_M32C_OLD:
5826 case EM_M32C:
5827 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5828 {
5829 case EF_M32C_CPU_M16C:
5830 eh_addr_size = 2;
5831 break;
5832 }
5833 break;
5834 }
5835
5836 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5837 do \
5838 { \
5839 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5840 if (section->sh_entsize != expected_entsize) \
5841 { \
5842 char buf[40]; \
5843 sprintf_vma (buf, section->sh_entsize); \
5844 /* Note: coded this way so that there is a single string for \
5845 translation. */ \
5846 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5847 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5848 (unsigned) expected_entsize); \
5849 section->sh_entsize = expected_entsize; \
5850 } \
5851 } \
5852 while (0)
5853
5854 #define CHECK_ENTSIZE(section, i, type) \
5855 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5856 sizeof (Elf64_External_##type))
5857
5858 for (i = 0, section = section_headers;
5859 i < elf_header.e_shnum;
5860 i++, section++)
5861 {
5862 char * name = SECTION_NAME (section);
5863
5864 if (section->sh_type == SHT_DYNSYM)
5865 {
5866 if (dynamic_symbols != NULL)
5867 {
5868 error (_("File contains multiple dynamic symbol tables\n"));
5869 continue;
5870 }
5871
5872 CHECK_ENTSIZE (section, i, Sym);
5873 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5874 }
5875 else if (section->sh_type == SHT_STRTAB
5876 && streq (name, ".dynstr"))
5877 {
5878 if (dynamic_strings != NULL)
5879 {
5880 error (_("File contains multiple dynamic string tables\n"));
5881 continue;
5882 }
5883
5884 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5885 1, section->sh_size,
5886 _("dynamic strings"));
5887 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5888 }
5889 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5890 {
5891 elf_section_list * entry = xmalloc (sizeof * entry);
5892 entry->hdr = section;
5893 entry->next = symtab_shndx_list;
5894 symtab_shndx_list = entry;
5895 }
5896 else if (section->sh_type == SHT_SYMTAB)
5897 CHECK_ENTSIZE (section, i, Sym);
5898 else if (section->sh_type == SHT_GROUP)
5899 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5900 else if (section->sh_type == SHT_REL)
5901 CHECK_ENTSIZE (section, i, Rel);
5902 else if (section->sh_type == SHT_RELA)
5903 CHECK_ENTSIZE (section, i, Rela);
5904 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5905 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5906 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5907 || do_debug_str || do_debug_loc || do_debug_ranges
5908 || do_debug_addr || do_debug_cu_index)
5909 && (const_strneq (name, ".debug_")
5910 || const_strneq (name, ".zdebug_")))
5911 {
5912 if (name[1] == 'z')
5913 name += sizeof (".zdebug_") - 1;
5914 else
5915 name += sizeof (".debug_") - 1;
5916
5917 if (do_debugging
5918 || (do_debug_info && const_strneq (name, "info"))
5919 || (do_debug_info && const_strneq (name, "types"))
5920 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5921 || (do_debug_lines && strcmp (name, "line") == 0)
5922 || (do_debug_lines && const_strneq (name, "line."))
5923 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5924 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5925 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5926 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5927 || (do_debug_aranges && const_strneq (name, "aranges"))
5928 || (do_debug_ranges && const_strneq (name, "ranges"))
5929 || (do_debug_frames && const_strneq (name, "frame"))
5930 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5931 || (do_debug_macinfo && const_strneq (name, "macro"))
5932 || (do_debug_str && const_strneq (name, "str"))
5933 || (do_debug_loc && const_strneq (name, "loc"))
5934 || (do_debug_addr && const_strneq (name, "addr"))
5935 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5936 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5937 )
5938 request_dump_bynumber (i, DEBUG_DUMP);
5939 }
5940 /* Linkonce section to be combined with .debug_info at link time. */
5941 else if ((do_debugging || do_debug_info)
5942 && const_strneq (name, ".gnu.linkonce.wi."))
5943 request_dump_bynumber (i, DEBUG_DUMP);
5944 else if (do_debug_frames && streq (name, ".eh_frame"))
5945 request_dump_bynumber (i, DEBUG_DUMP);
5946 else if (do_gdb_index && streq (name, ".gdb_index"))
5947 request_dump_bynumber (i, DEBUG_DUMP);
5948 /* Trace sections for Itanium VMS. */
5949 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5950 || do_trace_aranges)
5951 && const_strneq (name, ".trace_"))
5952 {
5953 name += sizeof (".trace_") - 1;
5954
5955 if (do_debugging
5956 || (do_trace_info && streq (name, "info"))
5957 || (do_trace_abbrevs && streq (name, "abbrev"))
5958 || (do_trace_aranges && streq (name, "aranges"))
5959 )
5960 request_dump_bynumber (i, DEBUG_DUMP);
5961 }
5962 }
5963
5964 if (! do_sections)
5965 return 1;
5966
5967 if (elf_header.e_shnum > 1)
5968 printf (_("\nSection Headers:\n"));
5969 else
5970 printf (_("\nSection Header:\n"));
5971
5972 if (is_32bit_elf)
5973 {
5974 if (do_section_details)
5975 {
5976 printf (_(" [Nr] Name\n"));
5977 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5978 }
5979 else
5980 printf
5981 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5982 }
5983 else if (do_wide)
5984 {
5985 if (do_section_details)
5986 {
5987 printf (_(" [Nr] Name\n"));
5988 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5989 }
5990 else
5991 printf
5992 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5993 }
5994 else
5995 {
5996 if (do_section_details)
5997 {
5998 printf (_(" [Nr] Name\n"));
5999 printf (_(" Type Address Offset Link\n"));
6000 printf (_(" Size EntSize Info Align\n"));
6001 }
6002 else
6003 {
6004 printf (_(" [Nr] Name Type Address Offset\n"));
6005 printf (_(" Size EntSize Flags Link Info Align\n"));
6006 }
6007 }
6008
6009 if (do_section_details)
6010 printf (_(" Flags\n"));
6011
6012 for (i = 0, section = section_headers;
6013 i < elf_header.e_shnum;
6014 i++, section++)
6015 {
6016 /* Run some sanity checks on the section header. */
6017
6018 /* Check the sh_link field. */
6019 switch (section->sh_type)
6020 {
6021 case SHT_SYMTAB_SHNDX:
6022 case SHT_GROUP:
6023 case SHT_HASH:
6024 case SHT_GNU_HASH:
6025 case SHT_GNU_versym:
6026 case SHT_REL:
6027 case SHT_RELA:
6028 if (section->sh_link < 1
6029 || section->sh_link >= elf_header.e_shnum
6030 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6031 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6032 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6033 i, section->sh_link);
6034 break;
6035
6036 case SHT_DYNAMIC:
6037 case SHT_SYMTAB:
6038 case SHT_DYNSYM:
6039 case SHT_GNU_verneed:
6040 case SHT_GNU_verdef:
6041 case SHT_GNU_LIBLIST:
6042 if (section->sh_link < 1
6043 || section->sh_link >= elf_header.e_shnum
6044 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6045 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6046 i, section->sh_link);
6047 break;
6048
6049 case SHT_INIT_ARRAY:
6050 case SHT_FINI_ARRAY:
6051 case SHT_PREINIT_ARRAY:
6052 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6053 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6054 i, section->sh_link);
6055 break;
6056
6057 default:
6058 /* FIXME: Add support for target specific section types. */
6059 #if 0 /* Currently we do not check other section types as there are too
6060 many special cases. Stab sections for example have a type
6061 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6062 section. */
6063 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6064 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6065 i, section->sh_link);
6066 #endif
6067 break;
6068 }
6069
6070 /* Check the sh_info field. */
6071 switch (section->sh_type)
6072 {
6073 case SHT_REL:
6074 case SHT_RELA:
6075 if (section->sh_info < 1
6076 || section->sh_info >= elf_header.e_shnum
6077 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6078 && section_headers[section->sh_info].sh_type != SHT_NOBITS
6079 && section_headers[section->sh_info].sh_type != SHT_NOTE
6080 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6081 /* FIXME: Are other section types valid ? */
6082 && section_headers[section->sh_info].sh_type < SHT_LOOS))
6083 {
6084 if (section->sh_info == 0
6085 && (streq (SECTION_NAME (section), ".rel.dyn")
6086 || streq (SECTION_NAME (section), ".rela.dyn")))
6087 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6088 of zero. No idea why. I would have expected the index
6089 of the .plt section. */
6090 ;
6091 else
6092 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6093 i, section->sh_info);
6094 }
6095 break;
6096
6097 case SHT_DYNAMIC:
6098 case SHT_HASH:
6099 case SHT_SYMTAB_SHNDX:
6100 case SHT_INIT_ARRAY:
6101 case SHT_FINI_ARRAY:
6102 case SHT_PREINIT_ARRAY:
6103 if (section->sh_info != 0)
6104 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6105 i, section->sh_info);
6106 break;
6107
6108 case SHT_GROUP:
6109 case SHT_SYMTAB:
6110 case SHT_DYNSYM:
6111 /* A symbol index - we assume that it is valid. */
6112 break;
6113
6114 default:
6115 /* FIXME: Add support for target specific section types. */
6116 if (section->sh_type == SHT_NOBITS)
6117 /* NOBITS section headers with non-zero sh_info fields can be
6118 created when a binary is stripped of everything but its debug
6119 information. The stripped sections have their headers
6120 preserved but their types set to SHT_NOBITS. So do not check
6121 this type of section. */
6122 ;
6123 else if (section->sh_flags & SHF_INFO_LINK)
6124 {
6125 if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
6126 warn (_("[%2u]: Expected link to another section in info field"), i);
6127 }
6128 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6129 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6130 i, section->sh_info);
6131 break;
6132 }
6133
6134 printf (" [%2u] ", i);
6135 if (do_section_details)
6136 printf ("%s\n ", printable_section_name (section));
6137 else
6138 print_symbol (-17, SECTION_NAME (section));
6139
6140 printf (do_wide ? " %-15s " : " %-15.15s ",
6141 get_section_type_name (section->sh_type));
6142
6143 if (is_32bit_elf)
6144 {
6145 const char * link_too_big = NULL;
6146
6147 print_vma (section->sh_addr, LONG_HEX);
6148
6149 printf ( " %6.6lx %6.6lx %2.2lx",
6150 (unsigned long) section->sh_offset,
6151 (unsigned long) section->sh_size,
6152 (unsigned long) section->sh_entsize);
6153
6154 if (do_section_details)
6155 fputs (" ", stdout);
6156 else
6157 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6158
6159 if (section->sh_link >= elf_header.e_shnum)
6160 {
6161 link_too_big = "";
6162 /* The sh_link value is out of range. Normally this indicates
6163 an error but it can have special values in Solaris binaries. */
6164 switch (elf_header.e_machine)
6165 {
6166 case EM_386:
6167 case EM_IAMCU:
6168 case EM_X86_64:
6169 case EM_L1OM:
6170 case EM_K1OM:
6171 case EM_OLD_SPARCV9:
6172 case EM_SPARC32PLUS:
6173 case EM_SPARCV9:
6174 case EM_SPARC:
6175 if (section->sh_link == (SHN_BEFORE & 0xffff))
6176 link_too_big = "BEFORE";
6177 else if (section->sh_link == (SHN_AFTER & 0xffff))
6178 link_too_big = "AFTER";
6179 break;
6180 default:
6181 break;
6182 }
6183 }
6184
6185 if (do_section_details)
6186 {
6187 if (link_too_big != NULL && * link_too_big)
6188 printf ("<%s> ", link_too_big);
6189 else
6190 printf ("%2u ", section->sh_link);
6191 printf ("%3u %2lu\n", section->sh_info,
6192 (unsigned long) section->sh_addralign);
6193 }
6194 else
6195 printf ("%2u %3u %2lu\n",
6196 section->sh_link,
6197 section->sh_info,
6198 (unsigned long) section->sh_addralign);
6199
6200 if (link_too_big && ! * link_too_big)
6201 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6202 i, section->sh_link);
6203 }
6204 else if (do_wide)
6205 {
6206 print_vma (section->sh_addr, LONG_HEX);
6207
6208 if ((long) section->sh_offset == section->sh_offset)
6209 printf (" %6.6lx", (unsigned long) section->sh_offset);
6210 else
6211 {
6212 putchar (' ');
6213 print_vma (section->sh_offset, LONG_HEX);
6214 }
6215
6216 if ((unsigned long) section->sh_size == section->sh_size)
6217 printf (" %6.6lx", (unsigned long) section->sh_size);
6218 else
6219 {
6220 putchar (' ');
6221 print_vma (section->sh_size, LONG_HEX);
6222 }
6223
6224 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6225 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6226 else
6227 {
6228 putchar (' ');
6229 print_vma (section->sh_entsize, LONG_HEX);
6230 }
6231
6232 if (do_section_details)
6233 fputs (" ", stdout);
6234 else
6235 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6236
6237 printf ("%2u %3u ", section->sh_link, section->sh_info);
6238
6239 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6240 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6241 else
6242 {
6243 print_vma (section->sh_addralign, DEC);
6244 putchar ('\n');
6245 }
6246 }
6247 else if (do_section_details)
6248 {
6249 printf (" %-15.15s ",
6250 get_section_type_name (section->sh_type));
6251 print_vma (section->sh_addr, LONG_HEX);
6252 if ((long) section->sh_offset == section->sh_offset)
6253 printf (" %16.16lx", (unsigned long) section->sh_offset);
6254 else
6255 {
6256 printf (" ");
6257 print_vma (section->sh_offset, LONG_HEX);
6258 }
6259 printf (" %u\n ", section->sh_link);
6260 print_vma (section->sh_size, LONG_HEX);
6261 putchar (' ');
6262 print_vma (section->sh_entsize, LONG_HEX);
6263
6264 printf (" %-16u %lu\n",
6265 section->sh_info,
6266 (unsigned long) section->sh_addralign);
6267 }
6268 else
6269 {
6270 putchar (' ');
6271 print_vma (section->sh_addr, LONG_HEX);
6272 if ((long) section->sh_offset == section->sh_offset)
6273 printf (" %8.8lx", (unsigned long) section->sh_offset);
6274 else
6275 {
6276 printf (" ");
6277 print_vma (section->sh_offset, LONG_HEX);
6278 }
6279 printf ("\n ");
6280 print_vma (section->sh_size, LONG_HEX);
6281 printf (" ");
6282 print_vma (section->sh_entsize, LONG_HEX);
6283
6284 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6285
6286 printf (" %2u %3u %lu\n",
6287 section->sh_link,
6288 section->sh_info,
6289 (unsigned long) section->sh_addralign);
6290 }
6291
6292 if (do_section_details)
6293 {
6294 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6295 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6296 {
6297 /* Minimum section size is 12 bytes for 32-bit compression
6298 header + 12 bytes for compressed data header. */
6299 unsigned char buf[24];
6300
6301 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6302 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6303 sizeof (buf), _("compression header")))
6304 {
6305 Elf_Internal_Chdr chdr;
6306
6307 (void) get_compression_header (&chdr, buf);
6308
6309 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6310 printf (" ZLIB, ");
6311 else
6312 printf (_(" [<unknown>: 0x%x], "),
6313 chdr.ch_type);
6314 print_vma (chdr.ch_size, LONG_HEX);
6315 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6316 }
6317 }
6318 }
6319 }
6320
6321 if (!do_section_details)
6322 {
6323 /* The ordering of the letters shown here matches the ordering of the
6324 corresponding SHF_xxx values, and hence the order in which these
6325 letters will be displayed to the user. */
6326 printf (_("Key to Flags:\n\
6327 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6328 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6329 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6330 if (elf_header.e_machine == EM_X86_64
6331 || elf_header.e_machine == EM_L1OM
6332 || elf_header.e_machine == EM_K1OM)
6333 printf (_("l (large), "));
6334 else if (elf_header.e_machine == EM_ARM)
6335 printf (_("y (purecode), "));
6336 printf ("p (processor specific)\n");
6337 }
6338
6339 return 1;
6340 }
6341
6342 static const char *
6343 get_group_flags (unsigned int flags)
6344 {
6345 static char buff[128];
6346
6347 if (flags == 0)
6348 return "";
6349 else if (flags == GRP_COMDAT)
6350 return "COMDAT ";
6351
6352 snprintf (buff, 14, _("[0x%x: "), flags);
6353
6354 flags &= ~ GRP_COMDAT;
6355 if (flags & GRP_MASKOS)
6356 {
6357 strcat (buff, "<OS specific>");
6358 flags &= ~ GRP_MASKOS;
6359 }
6360
6361 if (flags & GRP_MASKPROC)
6362 {
6363 strcat (buff, "<PROC specific>");
6364 flags &= ~ GRP_MASKPROC;
6365 }
6366
6367 if (flags)
6368 strcat (buff, "<unknown>");
6369
6370 strcat (buff, "]");
6371 return buff;
6372 }
6373
6374 static int
6375 process_section_groups (FILE * file)
6376 {
6377 Elf_Internal_Shdr * section;
6378 unsigned int i;
6379 struct group * group;
6380 Elf_Internal_Shdr * symtab_sec;
6381 Elf_Internal_Shdr * strtab_sec;
6382 Elf_Internal_Sym * symtab;
6383 unsigned long num_syms;
6384 char * strtab;
6385 size_t strtab_size;
6386
6387 /* Don't process section groups unless needed. */
6388 if (!do_unwind && !do_section_groups)
6389 return 1;
6390
6391 if (elf_header.e_shnum == 0)
6392 {
6393 if (do_section_groups)
6394 printf (_("\nThere are no sections to group in this file.\n"));
6395
6396 return 1;
6397 }
6398
6399 if (section_headers == NULL)
6400 {
6401 error (_("Section headers are not available!\n"));
6402 /* PR 13622: This can happen with a corrupt ELF header. */
6403 return 0;
6404 }
6405
6406 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6407 sizeof (struct group *));
6408
6409 if (section_headers_groups == NULL)
6410 {
6411 error (_("Out of memory reading %u section group headers\n"),
6412 elf_header.e_shnum);
6413 return 0;
6414 }
6415
6416 /* Scan the sections for the group section. */
6417 group_count = 0;
6418 for (i = 0, section = section_headers;
6419 i < elf_header.e_shnum;
6420 i++, section++)
6421 if (section->sh_type == SHT_GROUP)
6422 group_count++;
6423
6424 if (group_count == 0)
6425 {
6426 if (do_section_groups)
6427 printf (_("\nThere are no section groups in this file.\n"));
6428
6429 return 1;
6430 }
6431
6432 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6433
6434 if (section_groups == NULL)
6435 {
6436 error (_("Out of memory reading %lu groups\n"),
6437 (unsigned long) group_count);
6438 return 0;
6439 }
6440
6441 symtab_sec = NULL;
6442 strtab_sec = NULL;
6443 symtab = NULL;
6444 num_syms = 0;
6445 strtab = NULL;
6446 strtab_size = 0;
6447 for (i = 0, section = section_headers, group = section_groups;
6448 i < elf_header.e_shnum;
6449 i++, section++)
6450 {
6451 if (section->sh_type == SHT_GROUP)
6452 {
6453 const char * name = printable_section_name (section);
6454 const char * group_name;
6455 unsigned char * start;
6456 unsigned char * indices;
6457 unsigned int entry, j, size;
6458 Elf_Internal_Shdr * sec;
6459 Elf_Internal_Sym * sym;
6460
6461 /* Get the symbol table. */
6462 if (section->sh_link >= elf_header.e_shnum
6463 || ((sec = section_headers + section->sh_link)->sh_type
6464 != SHT_SYMTAB))
6465 {
6466 error (_("Bad sh_link in group section `%s'\n"), name);
6467 continue;
6468 }
6469
6470 if (symtab_sec != sec)
6471 {
6472 symtab_sec = sec;
6473 if (symtab)
6474 free (symtab);
6475 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6476 }
6477
6478 if (symtab == NULL)
6479 {
6480 error (_("Corrupt header in group section `%s'\n"), name);
6481 continue;
6482 }
6483
6484 if (section->sh_info >= num_syms)
6485 {
6486 error (_("Bad sh_info in group section `%s'\n"), name);
6487 continue;
6488 }
6489
6490 sym = symtab + section->sh_info;
6491
6492 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6493 {
6494 if (sym->st_shndx == 0
6495 || sym->st_shndx >= elf_header.e_shnum)
6496 {
6497 error (_("Bad sh_info in group section `%s'\n"), name);
6498 continue;
6499 }
6500
6501 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6502 strtab_sec = NULL;
6503 if (strtab)
6504 free (strtab);
6505 strtab = NULL;
6506 strtab_size = 0;
6507 }
6508 else
6509 {
6510 /* Get the string table. */
6511 if (symtab_sec->sh_link >= elf_header.e_shnum)
6512 {
6513 strtab_sec = NULL;
6514 if (strtab)
6515 free (strtab);
6516 strtab = NULL;
6517 strtab_size = 0;
6518 }
6519 else if (strtab_sec
6520 != (sec = section_headers + symtab_sec->sh_link))
6521 {
6522 strtab_sec = sec;
6523 if (strtab)
6524 free (strtab);
6525
6526 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6527 1, strtab_sec->sh_size,
6528 _("string table"));
6529 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6530 }
6531 group_name = sym->st_name < strtab_size
6532 ? strtab + sym->st_name : _("<corrupt>");
6533 }
6534
6535 /* PR 17531: file: loop. */
6536 if (section->sh_entsize > section->sh_size)
6537 {
6538 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6539 printable_section_name (section),
6540 (unsigned long) section->sh_entsize,
6541 (unsigned long) section->sh_size);
6542 break;
6543 }
6544
6545 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6546 1, section->sh_size,
6547 _("section data"));
6548 if (start == NULL)
6549 continue;
6550
6551 indices = start;
6552 size = (section->sh_size / section->sh_entsize) - 1;
6553 entry = byte_get (indices, 4);
6554 indices += 4;
6555
6556 if (do_section_groups)
6557 {
6558 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6559 get_group_flags (entry), i, name, group_name, size);
6560
6561 printf (_(" [Index] Name\n"));
6562 }
6563
6564 group->group_index = i;
6565
6566 for (j = 0; j < size; j++)
6567 {
6568 struct group_list * g;
6569
6570 entry = byte_get (indices, 4);
6571 indices += 4;
6572
6573 if (entry >= elf_header.e_shnum)
6574 {
6575 static unsigned num_group_errors = 0;
6576
6577 if (num_group_errors ++ < 10)
6578 {
6579 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6580 entry, i, elf_header.e_shnum - 1);
6581 if (num_group_errors == 10)
6582 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6583 }
6584 continue;
6585 }
6586
6587 if (section_headers_groups [entry] != NULL)
6588 {
6589 if (entry)
6590 {
6591 static unsigned num_errs = 0;
6592
6593 if (num_errs ++ < 10)
6594 {
6595 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6596 entry, i,
6597 section_headers_groups [entry]->group_index);
6598 if (num_errs == 10)
6599 warn (_("Further error messages about already contained group sections suppressed\n"));
6600 }
6601 continue;
6602 }
6603 else
6604 {
6605 /* Intel C/C++ compiler may put section 0 in a
6606 section group. We just warn it the first time
6607 and ignore it afterwards. */
6608 static int warned = 0;
6609 if (!warned)
6610 {
6611 error (_("section 0 in group section [%5u]\n"),
6612 section_headers_groups [entry]->group_index);
6613 warned++;
6614 }
6615 }
6616 }
6617
6618 section_headers_groups [entry] = group;
6619
6620 if (do_section_groups)
6621 {
6622 sec = section_headers + entry;
6623 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6624 }
6625
6626 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6627 g->section_index = entry;
6628 g->next = group->root;
6629 group->root = g;
6630 }
6631
6632 if (start)
6633 free (start);
6634
6635 group++;
6636 }
6637 }
6638
6639 if (symtab)
6640 free (symtab);
6641 if (strtab)
6642 free (strtab);
6643 return 1;
6644 }
6645
6646 /* Data used to display dynamic fixups. */
6647
6648 struct ia64_vms_dynfixup
6649 {
6650 bfd_vma needed_ident; /* Library ident number. */
6651 bfd_vma needed; /* Index in the dstrtab of the library name. */
6652 bfd_vma fixup_needed; /* Index of the library. */
6653 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6654 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6655 };
6656
6657 /* Data used to display dynamic relocations. */
6658
6659 struct ia64_vms_dynimgrela
6660 {
6661 bfd_vma img_rela_cnt; /* Number of relocations. */
6662 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6663 };
6664
6665 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6666 library). */
6667
6668 static void
6669 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6670 const char *strtab, unsigned int strtab_sz)
6671 {
6672 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6673 long i;
6674 const char *lib_name;
6675
6676 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6677 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6678 _("dynamic section image fixups"));
6679 if (!imfs)
6680 return;
6681
6682 if (fixup->needed < strtab_sz)
6683 lib_name = strtab + fixup->needed;
6684 else
6685 {
6686 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6687 (unsigned long) fixup->needed);
6688 lib_name = "???";
6689 }
6690 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6691 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6692 printf
6693 (_("Seg Offset Type SymVec DataType\n"));
6694
6695 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6696 {
6697 unsigned int type;
6698 const char *rtype;
6699
6700 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6701 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6702 type = BYTE_GET (imfs [i].type);
6703 rtype = elf_ia64_reloc_type (type);
6704 if (rtype == NULL)
6705 printf (" 0x%08x ", type);
6706 else
6707 printf (" %-32s ", rtype);
6708 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6709 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6710 }
6711
6712 free (imfs);
6713 }
6714
6715 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6716
6717 static void
6718 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6719 {
6720 Elf64_External_VMS_IMAGE_RELA *imrs;
6721 long i;
6722
6723 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6724 1, imgrela->img_rela_cnt * sizeof (*imrs),
6725 _("dynamic section image relocations"));
6726 if (!imrs)
6727 return;
6728
6729 printf (_("\nImage relocs\n"));
6730 printf
6731 (_("Seg Offset Type Addend Seg Sym Off\n"));
6732
6733 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6734 {
6735 unsigned int type;
6736 const char *rtype;
6737
6738 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6739 printf ("%08" BFD_VMA_FMT "x ",
6740 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6741 type = BYTE_GET (imrs [i].type);
6742 rtype = elf_ia64_reloc_type (type);
6743 if (rtype == NULL)
6744 printf ("0x%08x ", type);
6745 else
6746 printf ("%-31s ", rtype);
6747 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6748 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6749 printf ("%08" BFD_VMA_FMT "x\n",
6750 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6751 }
6752
6753 free (imrs);
6754 }
6755
6756 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6757
6758 static int
6759 process_ia64_vms_dynamic_relocs (FILE *file)
6760 {
6761 struct ia64_vms_dynfixup fixup;
6762 struct ia64_vms_dynimgrela imgrela;
6763 Elf_Internal_Dyn *entry;
6764 int res = 0;
6765 bfd_vma strtab_off = 0;
6766 bfd_vma strtab_sz = 0;
6767 char *strtab = NULL;
6768
6769 memset (&fixup, 0, sizeof (fixup));
6770 memset (&imgrela, 0, sizeof (imgrela));
6771
6772 /* Note: the order of the entries is specified by the OpenVMS specs. */
6773 for (entry = dynamic_section;
6774 entry < dynamic_section + dynamic_nent;
6775 entry++)
6776 {
6777 switch (entry->d_tag)
6778 {
6779 case DT_IA_64_VMS_STRTAB_OFFSET:
6780 strtab_off = entry->d_un.d_val;
6781 break;
6782 case DT_STRSZ:
6783 strtab_sz = entry->d_un.d_val;
6784 if (strtab == NULL)
6785 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6786 1, strtab_sz, _("dynamic string section"));
6787 break;
6788
6789 case DT_IA_64_VMS_NEEDED_IDENT:
6790 fixup.needed_ident = entry->d_un.d_val;
6791 break;
6792 case DT_NEEDED:
6793 fixup.needed = entry->d_un.d_val;
6794 break;
6795 case DT_IA_64_VMS_FIXUP_NEEDED:
6796 fixup.fixup_needed = entry->d_un.d_val;
6797 break;
6798 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6799 fixup.fixup_rela_cnt = entry->d_un.d_val;
6800 break;
6801 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6802 fixup.fixup_rela_off = entry->d_un.d_val;
6803 res++;
6804 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6805 break;
6806
6807 case DT_IA_64_VMS_IMG_RELA_CNT:
6808 imgrela.img_rela_cnt = entry->d_un.d_val;
6809 break;
6810 case DT_IA_64_VMS_IMG_RELA_OFF:
6811 imgrela.img_rela_off = entry->d_un.d_val;
6812 res++;
6813 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6814 break;
6815
6816 default:
6817 break;
6818 }
6819 }
6820
6821 if (strtab != NULL)
6822 free (strtab);
6823
6824 return res;
6825 }
6826
6827 static struct
6828 {
6829 const char * name;
6830 int reloc;
6831 int size;
6832 int rela;
6833 } dynamic_relocations [] =
6834 {
6835 { "REL", DT_REL, DT_RELSZ, FALSE },
6836 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6837 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6838 };
6839
6840 /* Process the reloc section. */
6841
6842 static int
6843 process_relocs (FILE * file)
6844 {
6845 unsigned long rel_size;
6846 unsigned long rel_offset;
6847
6848
6849 if (!do_reloc)
6850 return 1;
6851
6852 if (do_using_dynamic)
6853 {
6854 int is_rela;
6855 const char * name;
6856 int has_dynamic_reloc;
6857 unsigned int i;
6858
6859 has_dynamic_reloc = 0;
6860
6861 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6862 {
6863 is_rela = dynamic_relocations [i].rela;
6864 name = dynamic_relocations [i].name;
6865 rel_size = dynamic_info [dynamic_relocations [i].size];
6866 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6867
6868 has_dynamic_reloc |= rel_size;
6869
6870 if (is_rela == UNKNOWN)
6871 {
6872 if (dynamic_relocations [i].reloc == DT_JMPREL)
6873 switch (dynamic_info[DT_PLTREL])
6874 {
6875 case DT_REL:
6876 is_rela = FALSE;
6877 break;
6878 case DT_RELA:
6879 is_rela = TRUE;
6880 break;
6881 }
6882 }
6883
6884 if (rel_size)
6885 {
6886 printf
6887 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6888 name, rel_offset, rel_size);
6889
6890 dump_relocations (file,
6891 offset_from_vma (file, rel_offset, rel_size),
6892 rel_size,
6893 dynamic_symbols, num_dynamic_syms,
6894 dynamic_strings, dynamic_strings_length,
6895 is_rela, 1);
6896 }
6897 }
6898
6899 if (is_ia64_vms ())
6900 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6901
6902 if (! has_dynamic_reloc)
6903 printf (_("\nThere are no dynamic relocations in this file.\n"));
6904 }
6905 else
6906 {
6907 Elf_Internal_Shdr * section;
6908 unsigned long i;
6909 int found = 0;
6910
6911 for (i = 0, section = section_headers;
6912 i < elf_header.e_shnum;
6913 i++, section++)
6914 {
6915 if ( section->sh_type != SHT_RELA
6916 && section->sh_type != SHT_REL)
6917 continue;
6918
6919 rel_offset = section->sh_offset;
6920 rel_size = section->sh_size;
6921
6922 if (rel_size)
6923 {
6924 Elf_Internal_Shdr * strsec;
6925 int is_rela;
6926
6927 printf (_("\nRelocation section "));
6928
6929 if (string_table == NULL)
6930 printf ("%d", section->sh_name);
6931 else
6932 printf ("'%s'", printable_section_name (section));
6933
6934 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6935 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6936
6937 is_rela = section->sh_type == SHT_RELA;
6938
6939 if (section->sh_link != 0
6940 && section->sh_link < elf_header.e_shnum)
6941 {
6942 Elf_Internal_Shdr * symsec;
6943 Elf_Internal_Sym * symtab;
6944 unsigned long nsyms;
6945 unsigned long strtablen = 0;
6946 char * strtab = NULL;
6947
6948 symsec = section_headers + section->sh_link;
6949 if (symsec->sh_type != SHT_SYMTAB
6950 && symsec->sh_type != SHT_DYNSYM)
6951 continue;
6952
6953 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6954
6955 if (symtab == NULL)
6956 continue;
6957
6958 if (symsec->sh_link != 0
6959 && symsec->sh_link < elf_header.e_shnum)
6960 {
6961 strsec = section_headers + symsec->sh_link;
6962
6963 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6964 1, strsec->sh_size,
6965 _("string table"));
6966 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6967 }
6968
6969 dump_relocations (file, rel_offset, rel_size,
6970 symtab, nsyms, strtab, strtablen,
6971 is_rela,
6972 symsec->sh_type == SHT_DYNSYM);
6973 if (strtab)
6974 free (strtab);
6975 free (symtab);
6976 }
6977 else
6978 dump_relocations (file, rel_offset, rel_size,
6979 NULL, 0, NULL, 0, is_rela, 0);
6980
6981 found = 1;
6982 }
6983 }
6984
6985 if (! found)
6986 printf (_("\nThere are no relocations in this file.\n"));
6987 }
6988
6989 return 1;
6990 }
6991
6992 /* An absolute address consists of a section and an offset. If the
6993 section is NULL, the offset itself is the address, otherwise, the
6994 address equals to LOAD_ADDRESS(section) + offset. */
6995
6996 struct absaddr
6997 {
6998 unsigned short section;
6999 bfd_vma offset;
7000 };
7001
7002 #define ABSADDR(a) \
7003 ((a).section \
7004 ? section_headers [(a).section].sh_addr + (a).offset \
7005 : (a).offset)
7006
7007 /* Find the nearest symbol at or below ADDR. Returns the symbol
7008 name, if found, and the offset from the symbol to ADDR. */
7009
7010 static void
7011 find_symbol_for_address (Elf_Internal_Sym * symtab,
7012 unsigned long nsyms,
7013 const char * strtab,
7014 unsigned long strtab_size,
7015 struct absaddr addr,
7016 const char ** symname,
7017 bfd_vma * offset)
7018 {
7019 bfd_vma dist = 0x100000;
7020 Elf_Internal_Sym * sym;
7021 Elf_Internal_Sym * beg;
7022 Elf_Internal_Sym * end;
7023 Elf_Internal_Sym * best = NULL;
7024
7025 REMOVE_ARCH_BITS (addr.offset);
7026 beg = symtab;
7027 end = symtab + nsyms;
7028
7029 while (beg < end)
7030 {
7031 bfd_vma value;
7032
7033 sym = beg + (end - beg) / 2;
7034
7035 value = sym->st_value;
7036 REMOVE_ARCH_BITS (value);
7037
7038 if (sym->st_name != 0
7039 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7040 && addr.offset >= value
7041 && addr.offset - value < dist)
7042 {
7043 best = sym;
7044 dist = addr.offset - value;
7045 if (!dist)
7046 break;
7047 }
7048
7049 if (addr.offset < value)
7050 end = sym;
7051 else
7052 beg = sym + 1;
7053 }
7054
7055 if (best)
7056 {
7057 *symname = (best->st_name >= strtab_size
7058 ? _("<corrupt>") : strtab + best->st_name);
7059 *offset = dist;
7060 return;
7061 }
7062
7063 *symname = NULL;
7064 *offset = addr.offset;
7065 }
7066
7067 static int
7068 symcmp (const void *p, const void *q)
7069 {
7070 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7071 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7072
7073 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7074 }
7075
7076 /* Process the unwind section. */
7077
7078 #include "unwind-ia64.h"
7079
7080 struct ia64_unw_table_entry
7081 {
7082 struct absaddr start;
7083 struct absaddr end;
7084 struct absaddr info;
7085 };
7086
7087 struct ia64_unw_aux_info
7088 {
7089 struct ia64_unw_table_entry *table; /* Unwind table. */
7090 unsigned long table_len; /* Length of unwind table. */
7091 unsigned char * info; /* Unwind info. */
7092 unsigned long info_size; /* Size of unwind info. */
7093 bfd_vma info_addr; /* Starting address of unwind info. */
7094 bfd_vma seg_base; /* Starting address of segment. */
7095 Elf_Internal_Sym * symtab; /* The symbol table. */
7096 unsigned long nsyms; /* Number of symbols. */
7097 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7098 unsigned long nfuns; /* Number of entries in funtab. */
7099 char * strtab; /* The string table. */
7100 unsigned long strtab_size; /* Size of string table. */
7101 };
7102
7103 static void
7104 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
7105 {
7106 struct ia64_unw_table_entry * tp;
7107 unsigned long j, nfuns;
7108 int in_body;
7109
7110 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7111 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7112 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7113 aux->funtab[nfuns++] = aux->symtab[j];
7114 aux->nfuns = nfuns;
7115 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7116
7117 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7118 {
7119 bfd_vma stamp;
7120 bfd_vma offset;
7121 const unsigned char * dp;
7122 const unsigned char * head;
7123 const unsigned char * end;
7124 const char * procname;
7125
7126 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7127 aux->strtab_size, tp->start, &procname, &offset);
7128
7129 fputs ("\n<", stdout);
7130
7131 if (procname)
7132 {
7133 fputs (procname, stdout);
7134
7135 if (offset)
7136 printf ("+%lx", (unsigned long) offset);
7137 }
7138
7139 fputs (">: [", stdout);
7140 print_vma (tp->start.offset, PREFIX_HEX);
7141 fputc ('-', stdout);
7142 print_vma (tp->end.offset, PREFIX_HEX);
7143 printf ("], info at +0x%lx\n",
7144 (unsigned long) (tp->info.offset - aux->seg_base));
7145
7146 /* PR 17531: file: 86232b32. */
7147 if (aux->info == NULL)
7148 continue;
7149
7150 /* PR 17531: file: 0997b4d1. */
7151 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7152 {
7153 warn (_("Invalid offset %lx in table entry %ld\n"),
7154 (long) tp->info.offset, (long) (tp - aux->table));
7155 continue;
7156 }
7157
7158 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7159 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7160
7161 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7162 (unsigned) UNW_VER (stamp),
7163 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7164 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7165 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7166 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7167
7168 if (UNW_VER (stamp) != 1)
7169 {
7170 printf (_("\tUnknown version.\n"));
7171 continue;
7172 }
7173
7174 in_body = 0;
7175 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7176 /* PR 17531: file: 16ceda89. */
7177 if (end > aux->info + aux->info_size)
7178 end = aux->info + aux->info_size;
7179 for (dp = head + 8; dp < end;)
7180 dp = unw_decode (dp, in_body, & in_body, end);
7181 }
7182
7183 free (aux->funtab);
7184 }
7185
7186 static bfd_boolean
7187 slurp_ia64_unwind_table (FILE * file,
7188 struct ia64_unw_aux_info * aux,
7189 Elf_Internal_Shdr * sec)
7190 {
7191 unsigned long size, nrelas, i;
7192 Elf_Internal_Phdr * seg;
7193 struct ia64_unw_table_entry * tep;
7194 Elf_Internal_Shdr * relsec;
7195 Elf_Internal_Rela * rela;
7196 Elf_Internal_Rela * rp;
7197 unsigned char * table;
7198 unsigned char * tp;
7199 Elf_Internal_Sym * sym;
7200 const char * relname;
7201
7202 aux->table_len = 0;
7203
7204 /* First, find the starting address of the segment that includes
7205 this section: */
7206
7207 if (elf_header.e_phnum)
7208 {
7209 if (! get_program_headers (file))
7210 return FALSE;
7211
7212 for (seg = program_headers;
7213 seg < program_headers + elf_header.e_phnum;
7214 ++seg)
7215 {
7216 if (seg->p_type != PT_LOAD)
7217 continue;
7218
7219 if (sec->sh_addr >= seg->p_vaddr
7220 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7221 {
7222 aux->seg_base = seg->p_vaddr;
7223 break;
7224 }
7225 }
7226 }
7227
7228 /* Second, build the unwind table from the contents of the unwind section: */
7229 size = sec->sh_size;
7230 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7231 _("unwind table"));
7232 if (!table)
7233 return FALSE;
7234
7235 aux->table_len = size / (3 * eh_addr_size);
7236 aux->table = (struct ia64_unw_table_entry *)
7237 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7238 tep = aux->table;
7239
7240 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7241 {
7242 tep->start.section = SHN_UNDEF;
7243 tep->end.section = SHN_UNDEF;
7244 tep->info.section = SHN_UNDEF;
7245 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7246 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7247 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7248 tep->start.offset += aux->seg_base;
7249 tep->end.offset += aux->seg_base;
7250 tep->info.offset += aux->seg_base;
7251 }
7252 free (table);
7253
7254 /* Third, apply any relocations to the unwind table: */
7255 for (relsec = section_headers;
7256 relsec < section_headers + elf_header.e_shnum;
7257 ++relsec)
7258 {
7259 if (relsec->sh_type != SHT_RELA
7260 || relsec->sh_info >= elf_header.e_shnum
7261 || section_headers + relsec->sh_info != sec)
7262 continue;
7263
7264 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7265 & rela, & nrelas))
7266 {
7267 free (aux->table);
7268 aux->table = NULL;
7269 aux->table_len = 0;
7270 return FALSE;
7271 }
7272
7273 for (rp = rela; rp < rela + nrelas; ++rp)
7274 {
7275 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7276 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7277
7278 /* PR 17531: file: 9fa67536. */
7279 if (relname == NULL)
7280 {
7281 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7282 continue;
7283 }
7284
7285 if (! const_strneq (relname, "R_IA64_SEGREL"))
7286 {
7287 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7288 continue;
7289 }
7290
7291 i = rp->r_offset / (3 * eh_addr_size);
7292
7293 /* PR 17531: file: 5bc8d9bf. */
7294 if (i >= aux->table_len)
7295 {
7296 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7297 continue;
7298 }
7299
7300 switch (rp->r_offset / eh_addr_size % 3)
7301 {
7302 case 0:
7303 aux->table[i].start.section = sym->st_shndx;
7304 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7305 break;
7306 case 1:
7307 aux->table[i].end.section = sym->st_shndx;
7308 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7309 break;
7310 case 2:
7311 aux->table[i].info.section = sym->st_shndx;
7312 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7313 break;
7314 default:
7315 break;
7316 }
7317 }
7318
7319 free (rela);
7320 }
7321
7322 return TRUE;
7323 }
7324
7325 static void
7326 ia64_process_unwind (FILE * file)
7327 {
7328 Elf_Internal_Shdr * sec;
7329 Elf_Internal_Shdr * unwsec = NULL;
7330 Elf_Internal_Shdr * strsec;
7331 unsigned long i, unwcount = 0, unwstart = 0;
7332 struct ia64_unw_aux_info aux;
7333
7334 memset (& aux, 0, sizeof (aux));
7335
7336 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7337 {
7338 if (sec->sh_type == SHT_SYMTAB
7339 && sec->sh_link < elf_header.e_shnum)
7340 {
7341 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7342
7343 strsec = section_headers + sec->sh_link;
7344 if (aux.strtab != NULL)
7345 {
7346 error (_("Multiple auxillary string tables encountered\n"));
7347 free (aux.strtab);
7348 }
7349 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7350 1, strsec->sh_size,
7351 _("string table"));
7352 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7353 }
7354 else if (sec->sh_type == SHT_IA_64_UNWIND)
7355 unwcount++;
7356 }
7357
7358 if (!unwcount)
7359 printf (_("\nThere are no unwind sections in this file.\n"));
7360
7361 while (unwcount-- > 0)
7362 {
7363 char * suffix;
7364 size_t len, len2;
7365
7366 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7367 i < elf_header.e_shnum; ++i, ++sec)
7368 if (sec->sh_type == SHT_IA_64_UNWIND)
7369 {
7370 unwsec = sec;
7371 break;
7372 }
7373 /* We have already counted the number of SHT_IA64_UNWIND
7374 sections so the loop above should never fail. */
7375 assert (unwsec != NULL);
7376
7377 unwstart = i + 1;
7378 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7379
7380 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7381 {
7382 /* We need to find which section group it is in. */
7383 struct group_list * g;
7384
7385 if (section_headers_groups == NULL
7386 || section_headers_groups [i] == NULL)
7387 i = elf_header.e_shnum;
7388 else
7389 {
7390 g = section_headers_groups [i]->root;
7391
7392 for (; g != NULL; g = g->next)
7393 {
7394 sec = section_headers + g->section_index;
7395
7396 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7397 break;
7398 }
7399
7400 if (g == NULL)
7401 i = elf_header.e_shnum;
7402 }
7403 }
7404 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7405 {
7406 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7407 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7408 suffix = SECTION_NAME (unwsec) + len;
7409 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7410 ++i, ++sec)
7411 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7412 && streq (SECTION_NAME (sec) + len2, suffix))
7413 break;
7414 }
7415 else
7416 {
7417 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7418 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7419 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7420 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7421 suffix = "";
7422 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7423 suffix = SECTION_NAME (unwsec) + len;
7424 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7425 ++i, ++sec)
7426 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7427 && streq (SECTION_NAME (sec) + len2, suffix))
7428 break;
7429 }
7430
7431 if (i == elf_header.e_shnum)
7432 {
7433 printf (_("\nCould not find unwind info section for "));
7434
7435 if (string_table == NULL)
7436 printf ("%d", unwsec->sh_name);
7437 else
7438 printf ("'%s'", printable_section_name (unwsec));
7439 }
7440 else
7441 {
7442 aux.info_addr = sec->sh_addr;
7443 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7444 sec->sh_size,
7445 _("unwind info"));
7446 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7447
7448 printf (_("\nUnwind section "));
7449
7450 if (string_table == NULL)
7451 printf ("%d", unwsec->sh_name);
7452 else
7453 printf ("'%s'", printable_section_name (unwsec));
7454
7455 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7456 (unsigned long) unwsec->sh_offset,
7457 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7458
7459 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7460 && aux.table_len > 0)
7461 dump_ia64_unwind (& aux);
7462
7463 if (aux.table)
7464 free ((char *) aux.table);
7465 if (aux.info)
7466 free ((char *) aux.info);
7467 aux.table = NULL;
7468 aux.info = NULL;
7469 }
7470 }
7471
7472 if (aux.symtab)
7473 free (aux.symtab);
7474 if (aux.strtab)
7475 free ((char *) aux.strtab);
7476 }
7477
7478 struct hppa_unw_table_entry
7479 {
7480 struct absaddr start;
7481 struct absaddr end;
7482 unsigned int Cannot_unwind:1; /* 0 */
7483 unsigned int Millicode:1; /* 1 */
7484 unsigned int Millicode_save_sr0:1; /* 2 */
7485 unsigned int Region_description:2; /* 3..4 */
7486 unsigned int reserved1:1; /* 5 */
7487 unsigned int Entry_SR:1; /* 6 */
7488 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7489 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7490 unsigned int Args_stored:1; /* 16 */
7491 unsigned int Variable_Frame:1; /* 17 */
7492 unsigned int Separate_Package_Body:1; /* 18 */
7493 unsigned int Frame_Extension_Millicode:1; /* 19 */
7494 unsigned int Stack_Overflow_Check:1; /* 20 */
7495 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7496 unsigned int Ada_Region:1; /* 22 */
7497 unsigned int cxx_info:1; /* 23 */
7498 unsigned int cxx_try_catch:1; /* 24 */
7499 unsigned int sched_entry_seq:1; /* 25 */
7500 unsigned int reserved2:1; /* 26 */
7501 unsigned int Save_SP:1; /* 27 */
7502 unsigned int Save_RP:1; /* 28 */
7503 unsigned int Save_MRP_in_frame:1; /* 29 */
7504 unsigned int extn_ptr_defined:1; /* 30 */
7505 unsigned int Cleanup_defined:1; /* 31 */
7506
7507 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7508 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7509 unsigned int Large_frame:1; /* 2 */
7510 unsigned int Pseudo_SP_Set:1; /* 3 */
7511 unsigned int reserved4:1; /* 4 */
7512 unsigned int Total_frame_size:27; /* 5..31 */
7513 };
7514
7515 struct hppa_unw_aux_info
7516 {
7517 struct hppa_unw_table_entry * table; /* Unwind table. */
7518 unsigned long table_len; /* Length of unwind table. */
7519 bfd_vma seg_base; /* Starting address of segment. */
7520 Elf_Internal_Sym * symtab; /* The symbol table. */
7521 unsigned long nsyms; /* Number of symbols. */
7522 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7523 unsigned long nfuns; /* Number of entries in funtab. */
7524 char * strtab; /* The string table. */
7525 unsigned long strtab_size; /* Size of string table. */
7526 };
7527
7528 static void
7529 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7530 {
7531 struct hppa_unw_table_entry * tp;
7532 unsigned long j, nfuns;
7533
7534 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7535 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7536 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7537 aux->funtab[nfuns++] = aux->symtab[j];
7538 aux->nfuns = nfuns;
7539 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7540
7541 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7542 {
7543 bfd_vma offset;
7544 const char * procname;
7545
7546 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7547 aux->strtab_size, tp->start, &procname,
7548 &offset);
7549
7550 fputs ("\n<", stdout);
7551
7552 if (procname)
7553 {
7554 fputs (procname, stdout);
7555
7556 if (offset)
7557 printf ("+%lx", (unsigned long) offset);
7558 }
7559
7560 fputs (">: [", stdout);
7561 print_vma (tp->start.offset, PREFIX_HEX);
7562 fputc ('-', stdout);
7563 print_vma (tp->end.offset, PREFIX_HEX);
7564 printf ("]\n\t");
7565
7566 #define PF(_m) if (tp->_m) printf (#_m " ");
7567 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7568 PF(Cannot_unwind);
7569 PF(Millicode);
7570 PF(Millicode_save_sr0);
7571 /* PV(Region_description); */
7572 PF(Entry_SR);
7573 PV(Entry_FR);
7574 PV(Entry_GR);
7575 PF(Args_stored);
7576 PF(Variable_Frame);
7577 PF(Separate_Package_Body);
7578 PF(Frame_Extension_Millicode);
7579 PF(Stack_Overflow_Check);
7580 PF(Two_Instruction_SP_Increment);
7581 PF(Ada_Region);
7582 PF(cxx_info);
7583 PF(cxx_try_catch);
7584 PF(sched_entry_seq);
7585 PF(Save_SP);
7586 PF(Save_RP);
7587 PF(Save_MRP_in_frame);
7588 PF(extn_ptr_defined);
7589 PF(Cleanup_defined);
7590 PF(MPE_XL_interrupt_marker);
7591 PF(HP_UX_interrupt_marker);
7592 PF(Large_frame);
7593 PF(Pseudo_SP_Set);
7594 PV(Total_frame_size);
7595 #undef PF
7596 #undef PV
7597 }
7598
7599 printf ("\n");
7600
7601 free (aux->funtab);
7602 }
7603
7604 static int
7605 slurp_hppa_unwind_table (FILE * file,
7606 struct hppa_unw_aux_info * aux,
7607 Elf_Internal_Shdr * sec)
7608 {
7609 unsigned long size, unw_ent_size, nentries, nrelas, i;
7610 Elf_Internal_Phdr * seg;
7611 struct hppa_unw_table_entry * tep;
7612 Elf_Internal_Shdr * relsec;
7613 Elf_Internal_Rela * rela;
7614 Elf_Internal_Rela * rp;
7615 unsigned char * table;
7616 unsigned char * tp;
7617 Elf_Internal_Sym * sym;
7618 const char * relname;
7619
7620 /* First, find the starting address of the segment that includes
7621 this section. */
7622
7623 if (elf_header.e_phnum)
7624 {
7625 if (! get_program_headers (file))
7626 return 0;
7627
7628 for (seg = program_headers;
7629 seg < program_headers + elf_header.e_phnum;
7630 ++seg)
7631 {
7632 if (seg->p_type != PT_LOAD)
7633 continue;
7634
7635 if (sec->sh_addr >= seg->p_vaddr
7636 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7637 {
7638 aux->seg_base = seg->p_vaddr;
7639 break;
7640 }
7641 }
7642 }
7643
7644 /* Second, build the unwind table from the contents of the unwind
7645 section. */
7646 size = sec->sh_size;
7647 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7648 _("unwind table"));
7649 if (!table)
7650 return 0;
7651
7652 unw_ent_size = 16;
7653 nentries = size / unw_ent_size;
7654 size = unw_ent_size * nentries;
7655
7656 tep = aux->table = (struct hppa_unw_table_entry *)
7657 xcmalloc (nentries, sizeof (aux->table[0]));
7658
7659 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7660 {
7661 unsigned int tmp1, tmp2;
7662
7663 tep->start.section = SHN_UNDEF;
7664 tep->end.section = SHN_UNDEF;
7665
7666 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7667 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7668 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7669 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7670
7671 tep->start.offset += aux->seg_base;
7672 tep->end.offset += aux->seg_base;
7673
7674 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7675 tep->Millicode = (tmp1 >> 30) & 0x1;
7676 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7677 tep->Region_description = (tmp1 >> 27) & 0x3;
7678 tep->reserved1 = (tmp1 >> 26) & 0x1;
7679 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7680 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7681 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7682 tep->Args_stored = (tmp1 >> 15) & 0x1;
7683 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7684 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7685 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7686 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7687 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7688 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7689 tep->cxx_info = (tmp1 >> 8) & 0x1;
7690 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7691 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7692 tep->reserved2 = (tmp1 >> 5) & 0x1;
7693 tep->Save_SP = (tmp1 >> 4) & 0x1;
7694 tep->Save_RP = (tmp1 >> 3) & 0x1;
7695 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7696 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7697 tep->Cleanup_defined = tmp1 & 0x1;
7698
7699 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7700 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7701 tep->Large_frame = (tmp2 >> 29) & 0x1;
7702 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7703 tep->reserved4 = (tmp2 >> 27) & 0x1;
7704 tep->Total_frame_size = tmp2 & 0x7ffffff;
7705 }
7706 free (table);
7707
7708 /* Third, apply any relocations to the unwind table. */
7709 for (relsec = section_headers;
7710 relsec < section_headers + elf_header.e_shnum;
7711 ++relsec)
7712 {
7713 if (relsec->sh_type != SHT_RELA
7714 || relsec->sh_info >= elf_header.e_shnum
7715 || section_headers + relsec->sh_info != sec)
7716 continue;
7717
7718 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7719 & rela, & nrelas))
7720 return 0;
7721
7722 for (rp = rela; rp < rela + nrelas; ++rp)
7723 {
7724 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7725 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7726
7727 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7728 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7729 {
7730 warn (_("Skipping unexpected relocation type %s\n"), relname);
7731 continue;
7732 }
7733
7734 i = rp->r_offset / unw_ent_size;
7735
7736 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7737 {
7738 case 0:
7739 aux->table[i].start.section = sym->st_shndx;
7740 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7741 break;
7742 case 1:
7743 aux->table[i].end.section = sym->st_shndx;
7744 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7745 break;
7746 default:
7747 break;
7748 }
7749 }
7750
7751 free (rela);
7752 }
7753
7754 aux->table_len = nentries;
7755
7756 return 1;
7757 }
7758
7759 static void
7760 hppa_process_unwind (FILE * file)
7761 {
7762 struct hppa_unw_aux_info aux;
7763 Elf_Internal_Shdr * unwsec = NULL;
7764 Elf_Internal_Shdr * strsec;
7765 Elf_Internal_Shdr * sec;
7766 unsigned long i;
7767
7768 if (string_table == NULL)
7769 return;
7770
7771 memset (& aux, 0, sizeof (aux));
7772
7773 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7774 {
7775 if (sec->sh_type == SHT_SYMTAB
7776 && sec->sh_link < elf_header.e_shnum)
7777 {
7778 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7779
7780 strsec = section_headers + sec->sh_link;
7781 if (aux.strtab != NULL)
7782 {
7783 error (_("Multiple auxillary string tables encountered\n"));
7784 free (aux.strtab);
7785 }
7786 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7787 1, strsec->sh_size,
7788 _("string table"));
7789 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7790 }
7791 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7792 unwsec = sec;
7793 }
7794
7795 if (!unwsec)
7796 printf (_("\nThere are no unwind sections in this file.\n"));
7797
7798 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7799 {
7800 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7801 {
7802 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7803 printable_section_name (sec),
7804 (unsigned long) sec->sh_offset,
7805 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7806
7807 slurp_hppa_unwind_table (file, &aux, sec);
7808 if (aux.table_len > 0)
7809 dump_hppa_unwind (&aux);
7810
7811 if (aux.table)
7812 free ((char *) aux.table);
7813 aux.table = NULL;
7814 }
7815 }
7816
7817 if (aux.symtab)
7818 free (aux.symtab);
7819 if (aux.strtab)
7820 free ((char *) aux.strtab);
7821 }
7822
7823 struct arm_section
7824 {
7825 unsigned char * data; /* The unwind data. */
7826 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7827 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7828 unsigned long nrelas; /* The number of relocations. */
7829 unsigned int rel_type; /* REL or RELA ? */
7830 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7831 };
7832
7833 struct arm_unw_aux_info
7834 {
7835 FILE * file; /* The file containing the unwind sections. */
7836 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7837 unsigned long nsyms; /* Number of symbols. */
7838 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7839 unsigned long nfuns; /* Number of these symbols. */
7840 char * strtab; /* The file's string table. */
7841 unsigned long strtab_size; /* Size of string table. */
7842 };
7843
7844 static const char *
7845 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7846 bfd_vma fn, struct absaddr addr)
7847 {
7848 const char *procname;
7849 bfd_vma sym_offset;
7850
7851 if (addr.section == SHN_UNDEF)
7852 addr.offset = fn;
7853
7854 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7855 aux->strtab_size, addr, &procname,
7856 &sym_offset);
7857
7858 print_vma (fn, PREFIX_HEX);
7859
7860 if (procname)
7861 {
7862 fputs (" <", stdout);
7863 fputs (procname, stdout);
7864
7865 if (sym_offset)
7866 printf ("+0x%lx", (unsigned long) sym_offset);
7867 fputc ('>', stdout);
7868 }
7869
7870 return procname;
7871 }
7872
7873 static void
7874 arm_free_section (struct arm_section *arm_sec)
7875 {
7876 if (arm_sec->data != NULL)
7877 free (arm_sec->data);
7878
7879 if (arm_sec->rela != NULL)
7880 free (arm_sec->rela);
7881 }
7882
7883 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7884 cached section and install SEC instead.
7885 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7886 and return its valued in * WORDP, relocating if necessary.
7887 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7888 relocation's offset in ADDR.
7889 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7890 into the string table of the symbol associated with the reloc. If no
7891 reloc was applied store -1 there.
7892 5) Return TRUE upon success, FALSE otherwise. */
7893
7894 static bfd_boolean
7895 get_unwind_section_word (struct arm_unw_aux_info * aux,
7896 struct arm_section * arm_sec,
7897 Elf_Internal_Shdr * sec,
7898 bfd_vma word_offset,
7899 unsigned int * wordp,
7900 struct absaddr * addr,
7901 bfd_vma * sym_name)
7902 {
7903 Elf_Internal_Rela *rp;
7904 Elf_Internal_Sym *sym;
7905 const char * relname;
7906 unsigned int word;
7907 bfd_boolean wrapped;
7908
7909 if (sec == NULL || arm_sec == NULL)
7910 return FALSE;
7911
7912 addr->section = SHN_UNDEF;
7913 addr->offset = 0;
7914
7915 if (sym_name != NULL)
7916 *sym_name = (bfd_vma) -1;
7917
7918 /* If necessary, update the section cache. */
7919 if (sec != arm_sec->sec)
7920 {
7921 Elf_Internal_Shdr *relsec;
7922
7923 arm_free_section (arm_sec);
7924
7925 arm_sec->sec = sec;
7926 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7927 sec->sh_size, _("unwind data"));
7928 arm_sec->rela = NULL;
7929 arm_sec->nrelas = 0;
7930
7931 for (relsec = section_headers;
7932 relsec < section_headers + elf_header.e_shnum;
7933 ++relsec)
7934 {
7935 if (relsec->sh_info >= elf_header.e_shnum
7936 || section_headers + relsec->sh_info != sec
7937 /* PR 15745: Check the section type as well. */
7938 || (relsec->sh_type != SHT_REL
7939 && relsec->sh_type != SHT_RELA))
7940 continue;
7941
7942 arm_sec->rel_type = relsec->sh_type;
7943 if (relsec->sh_type == SHT_REL)
7944 {
7945 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7946 relsec->sh_size,
7947 & arm_sec->rela, & arm_sec->nrelas))
7948 return FALSE;
7949 }
7950 else /* relsec->sh_type == SHT_RELA */
7951 {
7952 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7953 relsec->sh_size,
7954 & arm_sec->rela, & arm_sec->nrelas))
7955 return FALSE;
7956 }
7957 break;
7958 }
7959
7960 arm_sec->next_rela = arm_sec->rela;
7961 }
7962
7963 /* If there is no unwind data we can do nothing. */
7964 if (arm_sec->data == NULL)
7965 return FALSE;
7966
7967 /* If the offset is invalid then fail. */
7968 if (word_offset > (sec->sh_size - 4)
7969 /* PR 18879 */
7970 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7971 || ((bfd_signed_vma) word_offset) < 0)
7972 return FALSE;
7973
7974 /* Get the word at the required offset. */
7975 word = byte_get (arm_sec->data + word_offset, 4);
7976
7977 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7978 if (arm_sec->rela == NULL)
7979 {
7980 * wordp = word;
7981 return TRUE;
7982 }
7983
7984 /* Look through the relocs to find the one that applies to the provided offset. */
7985 wrapped = FALSE;
7986 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7987 {
7988 bfd_vma prelval, offset;
7989
7990 if (rp->r_offset > word_offset && !wrapped)
7991 {
7992 rp = arm_sec->rela;
7993 wrapped = TRUE;
7994 }
7995 if (rp->r_offset > word_offset)
7996 break;
7997
7998 if (rp->r_offset & 3)
7999 {
8000 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8001 (unsigned long) rp->r_offset);
8002 continue;
8003 }
8004
8005 if (rp->r_offset < word_offset)
8006 continue;
8007
8008 /* PR 17531: file: 027-161405-0.004 */
8009 if (aux->symtab == NULL)
8010 continue;
8011
8012 if (arm_sec->rel_type == SHT_REL)
8013 {
8014 offset = word & 0x7fffffff;
8015 if (offset & 0x40000000)
8016 offset |= ~ (bfd_vma) 0x7fffffff;
8017 }
8018 else if (arm_sec->rel_type == SHT_RELA)
8019 offset = rp->r_addend;
8020 else
8021 {
8022 error (_("Unknown section relocation type %d encountered\n"),
8023 arm_sec->rel_type);
8024 break;
8025 }
8026
8027 /* PR 17531 file: 027-1241568-0.004. */
8028 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8029 {
8030 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8031 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8032 break;
8033 }
8034
8035 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8036 offset += sym->st_value;
8037 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8038
8039 /* Check that we are processing the expected reloc type. */
8040 if (elf_header.e_machine == EM_ARM)
8041 {
8042 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8043 if (relname == NULL)
8044 {
8045 warn (_("Skipping unknown ARM relocation type: %d\n"),
8046 (int) ELF32_R_TYPE (rp->r_info));
8047 continue;
8048 }
8049
8050 if (streq (relname, "R_ARM_NONE"))
8051 continue;
8052
8053 if (! streq (relname, "R_ARM_PREL31"))
8054 {
8055 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8056 continue;
8057 }
8058 }
8059 else if (elf_header.e_machine == EM_TI_C6000)
8060 {
8061 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8062 if (relname == NULL)
8063 {
8064 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8065 (int) ELF32_R_TYPE (rp->r_info));
8066 continue;
8067 }
8068
8069 if (streq (relname, "R_C6000_NONE"))
8070 continue;
8071
8072 if (! streq (relname, "R_C6000_PREL31"))
8073 {
8074 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8075 continue;
8076 }
8077
8078 prelval >>= 1;
8079 }
8080 else
8081 {
8082 /* This function currently only supports ARM and TI unwinders. */
8083 warn (_("Only TI and ARM unwinders are currently supported\n"));
8084 break;
8085 }
8086
8087 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8088 addr->section = sym->st_shndx;
8089 addr->offset = offset;
8090
8091 if (sym_name)
8092 * sym_name = sym->st_name;
8093 break;
8094 }
8095
8096 *wordp = word;
8097 arm_sec->next_rela = rp;
8098
8099 return TRUE;
8100 }
8101
8102 static const char *tic6x_unwind_regnames[16] =
8103 {
8104 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8105 "A14", "A13", "A12", "A11", "A10",
8106 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8107 };
8108
8109 static void
8110 decode_tic6x_unwind_regmask (unsigned int mask)
8111 {
8112 int i;
8113
8114 for (i = 12; mask; mask >>= 1, i--)
8115 {
8116 if (mask & 1)
8117 {
8118 fputs (tic6x_unwind_regnames[i], stdout);
8119 if (mask > 1)
8120 fputs (", ", stdout);
8121 }
8122 }
8123 }
8124
8125 #define ADVANCE \
8126 if (remaining == 0 && more_words) \
8127 { \
8128 data_offset += 4; \
8129 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8130 data_offset, & word, & addr, NULL)) \
8131 return; \
8132 remaining = 4; \
8133 more_words--; \
8134 } \
8135
8136 #define GET_OP(OP) \
8137 ADVANCE; \
8138 if (remaining) \
8139 { \
8140 remaining--; \
8141 (OP) = word >> 24; \
8142 word <<= 8; \
8143 } \
8144 else \
8145 { \
8146 printf (_("[Truncated opcode]\n")); \
8147 return; \
8148 } \
8149 printf ("0x%02x ", OP)
8150
8151 static void
8152 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8153 unsigned int word,
8154 unsigned int remaining,
8155 unsigned int more_words,
8156 bfd_vma data_offset,
8157 Elf_Internal_Shdr * data_sec,
8158 struct arm_section * data_arm_sec)
8159 {
8160 struct absaddr addr;
8161
8162 /* Decode the unwinding instructions. */
8163 while (1)
8164 {
8165 unsigned int op, op2;
8166
8167 ADVANCE;
8168 if (remaining == 0)
8169 break;
8170 remaining--;
8171 op = word >> 24;
8172 word <<= 8;
8173
8174 printf (" 0x%02x ", op);
8175
8176 if ((op & 0xc0) == 0x00)
8177 {
8178 int offset = ((op & 0x3f) << 2) + 4;
8179
8180 printf (" vsp = vsp + %d", offset);
8181 }
8182 else if ((op & 0xc0) == 0x40)
8183 {
8184 int offset = ((op & 0x3f) << 2) + 4;
8185
8186 printf (" vsp = vsp - %d", offset);
8187 }
8188 else if ((op & 0xf0) == 0x80)
8189 {
8190 GET_OP (op2);
8191 if (op == 0x80 && op2 == 0)
8192 printf (_("Refuse to unwind"));
8193 else
8194 {
8195 unsigned int mask = ((op & 0x0f) << 8) | op2;
8196 int first = 1;
8197 int i;
8198
8199 printf ("pop {");
8200 for (i = 0; i < 12; i++)
8201 if (mask & (1 << i))
8202 {
8203 if (first)
8204 first = 0;
8205 else
8206 printf (", ");
8207 printf ("r%d", 4 + i);
8208 }
8209 printf ("}");
8210 }
8211 }
8212 else if ((op & 0xf0) == 0x90)
8213 {
8214 if (op == 0x9d || op == 0x9f)
8215 printf (_(" [Reserved]"));
8216 else
8217 printf (" vsp = r%d", op & 0x0f);
8218 }
8219 else if ((op & 0xf0) == 0xa0)
8220 {
8221 int end = 4 + (op & 0x07);
8222 int first = 1;
8223 int i;
8224
8225 printf (" pop {");
8226 for (i = 4; i <= end; i++)
8227 {
8228 if (first)
8229 first = 0;
8230 else
8231 printf (", ");
8232 printf ("r%d", i);
8233 }
8234 if (op & 0x08)
8235 {
8236 if (!first)
8237 printf (", ");
8238 printf ("r14");
8239 }
8240 printf ("}");
8241 }
8242 else if (op == 0xb0)
8243 printf (_(" finish"));
8244 else if (op == 0xb1)
8245 {
8246 GET_OP (op2);
8247 if (op2 == 0 || (op2 & 0xf0) != 0)
8248 printf (_("[Spare]"));
8249 else
8250 {
8251 unsigned int mask = op2 & 0x0f;
8252 int first = 1;
8253 int i;
8254
8255 printf ("pop {");
8256 for (i = 0; i < 12; i++)
8257 if (mask & (1 << i))
8258 {
8259 if (first)
8260 first = 0;
8261 else
8262 printf (", ");
8263 printf ("r%d", i);
8264 }
8265 printf ("}");
8266 }
8267 }
8268 else if (op == 0xb2)
8269 {
8270 unsigned char buf[9];
8271 unsigned int i, len;
8272 unsigned long offset;
8273
8274 for (i = 0; i < sizeof (buf); i++)
8275 {
8276 GET_OP (buf[i]);
8277 if ((buf[i] & 0x80) == 0)
8278 break;
8279 }
8280 if (i == sizeof (buf))
8281 printf (_("corrupt change to vsp"));
8282 else
8283 {
8284 offset = read_uleb128 (buf, &len, buf + i + 1);
8285 assert (len == i + 1);
8286 offset = offset * 4 + 0x204;
8287 printf ("vsp = vsp + %ld", offset);
8288 }
8289 }
8290 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8291 {
8292 unsigned int first, last;
8293
8294 GET_OP (op2);
8295 first = op2 >> 4;
8296 last = op2 & 0x0f;
8297 if (op == 0xc8)
8298 first = first + 16;
8299 printf ("pop {D%d", first);
8300 if (last)
8301 printf ("-D%d", first + last);
8302 printf ("}");
8303 }
8304 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8305 {
8306 unsigned int count = op & 0x07;
8307
8308 printf ("pop {D8");
8309 if (count)
8310 printf ("-D%d", 8 + count);
8311 printf ("}");
8312 }
8313 else if (op >= 0xc0 && op <= 0xc5)
8314 {
8315 unsigned int count = op & 0x07;
8316
8317 printf (" pop {wR10");
8318 if (count)
8319 printf ("-wR%d", 10 + count);
8320 printf ("}");
8321 }
8322 else if (op == 0xc6)
8323 {
8324 unsigned int first, last;
8325
8326 GET_OP (op2);
8327 first = op2 >> 4;
8328 last = op2 & 0x0f;
8329 printf ("pop {wR%d", first);
8330 if (last)
8331 printf ("-wR%d", first + last);
8332 printf ("}");
8333 }
8334 else if (op == 0xc7)
8335 {
8336 GET_OP (op2);
8337 if (op2 == 0 || (op2 & 0xf0) != 0)
8338 printf (_("[Spare]"));
8339 else
8340 {
8341 unsigned int mask = op2 & 0x0f;
8342 int first = 1;
8343 int i;
8344
8345 printf ("pop {");
8346 for (i = 0; i < 4; i++)
8347 if (mask & (1 << i))
8348 {
8349 if (first)
8350 first = 0;
8351 else
8352 printf (", ");
8353 printf ("wCGR%d", i);
8354 }
8355 printf ("}");
8356 }
8357 }
8358 else
8359 printf (_(" [unsupported opcode]"));
8360 printf ("\n");
8361 }
8362 }
8363
8364 static void
8365 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8366 unsigned int word,
8367 unsigned int remaining,
8368 unsigned int more_words,
8369 bfd_vma data_offset,
8370 Elf_Internal_Shdr * data_sec,
8371 struct arm_section * data_arm_sec)
8372 {
8373 struct absaddr addr;
8374
8375 /* Decode the unwinding instructions. */
8376 while (1)
8377 {
8378 unsigned int op, op2;
8379
8380 ADVANCE;
8381 if (remaining == 0)
8382 break;
8383 remaining--;
8384 op = word >> 24;
8385 word <<= 8;
8386
8387 printf (" 0x%02x ", op);
8388
8389 if ((op & 0xc0) == 0x00)
8390 {
8391 int offset = ((op & 0x3f) << 3) + 8;
8392 printf (" sp = sp + %d", offset);
8393 }
8394 else if ((op & 0xc0) == 0x80)
8395 {
8396 GET_OP (op2);
8397 if (op == 0x80 && op2 == 0)
8398 printf (_("Refuse to unwind"));
8399 else
8400 {
8401 unsigned int mask = ((op & 0x1f) << 8) | op2;
8402 if (op & 0x20)
8403 printf ("pop compact {");
8404 else
8405 printf ("pop {");
8406
8407 decode_tic6x_unwind_regmask (mask);
8408 printf("}");
8409 }
8410 }
8411 else if ((op & 0xf0) == 0xc0)
8412 {
8413 unsigned int reg;
8414 unsigned int nregs;
8415 unsigned int i;
8416 const char *name;
8417 struct
8418 {
8419 unsigned int offset;
8420 unsigned int reg;
8421 } regpos[16];
8422
8423 /* Scan entire instruction first so that GET_OP output is not
8424 interleaved with disassembly. */
8425 nregs = 0;
8426 for (i = 0; nregs < (op & 0xf); i++)
8427 {
8428 GET_OP (op2);
8429 reg = op2 >> 4;
8430 if (reg != 0xf)
8431 {
8432 regpos[nregs].offset = i * 2;
8433 regpos[nregs].reg = reg;
8434 nregs++;
8435 }
8436
8437 reg = op2 & 0xf;
8438 if (reg != 0xf)
8439 {
8440 regpos[nregs].offset = i * 2 + 1;
8441 regpos[nregs].reg = reg;
8442 nregs++;
8443 }
8444 }
8445
8446 printf (_("pop frame {"));
8447 reg = nregs - 1;
8448 for (i = i * 2; i > 0; i--)
8449 {
8450 if (regpos[reg].offset == i - 1)
8451 {
8452 name = tic6x_unwind_regnames[regpos[reg].reg];
8453 if (reg > 0)
8454 reg--;
8455 }
8456 else
8457 name = _("[pad]");
8458
8459 fputs (name, stdout);
8460 if (i > 1)
8461 printf (", ");
8462 }
8463
8464 printf ("}");
8465 }
8466 else if (op == 0xd0)
8467 printf (" MOV FP, SP");
8468 else if (op == 0xd1)
8469 printf (" __c6xabi_pop_rts");
8470 else if (op == 0xd2)
8471 {
8472 unsigned char buf[9];
8473 unsigned int i, len;
8474 unsigned long offset;
8475
8476 for (i = 0; i < sizeof (buf); i++)
8477 {
8478 GET_OP (buf[i]);
8479 if ((buf[i] & 0x80) == 0)
8480 break;
8481 }
8482 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8483 if (i == sizeof (buf))
8484 {
8485 printf ("<corrupt sp adjust>\n");
8486 warn (_("Corrupt stack pointer adjustment detected\n"));
8487 return;
8488 }
8489
8490 offset = read_uleb128 (buf, &len, buf + i + 1);
8491 assert (len == i + 1);
8492 offset = offset * 8 + 0x408;
8493 printf (_("sp = sp + %ld"), offset);
8494 }
8495 else if ((op & 0xf0) == 0xe0)
8496 {
8497 if ((op & 0x0f) == 7)
8498 printf (" RETURN");
8499 else
8500 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8501 }
8502 else
8503 {
8504 printf (_(" [unsupported opcode]"));
8505 }
8506 putchar ('\n');
8507 }
8508 }
8509
8510 static bfd_vma
8511 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8512 {
8513 bfd_vma offset;
8514
8515 offset = word & 0x7fffffff;
8516 if (offset & 0x40000000)
8517 offset |= ~ (bfd_vma) 0x7fffffff;
8518
8519 if (elf_header.e_machine == EM_TI_C6000)
8520 offset <<= 1;
8521
8522 return offset + where;
8523 }
8524
8525 static void
8526 decode_arm_unwind (struct arm_unw_aux_info * aux,
8527 unsigned int word,
8528 unsigned int remaining,
8529 bfd_vma data_offset,
8530 Elf_Internal_Shdr * data_sec,
8531 struct arm_section * data_arm_sec)
8532 {
8533 int per_index;
8534 unsigned int more_words = 0;
8535 struct absaddr addr;
8536 bfd_vma sym_name = (bfd_vma) -1;
8537
8538 if (remaining == 0)
8539 {
8540 /* Fetch the first word.
8541 Note - when decoding an object file the address extracted
8542 here will always be 0. So we also pass in the sym_name
8543 parameter so that we can find the symbol associated with
8544 the personality routine. */
8545 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8546 & word, & addr, & sym_name))
8547 return;
8548
8549 remaining = 4;
8550 }
8551
8552 if ((word & 0x80000000) == 0)
8553 {
8554 /* Expand prel31 for personality routine. */
8555 bfd_vma fn;
8556 const char *procname;
8557
8558 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8559 printf (_(" Personality routine: "));
8560 if (fn == 0
8561 && addr.section == SHN_UNDEF && addr.offset == 0
8562 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8563 {
8564 procname = aux->strtab + sym_name;
8565 print_vma (fn, PREFIX_HEX);
8566 if (procname)
8567 {
8568 fputs (" <", stdout);
8569 fputs (procname, stdout);
8570 fputc ('>', stdout);
8571 }
8572 }
8573 else
8574 procname = arm_print_vma_and_name (aux, fn, addr);
8575 fputc ('\n', stdout);
8576
8577 /* The GCC personality routines use the standard compact
8578 encoding, starting with one byte giving the number of
8579 words. */
8580 if (procname != NULL
8581 && (const_strneq (procname, "__gcc_personality_v0")
8582 || const_strneq (procname, "__gxx_personality_v0")
8583 || const_strneq (procname, "__gcj_personality_v0")
8584 || const_strneq (procname, "__gnu_objc_personality_v0")))
8585 {
8586 remaining = 0;
8587 more_words = 1;
8588 ADVANCE;
8589 if (!remaining)
8590 {
8591 printf (_(" [Truncated data]\n"));
8592 return;
8593 }
8594 more_words = word >> 24;
8595 word <<= 8;
8596 remaining--;
8597 per_index = -1;
8598 }
8599 else
8600 return;
8601 }
8602 else
8603 {
8604 /* ARM EHABI Section 6.3:
8605
8606 An exception-handling table entry for the compact model looks like:
8607
8608 31 30-28 27-24 23-0
8609 -- ----- ----- ----
8610 1 0 index Data for personalityRoutine[index] */
8611
8612 if (elf_header.e_machine == EM_ARM
8613 && (word & 0x70000000))
8614 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8615
8616 per_index = (word >> 24) & 0x7f;
8617 printf (_(" Compact model index: %d\n"), per_index);
8618 if (per_index == 0)
8619 {
8620 more_words = 0;
8621 word <<= 8;
8622 remaining--;
8623 }
8624 else if (per_index < 3)
8625 {
8626 more_words = (word >> 16) & 0xff;
8627 word <<= 16;
8628 remaining -= 2;
8629 }
8630 }
8631
8632 switch (elf_header.e_machine)
8633 {
8634 case EM_ARM:
8635 if (per_index < 3)
8636 {
8637 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8638 data_offset, data_sec, data_arm_sec);
8639 }
8640 else
8641 {
8642 warn (_("Unknown ARM compact model index encountered\n"));
8643 printf (_(" [reserved]\n"));
8644 }
8645 break;
8646
8647 case EM_TI_C6000:
8648 if (per_index < 3)
8649 {
8650 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8651 data_offset, data_sec, data_arm_sec);
8652 }
8653 else if (per_index < 5)
8654 {
8655 if (((word >> 17) & 0x7f) == 0x7f)
8656 printf (_(" Restore stack from frame pointer\n"));
8657 else
8658 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8659 printf (_(" Registers restored: "));
8660 if (per_index == 4)
8661 printf (" (compact) ");
8662 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8663 putchar ('\n');
8664 printf (_(" Return register: %s\n"),
8665 tic6x_unwind_regnames[word & 0xf]);
8666 }
8667 else
8668 printf (_(" [reserved (%d)]\n"), per_index);
8669 break;
8670
8671 default:
8672 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8673 elf_header.e_machine);
8674 }
8675
8676 /* Decode the descriptors. Not implemented. */
8677 }
8678
8679 static void
8680 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8681 {
8682 struct arm_section exidx_arm_sec, extab_arm_sec;
8683 unsigned int i, exidx_len;
8684 unsigned long j, nfuns;
8685
8686 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8687 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8688 exidx_len = exidx_sec->sh_size / 8;
8689
8690 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8691 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8692 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8693 aux->funtab[nfuns++] = aux->symtab[j];
8694 aux->nfuns = nfuns;
8695 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8696
8697 for (i = 0; i < exidx_len; i++)
8698 {
8699 unsigned int exidx_fn, exidx_entry;
8700 struct absaddr fn_addr, entry_addr;
8701 bfd_vma fn;
8702
8703 fputc ('\n', stdout);
8704
8705 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8706 8 * i, & exidx_fn, & fn_addr, NULL)
8707 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8708 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8709 {
8710 free (aux->funtab);
8711 arm_free_section (& exidx_arm_sec);
8712 arm_free_section (& extab_arm_sec);
8713 return;
8714 }
8715
8716 /* ARM EHABI, Section 5:
8717 An index table entry consists of 2 words.
8718 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8719 if (exidx_fn & 0x80000000)
8720 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8721
8722 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8723
8724 arm_print_vma_and_name (aux, fn, fn_addr);
8725 fputs (": ", stdout);
8726
8727 if (exidx_entry == 1)
8728 {
8729 print_vma (exidx_entry, PREFIX_HEX);
8730 fputs (" [cantunwind]\n", stdout);
8731 }
8732 else if (exidx_entry & 0x80000000)
8733 {
8734 print_vma (exidx_entry, PREFIX_HEX);
8735 fputc ('\n', stdout);
8736 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8737 }
8738 else
8739 {
8740 bfd_vma table, table_offset = 0;
8741 Elf_Internal_Shdr *table_sec;
8742
8743 fputs ("@", stdout);
8744 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8745 print_vma (table, PREFIX_HEX);
8746 printf ("\n");
8747
8748 /* Locate the matching .ARM.extab. */
8749 if (entry_addr.section != SHN_UNDEF
8750 && entry_addr.section < elf_header.e_shnum)
8751 {
8752 table_sec = section_headers + entry_addr.section;
8753 table_offset = entry_addr.offset;
8754 /* PR 18879 */
8755 if (table_offset > table_sec->sh_size
8756 || ((bfd_signed_vma) table_offset) < 0)
8757 {
8758 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8759 (unsigned long) table_offset,
8760 printable_section_name (table_sec));
8761 continue;
8762 }
8763 }
8764 else
8765 {
8766 table_sec = find_section_by_address (table);
8767 if (table_sec != NULL)
8768 table_offset = table - table_sec->sh_addr;
8769 }
8770 if (table_sec == NULL)
8771 {
8772 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8773 (unsigned long) table);
8774 continue;
8775 }
8776 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8777 &extab_arm_sec);
8778 }
8779 }
8780
8781 printf ("\n");
8782
8783 free (aux->funtab);
8784 arm_free_section (&exidx_arm_sec);
8785 arm_free_section (&extab_arm_sec);
8786 }
8787
8788 /* Used for both ARM and C6X unwinding tables. */
8789
8790 static void
8791 arm_process_unwind (FILE *file)
8792 {
8793 struct arm_unw_aux_info aux;
8794 Elf_Internal_Shdr *unwsec = NULL;
8795 Elf_Internal_Shdr *strsec;
8796 Elf_Internal_Shdr *sec;
8797 unsigned long i;
8798 unsigned int sec_type;
8799
8800 switch (elf_header.e_machine)
8801 {
8802 case EM_ARM:
8803 sec_type = SHT_ARM_EXIDX;
8804 break;
8805
8806 case EM_TI_C6000:
8807 sec_type = SHT_C6000_UNWIND;
8808 break;
8809
8810 default:
8811 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8812 elf_header.e_machine);
8813 return;
8814 }
8815
8816 if (string_table == NULL)
8817 return;
8818
8819 memset (& aux, 0, sizeof (aux));
8820 aux.file = file;
8821
8822 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8823 {
8824 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8825 {
8826 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8827
8828 strsec = section_headers + sec->sh_link;
8829
8830 /* PR binutils/17531 file: 011-12666-0.004. */
8831 if (aux.strtab != NULL)
8832 {
8833 error (_("Multiple string tables found in file.\n"));
8834 free (aux.strtab);
8835 }
8836 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8837 1, strsec->sh_size, _("string table"));
8838 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8839 }
8840 else if (sec->sh_type == sec_type)
8841 unwsec = sec;
8842 }
8843
8844 if (unwsec == NULL)
8845 printf (_("\nThere are no unwind sections in this file.\n"));
8846 else
8847 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8848 {
8849 if (sec->sh_type == sec_type)
8850 {
8851 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8852 printable_section_name (sec),
8853 (unsigned long) sec->sh_offset,
8854 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8855
8856 dump_arm_unwind (&aux, sec);
8857 }
8858 }
8859
8860 if (aux.symtab)
8861 free (aux.symtab);
8862 if (aux.strtab)
8863 free ((char *) aux.strtab);
8864 }
8865
8866 static void
8867 process_unwind (FILE * file)
8868 {
8869 struct unwind_handler
8870 {
8871 int machtype;
8872 void (* handler)(FILE *);
8873 } handlers[] =
8874 {
8875 { EM_ARM, arm_process_unwind },
8876 { EM_IA_64, ia64_process_unwind },
8877 { EM_PARISC, hppa_process_unwind },
8878 { EM_TI_C6000, arm_process_unwind },
8879 { 0, 0 }
8880 };
8881 int i;
8882
8883 if (!do_unwind)
8884 return;
8885
8886 for (i = 0; handlers[i].handler != NULL; i++)
8887 if (elf_header.e_machine == handlers[i].machtype)
8888 {
8889 handlers[i].handler (file);
8890 return;
8891 }
8892
8893 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8894 get_machine_name (elf_header.e_machine));
8895 }
8896
8897 static void
8898 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8899 {
8900 switch (entry->d_tag)
8901 {
8902 case DT_MIPS_FLAGS:
8903 if (entry->d_un.d_val == 0)
8904 printf (_("NONE"));
8905 else
8906 {
8907 static const char * opts[] =
8908 {
8909 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8910 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8911 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8912 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8913 "RLD_ORDER_SAFE"
8914 };
8915 unsigned int cnt;
8916 int first = 1;
8917
8918 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8919 if (entry->d_un.d_val & (1 << cnt))
8920 {
8921 printf ("%s%s", first ? "" : " ", opts[cnt]);
8922 first = 0;
8923 }
8924 }
8925 break;
8926
8927 case DT_MIPS_IVERSION:
8928 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8929 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8930 else
8931 {
8932 char buf[40];
8933 sprintf_vma (buf, entry->d_un.d_ptr);
8934 /* Note: coded this way so that there is a single string for translation. */
8935 printf (_("<corrupt: %s>"), buf);
8936 }
8937 break;
8938
8939 case DT_MIPS_TIME_STAMP:
8940 {
8941 char timebuf[128];
8942 struct tm * tmp;
8943 time_t atime = entry->d_un.d_val;
8944
8945 tmp = gmtime (&atime);
8946 /* PR 17531: file: 6accc532. */
8947 if (tmp == NULL)
8948 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8949 else
8950 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8951 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8952 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8953 printf (_("Time Stamp: %s"), timebuf);
8954 }
8955 break;
8956
8957 case DT_MIPS_RLD_VERSION:
8958 case DT_MIPS_LOCAL_GOTNO:
8959 case DT_MIPS_CONFLICTNO:
8960 case DT_MIPS_LIBLISTNO:
8961 case DT_MIPS_SYMTABNO:
8962 case DT_MIPS_UNREFEXTNO:
8963 case DT_MIPS_HIPAGENO:
8964 case DT_MIPS_DELTA_CLASS_NO:
8965 case DT_MIPS_DELTA_INSTANCE_NO:
8966 case DT_MIPS_DELTA_RELOC_NO:
8967 case DT_MIPS_DELTA_SYM_NO:
8968 case DT_MIPS_DELTA_CLASSSYM_NO:
8969 case DT_MIPS_COMPACT_SIZE:
8970 print_vma (entry->d_un.d_val, DEC);
8971 break;
8972
8973 default:
8974 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8975 }
8976 putchar ('\n');
8977 }
8978
8979 static void
8980 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8981 {
8982 switch (entry->d_tag)
8983 {
8984 case DT_HP_DLD_FLAGS:
8985 {
8986 static struct
8987 {
8988 long int bit;
8989 const char * str;
8990 }
8991 flags[] =
8992 {
8993 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8994 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8995 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8996 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8997 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8998 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8999 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9000 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9001 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9002 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9003 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9004 { DT_HP_GST, "HP_GST" },
9005 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9006 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9007 { DT_HP_NODELETE, "HP_NODELETE" },
9008 { DT_HP_GROUP, "HP_GROUP" },
9009 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9010 };
9011 int first = 1;
9012 size_t cnt;
9013 bfd_vma val = entry->d_un.d_val;
9014
9015 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9016 if (val & flags[cnt].bit)
9017 {
9018 if (! first)
9019 putchar (' ');
9020 fputs (flags[cnt].str, stdout);
9021 first = 0;
9022 val ^= flags[cnt].bit;
9023 }
9024
9025 if (val != 0 || first)
9026 {
9027 if (! first)
9028 putchar (' ');
9029 print_vma (val, HEX);
9030 }
9031 }
9032 break;
9033
9034 default:
9035 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9036 break;
9037 }
9038 putchar ('\n');
9039 }
9040
9041 #ifdef BFD64
9042
9043 /* VMS vs Unix time offset and factor. */
9044
9045 #define VMS_EPOCH_OFFSET 35067168000000000LL
9046 #define VMS_GRANULARITY_FACTOR 10000000
9047
9048 /* Display a VMS time in a human readable format. */
9049
9050 static void
9051 print_vms_time (bfd_int64_t vmstime)
9052 {
9053 struct tm *tm;
9054 time_t unxtime;
9055
9056 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9057 tm = gmtime (&unxtime);
9058 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9059 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9060 tm->tm_hour, tm->tm_min, tm->tm_sec);
9061 }
9062 #endif /* BFD64 */
9063
9064 static void
9065 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9066 {
9067 switch (entry->d_tag)
9068 {
9069 case DT_IA_64_PLT_RESERVE:
9070 /* First 3 slots reserved. */
9071 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9072 printf (" -- ");
9073 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9074 break;
9075
9076 case DT_IA_64_VMS_LINKTIME:
9077 #ifdef BFD64
9078 print_vms_time (entry->d_un.d_val);
9079 #endif
9080 break;
9081
9082 case DT_IA_64_VMS_LNKFLAGS:
9083 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9084 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9085 printf (" CALL_DEBUG");
9086 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9087 printf (" NOP0BUFS");
9088 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9089 printf (" P0IMAGE");
9090 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9091 printf (" MKTHREADS");
9092 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9093 printf (" UPCALLS");
9094 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9095 printf (" IMGSTA");
9096 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9097 printf (" INITIALIZE");
9098 if (entry->d_un.d_val & VMS_LF_MAIN)
9099 printf (" MAIN");
9100 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9101 printf (" EXE_INIT");
9102 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9103 printf (" TBK_IN_IMG");
9104 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9105 printf (" DBG_IN_IMG");
9106 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9107 printf (" TBK_IN_DSF");
9108 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9109 printf (" DBG_IN_DSF");
9110 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9111 printf (" SIGNATURES");
9112 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9113 printf (" REL_SEG_OFF");
9114 break;
9115
9116 default:
9117 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9118 break;
9119 }
9120 putchar ('\n');
9121 }
9122
9123 static int
9124 get_32bit_dynamic_section (FILE * file)
9125 {
9126 Elf32_External_Dyn * edyn;
9127 Elf32_External_Dyn * ext;
9128 Elf_Internal_Dyn * entry;
9129
9130 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9131 dynamic_size, _("dynamic section"));
9132 if (!edyn)
9133 return 0;
9134
9135 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9136 might not have the luxury of section headers. Look for the DT_NULL
9137 terminator to determine the number of entries. */
9138 for (ext = edyn, dynamic_nent = 0;
9139 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9140 ext++)
9141 {
9142 dynamic_nent++;
9143 if (BYTE_GET (ext->d_tag) == DT_NULL)
9144 break;
9145 }
9146
9147 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9148 sizeof (* entry));
9149 if (dynamic_section == NULL)
9150 {
9151 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9152 (unsigned long) dynamic_nent);
9153 free (edyn);
9154 return 0;
9155 }
9156
9157 for (ext = edyn, entry = dynamic_section;
9158 entry < dynamic_section + dynamic_nent;
9159 ext++, entry++)
9160 {
9161 entry->d_tag = BYTE_GET (ext->d_tag);
9162 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9163 }
9164
9165 free (edyn);
9166
9167 return 1;
9168 }
9169
9170 static int
9171 get_64bit_dynamic_section (FILE * file)
9172 {
9173 Elf64_External_Dyn * edyn;
9174 Elf64_External_Dyn * ext;
9175 Elf_Internal_Dyn * entry;
9176
9177 /* Read in the data. */
9178 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9179 dynamic_size, _("dynamic section"));
9180 if (!edyn)
9181 return 0;
9182
9183 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9184 might not have the luxury of section headers. Look for the DT_NULL
9185 terminator to determine the number of entries. */
9186 for (ext = edyn, dynamic_nent = 0;
9187 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9188 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9189 ext++)
9190 {
9191 dynamic_nent++;
9192 if (BYTE_GET (ext->d_tag) == DT_NULL)
9193 break;
9194 }
9195
9196 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9197 sizeof (* entry));
9198 if (dynamic_section == NULL)
9199 {
9200 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9201 (unsigned long) dynamic_nent);
9202 free (edyn);
9203 return 0;
9204 }
9205
9206 /* Convert from external to internal formats. */
9207 for (ext = edyn, entry = dynamic_section;
9208 entry < dynamic_section + dynamic_nent;
9209 ext++, entry++)
9210 {
9211 entry->d_tag = BYTE_GET (ext->d_tag);
9212 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9213 }
9214
9215 free (edyn);
9216
9217 return 1;
9218 }
9219
9220 static void
9221 print_dynamic_flags (bfd_vma flags)
9222 {
9223 int first = 1;
9224
9225 while (flags)
9226 {
9227 bfd_vma flag;
9228
9229 flag = flags & - flags;
9230 flags &= ~ flag;
9231
9232 if (first)
9233 first = 0;
9234 else
9235 putc (' ', stdout);
9236
9237 switch (flag)
9238 {
9239 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9240 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9241 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9242 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9243 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9244 default: fputs (_("unknown"), stdout); break;
9245 }
9246 }
9247 puts ("");
9248 }
9249
9250 /* Parse and display the contents of the dynamic section. */
9251
9252 static int
9253 process_dynamic_section (FILE * file)
9254 {
9255 Elf_Internal_Dyn * entry;
9256
9257 if (dynamic_size == 0)
9258 {
9259 if (do_dynamic)
9260 printf (_("\nThere is no dynamic section in this file.\n"));
9261
9262 return 1;
9263 }
9264
9265 if (is_32bit_elf)
9266 {
9267 if (! get_32bit_dynamic_section (file))
9268 return 0;
9269 }
9270 else if (! get_64bit_dynamic_section (file))
9271 return 0;
9272
9273 /* Find the appropriate symbol table. */
9274 if (dynamic_symbols == NULL)
9275 {
9276 for (entry = dynamic_section;
9277 entry < dynamic_section + dynamic_nent;
9278 ++entry)
9279 {
9280 Elf_Internal_Shdr section;
9281
9282 if (entry->d_tag != DT_SYMTAB)
9283 continue;
9284
9285 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9286
9287 /* Since we do not know how big the symbol table is,
9288 we default to reading in the entire file (!) and
9289 processing that. This is overkill, I know, but it
9290 should work. */
9291 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9292
9293 if (archive_file_offset != 0)
9294 section.sh_size = archive_file_size - section.sh_offset;
9295 else
9296 {
9297 if (fseek (file, 0, SEEK_END))
9298 error (_("Unable to seek to end of file!\n"));
9299
9300 section.sh_size = ftell (file) - section.sh_offset;
9301 }
9302
9303 if (is_32bit_elf)
9304 section.sh_entsize = sizeof (Elf32_External_Sym);
9305 else
9306 section.sh_entsize = sizeof (Elf64_External_Sym);
9307 section.sh_name = string_table_length;
9308
9309 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9310 if (num_dynamic_syms < 1)
9311 {
9312 error (_("Unable to determine the number of symbols to load\n"));
9313 continue;
9314 }
9315 }
9316 }
9317
9318 /* Similarly find a string table. */
9319 if (dynamic_strings == NULL)
9320 {
9321 for (entry = dynamic_section;
9322 entry < dynamic_section + dynamic_nent;
9323 ++entry)
9324 {
9325 unsigned long offset;
9326 long str_tab_len;
9327
9328 if (entry->d_tag != DT_STRTAB)
9329 continue;
9330
9331 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9332
9333 /* Since we do not know how big the string table is,
9334 we default to reading in the entire file (!) and
9335 processing that. This is overkill, I know, but it
9336 should work. */
9337
9338 offset = offset_from_vma (file, entry->d_un.d_val, 0);
9339
9340 if (archive_file_offset != 0)
9341 str_tab_len = archive_file_size - offset;
9342 else
9343 {
9344 if (fseek (file, 0, SEEK_END))
9345 error (_("Unable to seek to end of file\n"));
9346 str_tab_len = ftell (file) - offset;
9347 }
9348
9349 if (str_tab_len < 1)
9350 {
9351 error
9352 (_("Unable to determine the length of the dynamic string table\n"));
9353 continue;
9354 }
9355
9356 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9357 str_tab_len,
9358 _("dynamic string table"));
9359 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9360 break;
9361 }
9362 }
9363
9364 /* And find the syminfo section if available. */
9365 if (dynamic_syminfo == NULL)
9366 {
9367 unsigned long syminsz = 0;
9368
9369 for (entry = dynamic_section;
9370 entry < dynamic_section + dynamic_nent;
9371 ++entry)
9372 {
9373 if (entry->d_tag == DT_SYMINENT)
9374 {
9375 /* Note: these braces are necessary to avoid a syntax
9376 error from the SunOS4 C compiler. */
9377 /* PR binutils/17531: A corrupt file can trigger this test.
9378 So do not use an assert, instead generate an error message. */
9379 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9380 error (_("Bad value (%d) for SYMINENT entry\n"),
9381 (int) entry->d_un.d_val);
9382 }
9383 else if (entry->d_tag == DT_SYMINSZ)
9384 syminsz = entry->d_un.d_val;
9385 else if (entry->d_tag == DT_SYMINFO)
9386 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9387 syminsz);
9388 }
9389
9390 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9391 {
9392 Elf_External_Syminfo * extsyminfo;
9393 Elf_External_Syminfo * extsym;
9394 Elf_Internal_Syminfo * syminfo;
9395
9396 /* There is a syminfo section. Read the data. */
9397 extsyminfo = (Elf_External_Syminfo *)
9398 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9399 _("symbol information"));
9400 if (!extsyminfo)
9401 return 0;
9402
9403 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9404 if (dynamic_syminfo == NULL)
9405 {
9406 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9407 (unsigned long) syminsz);
9408 return 0;
9409 }
9410
9411 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9412 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9413 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9414 ++syminfo, ++extsym)
9415 {
9416 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9417 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9418 }
9419
9420 free (extsyminfo);
9421 }
9422 }
9423
9424 if (do_dynamic && dynamic_addr)
9425 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9426 dynamic_addr, (unsigned long) dynamic_nent);
9427 if (do_dynamic)
9428 printf (_(" Tag Type Name/Value\n"));
9429
9430 for (entry = dynamic_section;
9431 entry < dynamic_section + dynamic_nent;
9432 entry++)
9433 {
9434 if (do_dynamic)
9435 {
9436 const char * dtype;
9437
9438 putchar (' ');
9439 print_vma (entry->d_tag, FULL_HEX);
9440 dtype = get_dynamic_type (entry->d_tag);
9441 printf (" (%s)%*s", dtype,
9442 ((is_32bit_elf ? 27 : 19)
9443 - (int) strlen (dtype)),
9444 " ");
9445 }
9446
9447 switch (entry->d_tag)
9448 {
9449 case DT_FLAGS:
9450 if (do_dynamic)
9451 print_dynamic_flags (entry->d_un.d_val);
9452 break;
9453
9454 case DT_AUXILIARY:
9455 case DT_FILTER:
9456 case DT_CONFIG:
9457 case DT_DEPAUDIT:
9458 case DT_AUDIT:
9459 if (do_dynamic)
9460 {
9461 switch (entry->d_tag)
9462 {
9463 case DT_AUXILIARY:
9464 printf (_("Auxiliary library"));
9465 break;
9466
9467 case DT_FILTER:
9468 printf (_("Filter library"));
9469 break;
9470
9471 case DT_CONFIG:
9472 printf (_("Configuration file"));
9473 break;
9474
9475 case DT_DEPAUDIT:
9476 printf (_("Dependency audit library"));
9477 break;
9478
9479 case DT_AUDIT:
9480 printf (_("Audit library"));
9481 break;
9482 }
9483
9484 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9485 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9486 else
9487 {
9488 printf (": ");
9489 print_vma (entry->d_un.d_val, PREFIX_HEX);
9490 putchar ('\n');
9491 }
9492 }
9493 break;
9494
9495 case DT_FEATURE:
9496 if (do_dynamic)
9497 {
9498 printf (_("Flags:"));
9499
9500 if (entry->d_un.d_val == 0)
9501 printf (_(" None\n"));
9502 else
9503 {
9504 unsigned long int val = entry->d_un.d_val;
9505
9506 if (val & DTF_1_PARINIT)
9507 {
9508 printf (" PARINIT");
9509 val ^= DTF_1_PARINIT;
9510 }
9511 if (val & DTF_1_CONFEXP)
9512 {
9513 printf (" CONFEXP");
9514 val ^= DTF_1_CONFEXP;
9515 }
9516 if (val != 0)
9517 printf (" %lx", val);
9518 puts ("");
9519 }
9520 }
9521 break;
9522
9523 case DT_POSFLAG_1:
9524 if (do_dynamic)
9525 {
9526 printf (_("Flags:"));
9527
9528 if (entry->d_un.d_val == 0)
9529 printf (_(" None\n"));
9530 else
9531 {
9532 unsigned long int val = entry->d_un.d_val;
9533
9534 if (val & DF_P1_LAZYLOAD)
9535 {
9536 printf (" LAZYLOAD");
9537 val ^= DF_P1_LAZYLOAD;
9538 }
9539 if (val & DF_P1_GROUPPERM)
9540 {
9541 printf (" GROUPPERM");
9542 val ^= DF_P1_GROUPPERM;
9543 }
9544 if (val != 0)
9545 printf (" %lx", val);
9546 puts ("");
9547 }
9548 }
9549 break;
9550
9551 case DT_FLAGS_1:
9552 if (do_dynamic)
9553 {
9554 printf (_("Flags:"));
9555 if (entry->d_un.d_val == 0)
9556 printf (_(" None\n"));
9557 else
9558 {
9559 unsigned long int val = entry->d_un.d_val;
9560
9561 if (val & DF_1_NOW)
9562 {
9563 printf (" NOW");
9564 val ^= DF_1_NOW;
9565 }
9566 if (val & DF_1_GLOBAL)
9567 {
9568 printf (" GLOBAL");
9569 val ^= DF_1_GLOBAL;
9570 }
9571 if (val & DF_1_GROUP)
9572 {
9573 printf (" GROUP");
9574 val ^= DF_1_GROUP;
9575 }
9576 if (val & DF_1_NODELETE)
9577 {
9578 printf (" NODELETE");
9579 val ^= DF_1_NODELETE;
9580 }
9581 if (val & DF_1_LOADFLTR)
9582 {
9583 printf (" LOADFLTR");
9584 val ^= DF_1_LOADFLTR;
9585 }
9586 if (val & DF_1_INITFIRST)
9587 {
9588 printf (" INITFIRST");
9589 val ^= DF_1_INITFIRST;
9590 }
9591 if (val & DF_1_NOOPEN)
9592 {
9593 printf (" NOOPEN");
9594 val ^= DF_1_NOOPEN;
9595 }
9596 if (val & DF_1_ORIGIN)
9597 {
9598 printf (" ORIGIN");
9599 val ^= DF_1_ORIGIN;
9600 }
9601 if (val & DF_1_DIRECT)
9602 {
9603 printf (" DIRECT");
9604 val ^= DF_1_DIRECT;
9605 }
9606 if (val & DF_1_TRANS)
9607 {
9608 printf (" TRANS");
9609 val ^= DF_1_TRANS;
9610 }
9611 if (val & DF_1_INTERPOSE)
9612 {
9613 printf (" INTERPOSE");
9614 val ^= DF_1_INTERPOSE;
9615 }
9616 if (val & DF_1_NODEFLIB)
9617 {
9618 printf (" NODEFLIB");
9619 val ^= DF_1_NODEFLIB;
9620 }
9621 if (val & DF_1_NODUMP)
9622 {
9623 printf (" NODUMP");
9624 val ^= DF_1_NODUMP;
9625 }
9626 if (val & DF_1_CONFALT)
9627 {
9628 printf (" CONFALT");
9629 val ^= DF_1_CONFALT;
9630 }
9631 if (val & DF_1_ENDFILTEE)
9632 {
9633 printf (" ENDFILTEE");
9634 val ^= DF_1_ENDFILTEE;
9635 }
9636 if (val & DF_1_DISPRELDNE)
9637 {
9638 printf (" DISPRELDNE");
9639 val ^= DF_1_DISPRELDNE;
9640 }
9641 if (val & DF_1_DISPRELPND)
9642 {
9643 printf (" DISPRELPND");
9644 val ^= DF_1_DISPRELPND;
9645 }
9646 if (val & DF_1_NODIRECT)
9647 {
9648 printf (" NODIRECT");
9649 val ^= DF_1_NODIRECT;
9650 }
9651 if (val & DF_1_IGNMULDEF)
9652 {
9653 printf (" IGNMULDEF");
9654 val ^= DF_1_IGNMULDEF;
9655 }
9656 if (val & DF_1_NOKSYMS)
9657 {
9658 printf (" NOKSYMS");
9659 val ^= DF_1_NOKSYMS;
9660 }
9661 if (val & DF_1_NOHDR)
9662 {
9663 printf (" NOHDR");
9664 val ^= DF_1_NOHDR;
9665 }
9666 if (val & DF_1_EDITED)
9667 {
9668 printf (" EDITED");
9669 val ^= DF_1_EDITED;
9670 }
9671 if (val & DF_1_NORELOC)
9672 {
9673 printf (" NORELOC");
9674 val ^= DF_1_NORELOC;
9675 }
9676 if (val & DF_1_SYMINTPOSE)
9677 {
9678 printf (" SYMINTPOSE");
9679 val ^= DF_1_SYMINTPOSE;
9680 }
9681 if (val & DF_1_GLOBAUDIT)
9682 {
9683 printf (" GLOBAUDIT");
9684 val ^= DF_1_GLOBAUDIT;
9685 }
9686 if (val & DF_1_SINGLETON)
9687 {
9688 printf (" SINGLETON");
9689 val ^= DF_1_SINGLETON;
9690 }
9691 if (val & DF_1_STUB)
9692 {
9693 printf (" STUB");
9694 val ^= DF_1_STUB;
9695 }
9696 if (val & DF_1_PIE)
9697 {
9698 printf (" PIE");
9699 val ^= DF_1_PIE;
9700 }
9701 if (val != 0)
9702 printf (" %lx", val);
9703 puts ("");
9704 }
9705 }
9706 break;
9707
9708 case DT_PLTREL:
9709 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9710 if (do_dynamic)
9711 puts (get_dynamic_type (entry->d_un.d_val));
9712 break;
9713
9714 case DT_NULL :
9715 case DT_NEEDED :
9716 case DT_PLTGOT :
9717 case DT_HASH :
9718 case DT_STRTAB :
9719 case DT_SYMTAB :
9720 case DT_RELA :
9721 case DT_INIT :
9722 case DT_FINI :
9723 case DT_SONAME :
9724 case DT_RPATH :
9725 case DT_SYMBOLIC:
9726 case DT_REL :
9727 case DT_DEBUG :
9728 case DT_TEXTREL :
9729 case DT_JMPREL :
9730 case DT_RUNPATH :
9731 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9732
9733 if (do_dynamic)
9734 {
9735 char * name;
9736
9737 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9738 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9739 else
9740 name = NULL;
9741
9742 if (name)
9743 {
9744 switch (entry->d_tag)
9745 {
9746 case DT_NEEDED:
9747 printf (_("Shared library: [%s]"), name);
9748
9749 if (streq (name, program_interpreter))
9750 printf (_(" program interpreter"));
9751 break;
9752
9753 case DT_SONAME:
9754 printf (_("Library soname: [%s]"), name);
9755 break;
9756
9757 case DT_RPATH:
9758 printf (_("Library rpath: [%s]"), name);
9759 break;
9760
9761 case DT_RUNPATH:
9762 printf (_("Library runpath: [%s]"), name);
9763 break;
9764
9765 default:
9766 print_vma (entry->d_un.d_val, PREFIX_HEX);
9767 break;
9768 }
9769 }
9770 else
9771 print_vma (entry->d_un.d_val, PREFIX_HEX);
9772
9773 putchar ('\n');
9774 }
9775 break;
9776
9777 case DT_PLTRELSZ:
9778 case DT_RELASZ :
9779 case DT_STRSZ :
9780 case DT_RELSZ :
9781 case DT_RELAENT :
9782 case DT_SYMENT :
9783 case DT_RELENT :
9784 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9785 /* Fall through. */
9786 case DT_PLTPADSZ:
9787 case DT_MOVEENT :
9788 case DT_MOVESZ :
9789 case DT_INIT_ARRAYSZ:
9790 case DT_FINI_ARRAYSZ:
9791 case DT_GNU_CONFLICTSZ:
9792 case DT_GNU_LIBLISTSZ:
9793 if (do_dynamic)
9794 {
9795 print_vma (entry->d_un.d_val, UNSIGNED);
9796 printf (_(" (bytes)\n"));
9797 }
9798 break;
9799
9800 case DT_VERDEFNUM:
9801 case DT_VERNEEDNUM:
9802 case DT_RELACOUNT:
9803 case DT_RELCOUNT:
9804 if (do_dynamic)
9805 {
9806 print_vma (entry->d_un.d_val, UNSIGNED);
9807 putchar ('\n');
9808 }
9809 break;
9810
9811 case DT_SYMINSZ:
9812 case DT_SYMINENT:
9813 case DT_SYMINFO:
9814 case DT_USED:
9815 case DT_INIT_ARRAY:
9816 case DT_FINI_ARRAY:
9817 if (do_dynamic)
9818 {
9819 if (entry->d_tag == DT_USED
9820 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9821 {
9822 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9823
9824 if (*name)
9825 {
9826 printf (_("Not needed object: [%s]\n"), name);
9827 break;
9828 }
9829 }
9830
9831 print_vma (entry->d_un.d_val, PREFIX_HEX);
9832 putchar ('\n');
9833 }
9834 break;
9835
9836 case DT_BIND_NOW:
9837 /* The value of this entry is ignored. */
9838 if (do_dynamic)
9839 putchar ('\n');
9840 break;
9841
9842 case DT_GNU_PRELINKED:
9843 if (do_dynamic)
9844 {
9845 struct tm * tmp;
9846 time_t atime = entry->d_un.d_val;
9847
9848 tmp = gmtime (&atime);
9849 /* PR 17533 file: 041-1244816-0.004. */
9850 if (tmp == NULL)
9851 printf (_("<corrupt time val: %lx"),
9852 (unsigned long) atime);
9853 else
9854 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9855 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9856 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9857
9858 }
9859 break;
9860
9861 case DT_GNU_HASH:
9862 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9863 if (do_dynamic)
9864 {
9865 print_vma (entry->d_un.d_val, PREFIX_HEX);
9866 putchar ('\n');
9867 }
9868 break;
9869
9870 default:
9871 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9872 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9873 entry->d_un.d_val;
9874
9875 if (do_dynamic)
9876 {
9877 switch (elf_header.e_machine)
9878 {
9879 case EM_MIPS:
9880 case EM_MIPS_RS3_LE:
9881 dynamic_section_mips_val (entry);
9882 break;
9883 case EM_PARISC:
9884 dynamic_section_parisc_val (entry);
9885 break;
9886 case EM_IA_64:
9887 dynamic_section_ia64_val (entry);
9888 break;
9889 default:
9890 print_vma (entry->d_un.d_val, PREFIX_HEX);
9891 putchar ('\n');
9892 }
9893 }
9894 break;
9895 }
9896 }
9897
9898 return 1;
9899 }
9900
9901 static char *
9902 get_ver_flags (unsigned int flags)
9903 {
9904 static char buff[32];
9905
9906 buff[0] = 0;
9907
9908 if (flags == 0)
9909 return _("none");
9910
9911 if (flags & VER_FLG_BASE)
9912 strcat (buff, "BASE ");
9913
9914 if (flags & VER_FLG_WEAK)
9915 {
9916 if (flags & VER_FLG_BASE)
9917 strcat (buff, "| ");
9918
9919 strcat (buff, "WEAK ");
9920 }
9921
9922 if (flags & VER_FLG_INFO)
9923 {
9924 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9925 strcat (buff, "| ");
9926
9927 strcat (buff, "INFO ");
9928 }
9929
9930 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9931 strcat (buff, _("| <unknown>"));
9932
9933 return buff;
9934 }
9935
9936 /* Display the contents of the version sections. */
9937
9938 static int
9939 process_version_sections (FILE * file)
9940 {
9941 Elf_Internal_Shdr * section;
9942 unsigned i;
9943 int found = 0;
9944
9945 if (! do_version)
9946 return 1;
9947
9948 for (i = 0, section = section_headers;
9949 i < elf_header.e_shnum;
9950 i++, section++)
9951 {
9952 switch (section->sh_type)
9953 {
9954 case SHT_GNU_verdef:
9955 {
9956 Elf_External_Verdef * edefs;
9957 unsigned int idx;
9958 unsigned int cnt;
9959 char * endbuf;
9960
9961 found = 1;
9962
9963 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9964 printable_section_name (section),
9965 section->sh_info);
9966
9967 printf (_(" Addr: 0x"));
9968 printf_vma (section->sh_addr);
9969 printf (_(" Offset: %#08lx Link: %u (%s)"),
9970 (unsigned long) section->sh_offset, section->sh_link,
9971 printable_section_name_from_index (section->sh_link));
9972
9973 edefs = (Elf_External_Verdef *)
9974 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9975 _("version definition section"));
9976 if (!edefs)
9977 break;
9978 endbuf = (char *) edefs + section->sh_size;
9979
9980 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9981 {
9982 char * vstart;
9983 Elf_External_Verdef * edef;
9984 Elf_Internal_Verdef ent;
9985 Elf_External_Verdaux * eaux;
9986 Elf_Internal_Verdaux aux;
9987 int j;
9988 int isum;
9989
9990 /* Check for very large indices. */
9991 if (idx > (size_t) (endbuf - (char *) edefs))
9992 break;
9993
9994 vstart = ((char *) edefs) + idx;
9995 if (vstart + sizeof (*edef) > endbuf)
9996 break;
9997
9998 edef = (Elf_External_Verdef *) vstart;
9999
10000 ent.vd_version = BYTE_GET (edef->vd_version);
10001 ent.vd_flags = BYTE_GET (edef->vd_flags);
10002 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10003 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10004 ent.vd_hash = BYTE_GET (edef->vd_hash);
10005 ent.vd_aux = BYTE_GET (edef->vd_aux);
10006 ent.vd_next = BYTE_GET (edef->vd_next);
10007
10008 printf (_(" %#06x: Rev: %d Flags: %s"),
10009 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10010
10011 printf (_(" Index: %d Cnt: %d "),
10012 ent.vd_ndx, ent.vd_cnt);
10013
10014 /* Check for overflow. */
10015 if (ent.vd_aux > (size_t) (endbuf - vstart))
10016 break;
10017
10018 vstart += ent.vd_aux;
10019
10020 eaux = (Elf_External_Verdaux *) vstart;
10021
10022 aux.vda_name = BYTE_GET (eaux->vda_name);
10023 aux.vda_next = BYTE_GET (eaux->vda_next);
10024
10025 if (VALID_DYNAMIC_NAME (aux.vda_name))
10026 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10027 else
10028 printf (_("Name index: %ld\n"), aux.vda_name);
10029
10030 isum = idx + ent.vd_aux;
10031
10032 for (j = 1; j < ent.vd_cnt; j++)
10033 {
10034 /* Check for overflow. */
10035 if (aux.vda_next > (size_t) (endbuf - vstart))
10036 break;
10037
10038 isum += aux.vda_next;
10039 vstart += aux.vda_next;
10040
10041 eaux = (Elf_External_Verdaux *) vstart;
10042 if (vstart + sizeof (*eaux) > endbuf)
10043 break;
10044
10045 aux.vda_name = BYTE_GET (eaux->vda_name);
10046 aux.vda_next = BYTE_GET (eaux->vda_next);
10047
10048 if (VALID_DYNAMIC_NAME (aux.vda_name))
10049 printf (_(" %#06x: Parent %d: %s\n"),
10050 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10051 else
10052 printf (_(" %#06x: Parent %d, name index: %ld\n"),
10053 isum, j, aux.vda_name);
10054 }
10055
10056 if (j < ent.vd_cnt)
10057 printf (_(" Version def aux past end of section\n"));
10058
10059 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
10060 if (idx + ent.vd_next <= idx)
10061 break;
10062
10063 idx += ent.vd_next;
10064 }
10065
10066 if (cnt < section->sh_info)
10067 printf (_(" Version definition past end of section\n"));
10068
10069 free (edefs);
10070 }
10071 break;
10072
10073 case SHT_GNU_verneed:
10074 {
10075 Elf_External_Verneed * eneed;
10076 unsigned int idx;
10077 unsigned int cnt;
10078 char * endbuf;
10079
10080 found = 1;
10081
10082 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
10083 printable_section_name (section), section->sh_info);
10084
10085 printf (_(" Addr: 0x"));
10086 printf_vma (section->sh_addr);
10087 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10088 (unsigned long) section->sh_offset, section->sh_link,
10089 printable_section_name_from_index (section->sh_link));
10090
10091 eneed = (Elf_External_Verneed *) get_data (NULL, file,
10092 section->sh_offset, 1,
10093 section->sh_size,
10094 _("Version Needs section"));
10095 if (!eneed)
10096 break;
10097 endbuf = (char *) eneed + section->sh_size;
10098
10099 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10100 {
10101 Elf_External_Verneed * entry;
10102 Elf_Internal_Verneed ent;
10103 int j;
10104 int isum;
10105 char * vstart;
10106
10107 if (idx > (size_t) (endbuf - (char *) eneed))
10108 break;
10109
10110 vstart = ((char *) eneed) + idx;
10111 if (vstart + sizeof (*entry) > endbuf)
10112 break;
10113
10114 entry = (Elf_External_Verneed *) vstart;
10115
10116 ent.vn_version = BYTE_GET (entry->vn_version);
10117 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10118 ent.vn_file = BYTE_GET (entry->vn_file);
10119 ent.vn_aux = BYTE_GET (entry->vn_aux);
10120 ent.vn_next = BYTE_GET (entry->vn_next);
10121
10122 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10123
10124 if (VALID_DYNAMIC_NAME (ent.vn_file))
10125 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10126 else
10127 printf (_(" File: %lx"), ent.vn_file);
10128
10129 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10130
10131 /* Check for overflow. */
10132 if (ent.vn_aux > (size_t) (endbuf - vstart))
10133 break;
10134 vstart += ent.vn_aux;
10135
10136 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10137 {
10138 Elf_External_Vernaux * eaux;
10139 Elf_Internal_Vernaux aux;
10140
10141 if (vstart + sizeof (*eaux) > endbuf)
10142 break;
10143 eaux = (Elf_External_Vernaux *) vstart;
10144
10145 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10146 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10147 aux.vna_other = BYTE_GET (eaux->vna_other);
10148 aux.vna_name = BYTE_GET (eaux->vna_name);
10149 aux.vna_next = BYTE_GET (eaux->vna_next);
10150
10151 if (VALID_DYNAMIC_NAME (aux.vna_name))
10152 printf (_(" %#06x: Name: %s"),
10153 isum, GET_DYNAMIC_NAME (aux.vna_name));
10154 else
10155 printf (_(" %#06x: Name index: %lx"),
10156 isum, aux.vna_name);
10157
10158 printf (_(" Flags: %s Version: %d\n"),
10159 get_ver_flags (aux.vna_flags), aux.vna_other);
10160
10161 /* Check for overflow. */
10162 if (aux.vna_next > (size_t) (endbuf - vstart)
10163 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10164 {
10165 warn (_("Invalid vna_next field of %lx\n"),
10166 aux.vna_next);
10167 j = ent.vn_cnt;
10168 break;
10169 }
10170 isum += aux.vna_next;
10171 vstart += aux.vna_next;
10172 }
10173
10174 if (j < ent.vn_cnt)
10175 warn (_("Missing Version Needs auxillary information\n"));
10176
10177 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10178 {
10179 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10180 cnt = section->sh_info;
10181 break;
10182 }
10183 idx += ent.vn_next;
10184 }
10185
10186 if (cnt < section->sh_info)
10187 warn (_("Missing Version Needs information\n"));
10188
10189 free (eneed);
10190 }
10191 break;
10192
10193 case SHT_GNU_versym:
10194 {
10195 Elf_Internal_Shdr * link_section;
10196 size_t total;
10197 unsigned int cnt;
10198 unsigned char * edata;
10199 unsigned short * data;
10200 char * strtab;
10201 Elf_Internal_Sym * symbols;
10202 Elf_Internal_Shdr * string_sec;
10203 unsigned long num_syms;
10204 long off;
10205
10206 if (section->sh_link >= elf_header.e_shnum)
10207 break;
10208
10209 link_section = section_headers + section->sh_link;
10210 total = section->sh_size / sizeof (Elf_External_Versym);
10211
10212 if (link_section->sh_link >= elf_header.e_shnum)
10213 break;
10214
10215 found = 1;
10216
10217 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10218 if (symbols == NULL)
10219 break;
10220
10221 string_sec = section_headers + link_section->sh_link;
10222
10223 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10224 string_sec->sh_size,
10225 _("version string table"));
10226 if (!strtab)
10227 {
10228 free (symbols);
10229 break;
10230 }
10231
10232 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10233 printable_section_name (section), (unsigned long) total);
10234
10235 printf (_(" Addr: "));
10236 printf_vma (section->sh_addr);
10237 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10238 (unsigned long) section->sh_offset, section->sh_link,
10239 printable_section_name (link_section));
10240
10241 off = offset_from_vma (file,
10242 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10243 total * sizeof (short));
10244 edata = (unsigned char *) get_data (NULL, file, off, total,
10245 sizeof (short),
10246 _("version symbol data"));
10247 if (!edata)
10248 {
10249 free (strtab);
10250 free (symbols);
10251 break;
10252 }
10253
10254 data = (short unsigned int *) cmalloc (total, sizeof (short));
10255
10256 for (cnt = total; cnt --;)
10257 data[cnt] = byte_get (edata + cnt * sizeof (short),
10258 sizeof (short));
10259
10260 free (edata);
10261
10262 for (cnt = 0; cnt < total; cnt += 4)
10263 {
10264 int j, nn;
10265 char *name;
10266 char *invalid = _("*invalid*");
10267
10268 printf (" %03x:", cnt);
10269
10270 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10271 switch (data[cnt + j])
10272 {
10273 case 0:
10274 fputs (_(" 0 (*local*) "), stdout);
10275 break;
10276
10277 case 1:
10278 fputs (_(" 1 (*global*) "), stdout);
10279 break;
10280
10281 default:
10282 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10283 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10284
10285 /* If this index value is greater than the size of the symbols
10286 array, break to avoid an out-of-bounds read. */
10287 if ((unsigned long)(cnt + j) >= num_syms)
10288 {
10289 warn (_("invalid index into symbol array\n"));
10290 break;
10291 }
10292
10293 name = NULL;
10294 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10295 {
10296 Elf_Internal_Verneed ivn;
10297 unsigned long offset;
10298
10299 offset = offset_from_vma
10300 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10301 sizeof (Elf_External_Verneed));
10302
10303 do
10304 {
10305 Elf_Internal_Vernaux ivna;
10306 Elf_External_Verneed evn;
10307 Elf_External_Vernaux evna;
10308 unsigned long a_off;
10309
10310 if (get_data (&evn, file, offset, sizeof (evn), 1,
10311 _("version need")) == NULL)
10312 break;
10313
10314 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10315 ivn.vn_next = BYTE_GET (evn.vn_next);
10316
10317 a_off = offset + ivn.vn_aux;
10318
10319 do
10320 {
10321 if (get_data (&evna, file, a_off, sizeof (evna),
10322 1, _("version need aux (2)")) == NULL)
10323 {
10324 ivna.vna_next = 0;
10325 ivna.vna_other = 0;
10326 }
10327 else
10328 {
10329 ivna.vna_next = BYTE_GET (evna.vna_next);
10330 ivna.vna_other = BYTE_GET (evna.vna_other);
10331 }
10332
10333 a_off += ivna.vna_next;
10334 }
10335 while (ivna.vna_other != data[cnt + j]
10336 && ivna.vna_next != 0);
10337
10338 if (ivna.vna_other == data[cnt + j])
10339 {
10340 ivna.vna_name = BYTE_GET (evna.vna_name);
10341
10342 if (ivna.vna_name >= string_sec->sh_size)
10343 name = invalid;
10344 else
10345 name = strtab + ivna.vna_name;
10346 break;
10347 }
10348
10349 offset += ivn.vn_next;
10350 }
10351 while (ivn.vn_next);
10352 }
10353
10354 if (data[cnt + j] != 0x8001
10355 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10356 {
10357 Elf_Internal_Verdef ivd;
10358 Elf_External_Verdef evd;
10359 unsigned long offset;
10360
10361 offset = offset_from_vma
10362 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10363 sizeof evd);
10364
10365 do
10366 {
10367 if (get_data (&evd, file, offset, sizeof (evd), 1,
10368 _("version def")) == NULL)
10369 {
10370 ivd.vd_next = 0;
10371 /* PR 17531: file: 046-1082287-0.004. */
10372 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10373 break;
10374 }
10375 else
10376 {
10377 ivd.vd_next = BYTE_GET (evd.vd_next);
10378 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10379 }
10380
10381 offset += ivd.vd_next;
10382 }
10383 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10384 && ivd.vd_next != 0);
10385
10386 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10387 {
10388 Elf_External_Verdaux evda;
10389 Elf_Internal_Verdaux ivda;
10390
10391 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10392
10393 if (get_data (&evda, file,
10394 offset - ivd.vd_next + ivd.vd_aux,
10395 sizeof (evda), 1,
10396 _("version def aux")) == NULL)
10397 break;
10398
10399 ivda.vda_name = BYTE_GET (evda.vda_name);
10400
10401 if (ivda.vda_name >= string_sec->sh_size)
10402 name = invalid;
10403 else if (name != NULL && name != invalid)
10404 name = _("*both*");
10405 else
10406 name = strtab + ivda.vda_name;
10407 }
10408 }
10409 if (name != NULL)
10410 nn += printf ("(%s%-*s",
10411 name,
10412 12 - (int) strlen (name),
10413 ")");
10414
10415 if (nn < 18)
10416 printf ("%*c", 18 - nn, ' ');
10417 }
10418
10419 putchar ('\n');
10420 }
10421
10422 free (data);
10423 free (strtab);
10424 free (symbols);
10425 }
10426 break;
10427
10428 default:
10429 break;
10430 }
10431 }
10432
10433 if (! found)
10434 printf (_("\nNo version information found in this file.\n"));
10435
10436 return 1;
10437 }
10438
10439 static const char *
10440 get_symbol_binding (unsigned int binding)
10441 {
10442 static char buff[32];
10443
10444 switch (binding)
10445 {
10446 case STB_LOCAL: return "LOCAL";
10447 case STB_GLOBAL: return "GLOBAL";
10448 case STB_WEAK: return "WEAK";
10449 default:
10450 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10451 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10452 binding);
10453 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10454 {
10455 if (binding == STB_GNU_UNIQUE
10456 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10457 /* GNU is still using the default value 0. */
10458 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10459 return "UNIQUE";
10460 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10461 }
10462 else
10463 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10464 return buff;
10465 }
10466 }
10467
10468 static const char *
10469 get_symbol_type (unsigned int type)
10470 {
10471 static char buff[32];
10472
10473 switch (type)
10474 {
10475 case STT_NOTYPE: return "NOTYPE";
10476 case STT_OBJECT: return "OBJECT";
10477 case STT_FUNC: return "FUNC";
10478 case STT_SECTION: return "SECTION";
10479 case STT_FILE: return "FILE";
10480 case STT_COMMON: return "COMMON";
10481 case STT_TLS: return "TLS";
10482 case STT_RELC: return "RELC";
10483 case STT_SRELC: return "SRELC";
10484 default:
10485 if (type >= STT_LOPROC && type <= STT_HIPROC)
10486 {
10487 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10488 return "THUMB_FUNC";
10489
10490 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10491 return "REGISTER";
10492
10493 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10494 return "PARISC_MILLI";
10495
10496 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10497 }
10498 else if (type >= STT_LOOS && type <= STT_HIOS)
10499 {
10500 if (elf_header.e_machine == EM_PARISC)
10501 {
10502 if (type == STT_HP_OPAQUE)
10503 return "HP_OPAQUE";
10504 if (type == STT_HP_STUB)
10505 return "HP_STUB";
10506 }
10507
10508 if (type == STT_GNU_IFUNC
10509 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10510 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10511 /* GNU is still using the default value 0. */
10512 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10513 return "IFUNC";
10514
10515 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10516 }
10517 else
10518 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10519 return buff;
10520 }
10521 }
10522
10523 static const char *
10524 get_symbol_visibility (unsigned int visibility)
10525 {
10526 switch (visibility)
10527 {
10528 case STV_DEFAULT: return "DEFAULT";
10529 case STV_INTERNAL: return "INTERNAL";
10530 case STV_HIDDEN: return "HIDDEN";
10531 case STV_PROTECTED: return "PROTECTED";
10532 default:
10533 error (_("Unrecognized visibility value: %u"), visibility);
10534 return _("<unknown>");
10535 }
10536 }
10537
10538 static const char *
10539 get_solaris_symbol_visibility (unsigned int visibility)
10540 {
10541 switch (visibility)
10542 {
10543 case 4: return "EXPORTED";
10544 case 5: return "SINGLETON";
10545 case 6: return "ELIMINATE";
10546 default: return get_symbol_visibility (visibility);
10547 }
10548 }
10549
10550 static const char *
10551 get_mips_symbol_other (unsigned int other)
10552 {
10553 switch (other)
10554 {
10555 case STO_OPTIONAL:
10556 return "OPTIONAL";
10557 case STO_MIPS_PLT:
10558 return "MIPS PLT";
10559 case STO_MIPS_PIC:
10560 return "MIPS PIC";
10561 case STO_MICROMIPS:
10562 return "MICROMIPS";
10563 case STO_MICROMIPS | STO_MIPS_PIC:
10564 return "MICROMIPS, MIPS PIC";
10565 case STO_MIPS16:
10566 return "MIPS16";
10567 default:
10568 return NULL;
10569 }
10570 }
10571
10572 static const char *
10573 get_ia64_symbol_other (unsigned int other)
10574 {
10575 if (is_ia64_vms ())
10576 {
10577 static char res[32];
10578
10579 res[0] = 0;
10580
10581 /* Function types is for images and .STB files only. */
10582 switch (elf_header.e_type)
10583 {
10584 case ET_DYN:
10585 case ET_EXEC:
10586 switch (VMS_ST_FUNC_TYPE (other))
10587 {
10588 case VMS_SFT_CODE_ADDR:
10589 strcat (res, " CA");
10590 break;
10591 case VMS_SFT_SYMV_IDX:
10592 strcat (res, " VEC");
10593 break;
10594 case VMS_SFT_FD:
10595 strcat (res, " FD");
10596 break;
10597 case VMS_SFT_RESERVE:
10598 strcat (res, " RSV");
10599 break;
10600 default:
10601 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10602 VMS_ST_FUNC_TYPE (other));
10603 strcat (res, " <unknown>");
10604 break;
10605 }
10606 break;
10607 default:
10608 break;
10609 }
10610 switch (VMS_ST_LINKAGE (other))
10611 {
10612 case VMS_STL_IGNORE:
10613 strcat (res, " IGN");
10614 break;
10615 case VMS_STL_RESERVE:
10616 strcat (res, " RSV");
10617 break;
10618 case VMS_STL_STD:
10619 strcat (res, " STD");
10620 break;
10621 case VMS_STL_LNK:
10622 strcat (res, " LNK");
10623 break;
10624 default:
10625 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10626 VMS_ST_LINKAGE (other));
10627 strcat (res, " <unknown>");
10628 break;
10629 }
10630
10631 if (res[0] != 0)
10632 return res + 1;
10633 else
10634 return res;
10635 }
10636 return NULL;
10637 }
10638
10639 static const char *
10640 get_ppc64_symbol_other (unsigned int other)
10641 {
10642 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10643 {
10644 static char buf[32];
10645 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10646 PPC64_LOCAL_ENTRY_OFFSET (other));
10647 return buf;
10648 }
10649 return NULL;
10650 }
10651
10652 static const char *
10653 get_symbol_other (unsigned int other)
10654 {
10655 const char * result = NULL;
10656 static char buff [32];
10657
10658 if (other == 0)
10659 return "";
10660
10661 switch (elf_header.e_machine)
10662 {
10663 case EM_MIPS:
10664 result = get_mips_symbol_other (other);
10665 break;
10666 case EM_IA_64:
10667 result = get_ia64_symbol_other (other);
10668 break;
10669 case EM_PPC64:
10670 result = get_ppc64_symbol_other (other);
10671 break;
10672 default:
10673 result = NULL;
10674 break;
10675 }
10676
10677 if (result)
10678 return result;
10679
10680 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10681 return buff;
10682 }
10683
10684 static const char *
10685 get_symbol_index_type (unsigned int type)
10686 {
10687 static char buff[32];
10688
10689 switch (type)
10690 {
10691 case SHN_UNDEF: return "UND";
10692 case SHN_ABS: return "ABS";
10693 case SHN_COMMON: return "COM";
10694 default:
10695 if (type == SHN_IA_64_ANSI_COMMON
10696 && elf_header.e_machine == EM_IA_64
10697 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10698 return "ANSI_COM";
10699 else if ((elf_header.e_machine == EM_X86_64
10700 || elf_header.e_machine == EM_L1OM
10701 || elf_header.e_machine == EM_K1OM)
10702 && type == SHN_X86_64_LCOMMON)
10703 return "LARGE_COM";
10704 else if ((type == SHN_MIPS_SCOMMON
10705 && elf_header.e_machine == EM_MIPS)
10706 || (type == SHN_TIC6X_SCOMMON
10707 && elf_header.e_machine == EM_TI_C6000))
10708 return "SCOM";
10709 else if (type == SHN_MIPS_SUNDEFINED
10710 && elf_header.e_machine == EM_MIPS)
10711 return "SUND";
10712 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10713 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10714 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10715 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10716 else if (type >= SHN_LORESERVE)
10717 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10718 else if (type >= elf_header.e_shnum)
10719 sprintf (buff, _("bad section index[%3d]"), type);
10720 else
10721 sprintf (buff, "%3d", type);
10722 break;
10723 }
10724
10725 return buff;
10726 }
10727
10728 static bfd_vma *
10729 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10730 {
10731 unsigned char * e_data;
10732 bfd_vma * i_data;
10733
10734 /* If the size_t type is smaller than the bfd_size_type, eg because
10735 you are building a 32-bit tool on a 64-bit host, then make sure
10736 that when (number) is cast to (size_t) no information is lost. */
10737 if (sizeof (size_t) < sizeof (bfd_size_type)
10738 && (bfd_size_type) ((size_t) number) != number)
10739 {
10740 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10741 " elements of size %u\n"),
10742 number, ent_size);
10743 return NULL;
10744 }
10745
10746 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10747 attempting to allocate memory when the read is bound to fail. */
10748 if (ent_size * number > current_file_size)
10749 {
10750 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10751 number);
10752 return NULL;
10753 }
10754
10755 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10756 if (e_data == NULL)
10757 {
10758 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10759 number);
10760 return NULL;
10761 }
10762
10763 if (fread (e_data, ent_size, (size_t) number, file) != number)
10764 {
10765 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10766 number * ent_size);
10767 free (e_data);
10768 return NULL;
10769 }
10770
10771 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10772 if (i_data == NULL)
10773 {
10774 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10775 " dynamic entries\n"),
10776 number);
10777 free (e_data);
10778 return NULL;
10779 }
10780
10781 while (number--)
10782 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10783
10784 free (e_data);
10785
10786 return i_data;
10787 }
10788
10789 static void
10790 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10791 {
10792 Elf_Internal_Sym * psym;
10793 int n;
10794
10795 n = print_vma (si, DEC_5);
10796 if (n < 5)
10797 fputs (&" "[n], stdout);
10798 printf (" %3lu: ", hn);
10799
10800 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10801 {
10802 printf (_("<No info available for dynamic symbol number %lu>\n"),
10803 (unsigned long) si);
10804 return;
10805 }
10806
10807 psym = dynamic_symbols + si;
10808 print_vma (psym->st_value, LONG_HEX);
10809 putchar (' ');
10810 print_vma (psym->st_size, DEC_5);
10811
10812 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10813 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10814
10815 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10816 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10817 else
10818 {
10819 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10820
10821 printf (" %-7s", get_symbol_visibility (vis));
10822 /* Check to see if any other bits in the st_other field are set.
10823 Note - displaying this information disrupts the layout of the
10824 table being generated, but for the moment this case is very
10825 rare. */
10826 if (psym->st_other ^ vis)
10827 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10828 }
10829
10830 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10831 if (VALID_DYNAMIC_NAME (psym->st_name))
10832 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10833 else
10834 printf (_(" <corrupt: %14ld>"), psym->st_name);
10835 putchar ('\n');
10836 }
10837
10838 static const char *
10839 get_symbol_version_string (FILE * file,
10840 bfd_boolean is_dynsym,
10841 const char * strtab,
10842 unsigned long int strtab_size,
10843 unsigned int si,
10844 Elf_Internal_Sym * psym,
10845 enum versioned_symbol_info * sym_info,
10846 unsigned short * vna_other)
10847 {
10848 unsigned char data[2];
10849 unsigned short vers_data;
10850 unsigned long offset;
10851
10852 if (!is_dynsym
10853 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10854 return NULL;
10855
10856 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10857 sizeof data + si * sizeof (vers_data));
10858
10859 if (get_data (&data, file, offset + si * sizeof (vers_data),
10860 sizeof (data), 1, _("version data")) == NULL)
10861 return NULL;
10862
10863 vers_data = byte_get (data, 2);
10864
10865 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10866 return NULL;
10867
10868 /* Usually we'd only see verdef for defined symbols, and verneed for
10869 undefined symbols. However, symbols defined by the linker in
10870 .dynbss for variables copied from a shared library in order to
10871 avoid text relocations are defined yet have verneed. We could
10872 use a heuristic to detect the special case, for example, check
10873 for verneed first on symbols defined in SHT_NOBITS sections, but
10874 it is simpler and more reliable to just look for both verdef and
10875 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10876
10877 if (psym->st_shndx != SHN_UNDEF
10878 && vers_data != 0x8001
10879 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10880 {
10881 Elf_Internal_Verdef ivd;
10882 Elf_Internal_Verdaux ivda;
10883 Elf_External_Verdaux evda;
10884 unsigned long off;
10885
10886 off = offset_from_vma (file,
10887 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10888 sizeof (Elf_External_Verdef));
10889
10890 do
10891 {
10892 Elf_External_Verdef evd;
10893
10894 if (get_data (&evd, file, off, sizeof (evd), 1,
10895 _("version def")) == NULL)
10896 {
10897 ivd.vd_ndx = 0;
10898 ivd.vd_aux = 0;
10899 ivd.vd_next = 0;
10900 }
10901 else
10902 {
10903 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10904 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10905 ivd.vd_next = BYTE_GET (evd.vd_next);
10906 }
10907
10908 off += ivd.vd_next;
10909 }
10910 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10911
10912 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10913 {
10914 off -= ivd.vd_next;
10915 off += ivd.vd_aux;
10916
10917 if (get_data (&evda, file, off, sizeof (evda), 1,
10918 _("version def aux")) != NULL)
10919 {
10920 ivda.vda_name = BYTE_GET (evda.vda_name);
10921
10922 if (psym->st_name != ivda.vda_name)
10923 {
10924 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10925 ? symbol_hidden : symbol_public);
10926 return (ivda.vda_name < strtab_size
10927 ? strtab + ivda.vda_name : _("<corrupt>"));
10928 }
10929 }
10930 }
10931 }
10932
10933 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10934 {
10935 Elf_External_Verneed evn;
10936 Elf_Internal_Verneed ivn;
10937 Elf_Internal_Vernaux ivna;
10938
10939 offset = offset_from_vma (file,
10940 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10941 sizeof evn);
10942 do
10943 {
10944 unsigned long vna_off;
10945
10946 if (get_data (&evn, file, offset, sizeof (evn), 1,
10947 _("version need")) == NULL)
10948 {
10949 ivna.vna_next = 0;
10950 ivna.vna_other = 0;
10951 ivna.vna_name = 0;
10952 break;
10953 }
10954
10955 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10956 ivn.vn_next = BYTE_GET (evn.vn_next);
10957
10958 vna_off = offset + ivn.vn_aux;
10959
10960 do
10961 {
10962 Elf_External_Vernaux evna;
10963
10964 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10965 _("version need aux (3)")) == NULL)
10966 {
10967 ivna.vna_next = 0;
10968 ivna.vna_other = 0;
10969 ivna.vna_name = 0;
10970 }
10971 else
10972 {
10973 ivna.vna_other = BYTE_GET (evna.vna_other);
10974 ivna.vna_next = BYTE_GET (evna.vna_next);
10975 ivna.vna_name = BYTE_GET (evna.vna_name);
10976 }
10977
10978 vna_off += ivna.vna_next;
10979 }
10980 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10981
10982 if (ivna.vna_other == vers_data)
10983 break;
10984
10985 offset += ivn.vn_next;
10986 }
10987 while (ivn.vn_next != 0);
10988
10989 if (ivna.vna_other == vers_data)
10990 {
10991 *sym_info = symbol_undefined;
10992 *vna_other = ivna.vna_other;
10993 return (ivna.vna_name < strtab_size
10994 ? strtab + ivna.vna_name : _("<corrupt>"));
10995 }
10996 }
10997 return NULL;
10998 }
10999
11000 /* Dump the symbol table. */
11001 static int
11002 process_symbol_table (FILE * file)
11003 {
11004 Elf_Internal_Shdr * section;
11005 bfd_size_type nbuckets = 0;
11006 bfd_size_type nchains = 0;
11007 bfd_vma * buckets = NULL;
11008 bfd_vma * chains = NULL;
11009 bfd_vma ngnubuckets = 0;
11010 bfd_vma * gnubuckets = NULL;
11011 bfd_vma * gnuchains = NULL;
11012 bfd_vma gnusymidx = 0;
11013 bfd_size_type ngnuchains = 0;
11014
11015 if (!do_syms && !do_dyn_syms && !do_histogram)
11016 return 1;
11017
11018 if (dynamic_info[DT_HASH]
11019 && (do_histogram
11020 || (do_using_dynamic
11021 && !do_dyn_syms
11022 && dynamic_strings != NULL)))
11023 {
11024 unsigned char nb[8];
11025 unsigned char nc[8];
11026 unsigned int hash_ent_size = 4;
11027
11028 if ((elf_header.e_machine == EM_ALPHA
11029 || elf_header.e_machine == EM_S390
11030 || elf_header.e_machine == EM_S390_OLD)
11031 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11032 hash_ent_size = 8;
11033
11034 if (fseek (file,
11035 (archive_file_offset
11036 + offset_from_vma (file, dynamic_info[DT_HASH],
11037 sizeof nb + sizeof nc)),
11038 SEEK_SET))
11039 {
11040 error (_("Unable to seek to start of dynamic information\n"));
11041 goto no_hash;
11042 }
11043
11044 if (fread (nb, hash_ent_size, 1, file) != 1)
11045 {
11046 error (_("Failed to read in number of buckets\n"));
11047 goto no_hash;
11048 }
11049
11050 if (fread (nc, hash_ent_size, 1, file) != 1)
11051 {
11052 error (_("Failed to read in number of chains\n"));
11053 goto no_hash;
11054 }
11055
11056 nbuckets = byte_get (nb, hash_ent_size);
11057 nchains = byte_get (nc, hash_ent_size);
11058
11059 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11060 chains = get_dynamic_data (file, nchains, hash_ent_size);
11061
11062 no_hash:
11063 if (buckets == NULL || chains == NULL)
11064 {
11065 if (do_using_dynamic)
11066 return 0;
11067 free (buckets);
11068 free (chains);
11069 buckets = NULL;
11070 chains = NULL;
11071 nbuckets = 0;
11072 nchains = 0;
11073 }
11074 }
11075
11076 if (dynamic_info_DT_GNU_HASH
11077 && (do_histogram
11078 || (do_using_dynamic
11079 && !do_dyn_syms
11080 && dynamic_strings != NULL)))
11081 {
11082 unsigned char nb[16];
11083 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11084 bfd_vma buckets_vma;
11085
11086 if (fseek (file,
11087 (archive_file_offset
11088 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11089 sizeof nb)),
11090 SEEK_SET))
11091 {
11092 error (_("Unable to seek to start of dynamic information\n"));
11093 goto no_gnu_hash;
11094 }
11095
11096 if (fread (nb, 16, 1, file) != 1)
11097 {
11098 error (_("Failed to read in number of buckets\n"));
11099 goto no_gnu_hash;
11100 }
11101
11102 ngnubuckets = byte_get (nb, 4);
11103 gnusymidx = byte_get (nb + 4, 4);
11104 bitmaskwords = byte_get (nb + 8, 4);
11105 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11106 if (is_32bit_elf)
11107 buckets_vma += bitmaskwords * 4;
11108 else
11109 buckets_vma += bitmaskwords * 8;
11110
11111 if (fseek (file,
11112 (archive_file_offset
11113 + offset_from_vma (file, buckets_vma, 4)),
11114 SEEK_SET))
11115 {
11116 error (_("Unable to seek to start of dynamic information\n"));
11117 goto no_gnu_hash;
11118 }
11119
11120 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11121
11122 if (gnubuckets == NULL)
11123 goto no_gnu_hash;
11124
11125 for (i = 0; i < ngnubuckets; i++)
11126 if (gnubuckets[i] != 0)
11127 {
11128 if (gnubuckets[i] < gnusymidx)
11129 return 0;
11130
11131 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11132 maxchain = gnubuckets[i];
11133 }
11134
11135 if (maxchain == 0xffffffff)
11136 goto no_gnu_hash;
11137
11138 maxchain -= gnusymidx;
11139
11140 if (fseek (file,
11141 (archive_file_offset
11142 + offset_from_vma (file, buckets_vma
11143 + 4 * (ngnubuckets + maxchain), 4)),
11144 SEEK_SET))
11145 {
11146 error (_("Unable to seek to start of dynamic information\n"));
11147 goto no_gnu_hash;
11148 }
11149
11150 do
11151 {
11152 if (fread (nb, 4, 1, file) != 1)
11153 {
11154 error (_("Failed to determine last chain length\n"));
11155 goto no_gnu_hash;
11156 }
11157
11158 if (maxchain + 1 == 0)
11159 goto no_gnu_hash;
11160
11161 ++maxchain;
11162 }
11163 while ((byte_get (nb, 4) & 1) == 0);
11164
11165 if (fseek (file,
11166 (archive_file_offset
11167 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11168 SEEK_SET))
11169 {
11170 error (_("Unable to seek to start of dynamic information\n"));
11171 goto no_gnu_hash;
11172 }
11173
11174 gnuchains = get_dynamic_data (file, maxchain, 4);
11175 ngnuchains = maxchain;
11176
11177 no_gnu_hash:
11178 if (gnuchains == NULL)
11179 {
11180 free (gnubuckets);
11181 gnubuckets = NULL;
11182 ngnubuckets = 0;
11183 if (do_using_dynamic)
11184 return 0;
11185 }
11186 }
11187
11188 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11189 && do_syms
11190 && do_using_dynamic
11191 && dynamic_strings != NULL
11192 && dynamic_symbols != NULL)
11193 {
11194 unsigned long hn;
11195
11196 if (dynamic_info[DT_HASH])
11197 {
11198 bfd_vma si;
11199
11200 printf (_("\nSymbol table for image:\n"));
11201 if (is_32bit_elf)
11202 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11203 else
11204 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11205
11206 for (hn = 0; hn < nbuckets; hn++)
11207 {
11208 if (! buckets[hn])
11209 continue;
11210
11211 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11212 print_dynamic_symbol (si, hn);
11213 }
11214 }
11215
11216 if (dynamic_info_DT_GNU_HASH)
11217 {
11218 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11219 if (is_32bit_elf)
11220 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11221 else
11222 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11223
11224 for (hn = 0; hn < ngnubuckets; ++hn)
11225 if (gnubuckets[hn] != 0)
11226 {
11227 bfd_vma si = gnubuckets[hn];
11228 bfd_vma off = si - gnusymidx;
11229
11230 do
11231 {
11232 print_dynamic_symbol (si, hn);
11233 si++;
11234 }
11235 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11236 }
11237 }
11238 }
11239 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11240 && section_headers != NULL)
11241 {
11242 unsigned int i;
11243
11244 for (i = 0, section = section_headers;
11245 i < elf_header.e_shnum;
11246 i++, section++)
11247 {
11248 unsigned int si;
11249 char * strtab = NULL;
11250 unsigned long int strtab_size = 0;
11251 Elf_Internal_Sym * symtab;
11252 Elf_Internal_Sym * psym;
11253 unsigned long num_syms;
11254
11255 if ((section->sh_type != SHT_SYMTAB
11256 && section->sh_type != SHT_DYNSYM)
11257 || (!do_syms
11258 && section->sh_type == SHT_SYMTAB))
11259 continue;
11260
11261 if (section->sh_entsize == 0)
11262 {
11263 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11264 printable_section_name (section));
11265 continue;
11266 }
11267
11268 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11269 printable_section_name (section),
11270 (unsigned long) (section->sh_size / section->sh_entsize));
11271
11272 if (is_32bit_elf)
11273 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11274 else
11275 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11276
11277 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11278 if (symtab == NULL)
11279 continue;
11280
11281 if (section->sh_link == elf_header.e_shstrndx)
11282 {
11283 strtab = string_table;
11284 strtab_size = string_table_length;
11285 }
11286 else if (section->sh_link < elf_header.e_shnum)
11287 {
11288 Elf_Internal_Shdr * string_sec;
11289
11290 string_sec = section_headers + section->sh_link;
11291
11292 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11293 1, string_sec->sh_size,
11294 _("string table"));
11295 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11296 }
11297
11298 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11299 {
11300 const char *version_string;
11301 enum versioned_symbol_info sym_info;
11302 unsigned short vna_other;
11303
11304 printf ("%6d: ", si);
11305 print_vma (psym->st_value, LONG_HEX);
11306 putchar (' ');
11307 print_vma (psym->st_size, DEC_5);
11308 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11309 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11310 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11311 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11312 else
11313 {
11314 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11315
11316 printf (" %-7s", get_symbol_visibility (vis));
11317 /* Check to see if any other bits in the st_other field are set.
11318 Note - displaying this information disrupts the layout of the
11319 table being generated, but for the moment this case is very rare. */
11320 if (psym->st_other ^ vis)
11321 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11322 }
11323 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11324 print_symbol (25, psym->st_name < strtab_size
11325 ? strtab + psym->st_name : _("<corrupt>"));
11326
11327 version_string
11328 = get_symbol_version_string (file,
11329 section->sh_type == SHT_DYNSYM,
11330 strtab, strtab_size, si,
11331 psym, &sym_info, &vna_other);
11332 if (version_string)
11333 {
11334 if (sym_info == symbol_undefined)
11335 printf ("@%s (%d)", version_string, vna_other);
11336 else
11337 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11338 version_string);
11339 }
11340
11341 putchar ('\n');
11342
11343 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11344 && si >= section->sh_info
11345 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11346 && elf_header.e_machine != EM_MIPS
11347 /* Solaris binaries have been found to violate this requirement as
11348 well. Not sure if this is a bug or an ABI requirement. */
11349 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11350 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11351 si, printable_section_name (section), section->sh_info);
11352 }
11353
11354 free (symtab);
11355 if (strtab != string_table)
11356 free (strtab);
11357 }
11358 }
11359 else if (do_syms)
11360 printf
11361 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11362
11363 if (do_histogram && buckets != NULL)
11364 {
11365 unsigned long * lengths;
11366 unsigned long * counts;
11367 unsigned long hn;
11368 bfd_vma si;
11369 unsigned long maxlength = 0;
11370 unsigned long nzero_counts = 0;
11371 unsigned long nsyms = 0;
11372 unsigned long chained;
11373
11374 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11375 (unsigned long) nbuckets);
11376
11377 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11378 if (lengths == NULL)
11379 {
11380 error (_("Out of memory allocating space for histogram buckets\n"));
11381 return 0;
11382 }
11383
11384 printf (_(" Length Number %% of total Coverage\n"));
11385 for (hn = 0; hn < nbuckets; ++hn)
11386 {
11387 for (si = buckets[hn], chained = 0;
11388 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11389 si = chains[si], ++chained)
11390 {
11391 ++nsyms;
11392 if (maxlength < ++lengths[hn])
11393 ++maxlength;
11394 }
11395
11396 /* PR binutils/17531: A corrupt binary could contain broken
11397 histogram data. Do not go into an infinite loop trying
11398 to process it. */
11399 if (chained > nchains)
11400 {
11401 error (_("histogram chain is corrupt\n"));
11402 break;
11403 }
11404 }
11405
11406 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11407 if (counts == NULL)
11408 {
11409 free (lengths);
11410 error (_("Out of memory allocating space for histogram counts\n"));
11411 return 0;
11412 }
11413
11414 for (hn = 0; hn < nbuckets; ++hn)
11415 ++counts[lengths[hn]];
11416
11417 if (nbuckets > 0)
11418 {
11419 unsigned long i;
11420 printf (" 0 %-10lu (%5.1f%%)\n",
11421 counts[0], (counts[0] * 100.0) / nbuckets);
11422 for (i = 1; i <= maxlength; ++i)
11423 {
11424 nzero_counts += counts[i] * i;
11425 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11426 i, counts[i], (counts[i] * 100.0) / nbuckets,
11427 (nzero_counts * 100.0) / nsyms);
11428 }
11429 }
11430
11431 free (counts);
11432 free (lengths);
11433 }
11434
11435 if (buckets != NULL)
11436 {
11437 free (buckets);
11438 free (chains);
11439 }
11440
11441 if (do_histogram && gnubuckets != NULL)
11442 {
11443 unsigned long * lengths;
11444 unsigned long * counts;
11445 unsigned long hn;
11446 unsigned long maxlength = 0;
11447 unsigned long nzero_counts = 0;
11448 unsigned long nsyms = 0;
11449
11450 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11451 (unsigned long) ngnubuckets);
11452
11453 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11454 if (lengths == NULL)
11455 {
11456 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11457 return 0;
11458 }
11459
11460 printf (_(" Length Number %% of total Coverage\n"));
11461
11462 for (hn = 0; hn < ngnubuckets; ++hn)
11463 if (gnubuckets[hn] != 0)
11464 {
11465 bfd_vma off, length = 1;
11466
11467 for (off = gnubuckets[hn] - gnusymidx;
11468 /* PR 17531 file: 010-77222-0.004. */
11469 off < ngnuchains && (gnuchains[off] & 1) == 0;
11470 ++off)
11471 ++length;
11472 lengths[hn] = length;
11473 if (length > maxlength)
11474 maxlength = length;
11475 nsyms += length;
11476 }
11477
11478 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11479 if (counts == NULL)
11480 {
11481 free (lengths);
11482 error (_("Out of memory allocating space for gnu histogram counts\n"));
11483 return 0;
11484 }
11485
11486 for (hn = 0; hn < ngnubuckets; ++hn)
11487 ++counts[lengths[hn]];
11488
11489 if (ngnubuckets > 0)
11490 {
11491 unsigned long j;
11492 printf (" 0 %-10lu (%5.1f%%)\n",
11493 counts[0], (counts[0] * 100.0) / ngnubuckets);
11494 for (j = 1; j <= maxlength; ++j)
11495 {
11496 nzero_counts += counts[j] * j;
11497 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11498 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11499 (nzero_counts * 100.0) / nsyms);
11500 }
11501 }
11502
11503 free (counts);
11504 free (lengths);
11505 free (gnubuckets);
11506 free (gnuchains);
11507 }
11508
11509 return 1;
11510 }
11511
11512 static int
11513 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11514 {
11515 unsigned int i;
11516
11517 if (dynamic_syminfo == NULL
11518 || !do_dynamic)
11519 /* No syminfo, this is ok. */
11520 return 1;
11521
11522 /* There better should be a dynamic symbol section. */
11523 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11524 return 0;
11525
11526 if (dynamic_addr)
11527 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11528 dynamic_syminfo_offset, dynamic_syminfo_nent);
11529
11530 printf (_(" Num: Name BoundTo Flags\n"));
11531 for (i = 0; i < dynamic_syminfo_nent; ++i)
11532 {
11533 unsigned short int flags = dynamic_syminfo[i].si_flags;
11534
11535 printf ("%4d: ", i);
11536 if (i >= num_dynamic_syms)
11537 printf (_("<corrupt index>"));
11538 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11539 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11540 else
11541 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11542 putchar (' ');
11543
11544 switch (dynamic_syminfo[i].si_boundto)
11545 {
11546 case SYMINFO_BT_SELF:
11547 fputs ("SELF ", stdout);
11548 break;
11549 case SYMINFO_BT_PARENT:
11550 fputs ("PARENT ", stdout);
11551 break;
11552 default:
11553 if (dynamic_syminfo[i].si_boundto > 0
11554 && dynamic_syminfo[i].si_boundto < dynamic_nent
11555 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11556 {
11557 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11558 putchar (' ' );
11559 }
11560 else
11561 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11562 break;
11563 }
11564
11565 if (flags & SYMINFO_FLG_DIRECT)
11566 printf (" DIRECT");
11567 if (flags & SYMINFO_FLG_PASSTHRU)
11568 printf (" PASSTHRU");
11569 if (flags & SYMINFO_FLG_COPY)
11570 printf (" COPY");
11571 if (flags & SYMINFO_FLG_LAZYLOAD)
11572 printf (" LAZYLOAD");
11573
11574 puts ("");
11575 }
11576
11577 return 1;
11578 }
11579
11580 /* Check to see if the given reloc needs to be handled in a target specific
11581 manner. If so then process the reloc and return TRUE otherwise return
11582 FALSE. */
11583
11584 static bfd_boolean
11585 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11586 unsigned char * start,
11587 Elf_Internal_Sym * symtab)
11588 {
11589 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11590
11591 switch (elf_header.e_machine)
11592 {
11593 case EM_MSP430:
11594 case EM_MSP430_OLD:
11595 {
11596 static Elf_Internal_Sym * saved_sym = NULL;
11597
11598 switch (reloc_type)
11599 {
11600 case 10: /* R_MSP430_SYM_DIFF */
11601 if (uses_msp430x_relocs ())
11602 break;
11603 /* Fall through. */
11604 case 21: /* R_MSP430X_SYM_DIFF */
11605 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11606 return TRUE;
11607
11608 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11609 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11610 goto handle_sym_diff;
11611
11612 case 5: /* R_MSP430_16_BYTE */
11613 case 9: /* R_MSP430_8 */
11614 if (uses_msp430x_relocs ())
11615 break;
11616 goto handle_sym_diff;
11617
11618 case 2: /* R_MSP430_ABS16 */
11619 case 15: /* R_MSP430X_ABS16 */
11620 if (! uses_msp430x_relocs ())
11621 break;
11622 goto handle_sym_diff;
11623
11624 handle_sym_diff:
11625 if (saved_sym != NULL)
11626 {
11627 bfd_vma value;
11628
11629 value = reloc->r_addend
11630 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11631 - saved_sym->st_value);
11632
11633 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11634
11635 saved_sym = NULL;
11636 return TRUE;
11637 }
11638 break;
11639
11640 default:
11641 if (saved_sym != NULL)
11642 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11643 break;
11644 }
11645 break;
11646 }
11647
11648 case EM_MN10300:
11649 case EM_CYGNUS_MN10300:
11650 {
11651 static Elf_Internal_Sym * saved_sym = NULL;
11652
11653 switch (reloc_type)
11654 {
11655 case 34: /* R_MN10300_ALIGN */
11656 return TRUE;
11657 case 33: /* R_MN10300_SYM_DIFF */
11658 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11659 return TRUE;
11660 case 1: /* R_MN10300_32 */
11661 case 2: /* R_MN10300_16 */
11662 if (saved_sym != NULL)
11663 {
11664 bfd_vma value;
11665
11666 value = reloc->r_addend
11667 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11668 - saved_sym->st_value);
11669
11670 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11671
11672 saved_sym = NULL;
11673 return TRUE;
11674 }
11675 break;
11676 default:
11677 if (saved_sym != NULL)
11678 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11679 break;
11680 }
11681 break;
11682 }
11683
11684 case EM_RL78:
11685 {
11686 static bfd_vma saved_sym1 = 0;
11687 static bfd_vma saved_sym2 = 0;
11688 static bfd_vma value;
11689
11690 switch (reloc_type)
11691 {
11692 case 0x80: /* R_RL78_SYM. */
11693 saved_sym1 = saved_sym2;
11694 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11695 saved_sym2 += reloc->r_addend;
11696 return TRUE;
11697
11698 case 0x83: /* R_RL78_OPsub. */
11699 value = saved_sym1 - saved_sym2;
11700 saved_sym2 = saved_sym1 = 0;
11701 return TRUE;
11702 break;
11703
11704 case 0x41: /* R_RL78_ABS32. */
11705 byte_put (start + reloc->r_offset, value, 4);
11706 value = 0;
11707 return TRUE;
11708
11709 case 0x43: /* R_RL78_ABS16. */
11710 byte_put (start + reloc->r_offset, value, 2);
11711 value = 0;
11712 return TRUE;
11713
11714 default:
11715 break;
11716 }
11717 break;
11718 }
11719 }
11720
11721 return FALSE;
11722 }
11723
11724 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11725 DWARF debug sections. This is a target specific test. Note - we do not
11726 go through the whole including-target-headers-multiple-times route, (as
11727 we have already done with <elf/h8.h>) because this would become very
11728 messy and even then this function would have to contain target specific
11729 information (the names of the relocs instead of their numeric values).
11730 FIXME: This is not the correct way to solve this problem. The proper way
11731 is to have target specific reloc sizing and typing functions created by
11732 the reloc-macros.h header, in the same way that it already creates the
11733 reloc naming functions. */
11734
11735 static bfd_boolean
11736 is_32bit_abs_reloc (unsigned int reloc_type)
11737 {
11738 /* Please keep this table alpha-sorted for ease of visual lookup. */
11739 switch (elf_header.e_machine)
11740 {
11741 case EM_386:
11742 case EM_IAMCU:
11743 return reloc_type == 1; /* R_386_32. */
11744 case EM_68K:
11745 return reloc_type == 1; /* R_68K_32. */
11746 case EM_860:
11747 return reloc_type == 1; /* R_860_32. */
11748 case EM_960:
11749 return reloc_type == 2; /* R_960_32. */
11750 case EM_AARCH64:
11751 return (reloc_type == 258
11752 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
11753 case EM_ADAPTEVA_EPIPHANY:
11754 return reloc_type == 3;
11755 case EM_ALPHA:
11756 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11757 case EM_ARC:
11758 return reloc_type == 1; /* R_ARC_32. */
11759 case EM_ARC_COMPACT:
11760 case EM_ARC_COMPACT2:
11761 return reloc_type == 4; /* R_ARC_32. */
11762 case EM_ARM:
11763 return reloc_type == 2; /* R_ARM_ABS32 */
11764 case EM_AVR_OLD:
11765 case EM_AVR:
11766 return reloc_type == 1;
11767 case EM_BLACKFIN:
11768 return reloc_type == 0x12; /* R_byte4_data. */
11769 case EM_CRIS:
11770 return reloc_type == 3; /* R_CRIS_32. */
11771 case EM_CR16:
11772 return reloc_type == 3; /* R_CR16_NUM32. */
11773 case EM_CRX:
11774 return reloc_type == 15; /* R_CRX_NUM32. */
11775 case EM_CYGNUS_FRV:
11776 return reloc_type == 1;
11777 case EM_CYGNUS_D10V:
11778 case EM_D10V:
11779 return reloc_type == 6; /* R_D10V_32. */
11780 case EM_CYGNUS_D30V:
11781 case EM_D30V:
11782 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11783 case EM_DLX:
11784 return reloc_type == 3; /* R_DLX_RELOC_32. */
11785 case EM_CYGNUS_FR30:
11786 case EM_FR30:
11787 return reloc_type == 3; /* R_FR30_32. */
11788 case EM_FT32:
11789 return reloc_type == 1; /* R_FT32_32. */
11790 case EM_H8S:
11791 case EM_H8_300:
11792 case EM_H8_300H:
11793 return reloc_type == 1; /* R_H8_DIR32. */
11794 case EM_IA_64:
11795 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11796 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11797 case EM_IP2K_OLD:
11798 case EM_IP2K:
11799 return reloc_type == 2; /* R_IP2K_32. */
11800 case EM_IQ2000:
11801 return reloc_type == 2; /* R_IQ2000_32. */
11802 case EM_LATTICEMICO32:
11803 return reloc_type == 3; /* R_LM32_32. */
11804 case EM_M32C_OLD:
11805 case EM_M32C:
11806 return reloc_type == 3; /* R_M32C_32. */
11807 case EM_M32R:
11808 return reloc_type == 34; /* R_M32R_32_RELA. */
11809 case EM_68HC11:
11810 case EM_68HC12:
11811 return reloc_type == 6; /* R_M68HC11_32. */
11812 case EM_MCORE:
11813 return reloc_type == 1; /* R_MCORE_ADDR32. */
11814 case EM_CYGNUS_MEP:
11815 return reloc_type == 4; /* R_MEP_32. */
11816 case EM_METAG:
11817 return reloc_type == 2; /* R_METAG_ADDR32. */
11818 case EM_MICROBLAZE:
11819 return reloc_type == 1; /* R_MICROBLAZE_32. */
11820 case EM_MIPS:
11821 return reloc_type == 2; /* R_MIPS_32. */
11822 case EM_MMIX:
11823 return reloc_type == 4; /* R_MMIX_32. */
11824 case EM_CYGNUS_MN10200:
11825 case EM_MN10200:
11826 return reloc_type == 1; /* R_MN10200_32. */
11827 case EM_CYGNUS_MN10300:
11828 case EM_MN10300:
11829 return reloc_type == 1; /* R_MN10300_32. */
11830 case EM_MOXIE:
11831 return reloc_type == 1; /* R_MOXIE_32. */
11832 case EM_MSP430_OLD:
11833 case EM_MSP430:
11834 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11835 case EM_MT:
11836 return reloc_type == 2; /* R_MT_32. */
11837 case EM_NDS32:
11838 return reloc_type == 20; /* R_NDS32_RELA. */
11839 case EM_ALTERA_NIOS2:
11840 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11841 case EM_NIOS32:
11842 return reloc_type == 1; /* R_NIOS_32. */
11843 case EM_OR1K:
11844 return reloc_type == 1; /* R_OR1K_32. */
11845 case EM_PARISC:
11846 return (reloc_type == 1 /* R_PARISC_DIR32. */
11847 || reloc_type == 41); /* R_PARISC_SECREL32. */
11848 case EM_PJ:
11849 case EM_PJ_OLD:
11850 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11851 case EM_PPC64:
11852 return reloc_type == 1; /* R_PPC64_ADDR32. */
11853 case EM_PPC:
11854 return reloc_type == 1; /* R_PPC_ADDR32. */
11855 case EM_RISCV:
11856 return reloc_type == 1; /* R_RISCV_32. */
11857 case EM_RL78:
11858 return reloc_type == 1; /* R_RL78_DIR32. */
11859 case EM_RX:
11860 return reloc_type == 1; /* R_RX_DIR32. */
11861 case EM_S370:
11862 return reloc_type == 1; /* R_I370_ADDR31. */
11863 case EM_S390_OLD:
11864 case EM_S390:
11865 return reloc_type == 4; /* R_S390_32. */
11866 case EM_SCORE:
11867 return reloc_type == 8; /* R_SCORE_ABS32. */
11868 case EM_SH:
11869 return reloc_type == 1; /* R_SH_DIR32. */
11870 case EM_SPARC32PLUS:
11871 case EM_SPARCV9:
11872 case EM_SPARC:
11873 return reloc_type == 3 /* R_SPARC_32. */
11874 || reloc_type == 23; /* R_SPARC_UA32. */
11875 case EM_SPU:
11876 return reloc_type == 6; /* R_SPU_ADDR32 */
11877 case EM_TI_C6000:
11878 return reloc_type == 1; /* R_C6000_ABS32. */
11879 case EM_TILEGX:
11880 return reloc_type == 2; /* R_TILEGX_32. */
11881 case EM_TILEPRO:
11882 return reloc_type == 1; /* R_TILEPRO_32. */
11883 case EM_CYGNUS_V850:
11884 case EM_V850:
11885 return reloc_type == 6; /* R_V850_ABS32. */
11886 case EM_V800:
11887 return reloc_type == 0x33; /* R_V810_WORD. */
11888 case EM_VAX:
11889 return reloc_type == 1; /* R_VAX_32. */
11890 case EM_VISIUM:
11891 return reloc_type == 3; /* R_VISIUM_32. */
11892 case EM_X86_64:
11893 case EM_L1OM:
11894 case EM_K1OM:
11895 return reloc_type == 10; /* R_X86_64_32. */
11896 case EM_XC16X:
11897 case EM_C166:
11898 return reloc_type == 3; /* R_XC16C_ABS_32. */
11899 case EM_XGATE:
11900 return reloc_type == 4; /* R_XGATE_32. */
11901 case EM_XSTORMY16:
11902 return reloc_type == 1; /* R_XSTROMY16_32. */
11903 case EM_XTENSA_OLD:
11904 case EM_XTENSA:
11905 return reloc_type == 1; /* R_XTENSA_32. */
11906 default:
11907 {
11908 static unsigned int prev_warn = 0;
11909
11910 /* Avoid repeating the same warning multiple times. */
11911 if (prev_warn != elf_header.e_machine)
11912 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11913 elf_header.e_machine);
11914 prev_warn = elf_header.e_machine;
11915 return FALSE;
11916 }
11917 }
11918 }
11919
11920 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11921 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11922
11923 static bfd_boolean
11924 is_32bit_pcrel_reloc (unsigned int reloc_type)
11925 {
11926 switch (elf_header.e_machine)
11927 /* Please keep this table alpha-sorted for ease of visual lookup. */
11928 {
11929 case EM_386:
11930 case EM_IAMCU:
11931 return reloc_type == 2; /* R_386_PC32. */
11932 case EM_68K:
11933 return reloc_type == 4; /* R_68K_PC32. */
11934 case EM_AARCH64:
11935 return reloc_type == 261; /* R_AARCH64_PREL32 */
11936 case EM_ADAPTEVA_EPIPHANY:
11937 return reloc_type == 6;
11938 case EM_ALPHA:
11939 return reloc_type == 10; /* R_ALPHA_SREL32. */
11940 case EM_ARC_COMPACT:
11941 case EM_ARC_COMPACT2:
11942 return reloc_type == 49; /* R_ARC_32_PCREL. */
11943 case EM_ARM:
11944 return reloc_type == 3; /* R_ARM_REL32 */
11945 case EM_AVR_OLD:
11946 case EM_AVR:
11947 return reloc_type == 36; /* R_AVR_32_PCREL. */
11948 case EM_MICROBLAZE:
11949 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11950 case EM_OR1K:
11951 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11952 case EM_PARISC:
11953 return reloc_type == 9; /* R_PARISC_PCREL32. */
11954 case EM_PPC:
11955 return reloc_type == 26; /* R_PPC_REL32. */
11956 case EM_PPC64:
11957 return reloc_type == 26; /* R_PPC64_REL32. */
11958 case EM_S390_OLD:
11959 case EM_S390:
11960 return reloc_type == 5; /* R_390_PC32. */
11961 case EM_SH:
11962 return reloc_type == 2; /* R_SH_REL32. */
11963 case EM_SPARC32PLUS:
11964 case EM_SPARCV9:
11965 case EM_SPARC:
11966 return reloc_type == 6; /* R_SPARC_DISP32. */
11967 case EM_SPU:
11968 return reloc_type == 13; /* R_SPU_REL32. */
11969 case EM_TILEGX:
11970 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11971 case EM_TILEPRO:
11972 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11973 case EM_VISIUM:
11974 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11975 case EM_X86_64:
11976 case EM_L1OM:
11977 case EM_K1OM:
11978 return reloc_type == 2; /* R_X86_64_PC32. */
11979 case EM_XTENSA_OLD:
11980 case EM_XTENSA:
11981 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11982 default:
11983 /* Do not abort or issue an error message here. Not all targets use
11984 pc-relative 32-bit relocs in their DWARF debug information and we
11985 have already tested for target coverage in is_32bit_abs_reloc. A
11986 more helpful warning message will be generated by apply_relocations
11987 anyway, so just return. */
11988 return FALSE;
11989 }
11990 }
11991
11992 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11993 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11994
11995 static bfd_boolean
11996 is_64bit_abs_reloc (unsigned int reloc_type)
11997 {
11998 switch (elf_header.e_machine)
11999 {
12000 case EM_AARCH64:
12001 return reloc_type == 257; /* R_AARCH64_ABS64. */
12002 case EM_ALPHA:
12003 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12004 case EM_IA_64:
12005 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
12006 case EM_PARISC:
12007 return reloc_type == 80; /* R_PARISC_DIR64. */
12008 case EM_PPC64:
12009 return reloc_type == 38; /* R_PPC64_ADDR64. */
12010 case EM_RISCV:
12011 return reloc_type == 2; /* R_RISCV_64. */
12012 case EM_SPARC32PLUS:
12013 case EM_SPARCV9:
12014 case EM_SPARC:
12015 return reloc_type == 54; /* R_SPARC_UA64. */
12016 case EM_X86_64:
12017 case EM_L1OM:
12018 case EM_K1OM:
12019 return reloc_type == 1; /* R_X86_64_64. */
12020 case EM_S390_OLD:
12021 case EM_S390:
12022 return reloc_type == 22; /* R_S390_64. */
12023 case EM_TILEGX:
12024 return reloc_type == 1; /* R_TILEGX_64. */
12025 case EM_MIPS:
12026 return reloc_type == 18; /* R_MIPS_64. */
12027 default:
12028 return FALSE;
12029 }
12030 }
12031
12032 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12033 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12034
12035 static bfd_boolean
12036 is_64bit_pcrel_reloc (unsigned int reloc_type)
12037 {
12038 switch (elf_header.e_machine)
12039 {
12040 case EM_AARCH64:
12041 return reloc_type == 260; /* R_AARCH64_PREL64. */
12042 case EM_ALPHA:
12043 return reloc_type == 11; /* R_ALPHA_SREL64. */
12044 case EM_IA_64:
12045 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
12046 case EM_PARISC:
12047 return reloc_type == 72; /* R_PARISC_PCREL64. */
12048 case EM_PPC64:
12049 return reloc_type == 44; /* R_PPC64_REL64. */
12050 case EM_SPARC32PLUS:
12051 case EM_SPARCV9:
12052 case EM_SPARC:
12053 return reloc_type == 46; /* R_SPARC_DISP64. */
12054 case EM_X86_64:
12055 case EM_L1OM:
12056 case EM_K1OM:
12057 return reloc_type == 24; /* R_X86_64_PC64. */
12058 case EM_S390_OLD:
12059 case EM_S390:
12060 return reloc_type == 23; /* R_S390_PC64. */
12061 case EM_TILEGX:
12062 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12063 default:
12064 return FALSE;
12065 }
12066 }
12067
12068 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12069 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12070
12071 static bfd_boolean
12072 is_24bit_abs_reloc (unsigned int reloc_type)
12073 {
12074 switch (elf_header.e_machine)
12075 {
12076 case EM_CYGNUS_MN10200:
12077 case EM_MN10200:
12078 return reloc_type == 4; /* R_MN10200_24. */
12079 case EM_FT32:
12080 return reloc_type == 5; /* R_FT32_20. */
12081 default:
12082 return FALSE;
12083 }
12084 }
12085
12086 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12087 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12088
12089 static bfd_boolean
12090 is_16bit_abs_reloc (unsigned int reloc_type)
12091 {
12092 /* Please keep this table alpha-sorted for ease of visual lookup. */
12093 switch (elf_header.e_machine)
12094 {
12095 case EM_ARC:
12096 case EM_ARC_COMPACT:
12097 case EM_ARC_COMPACT2:
12098 return reloc_type == 2; /* R_ARC_16. */
12099 case EM_ADAPTEVA_EPIPHANY:
12100 return reloc_type == 5;
12101 case EM_AVR_OLD:
12102 case EM_AVR:
12103 return reloc_type == 4; /* R_AVR_16. */
12104 case EM_CYGNUS_D10V:
12105 case EM_D10V:
12106 return reloc_type == 3; /* R_D10V_16. */
12107 case EM_H8S:
12108 case EM_H8_300:
12109 case EM_H8_300H:
12110 return reloc_type == R_H8_DIR16;
12111 case EM_IP2K_OLD:
12112 case EM_IP2K:
12113 return reloc_type == 1; /* R_IP2K_16. */
12114 case EM_M32C_OLD:
12115 case EM_M32C:
12116 return reloc_type == 1; /* R_M32C_16 */
12117 case EM_CYGNUS_MN10200:
12118 case EM_MN10200:
12119 return reloc_type == 2; /* R_MN10200_16. */
12120 case EM_CYGNUS_MN10300:
12121 case EM_MN10300:
12122 return reloc_type == 2; /* R_MN10300_16. */
12123 case EM_MSP430:
12124 if (uses_msp430x_relocs ())
12125 return reloc_type == 2; /* R_MSP430_ABS16. */
12126 /* Fall through. */
12127 case EM_MSP430_OLD:
12128 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12129 case EM_NDS32:
12130 return reloc_type == 19; /* R_NDS32_RELA. */
12131 case EM_ALTERA_NIOS2:
12132 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12133 case EM_NIOS32:
12134 return reloc_type == 9; /* R_NIOS_16. */
12135 case EM_OR1K:
12136 return reloc_type == 2; /* R_OR1K_16. */
12137 case EM_TI_C6000:
12138 return reloc_type == 2; /* R_C6000_ABS16. */
12139 case EM_VISIUM:
12140 return reloc_type == 2; /* R_VISIUM_16. */
12141 case EM_XC16X:
12142 case EM_C166:
12143 return reloc_type == 2; /* R_XC16C_ABS_16. */
12144 case EM_XGATE:
12145 return reloc_type == 3; /* R_XGATE_16. */
12146 default:
12147 return FALSE;
12148 }
12149 }
12150
12151 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12152 relocation entries (possibly formerly used for SHT_GROUP sections). */
12153
12154 static bfd_boolean
12155 is_none_reloc (unsigned int reloc_type)
12156 {
12157 switch (elf_header.e_machine)
12158 {
12159 case EM_386: /* R_386_NONE. */
12160 case EM_68K: /* R_68K_NONE. */
12161 case EM_ADAPTEVA_EPIPHANY:
12162 case EM_ALPHA: /* R_ALPHA_NONE. */
12163 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12164 case EM_ARC: /* R_ARC_NONE. */
12165 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12166 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12167 case EM_ARM: /* R_ARM_NONE. */
12168 case EM_C166: /* R_XC16X_NONE. */
12169 case EM_CRIS: /* R_CRIS_NONE. */
12170 case EM_FT32: /* R_FT32_NONE. */
12171 case EM_IA_64: /* R_IA64_NONE. */
12172 case EM_K1OM: /* R_X86_64_NONE. */
12173 case EM_L1OM: /* R_X86_64_NONE. */
12174 case EM_M32R: /* R_M32R_NONE. */
12175 case EM_MIPS: /* R_MIPS_NONE. */
12176 case EM_MN10300: /* R_MN10300_NONE. */
12177 case EM_MOXIE: /* R_MOXIE_NONE. */
12178 case EM_NIOS32: /* R_NIOS_NONE. */
12179 case EM_OR1K: /* R_OR1K_NONE. */
12180 case EM_PARISC: /* R_PARISC_NONE. */
12181 case EM_PPC64: /* R_PPC64_NONE. */
12182 case EM_PPC: /* R_PPC_NONE. */
12183 case EM_RISCV: /* R_RISCV_NONE. */
12184 case EM_S390: /* R_390_NONE. */
12185 case EM_S390_OLD:
12186 case EM_SH: /* R_SH_NONE. */
12187 case EM_SPARC32PLUS:
12188 case EM_SPARC: /* R_SPARC_NONE. */
12189 case EM_SPARCV9:
12190 case EM_TILEGX: /* R_TILEGX_NONE. */
12191 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12192 case EM_TI_C6000:/* R_C6000_NONE. */
12193 case EM_X86_64: /* R_X86_64_NONE. */
12194 case EM_XC16X:
12195 return reloc_type == 0;
12196
12197 case EM_AARCH64:
12198 return reloc_type == 0 || reloc_type == 256;
12199 case EM_AVR_OLD:
12200 case EM_AVR:
12201 return (reloc_type == 0 /* R_AVR_NONE. */
12202 || reloc_type == 30 /* R_AVR_DIFF8. */
12203 || reloc_type == 31 /* R_AVR_DIFF16. */
12204 || reloc_type == 32 /* R_AVR_DIFF32. */);
12205 case EM_METAG:
12206 return reloc_type == 3; /* R_METAG_NONE. */
12207 case EM_NDS32:
12208 return (reloc_type == 0 /* R_XTENSA_NONE. */
12209 || reloc_type == 204 /* R_NDS32_DIFF8. */
12210 || reloc_type == 205 /* R_NDS32_DIFF16. */
12211 || reloc_type == 206 /* R_NDS32_DIFF32. */
12212 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12213 case EM_XTENSA_OLD:
12214 case EM_XTENSA:
12215 return (reloc_type == 0 /* R_XTENSA_NONE. */
12216 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12217 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12218 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12219 }
12220 return FALSE;
12221 }
12222
12223 /* Returns TRUE if there is a relocation against
12224 section NAME at OFFSET bytes. */
12225
12226 bfd_boolean
12227 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12228 {
12229 Elf_Internal_Rela * relocs;
12230 Elf_Internal_Rela * rp;
12231
12232 if (dsec == NULL || dsec->reloc_info == NULL)
12233 return FALSE;
12234
12235 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12236
12237 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12238 if (rp->r_offset == offset)
12239 return TRUE;
12240
12241 return FALSE;
12242 }
12243
12244 /* Apply relocations to a section.
12245 Note: So far support has been added only for those relocations
12246 which can be found in debug sections.
12247 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12248 loaded relocs. It is then the caller's responsibility to free them.
12249 FIXME: Add support for more relocations ? */
12250
12251 static void
12252 apply_relocations (void * file,
12253 const Elf_Internal_Shdr * section,
12254 unsigned char * start,
12255 bfd_size_type size,
12256 void ** relocs_return,
12257 unsigned long * num_relocs_return)
12258 {
12259 Elf_Internal_Shdr * relsec;
12260 unsigned char * end = start + size;
12261
12262 if (relocs_return != NULL)
12263 {
12264 * (Elf_Internal_Rela **) relocs_return = NULL;
12265 * num_relocs_return = 0;
12266 }
12267
12268 if (elf_header.e_type != ET_REL)
12269 return;
12270
12271 /* Find the reloc section associated with the section. */
12272 for (relsec = section_headers;
12273 relsec < section_headers + elf_header.e_shnum;
12274 ++relsec)
12275 {
12276 bfd_boolean is_rela;
12277 unsigned long num_relocs;
12278 Elf_Internal_Rela * relocs;
12279 Elf_Internal_Rela * rp;
12280 Elf_Internal_Shdr * symsec;
12281 Elf_Internal_Sym * symtab;
12282 unsigned long num_syms;
12283 Elf_Internal_Sym * sym;
12284
12285 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12286 || relsec->sh_info >= elf_header.e_shnum
12287 || section_headers + relsec->sh_info != section
12288 || relsec->sh_size == 0
12289 || relsec->sh_link >= elf_header.e_shnum)
12290 continue;
12291
12292 is_rela = relsec->sh_type == SHT_RELA;
12293
12294 if (is_rela)
12295 {
12296 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12297 relsec->sh_size, & relocs, & num_relocs))
12298 return;
12299 }
12300 else
12301 {
12302 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12303 relsec->sh_size, & relocs, & num_relocs))
12304 return;
12305 }
12306
12307 /* SH uses RELA but uses in place value instead of the addend field. */
12308 if (elf_header.e_machine == EM_SH)
12309 is_rela = FALSE;
12310
12311 symsec = section_headers + relsec->sh_link;
12312 if (symsec->sh_type != SHT_SYMTAB
12313 && symsec->sh_type != SHT_DYNSYM)
12314 return;
12315 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12316
12317 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12318 {
12319 bfd_vma addend;
12320 unsigned int reloc_type;
12321 unsigned int reloc_size;
12322 unsigned char * rloc;
12323 unsigned long sym_index;
12324
12325 reloc_type = get_reloc_type (rp->r_info);
12326
12327 if (target_specific_reloc_handling (rp, start, symtab))
12328 continue;
12329 else if (is_none_reloc (reloc_type))
12330 continue;
12331 else if (is_32bit_abs_reloc (reloc_type)
12332 || is_32bit_pcrel_reloc (reloc_type))
12333 reloc_size = 4;
12334 else if (is_64bit_abs_reloc (reloc_type)
12335 || is_64bit_pcrel_reloc (reloc_type))
12336 reloc_size = 8;
12337 else if (is_24bit_abs_reloc (reloc_type))
12338 reloc_size = 3;
12339 else if (is_16bit_abs_reloc (reloc_type))
12340 reloc_size = 2;
12341 else
12342 {
12343 static unsigned int prev_reloc = 0;
12344 if (reloc_type != prev_reloc)
12345 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12346 reloc_type, printable_section_name (section));
12347 prev_reloc = reloc_type;
12348 continue;
12349 }
12350
12351 rloc = start + rp->r_offset;
12352 if ((rloc + reloc_size) > end || (rloc < start))
12353 {
12354 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12355 (unsigned long) rp->r_offset,
12356 printable_section_name (section));
12357 continue;
12358 }
12359
12360 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12361 if (sym_index >= num_syms)
12362 {
12363 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12364 sym_index, printable_section_name (section));
12365 continue;
12366 }
12367 sym = symtab + sym_index;
12368
12369 /* If the reloc has a symbol associated with it,
12370 make sure that it is of an appropriate type.
12371
12372 Relocations against symbols without type can happen.
12373 Gcc -feliminate-dwarf2-dups may generate symbols
12374 without type for debug info.
12375
12376 Icc generates relocations against function symbols
12377 instead of local labels.
12378
12379 Relocations against object symbols can happen, eg when
12380 referencing a global array. For an example of this see
12381 the _clz.o binary in libgcc.a. */
12382 if (sym != symtab
12383 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12384 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12385 {
12386 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12387 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12388 (long int)(rp - relocs),
12389 printable_section_name (relsec));
12390 continue;
12391 }
12392
12393 addend = 0;
12394 if (is_rela)
12395 addend += rp->r_addend;
12396 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12397 partial_inplace. */
12398 if (!is_rela
12399 || (elf_header.e_machine == EM_XTENSA
12400 && reloc_type == 1)
12401 || ((elf_header.e_machine == EM_PJ
12402 || elf_header.e_machine == EM_PJ_OLD)
12403 && reloc_type == 1)
12404 || ((elf_header.e_machine == EM_D30V
12405 || elf_header.e_machine == EM_CYGNUS_D30V)
12406 && reloc_type == 12))
12407 addend += byte_get (rloc, reloc_size);
12408
12409 if (is_32bit_pcrel_reloc (reloc_type)
12410 || is_64bit_pcrel_reloc (reloc_type))
12411 {
12412 /* On HPPA, all pc-relative relocations are biased by 8. */
12413 if (elf_header.e_machine == EM_PARISC)
12414 addend -= 8;
12415 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12416 reloc_size);
12417 }
12418 else
12419 byte_put (rloc, addend + sym->st_value, reloc_size);
12420 }
12421
12422 free (symtab);
12423
12424 if (relocs_return)
12425 {
12426 * (Elf_Internal_Rela **) relocs_return = relocs;
12427 * num_relocs_return = num_relocs;
12428 }
12429 else
12430 free (relocs);
12431
12432 break;
12433 }
12434 }
12435
12436 #ifdef SUPPORT_DISASSEMBLY
12437 static int
12438 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12439 {
12440 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12441
12442 /* FIXME: XXX -- to be done --- XXX */
12443
12444 return 1;
12445 }
12446 #endif
12447
12448 /* Reads in the contents of SECTION from FILE, returning a pointer
12449 to a malloc'ed buffer or NULL if something went wrong. */
12450
12451 static char *
12452 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12453 {
12454 bfd_size_type num_bytes;
12455
12456 num_bytes = section->sh_size;
12457
12458 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12459 {
12460 printf (_("\nSection '%s' has no data to dump.\n"),
12461 printable_section_name (section));
12462 return NULL;
12463 }
12464
12465 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12466 _("section contents"));
12467 }
12468
12469 /* Uncompresses a section that was compressed using zlib, in place. */
12470
12471 static bfd_boolean
12472 uncompress_section_contents (unsigned char **buffer,
12473 dwarf_size_type uncompressed_size,
12474 dwarf_size_type *size)
12475 {
12476 dwarf_size_type compressed_size = *size;
12477 unsigned char * compressed_buffer = *buffer;
12478 unsigned char * uncompressed_buffer;
12479 z_stream strm;
12480 int rc;
12481
12482 /* It is possible the section consists of several compressed
12483 buffers concatenated together, so we uncompress in a loop. */
12484 /* PR 18313: The state field in the z_stream structure is supposed
12485 to be invisible to the user (ie us), but some compilers will
12486 still complain about it being used without initialisation. So
12487 we first zero the entire z_stream structure and then set the fields
12488 that we need. */
12489 memset (& strm, 0, sizeof strm);
12490 strm.avail_in = compressed_size;
12491 strm.next_in = (Bytef *) compressed_buffer;
12492 strm.avail_out = uncompressed_size;
12493 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12494
12495 rc = inflateInit (& strm);
12496 while (strm.avail_in > 0)
12497 {
12498 if (rc != Z_OK)
12499 goto fail;
12500 strm.next_out = ((Bytef *) uncompressed_buffer
12501 + (uncompressed_size - strm.avail_out));
12502 rc = inflate (&strm, Z_FINISH);
12503 if (rc != Z_STREAM_END)
12504 goto fail;
12505 rc = inflateReset (& strm);
12506 }
12507 rc = inflateEnd (& strm);
12508 if (rc != Z_OK
12509 || strm.avail_out != 0)
12510 goto fail;
12511
12512 *buffer = uncompressed_buffer;
12513 *size = uncompressed_size;
12514 return TRUE;
12515
12516 fail:
12517 free (uncompressed_buffer);
12518 /* Indicate decompression failure. */
12519 *buffer = NULL;
12520 return FALSE;
12521 }
12522
12523 static void
12524 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12525 {
12526 Elf_Internal_Shdr * relsec;
12527 bfd_size_type num_bytes;
12528 unsigned char * data;
12529 unsigned char * end;
12530 unsigned char * real_start;
12531 unsigned char * start;
12532 bfd_boolean some_strings_shown;
12533
12534 real_start = start = (unsigned char *) get_section_contents (section,
12535 file);
12536 if (start == NULL)
12537 return;
12538 num_bytes = section->sh_size;
12539
12540 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12541
12542 if (decompress_dumps)
12543 {
12544 dwarf_size_type new_size = num_bytes;
12545 dwarf_size_type uncompressed_size = 0;
12546
12547 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12548 {
12549 Elf_Internal_Chdr chdr;
12550 unsigned int compression_header_size
12551 = get_compression_header (& chdr, (unsigned char *) start);
12552
12553 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12554 {
12555 warn (_("section '%s' has unsupported compress type: %d\n"),
12556 printable_section_name (section), chdr.ch_type);
12557 return;
12558 }
12559 else if (chdr.ch_addralign != section->sh_addralign)
12560 {
12561 warn (_("compressed section '%s' is corrupted\n"),
12562 printable_section_name (section));
12563 return;
12564 }
12565 uncompressed_size = chdr.ch_size;
12566 start += compression_header_size;
12567 new_size -= compression_header_size;
12568 }
12569 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12570 {
12571 /* Read the zlib header. In this case, it should be "ZLIB"
12572 followed by the uncompressed section size, 8 bytes in
12573 big-endian order. */
12574 uncompressed_size = start[4]; uncompressed_size <<= 8;
12575 uncompressed_size += start[5]; uncompressed_size <<= 8;
12576 uncompressed_size += start[6]; uncompressed_size <<= 8;
12577 uncompressed_size += start[7]; uncompressed_size <<= 8;
12578 uncompressed_size += start[8]; uncompressed_size <<= 8;
12579 uncompressed_size += start[9]; uncompressed_size <<= 8;
12580 uncompressed_size += start[10]; uncompressed_size <<= 8;
12581 uncompressed_size += start[11];
12582 start += 12;
12583 new_size -= 12;
12584 }
12585
12586 if (uncompressed_size
12587 && uncompress_section_contents (& start,
12588 uncompressed_size, & new_size))
12589 num_bytes = new_size;
12590 }
12591
12592 /* If the section being dumped has relocations against it the user might
12593 be expecting these relocations to have been applied. Check for this
12594 case and issue a warning message in order to avoid confusion.
12595 FIXME: Maybe we ought to have an option that dumps a section with
12596 relocs applied ? */
12597 for (relsec = section_headers;
12598 relsec < section_headers + elf_header.e_shnum;
12599 ++relsec)
12600 {
12601 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12602 || relsec->sh_info >= elf_header.e_shnum
12603 || section_headers + relsec->sh_info != section
12604 || relsec->sh_size == 0
12605 || relsec->sh_link >= elf_header.e_shnum)
12606 continue;
12607
12608 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12609 break;
12610 }
12611
12612 data = start;
12613 end = start + num_bytes;
12614 some_strings_shown = FALSE;
12615
12616 while (data < end)
12617 {
12618 while (!ISPRINT (* data))
12619 if (++ data >= end)
12620 break;
12621
12622 if (data < end)
12623 {
12624 size_t maxlen = end - data;
12625
12626 #ifndef __MSVCRT__
12627 /* PR 11128: Use two separate invocations in order to work
12628 around bugs in the Solaris 8 implementation of printf. */
12629 printf (" [%6tx] ", data - start);
12630 #else
12631 printf (" [%6Ix] ", (size_t) (data - start));
12632 #endif
12633 if (maxlen > 0)
12634 {
12635 print_symbol ((int) maxlen, (const char *) data);
12636 putchar ('\n');
12637 data += strnlen ((const char *) data, maxlen);
12638 }
12639 else
12640 {
12641 printf (_("<corrupt>\n"));
12642 data = end;
12643 }
12644 some_strings_shown = TRUE;
12645 }
12646 }
12647
12648 if (! some_strings_shown)
12649 printf (_(" No strings found in this section."));
12650
12651 free (real_start);
12652
12653 putchar ('\n');
12654 }
12655
12656 static void
12657 dump_section_as_bytes (Elf_Internal_Shdr * section,
12658 FILE * file,
12659 bfd_boolean relocate)
12660 {
12661 Elf_Internal_Shdr * relsec;
12662 bfd_size_type bytes;
12663 bfd_size_type section_size;
12664 bfd_vma addr;
12665 unsigned char * data;
12666 unsigned char * real_start;
12667 unsigned char * start;
12668
12669 real_start = start = (unsigned char *) get_section_contents (section, file);
12670 if (start == NULL)
12671 return;
12672 section_size = section->sh_size;
12673
12674 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12675
12676 if (decompress_dumps)
12677 {
12678 dwarf_size_type new_size = section_size;
12679 dwarf_size_type uncompressed_size = 0;
12680
12681 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12682 {
12683 Elf_Internal_Chdr chdr;
12684 unsigned int compression_header_size
12685 = get_compression_header (& chdr, start);
12686
12687 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12688 {
12689 warn (_("section '%s' has unsupported compress type: %d\n"),
12690 printable_section_name (section), chdr.ch_type);
12691 return;
12692 }
12693 else if (chdr.ch_addralign != section->sh_addralign)
12694 {
12695 warn (_("compressed section '%s' is corrupted\n"),
12696 printable_section_name (section));
12697 return;
12698 }
12699 uncompressed_size = chdr.ch_size;
12700 start += compression_header_size;
12701 new_size -= compression_header_size;
12702 }
12703 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12704 {
12705 /* Read the zlib header. In this case, it should be "ZLIB"
12706 followed by the uncompressed section size, 8 bytes in
12707 big-endian order. */
12708 uncompressed_size = start[4]; uncompressed_size <<= 8;
12709 uncompressed_size += start[5]; uncompressed_size <<= 8;
12710 uncompressed_size += start[6]; uncompressed_size <<= 8;
12711 uncompressed_size += start[7]; uncompressed_size <<= 8;
12712 uncompressed_size += start[8]; uncompressed_size <<= 8;
12713 uncompressed_size += start[9]; uncompressed_size <<= 8;
12714 uncompressed_size += start[10]; uncompressed_size <<= 8;
12715 uncompressed_size += start[11];
12716 start += 12;
12717 new_size -= 12;
12718 }
12719
12720 if (uncompressed_size
12721 && uncompress_section_contents (& start, uncompressed_size,
12722 & new_size))
12723 section_size = new_size;
12724 }
12725
12726 if (relocate)
12727 {
12728 apply_relocations (file, section, start, section_size, NULL, NULL);
12729 }
12730 else
12731 {
12732 /* If the section being dumped has relocations against it the user might
12733 be expecting these relocations to have been applied. Check for this
12734 case and issue a warning message in order to avoid confusion.
12735 FIXME: Maybe we ought to have an option that dumps a section with
12736 relocs applied ? */
12737 for (relsec = section_headers;
12738 relsec < section_headers + elf_header.e_shnum;
12739 ++relsec)
12740 {
12741 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12742 || relsec->sh_info >= elf_header.e_shnum
12743 || section_headers + relsec->sh_info != section
12744 || relsec->sh_size == 0
12745 || relsec->sh_link >= elf_header.e_shnum)
12746 continue;
12747
12748 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12749 break;
12750 }
12751 }
12752
12753 addr = section->sh_addr;
12754 bytes = section_size;
12755 data = start;
12756
12757 while (bytes)
12758 {
12759 int j;
12760 int k;
12761 int lbytes;
12762
12763 lbytes = (bytes > 16 ? 16 : bytes);
12764
12765 printf (" 0x%8.8lx ", (unsigned long) addr);
12766
12767 for (j = 0; j < 16; j++)
12768 {
12769 if (j < lbytes)
12770 printf ("%2.2x", data[j]);
12771 else
12772 printf (" ");
12773
12774 if ((j & 3) == 3)
12775 printf (" ");
12776 }
12777
12778 for (j = 0; j < lbytes; j++)
12779 {
12780 k = data[j];
12781 if (k >= ' ' && k < 0x7f)
12782 printf ("%c", k);
12783 else
12784 printf (".");
12785 }
12786
12787 putchar ('\n');
12788
12789 data += lbytes;
12790 addr += lbytes;
12791 bytes -= lbytes;
12792 }
12793
12794 free (real_start);
12795
12796 putchar ('\n');
12797 }
12798
12799 static int
12800 load_specific_debug_section (enum dwarf_section_display_enum debug,
12801 const Elf_Internal_Shdr * sec, void * file)
12802 {
12803 struct dwarf_section * section = &debug_displays [debug].section;
12804 char buf [64];
12805
12806 /* If it is already loaded, do nothing. */
12807 if (section->start != NULL)
12808 return 1;
12809
12810 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12811 section->address = sec->sh_addr;
12812 section->user_data = NULL;
12813 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12814 sec->sh_offset, 1,
12815 sec->sh_size, buf);
12816 if (section->start == NULL)
12817 section->size = 0;
12818 else
12819 {
12820 unsigned char *start = section->start;
12821 dwarf_size_type size = sec->sh_size;
12822 dwarf_size_type uncompressed_size = 0;
12823
12824 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12825 {
12826 Elf_Internal_Chdr chdr;
12827 unsigned int compression_header_size;
12828
12829 if (size < (is_32bit_elf
12830 ? sizeof (Elf32_External_Chdr)
12831 : sizeof (Elf64_External_Chdr)))
12832 {
12833 warn (_("compressed section %s is too small to contain a compression header"),
12834 section->name);
12835 return 0;
12836 }
12837
12838 compression_header_size = get_compression_header (&chdr, start);
12839
12840 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12841 {
12842 warn (_("section '%s' has unsupported compress type: %d\n"),
12843 section->name, chdr.ch_type);
12844 return 0;
12845 }
12846 else if (chdr.ch_addralign != sec->sh_addralign)
12847 {
12848 warn (_("compressed section '%s' is corrupted\n"),
12849 section->name);
12850 return 0;
12851 }
12852 uncompressed_size = chdr.ch_size;
12853 start += compression_header_size;
12854 size -= compression_header_size;
12855 }
12856 else if (size > 12 && streq ((char *) start, "ZLIB"))
12857 {
12858 /* Read the zlib header. In this case, it should be "ZLIB"
12859 followed by the uncompressed section size, 8 bytes in
12860 big-endian order. */
12861 uncompressed_size = start[4]; uncompressed_size <<= 8;
12862 uncompressed_size += start[5]; uncompressed_size <<= 8;
12863 uncompressed_size += start[6]; uncompressed_size <<= 8;
12864 uncompressed_size += start[7]; uncompressed_size <<= 8;
12865 uncompressed_size += start[8]; uncompressed_size <<= 8;
12866 uncompressed_size += start[9]; uncompressed_size <<= 8;
12867 uncompressed_size += start[10]; uncompressed_size <<= 8;
12868 uncompressed_size += start[11];
12869 start += 12;
12870 size -= 12;
12871 }
12872
12873 if (uncompressed_size
12874 && uncompress_section_contents (&start, uncompressed_size,
12875 &size))
12876 {
12877 /* Free the compressed buffer, update the section buffer
12878 and the section size if uncompress is successful. */
12879 free (section->start);
12880 section->start = start;
12881 }
12882 section->size = size;
12883 }
12884
12885 if (section->start == NULL)
12886 return 0;
12887
12888 if (debug_displays [debug].relocate)
12889 apply_relocations ((FILE *) file, sec, section->start, section->size,
12890 & section->reloc_info, & section->num_relocs);
12891 else
12892 {
12893 section->reloc_info = NULL;
12894 section->num_relocs = 0;
12895 }
12896
12897 return 1;
12898 }
12899
12900 /* If this is not NULL, load_debug_section will only look for sections
12901 within the list of sections given here. */
12902 unsigned int *section_subset = NULL;
12903
12904 int
12905 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12906 {
12907 struct dwarf_section * section = &debug_displays [debug].section;
12908 Elf_Internal_Shdr * sec;
12909
12910 /* Locate the debug section. */
12911 sec = find_section_in_set (section->uncompressed_name, section_subset);
12912 if (sec != NULL)
12913 section->name = section->uncompressed_name;
12914 else
12915 {
12916 sec = find_section_in_set (section->compressed_name, section_subset);
12917 if (sec != NULL)
12918 section->name = section->compressed_name;
12919 }
12920 if (sec == NULL)
12921 return 0;
12922
12923 /* If we're loading from a subset of sections, and we've loaded
12924 a section matching this name before, it's likely that it's a
12925 different one. */
12926 if (section_subset != NULL)
12927 free_debug_section (debug);
12928
12929 return load_specific_debug_section (debug, sec, (FILE *) file);
12930 }
12931
12932 void
12933 free_debug_section (enum dwarf_section_display_enum debug)
12934 {
12935 struct dwarf_section * section = &debug_displays [debug].section;
12936
12937 if (section->start == NULL)
12938 return;
12939
12940 free ((char *) section->start);
12941 section->start = NULL;
12942 section->address = 0;
12943 section->size = 0;
12944 }
12945
12946 static int
12947 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12948 {
12949 char * name = SECTION_NAME (section);
12950 const char * print_name = printable_section_name (section);
12951 bfd_size_type length;
12952 int result = 1;
12953 int i;
12954
12955 length = section->sh_size;
12956 if (length == 0)
12957 {
12958 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12959 return 0;
12960 }
12961 if (section->sh_type == SHT_NOBITS)
12962 {
12963 /* There is no point in dumping the contents of a debugging section
12964 which has the NOBITS type - the bits in the file will be random.
12965 This can happen when a file containing a .eh_frame section is
12966 stripped with the --only-keep-debug command line option. */
12967 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12968 print_name);
12969 return 0;
12970 }
12971
12972 if (const_strneq (name, ".gnu.linkonce.wi."))
12973 name = ".debug_info";
12974
12975 /* See if we know how to display the contents of this section. */
12976 for (i = 0; i < max; i++)
12977 if (streq (debug_displays[i].section.uncompressed_name, name)
12978 || (i == line && const_strneq (name, ".debug_line."))
12979 || streq (debug_displays[i].section.compressed_name, name))
12980 {
12981 struct dwarf_section * sec = &debug_displays [i].section;
12982 int secondary = (section != find_section (name));
12983
12984 if (secondary)
12985 free_debug_section ((enum dwarf_section_display_enum) i);
12986
12987 if (i == line && const_strneq (name, ".debug_line."))
12988 sec->name = name;
12989 else if (streq (sec->uncompressed_name, name))
12990 sec->name = sec->uncompressed_name;
12991 else
12992 sec->name = sec->compressed_name;
12993 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12994 section, file))
12995 {
12996 /* If this debug section is part of a CU/TU set in a .dwp file,
12997 restrict load_debug_section to the sections in that set. */
12998 section_subset = find_cu_tu_set (file, shndx);
12999
13000 result &= debug_displays[i].display (sec, file);
13001
13002 section_subset = NULL;
13003
13004 if (secondary || (i != info && i != abbrev))
13005 free_debug_section ((enum dwarf_section_display_enum) i);
13006 }
13007
13008 break;
13009 }
13010
13011 if (i == max)
13012 {
13013 printf (_("Unrecognized debug section: %s\n"), print_name);
13014 result = 0;
13015 }
13016
13017 return result;
13018 }
13019
13020 /* Set DUMP_SECTS for all sections where dumps were requested
13021 based on section name. */
13022
13023 static void
13024 initialise_dumps_byname (void)
13025 {
13026 struct dump_list_entry * cur;
13027
13028 for (cur = dump_sects_byname; cur; cur = cur->next)
13029 {
13030 unsigned int i;
13031 int any;
13032
13033 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
13034 if (streq (SECTION_NAME (section_headers + i), cur->name))
13035 {
13036 request_dump_bynumber (i, cur->type);
13037 any = 1;
13038 }
13039
13040 if (!any)
13041 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13042 cur->name);
13043 }
13044 }
13045
13046 static void
13047 process_section_contents (FILE * file)
13048 {
13049 Elf_Internal_Shdr * section;
13050 unsigned int i;
13051
13052 if (! do_dump)
13053 return;
13054
13055 initialise_dumps_byname ();
13056
13057 for (i = 0, section = section_headers;
13058 i < elf_header.e_shnum && i < num_dump_sects;
13059 i++, section++)
13060 {
13061 #ifdef SUPPORT_DISASSEMBLY
13062 if (dump_sects[i] & DISASS_DUMP)
13063 disassemble_section (section, file);
13064 #endif
13065 if (dump_sects[i] & HEX_DUMP)
13066 dump_section_as_bytes (section, file, FALSE);
13067
13068 if (dump_sects[i] & RELOC_DUMP)
13069 dump_section_as_bytes (section, file, TRUE);
13070
13071 if (dump_sects[i] & STRING_DUMP)
13072 dump_section_as_strings (section, file);
13073
13074 if (dump_sects[i] & DEBUG_DUMP)
13075 display_debug_section (i, section, file);
13076 }
13077
13078 /* Check to see if the user requested a
13079 dump of a section that does not exist. */
13080 while (i++ < num_dump_sects)
13081 if (dump_sects[i])
13082 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13083 }
13084
13085 static void
13086 process_mips_fpe_exception (int mask)
13087 {
13088 if (mask)
13089 {
13090 int first = 1;
13091 if (mask & OEX_FPU_INEX)
13092 fputs ("INEX", stdout), first = 0;
13093 if (mask & OEX_FPU_UFLO)
13094 printf ("%sUFLO", first ? "" : "|"), first = 0;
13095 if (mask & OEX_FPU_OFLO)
13096 printf ("%sOFLO", first ? "" : "|"), first = 0;
13097 if (mask & OEX_FPU_DIV0)
13098 printf ("%sDIV0", first ? "" : "|"), first = 0;
13099 if (mask & OEX_FPU_INVAL)
13100 printf ("%sINVAL", first ? "" : "|");
13101 }
13102 else
13103 fputs ("0", stdout);
13104 }
13105
13106 /* Display's the value of TAG at location P. If TAG is
13107 greater than 0 it is assumed to be an unknown tag, and
13108 a message is printed to this effect. Otherwise it is
13109 assumed that a message has already been printed.
13110
13111 If the bottom bit of TAG is set it assumed to have a
13112 string value, otherwise it is assumed to have an integer
13113 value.
13114
13115 Returns an updated P pointing to the first unread byte
13116 beyond the end of TAG's value.
13117
13118 Reads at or beyond END will not be made. */
13119
13120 static unsigned char *
13121 display_tag_value (int tag,
13122 unsigned char * p,
13123 const unsigned char * const end)
13124 {
13125 unsigned long val;
13126
13127 if (tag > 0)
13128 printf (" Tag_unknown_%d: ", tag);
13129
13130 if (p >= end)
13131 {
13132 warn (_("<corrupt tag>\n"));
13133 }
13134 else if (tag & 1)
13135 {
13136 /* PR 17531 file: 027-19978-0.004. */
13137 size_t maxlen = (end - p) - 1;
13138
13139 putchar ('"');
13140 if (maxlen > 0)
13141 {
13142 print_symbol ((int) maxlen, (const char *) p);
13143 p += strnlen ((char *) p, maxlen) + 1;
13144 }
13145 else
13146 {
13147 printf (_("<corrupt string tag>"));
13148 p = (unsigned char *) end;
13149 }
13150 printf ("\"\n");
13151 }
13152 else
13153 {
13154 unsigned int len;
13155
13156 val = read_uleb128 (p, &len, end);
13157 p += len;
13158 printf ("%ld (0x%lx)\n", val, val);
13159 }
13160
13161 assert (p <= end);
13162 return p;
13163 }
13164
13165 /* ARM EABI attributes section. */
13166 typedef struct
13167 {
13168 unsigned int tag;
13169 const char * name;
13170 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
13171 unsigned int type;
13172 const char ** table;
13173 } arm_attr_public_tag;
13174
13175 static const char * arm_attr_tag_CPU_arch[] =
13176 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13177 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13178 "v8-M.mainline"};
13179 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13180 static const char * arm_attr_tag_THUMB_ISA_use[] =
13181 {"No", "Thumb-1", "Thumb-2", "Yes"};
13182 static const char * arm_attr_tag_FP_arch[] =
13183 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13184 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13185 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13186 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13187 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13188 "NEON for ARMv8.1"};
13189 static const char * arm_attr_tag_PCS_config[] =
13190 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13191 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13192 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13193 {"V6", "SB", "TLS", "Unused"};
13194 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13195 {"Absolute", "PC-relative", "SB-relative", "None"};
13196 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13197 {"Absolute", "PC-relative", "None"};
13198 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13199 {"None", "direct", "GOT-indirect"};
13200 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13201 {"None", "??? 1", "2", "??? 3", "4"};
13202 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13203 static const char * arm_attr_tag_ABI_FP_denormal[] =
13204 {"Unused", "Needed", "Sign only"};
13205 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13206 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13207 static const char * arm_attr_tag_ABI_FP_number_model[] =
13208 {"Unused", "Finite", "RTABI", "IEEE 754"};
13209 static const char * arm_attr_tag_ABI_enum_size[] =
13210 {"Unused", "small", "int", "forced to int"};
13211 static const char * arm_attr_tag_ABI_HardFP_use[] =
13212 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13213 static const char * arm_attr_tag_ABI_VFP_args[] =
13214 {"AAPCS", "VFP registers", "custom", "compatible"};
13215 static const char * arm_attr_tag_ABI_WMMX_args[] =
13216 {"AAPCS", "WMMX registers", "custom"};
13217 static const char * arm_attr_tag_ABI_optimization_goals[] =
13218 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13219 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13220 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13221 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13222 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13223 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13224 static const char * arm_attr_tag_FP_HP_extension[] =
13225 {"Not Allowed", "Allowed"};
13226 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13227 {"None", "IEEE 754", "Alternative Format"};
13228 static const char * arm_attr_tag_DSP_extension[] =
13229 {"Follow architecture", "Allowed"};
13230 static const char * arm_attr_tag_MPextension_use[] =
13231 {"Not Allowed", "Allowed"};
13232 static const char * arm_attr_tag_DIV_use[] =
13233 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13234 "Allowed in v7-A with integer division extension"};
13235 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13236 static const char * arm_attr_tag_Virtualization_use[] =
13237 {"Not Allowed", "TrustZone", "Virtualization Extensions",
13238 "TrustZone and Virtualization Extensions"};
13239 static const char * arm_attr_tag_MPextension_use_legacy[] =
13240 {"Not Allowed", "Allowed"};
13241
13242 #define LOOKUP(id, name) \
13243 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13244 static arm_attr_public_tag arm_attr_public_tags[] =
13245 {
13246 {4, "CPU_raw_name", 1, NULL},
13247 {5, "CPU_name", 1, NULL},
13248 LOOKUP(6, CPU_arch),
13249 {7, "CPU_arch_profile", 0, NULL},
13250 LOOKUP(8, ARM_ISA_use),
13251 LOOKUP(9, THUMB_ISA_use),
13252 LOOKUP(10, FP_arch),
13253 LOOKUP(11, WMMX_arch),
13254 LOOKUP(12, Advanced_SIMD_arch),
13255 LOOKUP(13, PCS_config),
13256 LOOKUP(14, ABI_PCS_R9_use),
13257 LOOKUP(15, ABI_PCS_RW_data),
13258 LOOKUP(16, ABI_PCS_RO_data),
13259 LOOKUP(17, ABI_PCS_GOT_use),
13260 LOOKUP(18, ABI_PCS_wchar_t),
13261 LOOKUP(19, ABI_FP_rounding),
13262 LOOKUP(20, ABI_FP_denormal),
13263 LOOKUP(21, ABI_FP_exceptions),
13264 LOOKUP(22, ABI_FP_user_exceptions),
13265 LOOKUP(23, ABI_FP_number_model),
13266 {24, "ABI_align_needed", 0, NULL},
13267 {25, "ABI_align_preserved", 0, NULL},
13268 LOOKUP(26, ABI_enum_size),
13269 LOOKUP(27, ABI_HardFP_use),
13270 LOOKUP(28, ABI_VFP_args),
13271 LOOKUP(29, ABI_WMMX_args),
13272 LOOKUP(30, ABI_optimization_goals),
13273 LOOKUP(31, ABI_FP_optimization_goals),
13274 {32, "compatibility", 0, NULL},
13275 LOOKUP(34, CPU_unaligned_access),
13276 LOOKUP(36, FP_HP_extension),
13277 LOOKUP(38, ABI_FP_16bit_format),
13278 LOOKUP(42, MPextension_use),
13279 LOOKUP(44, DIV_use),
13280 LOOKUP(46, DSP_extension),
13281 {64, "nodefaults", 0, NULL},
13282 {65, "also_compatible_with", 0, NULL},
13283 LOOKUP(66, T2EE_use),
13284 {67, "conformance", 1, NULL},
13285 LOOKUP(68, Virtualization_use),
13286 LOOKUP(70, MPextension_use_legacy)
13287 };
13288 #undef LOOKUP
13289
13290 static unsigned char *
13291 display_arm_attribute (unsigned char * p,
13292 const unsigned char * const end)
13293 {
13294 unsigned int tag;
13295 unsigned int len;
13296 unsigned int val;
13297 arm_attr_public_tag * attr;
13298 unsigned i;
13299 unsigned int type;
13300
13301 tag = read_uleb128 (p, &len, end);
13302 p += len;
13303 attr = NULL;
13304 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13305 {
13306 if (arm_attr_public_tags[i].tag == tag)
13307 {
13308 attr = &arm_attr_public_tags[i];
13309 break;
13310 }
13311 }
13312
13313 if (attr)
13314 {
13315 printf (" Tag_%s: ", attr->name);
13316 switch (attr->type)
13317 {
13318 case 0:
13319 switch (tag)
13320 {
13321 case 7: /* Tag_CPU_arch_profile. */
13322 val = read_uleb128 (p, &len, end);
13323 p += len;
13324 switch (val)
13325 {
13326 case 0: printf (_("None\n")); break;
13327 case 'A': printf (_("Application\n")); break;
13328 case 'R': printf (_("Realtime\n")); break;
13329 case 'M': printf (_("Microcontroller\n")); break;
13330 case 'S': printf (_("Application or Realtime\n")); break;
13331 default: printf ("??? (%d)\n", val); break;
13332 }
13333 break;
13334
13335 case 24: /* Tag_align_needed. */
13336 val = read_uleb128 (p, &len, end);
13337 p += len;
13338 switch (val)
13339 {
13340 case 0: printf (_("None\n")); break;
13341 case 1: printf (_("8-byte\n")); break;
13342 case 2: printf (_("4-byte\n")); break;
13343 case 3: printf ("??? 3\n"); break;
13344 default:
13345 if (val <= 12)
13346 printf (_("8-byte and up to %d-byte extended\n"),
13347 1 << val);
13348 else
13349 printf ("??? (%d)\n", val);
13350 break;
13351 }
13352 break;
13353
13354 case 25: /* Tag_align_preserved. */
13355 val = read_uleb128 (p, &len, end);
13356 p += len;
13357 switch (val)
13358 {
13359 case 0: printf (_("None\n")); break;
13360 case 1: printf (_("8-byte, except leaf SP\n")); break;
13361 case 2: printf (_("8-byte\n")); break;
13362 case 3: printf ("??? 3\n"); break;
13363 default:
13364 if (val <= 12)
13365 printf (_("8-byte and up to %d-byte extended\n"),
13366 1 << val);
13367 else
13368 printf ("??? (%d)\n", val);
13369 break;
13370 }
13371 break;
13372
13373 case 32: /* Tag_compatibility. */
13374 {
13375 val = read_uleb128 (p, &len, end);
13376 p += len;
13377 printf (_("flag = %d, vendor = "), val);
13378 if (p < end - 1)
13379 {
13380 size_t maxlen = (end - p) - 1;
13381
13382 print_symbol ((int) maxlen, (const char *) p);
13383 p += strnlen ((char *) p, maxlen) + 1;
13384 }
13385 else
13386 {
13387 printf (_("<corrupt>"));
13388 p = (unsigned char *) end;
13389 }
13390 putchar ('\n');
13391 }
13392 break;
13393
13394 case 64: /* Tag_nodefaults. */
13395 /* PR 17531: file: 001-505008-0.01. */
13396 if (p < end)
13397 p++;
13398 printf (_("True\n"));
13399 break;
13400
13401 case 65: /* Tag_also_compatible_with. */
13402 val = read_uleb128 (p, &len, end);
13403 p += len;
13404 if (val == 6 /* Tag_CPU_arch. */)
13405 {
13406 val = read_uleb128 (p, &len, end);
13407 p += len;
13408 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13409 printf ("??? (%d)\n", val);
13410 else
13411 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13412 }
13413 else
13414 printf ("???\n");
13415 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13416 ;
13417 break;
13418
13419 default:
13420 printf (_("<unknown: %d>\n"), tag);
13421 break;
13422 }
13423 return p;
13424
13425 case 1:
13426 return display_tag_value (-1, p, end);
13427 case 2:
13428 return display_tag_value (0, p, end);
13429
13430 default:
13431 assert (attr->type & 0x80);
13432 val = read_uleb128 (p, &len, end);
13433 p += len;
13434 type = attr->type & 0x7f;
13435 if (val >= type)
13436 printf ("??? (%d)\n", val);
13437 else
13438 printf ("%s\n", attr->table[val]);
13439 return p;
13440 }
13441 }
13442
13443 return display_tag_value (tag, p, end);
13444 }
13445
13446 static unsigned char *
13447 display_gnu_attribute (unsigned char * p,
13448 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13449 const unsigned char * const end)
13450 {
13451 int tag;
13452 unsigned int len;
13453 int val;
13454
13455 tag = read_uleb128 (p, &len, end);
13456 p += len;
13457
13458 /* Tag_compatibility is the only generic GNU attribute defined at
13459 present. */
13460 if (tag == 32)
13461 {
13462 val = read_uleb128 (p, &len, end);
13463 p += len;
13464
13465 printf (_("flag = %d, vendor = "), val);
13466 if (p == end)
13467 {
13468 printf (_("<corrupt>\n"));
13469 warn (_("corrupt vendor attribute\n"));
13470 }
13471 else
13472 {
13473 if (p < end - 1)
13474 {
13475 size_t maxlen = (end - p) - 1;
13476
13477 print_symbol ((int) maxlen, (const char *) p);
13478 p += strnlen ((char *) p, maxlen) + 1;
13479 }
13480 else
13481 {
13482 printf (_("<corrupt>"));
13483 p = (unsigned char *) end;
13484 }
13485 putchar ('\n');
13486 }
13487 return p;
13488 }
13489
13490 if ((tag & 2) == 0 && display_proc_gnu_attribute)
13491 return display_proc_gnu_attribute (p, tag, end);
13492
13493 return display_tag_value (tag, p, end);
13494 }
13495
13496 static unsigned char *
13497 display_power_gnu_attribute (unsigned char * p,
13498 int tag,
13499 const unsigned char * const end)
13500 {
13501 unsigned int len;
13502 unsigned int val;
13503
13504 if (tag == Tag_GNU_Power_ABI_FP)
13505 {
13506 val = read_uleb128 (p, &len, end);
13507 p += len;
13508 printf (" Tag_GNU_Power_ABI_FP: ");
13509 if (len == 0)
13510 {
13511 printf (_("<corrupt>\n"));
13512 return p;
13513 }
13514
13515 if (val > 15)
13516 printf ("(%#x), ", val);
13517
13518 switch (val & 3)
13519 {
13520 case 0:
13521 printf (_("unspecified hard/soft float, "));
13522 break;
13523 case 1:
13524 printf (_("hard float, "));
13525 break;
13526 case 2:
13527 printf (_("soft float, "));
13528 break;
13529 case 3:
13530 printf (_("single-precision hard float, "));
13531 break;
13532 }
13533
13534 switch (val & 0xC)
13535 {
13536 case 0:
13537 printf (_("unspecified long double\n"));
13538 break;
13539 case 4:
13540 printf (_("128-bit IBM long double\n"));
13541 break;
13542 case 8:
13543 printf (_("64-bit long double\n"));
13544 break;
13545 case 12:
13546 printf (_("128-bit IEEE long double\n"));
13547 break;
13548 }
13549 return p;
13550 }
13551
13552 if (tag == Tag_GNU_Power_ABI_Vector)
13553 {
13554 val = read_uleb128 (p, &len, end);
13555 p += len;
13556 printf (" Tag_GNU_Power_ABI_Vector: ");
13557 if (len == 0)
13558 {
13559 printf (_("<corrupt>\n"));
13560 return p;
13561 }
13562
13563 if (val > 3)
13564 printf ("(%#x), ", val);
13565
13566 switch (val & 3)
13567 {
13568 case 0:
13569 printf (_("unspecified\n"));
13570 break;
13571 case 1:
13572 printf (_("generic\n"));
13573 break;
13574 case 2:
13575 printf ("AltiVec\n");
13576 break;
13577 case 3:
13578 printf ("SPE\n");
13579 break;
13580 }
13581 return p;
13582 }
13583
13584 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13585 {
13586 val = read_uleb128 (p, &len, end);
13587 p += len;
13588 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13589 if (len == 0)
13590 {
13591 printf (_("<corrupt>\n"));
13592 return p;
13593 }
13594
13595 if (val > 2)
13596 printf ("(%#x), ", val);
13597
13598 switch (val & 3)
13599 {
13600 case 0:
13601 printf (_("unspecified\n"));
13602 break;
13603 case 1:
13604 printf ("r3/r4\n");
13605 break;
13606 case 2:
13607 printf (_("memory\n"));
13608 break;
13609 case 3:
13610 printf ("???\n");
13611 break;
13612 }
13613 return p;
13614 }
13615
13616 return display_tag_value (tag & 1, p, end);
13617 }
13618
13619 static unsigned char *
13620 display_s390_gnu_attribute (unsigned char * p,
13621 int tag,
13622 const unsigned char * const end)
13623 {
13624 unsigned int len;
13625 int val;
13626
13627 if (tag == Tag_GNU_S390_ABI_Vector)
13628 {
13629 val = read_uleb128 (p, &len, end);
13630 p += len;
13631 printf (" Tag_GNU_S390_ABI_Vector: ");
13632
13633 switch (val)
13634 {
13635 case 0:
13636 printf (_("any\n"));
13637 break;
13638 case 1:
13639 printf (_("software\n"));
13640 break;
13641 case 2:
13642 printf (_("hardware\n"));
13643 break;
13644 default:
13645 printf ("??? (%d)\n", val);
13646 break;
13647 }
13648 return p;
13649 }
13650
13651 return display_tag_value (tag & 1, p, end);
13652 }
13653
13654 static void
13655 display_sparc_hwcaps (int mask)
13656 {
13657 if (mask)
13658 {
13659 int first = 1;
13660
13661 if (mask & ELF_SPARC_HWCAP_MUL32)
13662 fputs ("mul32", stdout), first = 0;
13663 if (mask & ELF_SPARC_HWCAP_DIV32)
13664 printf ("%sdiv32", first ? "" : "|"), first = 0;
13665 if (mask & ELF_SPARC_HWCAP_FSMULD)
13666 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13667 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13668 printf ("%sv8plus", first ? "" : "|"), first = 0;
13669 if (mask & ELF_SPARC_HWCAP_POPC)
13670 printf ("%spopc", first ? "" : "|"), first = 0;
13671 if (mask & ELF_SPARC_HWCAP_VIS)
13672 printf ("%svis", first ? "" : "|"), first = 0;
13673 if (mask & ELF_SPARC_HWCAP_VIS2)
13674 printf ("%svis2", first ? "" : "|"), first = 0;
13675 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13676 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13677 if (mask & ELF_SPARC_HWCAP_FMAF)
13678 printf ("%sfmaf", first ? "" : "|"), first = 0;
13679 if (mask & ELF_SPARC_HWCAP_VIS3)
13680 printf ("%svis3", first ? "" : "|"), first = 0;
13681 if (mask & ELF_SPARC_HWCAP_HPC)
13682 printf ("%shpc", first ? "" : "|"), first = 0;
13683 if (mask & ELF_SPARC_HWCAP_RANDOM)
13684 printf ("%srandom", first ? "" : "|"), first = 0;
13685 if (mask & ELF_SPARC_HWCAP_TRANS)
13686 printf ("%strans", first ? "" : "|"), first = 0;
13687 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13688 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13689 if (mask & ELF_SPARC_HWCAP_IMA)
13690 printf ("%sima", first ? "" : "|"), first = 0;
13691 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13692 printf ("%scspare", first ? "" : "|"), first = 0;
13693 }
13694 else
13695 fputc ('0', stdout);
13696 fputc ('\n', stdout);
13697 }
13698
13699 static void
13700 display_sparc_hwcaps2 (int mask)
13701 {
13702 if (mask)
13703 {
13704 int first = 1;
13705
13706 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13707 fputs ("fjathplus", stdout), first = 0;
13708 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13709 printf ("%svis3b", first ? "" : "|"), first = 0;
13710 if (mask & ELF_SPARC_HWCAP2_ADP)
13711 printf ("%sadp", first ? "" : "|"), first = 0;
13712 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13713 printf ("%ssparc5", first ? "" : "|"), first = 0;
13714 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13715 printf ("%smwait", first ? "" : "|"), first = 0;
13716 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13717 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13718 if (mask & ELF_SPARC_HWCAP2_XMONT)
13719 printf ("%sxmont2", first ? "" : "|"), first = 0;
13720 if (mask & ELF_SPARC_HWCAP2_NSEC)
13721 printf ("%snsec", first ? "" : "|"), first = 0;
13722 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13723 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13724 if (mask & ELF_SPARC_HWCAP2_FJDES)
13725 printf ("%sfjdes", first ? "" : "|"), first = 0;
13726 if (mask & ELF_SPARC_HWCAP2_FJAES)
13727 printf ("%sfjaes", first ? "" : "|"), first = 0;
13728 }
13729 else
13730 fputc ('0', stdout);
13731 fputc ('\n', stdout);
13732 }
13733
13734 static unsigned char *
13735 display_sparc_gnu_attribute (unsigned char * p,
13736 int tag,
13737 const unsigned char * const end)
13738 {
13739 unsigned int len;
13740 int val;
13741
13742 if (tag == Tag_GNU_Sparc_HWCAPS)
13743 {
13744 val = read_uleb128 (p, &len, end);
13745 p += len;
13746 printf (" Tag_GNU_Sparc_HWCAPS: ");
13747 display_sparc_hwcaps (val);
13748 return p;
13749 }
13750 if (tag == Tag_GNU_Sparc_HWCAPS2)
13751 {
13752 val = read_uleb128 (p, &len, end);
13753 p += len;
13754 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13755 display_sparc_hwcaps2 (val);
13756 return p;
13757 }
13758
13759 return display_tag_value (tag, p, end);
13760 }
13761
13762 static void
13763 print_mips_fp_abi_value (int val)
13764 {
13765 switch (val)
13766 {
13767 case Val_GNU_MIPS_ABI_FP_ANY:
13768 printf (_("Hard or soft float\n"));
13769 break;
13770 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13771 printf (_("Hard float (double precision)\n"));
13772 break;
13773 case Val_GNU_MIPS_ABI_FP_SINGLE:
13774 printf (_("Hard float (single precision)\n"));
13775 break;
13776 case Val_GNU_MIPS_ABI_FP_SOFT:
13777 printf (_("Soft float\n"));
13778 break;
13779 case Val_GNU_MIPS_ABI_FP_OLD_64:
13780 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13781 break;
13782 case Val_GNU_MIPS_ABI_FP_XX:
13783 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13784 break;
13785 case Val_GNU_MIPS_ABI_FP_64:
13786 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13787 break;
13788 case Val_GNU_MIPS_ABI_FP_64A:
13789 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13790 break;
13791 case Val_GNU_MIPS_ABI_FP_NAN2008:
13792 printf (_("NaN 2008 compatibility\n"));
13793 break;
13794 default:
13795 printf ("??? (%d)\n", val);
13796 break;
13797 }
13798 }
13799
13800 static unsigned char *
13801 display_mips_gnu_attribute (unsigned char * p,
13802 int tag,
13803 const unsigned char * const end)
13804 {
13805 if (tag == Tag_GNU_MIPS_ABI_FP)
13806 {
13807 unsigned int len;
13808 int val;
13809
13810 val = read_uleb128 (p, &len, end);
13811 p += len;
13812 printf (" Tag_GNU_MIPS_ABI_FP: ");
13813
13814 print_mips_fp_abi_value (val);
13815
13816 return p;
13817 }
13818
13819 if (tag == Tag_GNU_MIPS_ABI_MSA)
13820 {
13821 unsigned int len;
13822 int val;
13823
13824 val = read_uleb128 (p, &len, end);
13825 p += len;
13826 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13827
13828 switch (val)
13829 {
13830 case Val_GNU_MIPS_ABI_MSA_ANY:
13831 printf (_("Any MSA or not\n"));
13832 break;
13833 case Val_GNU_MIPS_ABI_MSA_128:
13834 printf (_("128-bit MSA\n"));
13835 break;
13836 default:
13837 printf ("??? (%d)\n", val);
13838 break;
13839 }
13840 return p;
13841 }
13842
13843 return display_tag_value (tag & 1, p, end);
13844 }
13845
13846 static unsigned char *
13847 display_tic6x_attribute (unsigned char * p,
13848 const unsigned char * const end)
13849 {
13850 int tag;
13851 unsigned int len;
13852 int val;
13853
13854 tag = read_uleb128 (p, &len, end);
13855 p += len;
13856
13857 switch (tag)
13858 {
13859 case Tag_ISA:
13860 val = read_uleb128 (p, &len, end);
13861 p += len;
13862 printf (" Tag_ISA: ");
13863
13864 switch (val)
13865 {
13866 case C6XABI_Tag_ISA_none:
13867 printf (_("None\n"));
13868 break;
13869 case C6XABI_Tag_ISA_C62X:
13870 printf ("C62x\n");
13871 break;
13872 case C6XABI_Tag_ISA_C67X:
13873 printf ("C67x\n");
13874 break;
13875 case C6XABI_Tag_ISA_C67XP:
13876 printf ("C67x+\n");
13877 break;
13878 case C6XABI_Tag_ISA_C64X:
13879 printf ("C64x\n");
13880 break;
13881 case C6XABI_Tag_ISA_C64XP:
13882 printf ("C64x+\n");
13883 break;
13884 case C6XABI_Tag_ISA_C674X:
13885 printf ("C674x\n");
13886 break;
13887 default:
13888 printf ("??? (%d)\n", val);
13889 break;
13890 }
13891 return p;
13892
13893 case Tag_ABI_wchar_t:
13894 val = read_uleb128 (p, &len, end);
13895 p += len;
13896 printf (" Tag_ABI_wchar_t: ");
13897 switch (val)
13898 {
13899 case 0:
13900 printf (_("Not used\n"));
13901 break;
13902 case 1:
13903 printf (_("2 bytes\n"));
13904 break;
13905 case 2:
13906 printf (_("4 bytes\n"));
13907 break;
13908 default:
13909 printf ("??? (%d)\n", val);
13910 break;
13911 }
13912 return p;
13913
13914 case Tag_ABI_stack_align_needed:
13915 val = read_uleb128 (p, &len, end);
13916 p += len;
13917 printf (" Tag_ABI_stack_align_needed: ");
13918 switch (val)
13919 {
13920 case 0:
13921 printf (_("8-byte\n"));
13922 break;
13923 case 1:
13924 printf (_("16-byte\n"));
13925 break;
13926 default:
13927 printf ("??? (%d)\n", val);
13928 break;
13929 }
13930 return p;
13931
13932 case Tag_ABI_stack_align_preserved:
13933 val = read_uleb128 (p, &len, end);
13934 p += len;
13935 printf (" Tag_ABI_stack_align_preserved: ");
13936 switch (val)
13937 {
13938 case 0:
13939 printf (_("8-byte\n"));
13940 break;
13941 case 1:
13942 printf (_("16-byte\n"));
13943 break;
13944 default:
13945 printf ("??? (%d)\n", val);
13946 break;
13947 }
13948 return p;
13949
13950 case Tag_ABI_DSBT:
13951 val = read_uleb128 (p, &len, end);
13952 p += len;
13953 printf (" Tag_ABI_DSBT: ");
13954 switch (val)
13955 {
13956 case 0:
13957 printf (_("DSBT addressing not used\n"));
13958 break;
13959 case 1:
13960 printf (_("DSBT addressing used\n"));
13961 break;
13962 default:
13963 printf ("??? (%d)\n", val);
13964 break;
13965 }
13966 return p;
13967
13968 case Tag_ABI_PID:
13969 val = read_uleb128 (p, &len, end);
13970 p += len;
13971 printf (" Tag_ABI_PID: ");
13972 switch (val)
13973 {
13974 case 0:
13975 printf (_("Data addressing position-dependent\n"));
13976 break;
13977 case 1:
13978 printf (_("Data addressing position-independent, GOT near DP\n"));
13979 break;
13980 case 2:
13981 printf (_("Data addressing position-independent, GOT far from DP\n"));
13982 break;
13983 default:
13984 printf ("??? (%d)\n", val);
13985 break;
13986 }
13987 return p;
13988
13989 case Tag_ABI_PIC:
13990 val = read_uleb128 (p, &len, end);
13991 p += len;
13992 printf (" Tag_ABI_PIC: ");
13993 switch (val)
13994 {
13995 case 0:
13996 printf (_("Code addressing position-dependent\n"));
13997 break;
13998 case 1:
13999 printf (_("Code addressing position-independent\n"));
14000 break;
14001 default:
14002 printf ("??? (%d)\n", val);
14003 break;
14004 }
14005 return p;
14006
14007 case Tag_ABI_array_object_alignment:
14008 val = read_uleb128 (p, &len, end);
14009 p += len;
14010 printf (" Tag_ABI_array_object_alignment: ");
14011 switch (val)
14012 {
14013 case 0:
14014 printf (_("8-byte\n"));
14015 break;
14016 case 1:
14017 printf (_("4-byte\n"));
14018 break;
14019 case 2:
14020 printf (_("16-byte\n"));
14021 break;
14022 default:
14023 printf ("??? (%d)\n", val);
14024 break;
14025 }
14026 return p;
14027
14028 case Tag_ABI_array_object_align_expected:
14029 val = read_uleb128 (p, &len, end);
14030 p += len;
14031 printf (" Tag_ABI_array_object_align_expected: ");
14032 switch (val)
14033 {
14034 case 0:
14035 printf (_("8-byte\n"));
14036 break;
14037 case 1:
14038 printf (_("4-byte\n"));
14039 break;
14040 case 2:
14041 printf (_("16-byte\n"));
14042 break;
14043 default:
14044 printf ("??? (%d)\n", val);
14045 break;
14046 }
14047 return p;
14048
14049 case Tag_ABI_compatibility:
14050 {
14051 val = read_uleb128 (p, &len, end);
14052 p += len;
14053 printf (" Tag_ABI_compatibility: ");
14054 printf (_("flag = %d, vendor = "), val);
14055 if (p < end - 1)
14056 {
14057 size_t maxlen = (end - p) - 1;
14058
14059 print_symbol ((int) maxlen, (const char *) p);
14060 p += strnlen ((char *) p, maxlen) + 1;
14061 }
14062 else
14063 {
14064 printf (_("<corrupt>"));
14065 p = (unsigned char *) end;
14066 }
14067 putchar ('\n');
14068 return p;
14069 }
14070
14071 case Tag_ABI_conformance:
14072 {
14073 printf (" Tag_ABI_conformance: \"");
14074 if (p < end - 1)
14075 {
14076 size_t maxlen = (end - p) - 1;
14077
14078 print_symbol ((int) maxlen, (const char *) p);
14079 p += strnlen ((char *) p, maxlen) + 1;
14080 }
14081 else
14082 {
14083 printf (_("<corrupt>"));
14084 p = (unsigned char *) end;
14085 }
14086 printf ("\"\n");
14087 return p;
14088 }
14089 }
14090
14091 return display_tag_value (tag, p, end);
14092 }
14093
14094 static void
14095 display_raw_attribute (unsigned char * p, unsigned char * end)
14096 {
14097 unsigned long addr = 0;
14098 size_t bytes = end - p;
14099
14100 assert (end > p);
14101 while (bytes)
14102 {
14103 int j;
14104 int k;
14105 int lbytes = (bytes > 16 ? 16 : bytes);
14106
14107 printf (" 0x%8.8lx ", addr);
14108
14109 for (j = 0; j < 16; j++)
14110 {
14111 if (j < lbytes)
14112 printf ("%2.2x", p[j]);
14113 else
14114 printf (" ");
14115
14116 if ((j & 3) == 3)
14117 printf (" ");
14118 }
14119
14120 for (j = 0; j < lbytes; j++)
14121 {
14122 k = p[j];
14123 if (k >= ' ' && k < 0x7f)
14124 printf ("%c", k);
14125 else
14126 printf (".");
14127 }
14128
14129 putchar ('\n');
14130
14131 p += lbytes;
14132 bytes -= lbytes;
14133 addr += lbytes;
14134 }
14135
14136 putchar ('\n');
14137 }
14138
14139 static unsigned char *
14140 display_msp430x_attribute (unsigned char * p,
14141 const unsigned char * const end)
14142 {
14143 unsigned int len;
14144 int val;
14145 int tag;
14146
14147 tag = read_uleb128 (p, & len, end);
14148 p += len;
14149
14150 switch (tag)
14151 {
14152 case OFBA_MSPABI_Tag_ISA:
14153 val = read_uleb128 (p, &len, end);
14154 p += len;
14155 printf (" Tag_ISA: ");
14156 switch (val)
14157 {
14158 case 0: printf (_("None\n")); break;
14159 case 1: printf (_("MSP430\n")); break;
14160 case 2: printf (_("MSP430X\n")); break;
14161 default: printf ("??? (%d)\n", val); break;
14162 }
14163 break;
14164
14165 case OFBA_MSPABI_Tag_Code_Model:
14166 val = read_uleb128 (p, &len, end);
14167 p += len;
14168 printf (" Tag_Code_Model: ");
14169 switch (val)
14170 {
14171 case 0: printf (_("None\n")); break;
14172 case 1: printf (_("Small\n")); break;
14173 case 2: printf (_("Large\n")); break;
14174 default: printf ("??? (%d)\n", val); break;
14175 }
14176 break;
14177
14178 case OFBA_MSPABI_Tag_Data_Model:
14179 val = read_uleb128 (p, &len, end);
14180 p += len;
14181 printf (" Tag_Data_Model: ");
14182 switch (val)
14183 {
14184 case 0: printf (_("None\n")); break;
14185 case 1: printf (_("Small\n")); break;
14186 case 2: printf (_("Large\n")); break;
14187 case 3: printf (_("Restricted Large\n")); break;
14188 default: printf ("??? (%d)\n", val); break;
14189 }
14190 break;
14191
14192 default:
14193 printf (_(" <unknown tag %d>: "), tag);
14194
14195 if (tag & 1)
14196 {
14197 putchar ('"');
14198 if (p < end - 1)
14199 {
14200 size_t maxlen = (end - p) - 1;
14201
14202 print_symbol ((int) maxlen, (const char *) p);
14203 p += strnlen ((char *) p, maxlen) + 1;
14204 }
14205 else
14206 {
14207 printf (_("<corrupt>"));
14208 p = (unsigned char *) end;
14209 }
14210 printf ("\"\n");
14211 }
14212 else
14213 {
14214 val = read_uleb128 (p, &len, end);
14215 p += len;
14216 printf ("%d (0x%x)\n", val, val);
14217 }
14218 break;
14219 }
14220
14221 assert (p <= end);
14222 return p;
14223 }
14224
14225 static int
14226 process_attributes (FILE * file,
14227 const char * public_name,
14228 unsigned int proc_type,
14229 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14230 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14231 {
14232 Elf_Internal_Shdr * sect;
14233 unsigned i;
14234
14235 /* Find the section header so that we get the size. */
14236 for (i = 0, sect = section_headers;
14237 i < elf_header.e_shnum;
14238 i++, sect++)
14239 {
14240 unsigned char * contents;
14241 unsigned char * p;
14242
14243 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14244 continue;
14245
14246 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14247 sect->sh_size, _("attributes"));
14248 if (contents == NULL)
14249 continue;
14250
14251 p = contents;
14252 if (*p == 'A')
14253 {
14254 bfd_vma section_len;
14255
14256 section_len = sect->sh_size - 1;
14257 p++;
14258
14259 while (section_len > 0)
14260 {
14261 bfd_vma attr_len;
14262 unsigned int namelen;
14263 bfd_boolean public_section;
14264 bfd_boolean gnu_section;
14265
14266 if (section_len <= 4)
14267 {
14268 error (_("Tag section ends prematurely\n"));
14269 break;
14270 }
14271 attr_len = byte_get (p, 4);
14272 p += 4;
14273
14274 if (attr_len > section_len)
14275 {
14276 error (_("Bad attribute length (%u > %u)\n"),
14277 (unsigned) attr_len, (unsigned) section_len);
14278 attr_len = section_len;
14279 }
14280 /* PR 17531: file: 001-101425-0.004 */
14281 else if (attr_len < 5)
14282 {
14283 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14284 break;
14285 }
14286
14287 section_len -= attr_len;
14288 attr_len -= 4;
14289
14290 namelen = strnlen ((char *) p, attr_len) + 1;
14291 if (namelen == 0 || namelen >= attr_len)
14292 {
14293 error (_("Corrupt attribute section name\n"));
14294 break;
14295 }
14296
14297 printf (_("Attribute Section: "));
14298 print_symbol (INT_MAX, (const char *) p);
14299 putchar ('\n');
14300
14301 if (public_name && streq ((char *) p, public_name))
14302 public_section = TRUE;
14303 else
14304 public_section = FALSE;
14305
14306 if (streq ((char *) p, "gnu"))
14307 gnu_section = TRUE;
14308 else
14309 gnu_section = FALSE;
14310
14311 p += namelen;
14312 attr_len -= namelen;
14313
14314 while (attr_len > 0 && p < contents + sect->sh_size)
14315 {
14316 int tag;
14317 int val;
14318 bfd_vma size;
14319 unsigned char * end;
14320
14321 /* PR binutils/17531: Safe handling of corrupt files. */
14322 if (attr_len < 6)
14323 {
14324 error (_("Unused bytes at end of section\n"));
14325 section_len = 0;
14326 break;
14327 }
14328
14329 tag = *(p++);
14330 size = byte_get (p, 4);
14331 if (size > attr_len)
14332 {
14333 error (_("Bad subsection length (%u > %u)\n"),
14334 (unsigned) size, (unsigned) attr_len);
14335 size = attr_len;
14336 }
14337 /* PR binutils/17531: Safe handling of corrupt files. */
14338 if (size < 6)
14339 {
14340 error (_("Bad subsection length (%u < 6)\n"),
14341 (unsigned) size);
14342 section_len = 0;
14343 break;
14344 }
14345
14346 attr_len -= size;
14347 end = p + size - 1;
14348 assert (end <= contents + sect->sh_size);
14349 p += 4;
14350
14351 switch (tag)
14352 {
14353 case 1:
14354 printf (_("File Attributes\n"));
14355 break;
14356 case 2:
14357 printf (_("Section Attributes:"));
14358 goto do_numlist;
14359 case 3:
14360 printf (_("Symbol Attributes:"));
14361 /* Fall through. */
14362 do_numlist:
14363 for (;;)
14364 {
14365 unsigned int j;
14366
14367 val = read_uleb128 (p, &j, end);
14368 p += j;
14369 if (val == 0)
14370 break;
14371 printf (" %d", val);
14372 }
14373 printf ("\n");
14374 break;
14375 default:
14376 printf (_("Unknown tag: %d\n"), tag);
14377 public_section = FALSE;
14378 break;
14379 }
14380
14381 if (public_section && display_pub_attribute != NULL)
14382 {
14383 while (p < end)
14384 p = display_pub_attribute (p, end);
14385 assert (p <= end);
14386 }
14387 else if (gnu_section && display_proc_gnu_attribute != NULL)
14388 {
14389 while (p < end)
14390 p = display_gnu_attribute (p,
14391 display_proc_gnu_attribute,
14392 end);
14393 assert (p <= end);
14394 }
14395 else if (p < end)
14396 {
14397 printf (_(" Unknown attribute:\n"));
14398 display_raw_attribute (p, end);
14399 p = end;
14400 }
14401 else
14402 attr_len = 0;
14403 }
14404 }
14405 }
14406 else
14407 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14408
14409 free (contents);
14410 }
14411 return 1;
14412 }
14413
14414 static int
14415 process_arm_specific (FILE * file)
14416 {
14417 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14418 display_arm_attribute, NULL);
14419 }
14420
14421 static int
14422 process_power_specific (FILE * file)
14423 {
14424 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14425 display_power_gnu_attribute);
14426 }
14427
14428 static int
14429 process_s390_specific (FILE * file)
14430 {
14431 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14432 display_s390_gnu_attribute);
14433 }
14434
14435 static int
14436 process_sparc_specific (FILE * file)
14437 {
14438 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14439 display_sparc_gnu_attribute);
14440 }
14441
14442 static int
14443 process_tic6x_specific (FILE * file)
14444 {
14445 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14446 display_tic6x_attribute, NULL);
14447 }
14448
14449 static int
14450 process_msp430x_specific (FILE * file)
14451 {
14452 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14453 display_msp430x_attribute, NULL);
14454 }
14455
14456 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14457 Print the Address, Access and Initial fields of an entry at VMA ADDR
14458 and return the VMA of the next entry, or -1 if there was a problem.
14459 Does not read from DATA_END or beyond. */
14460
14461 static bfd_vma
14462 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14463 unsigned char * data_end)
14464 {
14465 printf (" ");
14466 print_vma (addr, LONG_HEX);
14467 printf (" ");
14468 if (addr < pltgot + 0xfff0)
14469 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14470 else
14471 printf ("%10s", "");
14472 printf (" ");
14473 if (data == NULL)
14474 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14475 else
14476 {
14477 bfd_vma entry;
14478 unsigned char * from = data + addr - pltgot;
14479
14480 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14481 {
14482 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14483 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14484 return (bfd_vma) -1;
14485 }
14486 else
14487 {
14488 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14489 print_vma (entry, LONG_HEX);
14490 }
14491 }
14492 return addr + (is_32bit_elf ? 4 : 8);
14493 }
14494
14495 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14496 PLTGOT. Print the Address and Initial fields of an entry at VMA
14497 ADDR and return the VMA of the next entry. */
14498
14499 static bfd_vma
14500 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14501 {
14502 printf (" ");
14503 print_vma (addr, LONG_HEX);
14504 printf (" ");
14505 if (data == NULL)
14506 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14507 else
14508 {
14509 bfd_vma entry;
14510
14511 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14512 print_vma (entry, LONG_HEX);
14513 }
14514 return addr + (is_32bit_elf ? 4 : 8);
14515 }
14516
14517 static void
14518 print_mips_ases (unsigned int mask)
14519 {
14520 if (mask & AFL_ASE_DSP)
14521 fputs ("\n\tDSP ASE", stdout);
14522 if (mask & AFL_ASE_DSPR2)
14523 fputs ("\n\tDSP R2 ASE", stdout);
14524 if (mask & AFL_ASE_DSPR3)
14525 fputs ("\n\tDSP R3 ASE", stdout);
14526 if (mask & AFL_ASE_EVA)
14527 fputs ("\n\tEnhanced VA Scheme", stdout);
14528 if (mask & AFL_ASE_MCU)
14529 fputs ("\n\tMCU (MicroController) ASE", stdout);
14530 if (mask & AFL_ASE_MDMX)
14531 fputs ("\n\tMDMX ASE", stdout);
14532 if (mask & AFL_ASE_MIPS3D)
14533 fputs ("\n\tMIPS-3D ASE", stdout);
14534 if (mask & AFL_ASE_MT)
14535 fputs ("\n\tMT ASE", stdout);
14536 if (mask & AFL_ASE_SMARTMIPS)
14537 fputs ("\n\tSmartMIPS ASE", stdout);
14538 if (mask & AFL_ASE_VIRT)
14539 fputs ("\n\tVZ ASE", stdout);
14540 if (mask & AFL_ASE_MSA)
14541 fputs ("\n\tMSA ASE", stdout);
14542 if (mask & AFL_ASE_MIPS16)
14543 fputs ("\n\tMIPS16 ASE", stdout);
14544 if (mask & AFL_ASE_MICROMIPS)
14545 fputs ("\n\tMICROMIPS ASE", stdout);
14546 if (mask & AFL_ASE_XPA)
14547 fputs ("\n\tXPA ASE", stdout);
14548 if (mask == 0)
14549 fprintf (stdout, "\n\t%s", _("None"));
14550 else if ((mask & ~AFL_ASE_MASK) != 0)
14551 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14552 }
14553
14554 static void
14555 print_mips_isa_ext (unsigned int isa_ext)
14556 {
14557 switch (isa_ext)
14558 {
14559 case 0:
14560 fputs (_("None"), stdout);
14561 break;
14562 case AFL_EXT_XLR:
14563 fputs ("RMI XLR", stdout);
14564 break;
14565 case AFL_EXT_OCTEON3:
14566 fputs ("Cavium Networks Octeon3", stdout);
14567 break;
14568 case AFL_EXT_OCTEON2:
14569 fputs ("Cavium Networks Octeon2", stdout);
14570 break;
14571 case AFL_EXT_OCTEONP:
14572 fputs ("Cavium Networks OcteonP", stdout);
14573 break;
14574 case AFL_EXT_LOONGSON_3A:
14575 fputs ("Loongson 3A", stdout);
14576 break;
14577 case AFL_EXT_OCTEON:
14578 fputs ("Cavium Networks Octeon", stdout);
14579 break;
14580 case AFL_EXT_5900:
14581 fputs ("Toshiba R5900", stdout);
14582 break;
14583 case AFL_EXT_4650:
14584 fputs ("MIPS R4650", stdout);
14585 break;
14586 case AFL_EXT_4010:
14587 fputs ("LSI R4010", stdout);
14588 break;
14589 case AFL_EXT_4100:
14590 fputs ("NEC VR4100", stdout);
14591 break;
14592 case AFL_EXT_3900:
14593 fputs ("Toshiba R3900", stdout);
14594 break;
14595 case AFL_EXT_10000:
14596 fputs ("MIPS R10000", stdout);
14597 break;
14598 case AFL_EXT_SB1:
14599 fputs ("Broadcom SB-1", stdout);
14600 break;
14601 case AFL_EXT_4111:
14602 fputs ("NEC VR4111/VR4181", stdout);
14603 break;
14604 case AFL_EXT_4120:
14605 fputs ("NEC VR4120", stdout);
14606 break;
14607 case AFL_EXT_5400:
14608 fputs ("NEC VR5400", stdout);
14609 break;
14610 case AFL_EXT_5500:
14611 fputs ("NEC VR5500", stdout);
14612 break;
14613 case AFL_EXT_LOONGSON_2E:
14614 fputs ("ST Microelectronics Loongson 2E", stdout);
14615 break;
14616 case AFL_EXT_LOONGSON_2F:
14617 fputs ("ST Microelectronics Loongson 2F", stdout);
14618 break;
14619 default:
14620 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14621 }
14622 }
14623
14624 static int
14625 get_mips_reg_size (int reg_size)
14626 {
14627 return (reg_size == AFL_REG_NONE) ? 0
14628 : (reg_size == AFL_REG_32) ? 32
14629 : (reg_size == AFL_REG_64) ? 64
14630 : (reg_size == AFL_REG_128) ? 128
14631 : -1;
14632 }
14633
14634 static int
14635 process_mips_specific (FILE * file)
14636 {
14637 Elf_Internal_Dyn * entry;
14638 Elf_Internal_Shdr *sect = NULL;
14639 size_t liblist_offset = 0;
14640 size_t liblistno = 0;
14641 size_t conflictsno = 0;
14642 size_t options_offset = 0;
14643 size_t conflicts_offset = 0;
14644 size_t pltrelsz = 0;
14645 size_t pltrel = 0;
14646 bfd_vma pltgot = 0;
14647 bfd_vma mips_pltgot = 0;
14648 bfd_vma jmprel = 0;
14649 bfd_vma local_gotno = 0;
14650 bfd_vma gotsym = 0;
14651 bfd_vma symtabno = 0;
14652
14653 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14654 display_mips_gnu_attribute);
14655
14656 sect = find_section (".MIPS.abiflags");
14657
14658 if (sect != NULL)
14659 {
14660 Elf_External_ABIFlags_v0 *abiflags_ext;
14661 Elf_Internal_ABIFlags_v0 abiflags_in;
14662
14663 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14664 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14665 else
14666 {
14667 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14668 sect->sh_size, _("MIPS ABI Flags section"));
14669 if (abiflags_ext)
14670 {
14671 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14672 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14673 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14674 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14675 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14676 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14677 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14678 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14679 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14680 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14681 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14682
14683 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14684 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14685 if (abiflags_in.isa_rev > 1)
14686 printf ("r%d", abiflags_in.isa_rev);
14687 printf ("\nGPR size: %d",
14688 get_mips_reg_size (abiflags_in.gpr_size));
14689 printf ("\nCPR1 size: %d",
14690 get_mips_reg_size (abiflags_in.cpr1_size));
14691 printf ("\nCPR2 size: %d",
14692 get_mips_reg_size (abiflags_in.cpr2_size));
14693 fputs ("\nFP ABI: ", stdout);
14694 print_mips_fp_abi_value (abiflags_in.fp_abi);
14695 fputs ("ISA Extension: ", stdout);
14696 print_mips_isa_ext (abiflags_in.isa_ext);
14697 fputs ("\nASEs:", stdout);
14698 print_mips_ases (abiflags_in.ases);
14699 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14700 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14701 fputc ('\n', stdout);
14702 free (abiflags_ext);
14703 }
14704 }
14705 }
14706
14707 /* We have a lot of special sections. Thanks SGI! */
14708 if (dynamic_section == NULL)
14709 /* No information available. */
14710 return 0;
14711
14712 for (entry = dynamic_section;
14713 /* PR 17531 file: 012-50589-0.004. */
14714 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14715 ++entry)
14716 switch (entry->d_tag)
14717 {
14718 case DT_MIPS_LIBLIST:
14719 liblist_offset
14720 = offset_from_vma (file, entry->d_un.d_val,
14721 liblistno * sizeof (Elf32_External_Lib));
14722 break;
14723 case DT_MIPS_LIBLISTNO:
14724 liblistno = entry->d_un.d_val;
14725 break;
14726 case DT_MIPS_OPTIONS:
14727 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14728 break;
14729 case DT_MIPS_CONFLICT:
14730 conflicts_offset
14731 = offset_from_vma (file, entry->d_un.d_val,
14732 conflictsno * sizeof (Elf32_External_Conflict));
14733 break;
14734 case DT_MIPS_CONFLICTNO:
14735 conflictsno = entry->d_un.d_val;
14736 break;
14737 case DT_PLTGOT:
14738 pltgot = entry->d_un.d_ptr;
14739 break;
14740 case DT_MIPS_LOCAL_GOTNO:
14741 local_gotno = entry->d_un.d_val;
14742 break;
14743 case DT_MIPS_GOTSYM:
14744 gotsym = entry->d_un.d_val;
14745 break;
14746 case DT_MIPS_SYMTABNO:
14747 symtabno = entry->d_un.d_val;
14748 break;
14749 case DT_MIPS_PLTGOT:
14750 mips_pltgot = entry->d_un.d_ptr;
14751 break;
14752 case DT_PLTREL:
14753 pltrel = entry->d_un.d_val;
14754 break;
14755 case DT_PLTRELSZ:
14756 pltrelsz = entry->d_un.d_val;
14757 break;
14758 case DT_JMPREL:
14759 jmprel = entry->d_un.d_ptr;
14760 break;
14761 default:
14762 break;
14763 }
14764
14765 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14766 {
14767 Elf32_External_Lib * elib;
14768 size_t cnt;
14769
14770 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14771 liblistno,
14772 sizeof (Elf32_External_Lib),
14773 _("liblist section data"));
14774 if (elib)
14775 {
14776 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14777 (unsigned long) liblistno);
14778 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14779 stdout);
14780
14781 for (cnt = 0; cnt < liblistno; ++cnt)
14782 {
14783 Elf32_Lib liblist;
14784 time_t atime;
14785 char timebuf[128];
14786 struct tm * tmp;
14787
14788 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14789 atime = BYTE_GET (elib[cnt].l_time_stamp);
14790 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14791 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14792 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14793
14794 tmp = gmtime (&atime);
14795 snprintf (timebuf, sizeof (timebuf),
14796 "%04u-%02u-%02uT%02u:%02u:%02u",
14797 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14798 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14799
14800 printf ("%3lu: ", (unsigned long) cnt);
14801 if (VALID_DYNAMIC_NAME (liblist.l_name))
14802 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14803 else
14804 printf (_("<corrupt: %9ld>"), liblist.l_name);
14805 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14806 liblist.l_version);
14807
14808 if (liblist.l_flags == 0)
14809 puts (_(" NONE"));
14810 else
14811 {
14812 static const struct
14813 {
14814 const char * name;
14815 int bit;
14816 }
14817 l_flags_vals[] =
14818 {
14819 { " EXACT_MATCH", LL_EXACT_MATCH },
14820 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14821 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14822 { " EXPORTS", LL_EXPORTS },
14823 { " DELAY_LOAD", LL_DELAY_LOAD },
14824 { " DELTA", LL_DELTA }
14825 };
14826 int flags = liblist.l_flags;
14827 size_t fcnt;
14828
14829 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14830 if ((flags & l_flags_vals[fcnt].bit) != 0)
14831 {
14832 fputs (l_flags_vals[fcnt].name, stdout);
14833 flags ^= l_flags_vals[fcnt].bit;
14834 }
14835 if (flags != 0)
14836 printf (" %#x", (unsigned int) flags);
14837
14838 puts ("");
14839 }
14840 }
14841
14842 free (elib);
14843 }
14844 }
14845
14846 if (options_offset != 0)
14847 {
14848 Elf_External_Options * eopt;
14849 Elf_Internal_Options * iopt;
14850 Elf_Internal_Options * option;
14851 size_t offset;
14852 int cnt;
14853 sect = section_headers;
14854
14855 /* Find the section header so that we get the size. */
14856 sect = find_section_by_type (SHT_MIPS_OPTIONS);
14857 /* PR 17533 file: 012-277276-0.004. */
14858 if (sect == NULL)
14859 {
14860 error (_("No MIPS_OPTIONS header found\n"));
14861 return 0;
14862 }
14863
14864 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14865 sect->sh_size, _("options"));
14866 if (eopt)
14867 {
14868 iopt = (Elf_Internal_Options *)
14869 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14870 if (iopt == NULL)
14871 {
14872 error (_("Out of memory allocating space for MIPS options\n"));
14873 return 0;
14874 }
14875
14876 offset = cnt = 0;
14877 option = iopt;
14878
14879 while (offset <= sect->sh_size - sizeof (* eopt))
14880 {
14881 Elf_External_Options * eoption;
14882
14883 eoption = (Elf_External_Options *) ((char *) eopt + offset);
14884
14885 option->kind = BYTE_GET (eoption->kind);
14886 option->size = BYTE_GET (eoption->size);
14887 option->section = BYTE_GET (eoption->section);
14888 option->info = BYTE_GET (eoption->info);
14889
14890 /* PR 17531: file: ffa0fa3b. */
14891 if (option->size < sizeof (* eopt)
14892 || offset + option->size > sect->sh_size)
14893 {
14894 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14895 return 0;
14896 }
14897 offset += option->size;
14898
14899 ++option;
14900 ++cnt;
14901 }
14902
14903 printf (_("\nSection '%s' contains %d entries:\n"),
14904 printable_section_name (sect), cnt);
14905
14906 option = iopt;
14907 offset = 0;
14908
14909 while (cnt-- > 0)
14910 {
14911 size_t len;
14912
14913 switch (option->kind)
14914 {
14915 case ODK_NULL:
14916 /* This shouldn't happen. */
14917 printf (" NULL %d %lx", option->section, option->info);
14918 break;
14919 case ODK_REGINFO:
14920 printf (" REGINFO ");
14921 if (elf_header.e_machine == EM_MIPS)
14922 {
14923 /* 32bit form. */
14924 Elf32_External_RegInfo * ereg;
14925 Elf32_RegInfo reginfo;
14926
14927 ereg = (Elf32_External_RegInfo *) (option + 1);
14928 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14929 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14930 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14931 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14932 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14933 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14934
14935 printf ("GPR %08lx GP 0x%lx\n",
14936 reginfo.ri_gprmask,
14937 (unsigned long) reginfo.ri_gp_value);
14938 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14939 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14940 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14941 }
14942 else
14943 {
14944 /* 64 bit form. */
14945 Elf64_External_RegInfo * ereg;
14946 Elf64_Internal_RegInfo reginfo;
14947
14948 ereg = (Elf64_External_RegInfo *) (option + 1);
14949 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14950 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14951 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14952 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14953 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14954 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14955
14956 printf ("GPR %08lx GP 0x",
14957 reginfo.ri_gprmask);
14958 printf_vma (reginfo.ri_gp_value);
14959 printf ("\n");
14960
14961 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14962 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14963 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14964 }
14965 ++option;
14966 continue;
14967 case ODK_EXCEPTIONS:
14968 fputs (" EXCEPTIONS fpe_min(", stdout);
14969 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14970 fputs (") fpe_max(", stdout);
14971 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14972 fputs (")", stdout);
14973
14974 if (option->info & OEX_PAGE0)
14975 fputs (" PAGE0", stdout);
14976 if (option->info & OEX_SMM)
14977 fputs (" SMM", stdout);
14978 if (option->info & OEX_FPDBUG)
14979 fputs (" FPDBUG", stdout);
14980 if (option->info & OEX_DISMISS)
14981 fputs (" DISMISS", stdout);
14982 break;
14983 case ODK_PAD:
14984 fputs (" PAD ", stdout);
14985 if (option->info & OPAD_PREFIX)
14986 fputs (" PREFIX", stdout);
14987 if (option->info & OPAD_POSTFIX)
14988 fputs (" POSTFIX", stdout);
14989 if (option->info & OPAD_SYMBOL)
14990 fputs (" SYMBOL", stdout);
14991 break;
14992 case ODK_HWPATCH:
14993 fputs (" HWPATCH ", stdout);
14994 if (option->info & OHW_R4KEOP)
14995 fputs (" R4KEOP", stdout);
14996 if (option->info & OHW_R8KPFETCH)
14997 fputs (" R8KPFETCH", stdout);
14998 if (option->info & OHW_R5KEOP)
14999 fputs (" R5KEOP", stdout);
15000 if (option->info & OHW_R5KCVTL)
15001 fputs (" R5KCVTL", stdout);
15002 break;
15003 case ODK_FILL:
15004 fputs (" FILL ", stdout);
15005 /* XXX Print content of info word? */
15006 break;
15007 case ODK_TAGS:
15008 fputs (" TAGS ", stdout);
15009 /* XXX Print content of info word? */
15010 break;
15011 case ODK_HWAND:
15012 fputs (" HWAND ", stdout);
15013 if (option->info & OHWA0_R4KEOP_CHECKED)
15014 fputs (" R4KEOP_CHECKED", stdout);
15015 if (option->info & OHWA0_R4KEOP_CLEAN)
15016 fputs (" R4KEOP_CLEAN", stdout);
15017 break;
15018 case ODK_HWOR:
15019 fputs (" HWOR ", stdout);
15020 if (option->info & OHWA0_R4KEOP_CHECKED)
15021 fputs (" R4KEOP_CHECKED", stdout);
15022 if (option->info & OHWA0_R4KEOP_CLEAN)
15023 fputs (" R4KEOP_CLEAN", stdout);
15024 break;
15025 case ODK_GP_GROUP:
15026 printf (" GP_GROUP %#06lx self-contained %#06lx",
15027 option->info & OGP_GROUP,
15028 (option->info & OGP_SELF) >> 16);
15029 break;
15030 case ODK_IDENT:
15031 printf (" IDENT %#06lx self-contained %#06lx",
15032 option->info & OGP_GROUP,
15033 (option->info & OGP_SELF) >> 16);
15034 break;
15035 default:
15036 /* This shouldn't happen. */
15037 printf (" %3d ??? %d %lx",
15038 option->kind, option->section, option->info);
15039 break;
15040 }
15041
15042 len = sizeof (* eopt);
15043 while (len < option->size)
15044 {
15045 unsigned char datum = * ((unsigned char *) eopt + offset + len);
15046
15047 if (ISPRINT (datum))
15048 printf ("%c", datum);
15049 else
15050 printf ("\\%03o", datum);
15051 len ++;
15052 }
15053 fputs ("\n", stdout);
15054
15055 offset += option->size;
15056 ++option;
15057 }
15058
15059 free (eopt);
15060 }
15061 }
15062
15063 if (conflicts_offset != 0 && conflictsno != 0)
15064 {
15065 Elf32_Conflict * iconf;
15066 size_t cnt;
15067
15068 if (dynamic_symbols == NULL)
15069 {
15070 error (_("conflict list found without a dynamic symbol table\n"));
15071 return 0;
15072 }
15073
15074 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
15075 if (iconf == NULL)
15076 {
15077 error (_("Out of memory allocating space for dynamic conflicts\n"));
15078 return 0;
15079 }
15080
15081 if (is_32bit_elf)
15082 {
15083 Elf32_External_Conflict * econf32;
15084
15085 econf32 = (Elf32_External_Conflict *)
15086 get_data (NULL, file, conflicts_offset, conflictsno,
15087 sizeof (* econf32), _("conflict"));
15088 if (!econf32)
15089 return 0;
15090
15091 for (cnt = 0; cnt < conflictsno; ++cnt)
15092 iconf[cnt] = BYTE_GET (econf32[cnt]);
15093
15094 free (econf32);
15095 }
15096 else
15097 {
15098 Elf64_External_Conflict * econf64;
15099
15100 econf64 = (Elf64_External_Conflict *)
15101 get_data (NULL, file, conflicts_offset, conflictsno,
15102 sizeof (* econf64), _("conflict"));
15103 if (!econf64)
15104 return 0;
15105
15106 for (cnt = 0; cnt < conflictsno; ++cnt)
15107 iconf[cnt] = BYTE_GET (econf64[cnt]);
15108
15109 free (econf64);
15110 }
15111
15112 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15113 (unsigned long) conflictsno);
15114 puts (_(" Num: Index Value Name"));
15115
15116 for (cnt = 0; cnt < conflictsno; ++cnt)
15117 {
15118 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
15119
15120 if (iconf[cnt] >= num_dynamic_syms)
15121 printf (_("<corrupt symbol index>"));
15122 else
15123 {
15124 Elf_Internal_Sym * psym;
15125
15126 psym = & dynamic_symbols[iconf[cnt]];
15127 print_vma (psym->st_value, FULL_HEX);
15128 putchar (' ');
15129 if (VALID_DYNAMIC_NAME (psym->st_name))
15130 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15131 else
15132 printf (_("<corrupt: %14ld>"), psym->st_name);
15133 }
15134 putchar ('\n');
15135 }
15136
15137 free (iconf);
15138 }
15139
15140 if (pltgot != 0 && local_gotno != 0)
15141 {
15142 bfd_vma ent, local_end, global_end;
15143 size_t i, offset;
15144 unsigned char * data;
15145 unsigned char * data_end;
15146 int addr_size;
15147
15148 ent = pltgot;
15149 addr_size = (is_32bit_elf ? 4 : 8);
15150 local_end = pltgot + local_gotno * addr_size;
15151
15152 /* PR binutils/17533 file: 012-111227-0.004 */
15153 if (symtabno < gotsym)
15154 {
15155 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15156 (unsigned long) gotsym, (unsigned long) symtabno);
15157 return 0;
15158 }
15159
15160 global_end = local_end + (symtabno - gotsym) * addr_size;
15161 /* PR 17531: file: 54c91a34. */
15162 if (global_end < local_end)
15163 {
15164 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15165 return 0;
15166 }
15167
15168 offset = offset_from_vma (file, pltgot, global_end - pltgot);
15169 data = (unsigned char *) get_data (NULL, file, offset,
15170 global_end - pltgot, 1,
15171 _("Global Offset Table data"));
15172 if (data == NULL)
15173 return 0;
15174 data_end = data + (global_end - pltgot);
15175
15176 printf (_("\nPrimary GOT:\n"));
15177 printf (_(" Canonical gp value: "));
15178 print_vma (pltgot + 0x7ff0, LONG_HEX);
15179 printf ("\n\n");
15180
15181 printf (_(" Reserved entries:\n"));
15182 printf (_(" %*s %10s %*s Purpose\n"),
15183 addr_size * 2, _("Address"), _("Access"),
15184 addr_size * 2, _("Initial"));
15185 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15186 printf (_(" Lazy resolver\n"));
15187 if (ent == (bfd_vma) -1)
15188 goto got_print_fail;
15189 if (data
15190 && (byte_get (data + ent - pltgot, addr_size)
15191 >> (addr_size * 8 - 1)) != 0)
15192 {
15193 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15194 printf (_(" Module pointer (GNU extension)\n"));
15195 if (ent == (bfd_vma) -1)
15196 goto got_print_fail;
15197 }
15198 printf ("\n");
15199
15200 if (ent < local_end)
15201 {
15202 printf (_(" Local entries:\n"));
15203 printf (" %*s %10s %*s\n",
15204 addr_size * 2, _("Address"), _("Access"),
15205 addr_size * 2, _("Initial"));
15206 while (ent < local_end)
15207 {
15208 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15209 printf ("\n");
15210 if (ent == (bfd_vma) -1)
15211 goto got_print_fail;
15212 }
15213 printf ("\n");
15214 }
15215
15216 if (gotsym < symtabno)
15217 {
15218 int sym_width;
15219
15220 printf (_(" Global entries:\n"));
15221 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
15222 addr_size * 2, _("Address"),
15223 _("Access"),
15224 addr_size * 2, _("Initial"),
15225 addr_size * 2, _("Sym.Val."),
15226 _("Type"),
15227 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15228 _("Ndx"), _("Name"));
15229
15230 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15231
15232 for (i = gotsym; i < symtabno; i++)
15233 {
15234 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15235 printf (" ");
15236
15237 if (dynamic_symbols == NULL)
15238 printf (_("<no dynamic symbols>"));
15239 else if (i < num_dynamic_syms)
15240 {
15241 Elf_Internal_Sym * psym = dynamic_symbols + i;
15242
15243 print_vma (psym->st_value, LONG_HEX);
15244 printf (" %-7s %3s ",
15245 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15246 get_symbol_index_type (psym->st_shndx));
15247
15248 if (VALID_DYNAMIC_NAME (psym->st_name))
15249 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15250 else
15251 printf (_("<corrupt: %14ld>"), psym->st_name);
15252 }
15253 else
15254 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15255 (unsigned long) i);
15256
15257 printf ("\n");
15258 if (ent == (bfd_vma) -1)
15259 break;
15260 }
15261 printf ("\n");
15262 }
15263
15264 got_print_fail:
15265 if (data)
15266 free (data);
15267 }
15268
15269 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15270 {
15271 bfd_vma ent, end;
15272 size_t offset, rel_offset;
15273 unsigned long count, i;
15274 unsigned char * data;
15275 int addr_size, sym_width;
15276 Elf_Internal_Rela * rels;
15277
15278 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15279 if (pltrel == DT_RELA)
15280 {
15281 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15282 return 0;
15283 }
15284 else
15285 {
15286 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15287 return 0;
15288 }
15289
15290 ent = mips_pltgot;
15291 addr_size = (is_32bit_elf ? 4 : 8);
15292 end = mips_pltgot + (2 + count) * addr_size;
15293
15294 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15295 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15296 1, _("Procedure Linkage Table data"));
15297 if (data == NULL)
15298 return 0;
15299
15300 printf ("\nPLT GOT:\n\n");
15301 printf (_(" Reserved entries:\n"));
15302 printf (_(" %*s %*s Purpose\n"),
15303 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15304 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15305 printf (_(" PLT lazy resolver\n"));
15306 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15307 printf (_(" Module pointer\n"));
15308 printf ("\n");
15309
15310 printf (_(" Entries:\n"));
15311 printf (" %*s %*s %*s %-7s %3s %s\n",
15312 addr_size * 2, _("Address"),
15313 addr_size * 2, _("Initial"),
15314 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15315 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15316 for (i = 0; i < count; i++)
15317 {
15318 unsigned long idx = get_reloc_symindex (rels[i].r_info);
15319
15320 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15321 printf (" ");
15322
15323 if (idx >= num_dynamic_syms)
15324 printf (_("<corrupt symbol index: %lu>"), idx);
15325 else
15326 {
15327 Elf_Internal_Sym * psym = dynamic_symbols + idx;
15328
15329 print_vma (psym->st_value, LONG_HEX);
15330 printf (" %-7s %3s ",
15331 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15332 get_symbol_index_type (psym->st_shndx));
15333 if (VALID_DYNAMIC_NAME (psym->st_name))
15334 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15335 else
15336 printf (_("<corrupt: %14ld>"), psym->st_name);
15337 }
15338 printf ("\n");
15339 }
15340 printf ("\n");
15341
15342 if (data)
15343 free (data);
15344 free (rels);
15345 }
15346
15347 return 1;
15348 }
15349
15350 static int
15351 process_nds32_specific (FILE * file)
15352 {
15353 Elf_Internal_Shdr *sect = NULL;
15354
15355 sect = find_section (".nds32_e_flags");
15356 if (sect != NULL)
15357 {
15358 unsigned int *flag;
15359
15360 printf ("\nNDS32 elf flags section:\n");
15361 flag = get_data (NULL, file, sect->sh_offset, 1,
15362 sect->sh_size, _("NDS32 elf flags section"));
15363
15364 switch ((*flag) & 0x3)
15365 {
15366 case 0:
15367 printf ("(VEC_SIZE):\tNo entry.\n");
15368 break;
15369 case 1:
15370 printf ("(VEC_SIZE):\t4 bytes\n");
15371 break;
15372 case 2:
15373 printf ("(VEC_SIZE):\t16 bytes\n");
15374 break;
15375 case 3:
15376 printf ("(VEC_SIZE):\treserved\n");
15377 break;
15378 }
15379 }
15380
15381 return TRUE;
15382 }
15383
15384 static int
15385 process_gnu_liblist (FILE * file)
15386 {
15387 Elf_Internal_Shdr * section;
15388 Elf_Internal_Shdr * string_sec;
15389 Elf32_External_Lib * elib;
15390 char * strtab;
15391 size_t strtab_size;
15392 size_t cnt;
15393 unsigned i;
15394
15395 if (! do_arch)
15396 return 0;
15397
15398 for (i = 0, section = section_headers;
15399 i < elf_header.e_shnum;
15400 i++, section++)
15401 {
15402 switch (section->sh_type)
15403 {
15404 case SHT_GNU_LIBLIST:
15405 if (section->sh_link >= elf_header.e_shnum)
15406 break;
15407
15408 elib = (Elf32_External_Lib *)
15409 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15410 _("liblist section data"));
15411
15412 if (elib == NULL)
15413 break;
15414 string_sec = section_headers + section->sh_link;
15415
15416 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15417 string_sec->sh_size,
15418 _("liblist string table"));
15419 if (strtab == NULL
15420 || section->sh_entsize != sizeof (Elf32_External_Lib))
15421 {
15422 free (elib);
15423 free (strtab);
15424 break;
15425 }
15426 strtab_size = string_sec->sh_size;
15427
15428 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15429 printable_section_name (section),
15430 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15431
15432 puts (_(" Library Time Stamp Checksum Version Flags"));
15433
15434 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15435 ++cnt)
15436 {
15437 Elf32_Lib liblist;
15438 time_t atime;
15439 char timebuf[128];
15440 struct tm * tmp;
15441
15442 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15443 atime = BYTE_GET (elib[cnt].l_time_stamp);
15444 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15445 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15446 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15447
15448 tmp = gmtime (&atime);
15449 snprintf (timebuf, sizeof (timebuf),
15450 "%04u-%02u-%02uT%02u:%02u:%02u",
15451 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15452 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15453
15454 printf ("%3lu: ", (unsigned long) cnt);
15455 if (do_wide)
15456 printf ("%-20s", liblist.l_name < strtab_size
15457 ? strtab + liblist.l_name : _("<corrupt>"));
15458 else
15459 printf ("%-20.20s", liblist.l_name < strtab_size
15460 ? strtab + liblist.l_name : _("<corrupt>"));
15461 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15462 liblist.l_version, liblist.l_flags);
15463 }
15464
15465 free (elib);
15466 free (strtab);
15467 }
15468 }
15469
15470 return 1;
15471 }
15472
15473 static const char *
15474 get_note_type (unsigned e_type)
15475 {
15476 static char buff[64];
15477
15478 if (elf_header.e_type == ET_CORE)
15479 switch (e_type)
15480 {
15481 case NT_AUXV:
15482 return _("NT_AUXV (auxiliary vector)");
15483 case NT_PRSTATUS:
15484 return _("NT_PRSTATUS (prstatus structure)");
15485 case NT_FPREGSET:
15486 return _("NT_FPREGSET (floating point registers)");
15487 case NT_PRPSINFO:
15488 return _("NT_PRPSINFO (prpsinfo structure)");
15489 case NT_TASKSTRUCT:
15490 return _("NT_TASKSTRUCT (task structure)");
15491 case NT_PRXFPREG:
15492 return _("NT_PRXFPREG (user_xfpregs structure)");
15493 case NT_PPC_VMX:
15494 return _("NT_PPC_VMX (ppc Altivec registers)");
15495 case NT_PPC_VSX:
15496 return _("NT_PPC_VSX (ppc VSX registers)");
15497 case NT_386_TLS:
15498 return _("NT_386_TLS (x86 TLS information)");
15499 case NT_386_IOPERM:
15500 return _("NT_386_IOPERM (x86 I/O permissions)");
15501 case NT_X86_XSTATE:
15502 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15503 case NT_S390_HIGH_GPRS:
15504 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15505 case NT_S390_TIMER:
15506 return _("NT_S390_TIMER (s390 timer register)");
15507 case NT_S390_TODCMP:
15508 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15509 case NT_S390_TODPREG:
15510 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15511 case NT_S390_CTRS:
15512 return _("NT_S390_CTRS (s390 control registers)");
15513 case NT_S390_PREFIX:
15514 return _("NT_S390_PREFIX (s390 prefix register)");
15515 case NT_S390_LAST_BREAK:
15516 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15517 case NT_S390_SYSTEM_CALL:
15518 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15519 case NT_S390_TDB:
15520 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15521 case NT_S390_VXRS_LOW:
15522 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15523 case NT_S390_VXRS_HIGH:
15524 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15525 case NT_ARM_VFP:
15526 return _("NT_ARM_VFP (arm VFP registers)");
15527 case NT_ARM_TLS:
15528 return _("NT_ARM_TLS (AArch TLS registers)");
15529 case NT_ARM_HW_BREAK:
15530 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15531 case NT_ARM_HW_WATCH:
15532 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15533 case NT_PSTATUS:
15534 return _("NT_PSTATUS (pstatus structure)");
15535 case NT_FPREGS:
15536 return _("NT_FPREGS (floating point registers)");
15537 case NT_PSINFO:
15538 return _("NT_PSINFO (psinfo structure)");
15539 case NT_LWPSTATUS:
15540 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15541 case NT_LWPSINFO:
15542 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15543 case NT_WIN32PSTATUS:
15544 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15545 case NT_SIGINFO:
15546 return _("NT_SIGINFO (siginfo_t data)");
15547 case NT_FILE:
15548 return _("NT_FILE (mapped files)");
15549 default:
15550 break;
15551 }
15552 else
15553 switch (e_type)
15554 {
15555 case NT_VERSION:
15556 return _("NT_VERSION (version)");
15557 case NT_ARCH:
15558 return _("NT_ARCH (architecture)");
15559 default:
15560 break;
15561 }
15562
15563 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15564 return buff;
15565 }
15566
15567 static int
15568 print_core_note (Elf_Internal_Note *pnote)
15569 {
15570 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15571 bfd_vma count, page_size;
15572 unsigned char *descdata, *filenames, *descend;
15573
15574 if (pnote->type != NT_FILE)
15575 return 1;
15576
15577 #ifndef BFD64
15578 if (!is_32bit_elf)
15579 {
15580 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15581 /* Still "successful". */
15582 return 1;
15583 }
15584 #endif
15585
15586 if (pnote->descsz < 2 * addr_size)
15587 {
15588 printf (_(" Malformed note - too short for header\n"));
15589 return 0;
15590 }
15591
15592 descdata = (unsigned char *) pnote->descdata;
15593 descend = descdata + pnote->descsz;
15594
15595 if (descdata[pnote->descsz - 1] != '\0')
15596 {
15597 printf (_(" Malformed note - does not end with \\0\n"));
15598 return 0;
15599 }
15600
15601 count = byte_get (descdata, addr_size);
15602 descdata += addr_size;
15603
15604 page_size = byte_get (descdata, addr_size);
15605 descdata += addr_size;
15606
15607 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15608 {
15609 printf (_(" Malformed note - too short for supplied file count\n"));
15610 return 0;
15611 }
15612
15613 printf (_(" Page size: "));
15614 print_vma (page_size, DEC);
15615 printf ("\n");
15616
15617 printf (_(" %*s%*s%*s\n"),
15618 (int) (2 + 2 * addr_size), _("Start"),
15619 (int) (4 + 2 * addr_size), _("End"),
15620 (int) (4 + 2 * addr_size), _("Page Offset"));
15621 filenames = descdata + count * 3 * addr_size;
15622 while (count-- > 0)
15623 {
15624 bfd_vma start, end, file_ofs;
15625
15626 if (filenames == descend)
15627 {
15628 printf (_(" Malformed note - filenames end too early\n"));
15629 return 0;
15630 }
15631
15632 start = byte_get (descdata, addr_size);
15633 descdata += addr_size;
15634 end = byte_get (descdata, addr_size);
15635 descdata += addr_size;
15636 file_ofs = byte_get (descdata, addr_size);
15637 descdata += addr_size;
15638
15639 printf (" ");
15640 print_vma (start, FULL_HEX);
15641 printf (" ");
15642 print_vma (end, FULL_HEX);
15643 printf (" ");
15644 print_vma (file_ofs, FULL_HEX);
15645 printf ("\n %s\n", filenames);
15646
15647 filenames += 1 + strlen ((char *) filenames);
15648 }
15649
15650 return 1;
15651 }
15652
15653 static const char *
15654 get_gnu_elf_note_type (unsigned e_type)
15655 {
15656 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
15657 switch (e_type)
15658 {
15659 case NT_GNU_ABI_TAG:
15660 return _("NT_GNU_ABI_TAG (ABI version tag)");
15661 case NT_GNU_HWCAP:
15662 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15663 case NT_GNU_BUILD_ID:
15664 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15665 case NT_GNU_GOLD_VERSION:
15666 return _("NT_GNU_GOLD_VERSION (gold version)");
15667 default:
15668 {
15669 static char buff[64];
15670
15671 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15672 return buff;
15673 }
15674 }
15675 }
15676
15677 static int
15678 print_gnu_note (Elf_Internal_Note *pnote)
15679 {
15680 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
15681 switch (pnote->type)
15682 {
15683 case NT_GNU_BUILD_ID:
15684 {
15685 unsigned long i;
15686
15687 printf (_(" Build ID: "));
15688 for (i = 0; i < pnote->descsz; ++i)
15689 printf ("%02x", pnote->descdata[i] & 0xff);
15690 printf ("\n");
15691 }
15692 break;
15693
15694 case NT_GNU_ABI_TAG:
15695 {
15696 unsigned long os, major, minor, subminor;
15697 const char *osname;
15698
15699 /* PR 17531: file: 030-599401-0.004. */
15700 if (pnote->descsz < 16)
15701 {
15702 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15703 break;
15704 }
15705
15706 os = byte_get ((unsigned char *) pnote->descdata, 4);
15707 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15708 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15709 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15710
15711 switch (os)
15712 {
15713 case GNU_ABI_TAG_LINUX:
15714 osname = "Linux";
15715 break;
15716 case GNU_ABI_TAG_HURD:
15717 osname = "Hurd";
15718 break;
15719 case GNU_ABI_TAG_SOLARIS:
15720 osname = "Solaris";
15721 break;
15722 case GNU_ABI_TAG_FREEBSD:
15723 osname = "FreeBSD";
15724 break;
15725 case GNU_ABI_TAG_NETBSD:
15726 osname = "NetBSD";
15727 break;
15728 case GNU_ABI_TAG_SYLLABLE:
15729 osname = "Syllable";
15730 break;
15731 case GNU_ABI_TAG_NACL:
15732 osname = "NaCl";
15733 break;
15734 default:
15735 osname = "Unknown";
15736 break;
15737 }
15738
15739 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15740 major, minor, subminor);
15741 }
15742 break;
15743
15744 case NT_GNU_GOLD_VERSION:
15745 {
15746 unsigned long i;
15747
15748 printf (_(" Version: "));
15749 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15750 printf ("%c", pnote->descdata[i]);
15751 printf ("\n");
15752 }
15753 break;
15754
15755 case NT_GNU_HWCAP:
15756 {
15757 unsigned long num_entries, mask;
15758
15759 /* Hardware capabilities information. Word 0 is the number of entries.
15760 Word 1 is a bitmask of enabled entries. The rest of the descriptor
15761 is a series of entries, where each entry is a single byte followed
15762 by a nul terminated string. The byte gives the bit number to test
15763 if enabled in the bitmask. */
15764 printf (_(" Hardware Capabilities: "));
15765 if (pnote->descsz < 8)
15766 {
15767 printf (_("<corrupt GNU_HWCAP>\n"));
15768 break;
15769 }
15770 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
15771 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15772 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
15773 /* FIXME: Add code to display the entries... */
15774 }
15775 break;
15776
15777 default:
15778 /* Handle unrecognised types. An error message should have already been
15779 created by get_gnu_elf_note_type(), so all that we need to do is to
15780 display the data. */
15781 {
15782 unsigned long i;
15783
15784 printf (_(" Description data: "));
15785 for (i = 0; i < pnote->descsz; ++i)
15786 printf ("%02x ", pnote->descdata[i] & 0xff);
15787 printf ("\n");
15788 }
15789 break;
15790 }
15791
15792 return 1;
15793 }
15794
15795 static const char *
15796 get_v850_elf_note_type (enum v850_notes n_type)
15797 {
15798 static char buff[64];
15799
15800 switch (n_type)
15801 {
15802 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15803 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15804 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15805 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15806 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15807 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15808 default:
15809 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15810 return buff;
15811 }
15812 }
15813
15814 static int
15815 print_v850_note (Elf_Internal_Note * pnote)
15816 {
15817 unsigned int val;
15818
15819 if (pnote->descsz != 4)
15820 return 0;
15821 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15822
15823 if (val == 0)
15824 {
15825 printf (_("not set\n"));
15826 return 1;
15827 }
15828
15829 switch (pnote->type)
15830 {
15831 case V850_NOTE_ALIGNMENT:
15832 switch (val)
15833 {
15834 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15835 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15836 }
15837 break;
15838
15839 case V850_NOTE_DATA_SIZE:
15840 switch (val)
15841 {
15842 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15843 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15844 }
15845 break;
15846
15847 case V850_NOTE_FPU_INFO:
15848 switch (val)
15849 {
15850 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15851 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15852 }
15853 break;
15854
15855 case V850_NOTE_MMU_INFO:
15856 case V850_NOTE_CACHE_INFO:
15857 case V850_NOTE_SIMD_INFO:
15858 if (val == EF_RH850_SIMD)
15859 {
15860 printf (_("yes\n"));
15861 return 1;
15862 }
15863 break;
15864
15865 default:
15866 /* An 'unknown note type' message will already have been displayed. */
15867 break;
15868 }
15869
15870 printf (_("unknown value: %x\n"), val);
15871 return 0;
15872 }
15873
15874 static int
15875 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15876 {
15877 unsigned int version;
15878
15879 switch (pnote->type)
15880 {
15881 case NT_NETBSD_IDENT:
15882 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15883 if ((version / 10000) % 100)
15884 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15885 version, version / 100000000, (version / 1000000) % 100,
15886 (version / 10000) % 100 > 26 ? "Z" : "",
15887 'A' + (version / 10000) % 26);
15888 else
15889 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15890 version, version / 100000000, (version / 1000000) % 100,
15891 (version / 100) % 100);
15892 return 1;
15893
15894 case NT_NETBSD_MARCH:
15895 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15896 pnote->descdata);
15897 return 1;
15898
15899 default:
15900 break;
15901 }
15902
15903 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15904 pnote->type);
15905 return 1;
15906 }
15907
15908 static const char *
15909 get_freebsd_elfcore_note_type (unsigned e_type)
15910 {
15911 switch (e_type)
15912 {
15913 case NT_FREEBSD_THRMISC:
15914 return _("NT_THRMISC (thrmisc structure)");
15915 case NT_FREEBSD_PROCSTAT_PROC:
15916 return _("NT_PROCSTAT_PROC (proc data)");
15917 case NT_FREEBSD_PROCSTAT_FILES:
15918 return _("NT_PROCSTAT_FILES (files data)");
15919 case NT_FREEBSD_PROCSTAT_VMMAP:
15920 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15921 case NT_FREEBSD_PROCSTAT_GROUPS:
15922 return _("NT_PROCSTAT_GROUPS (groups data)");
15923 case NT_FREEBSD_PROCSTAT_UMASK:
15924 return _("NT_PROCSTAT_UMASK (umask data)");
15925 case NT_FREEBSD_PROCSTAT_RLIMIT:
15926 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15927 case NT_FREEBSD_PROCSTAT_OSREL:
15928 return _("NT_PROCSTAT_OSREL (osreldate data)");
15929 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15930 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15931 case NT_FREEBSD_PROCSTAT_AUXV:
15932 return _("NT_PROCSTAT_AUXV (auxv data)");
15933 }
15934 return get_note_type (e_type);
15935 }
15936
15937 static const char *
15938 get_netbsd_elfcore_note_type (unsigned e_type)
15939 {
15940 static char buff[64];
15941
15942 if (e_type == NT_NETBSDCORE_PROCINFO)
15943 {
15944 /* NetBSD core "procinfo" structure. */
15945 return _("NetBSD procinfo structure");
15946 }
15947
15948 /* As of Jan 2002 there are no other machine-independent notes
15949 defined for NetBSD core files. If the note type is less
15950 than the start of the machine-dependent note types, we don't
15951 understand it. */
15952
15953 if (e_type < NT_NETBSDCORE_FIRSTMACH)
15954 {
15955 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15956 return buff;
15957 }
15958
15959 switch (elf_header.e_machine)
15960 {
15961 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15962 and PT_GETFPREGS == mach+2. */
15963
15964 case EM_OLD_ALPHA:
15965 case EM_ALPHA:
15966 case EM_SPARC:
15967 case EM_SPARC32PLUS:
15968 case EM_SPARCV9:
15969 switch (e_type)
15970 {
15971 case NT_NETBSDCORE_FIRSTMACH + 0:
15972 return _("PT_GETREGS (reg structure)");
15973 case NT_NETBSDCORE_FIRSTMACH + 2:
15974 return _("PT_GETFPREGS (fpreg structure)");
15975 default:
15976 break;
15977 }
15978 break;
15979
15980 /* On all other arch's, PT_GETREGS == mach+1 and
15981 PT_GETFPREGS == mach+3. */
15982 default:
15983 switch (e_type)
15984 {
15985 case NT_NETBSDCORE_FIRSTMACH + 1:
15986 return _("PT_GETREGS (reg structure)");
15987 case NT_NETBSDCORE_FIRSTMACH + 3:
15988 return _("PT_GETFPREGS (fpreg structure)");
15989 default:
15990 break;
15991 }
15992 }
15993
15994 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15995 e_type - NT_NETBSDCORE_FIRSTMACH);
15996 return buff;
15997 }
15998
15999 static const char *
16000 get_stapsdt_note_type (unsigned e_type)
16001 {
16002 static char buff[64];
16003
16004 switch (e_type)
16005 {
16006 case NT_STAPSDT:
16007 return _("NT_STAPSDT (SystemTap probe descriptors)");
16008
16009 default:
16010 break;
16011 }
16012
16013 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16014 return buff;
16015 }
16016
16017 static int
16018 print_stapsdt_note (Elf_Internal_Note *pnote)
16019 {
16020 int addr_size = is_32bit_elf ? 4 : 8;
16021 char *data = pnote->descdata;
16022 char *data_end = pnote->descdata + pnote->descsz;
16023 bfd_vma pc, base_addr, semaphore;
16024 char *provider, *probe, *arg_fmt;
16025
16026 pc = byte_get ((unsigned char *) data, addr_size);
16027 data += addr_size;
16028 base_addr = byte_get ((unsigned char *) data, addr_size);
16029 data += addr_size;
16030 semaphore = byte_get ((unsigned char *) data, addr_size);
16031 data += addr_size;
16032
16033 provider = data;
16034 data += strlen (data) + 1;
16035 probe = data;
16036 data += strlen (data) + 1;
16037 arg_fmt = data;
16038 data += strlen (data) + 1;
16039
16040 printf (_(" Provider: %s\n"), provider);
16041 printf (_(" Name: %s\n"), probe);
16042 printf (_(" Location: "));
16043 print_vma (pc, FULL_HEX);
16044 printf (_(", Base: "));
16045 print_vma (base_addr, FULL_HEX);
16046 printf (_(", Semaphore: "));
16047 print_vma (semaphore, FULL_HEX);
16048 printf ("\n");
16049 printf (_(" Arguments: %s\n"), arg_fmt);
16050
16051 return data == data_end;
16052 }
16053
16054 static const char *
16055 get_ia64_vms_note_type (unsigned e_type)
16056 {
16057 static char buff[64];
16058
16059 switch (e_type)
16060 {
16061 case NT_VMS_MHD:
16062 return _("NT_VMS_MHD (module header)");
16063 case NT_VMS_LNM:
16064 return _("NT_VMS_LNM (language name)");
16065 case NT_VMS_SRC:
16066 return _("NT_VMS_SRC (source files)");
16067 case NT_VMS_TITLE:
16068 return "NT_VMS_TITLE";
16069 case NT_VMS_EIDC:
16070 return _("NT_VMS_EIDC (consistency check)");
16071 case NT_VMS_FPMODE:
16072 return _("NT_VMS_FPMODE (FP mode)");
16073 case NT_VMS_LINKTIME:
16074 return "NT_VMS_LINKTIME";
16075 case NT_VMS_IMGNAM:
16076 return _("NT_VMS_IMGNAM (image name)");
16077 case NT_VMS_IMGID:
16078 return _("NT_VMS_IMGID (image id)");
16079 case NT_VMS_LINKID:
16080 return _("NT_VMS_LINKID (link id)");
16081 case NT_VMS_IMGBID:
16082 return _("NT_VMS_IMGBID (build id)");
16083 case NT_VMS_GSTNAM:
16084 return _("NT_VMS_GSTNAM (sym table name)");
16085 case NT_VMS_ORIG_DYN:
16086 return "NT_VMS_ORIG_DYN";
16087 case NT_VMS_PATCHTIME:
16088 return "NT_VMS_PATCHTIME";
16089 default:
16090 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16091 return buff;
16092 }
16093 }
16094
16095 static int
16096 print_ia64_vms_note (Elf_Internal_Note * pnote)
16097 {
16098 switch (pnote->type)
16099 {
16100 case NT_VMS_MHD:
16101 if (pnote->descsz > 36)
16102 {
16103 size_t l = strlen (pnote->descdata + 34);
16104 printf (_(" Creation date : %.17s\n"), pnote->descdata);
16105 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
16106 printf (_(" Module name : %s\n"), pnote->descdata + 34);
16107 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
16108 }
16109 else
16110 printf (_(" Invalid size\n"));
16111 break;
16112 case NT_VMS_LNM:
16113 printf (_(" Language: %s\n"), pnote->descdata);
16114 break;
16115 #ifdef BFD64
16116 case NT_VMS_FPMODE:
16117 printf (_(" Floating Point mode: "));
16118 printf ("0x%016" BFD_VMA_FMT "x\n",
16119 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
16120 break;
16121 case NT_VMS_LINKTIME:
16122 printf (_(" Link time: "));
16123 print_vms_time
16124 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16125 printf ("\n");
16126 break;
16127 case NT_VMS_PATCHTIME:
16128 printf (_(" Patch time: "));
16129 print_vms_time
16130 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16131 printf ("\n");
16132 break;
16133 case NT_VMS_ORIG_DYN:
16134 printf (_(" Major id: %u, minor id: %u\n"),
16135 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16136 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
16137 printf (_(" Last modified : "));
16138 print_vms_time
16139 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
16140 printf (_("\n Link flags : "));
16141 printf ("0x%016" BFD_VMA_FMT "x\n",
16142 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
16143 printf (_(" Header flags: 0x%08x\n"),
16144 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
16145 printf (_(" Image id : %s\n"), pnote->descdata + 32);
16146 break;
16147 #endif
16148 case NT_VMS_IMGNAM:
16149 printf (_(" Image name: %s\n"), pnote->descdata);
16150 break;
16151 case NT_VMS_GSTNAM:
16152 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
16153 break;
16154 case NT_VMS_IMGID:
16155 printf (_(" Image id: %s\n"), pnote->descdata);
16156 break;
16157 case NT_VMS_LINKID:
16158 printf (_(" Linker id: %s\n"), pnote->descdata);
16159 break;
16160 default:
16161 break;
16162 }
16163 return 1;
16164 }
16165
16166 /* Note that by the ELF standard, the name field is already null byte
16167 terminated, and namesz includes the terminating null byte.
16168 I.E. the value of namesz for the name "FSF" is 4.
16169
16170 If the value of namesz is zero, there is no name present. */
16171 static int
16172 process_note (Elf_Internal_Note * pnote,
16173 FILE * file ATTRIBUTE_UNUSED,
16174 Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
16175 {
16176 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16177 const char * nt;
16178
16179 if (pnote->namesz == 0)
16180 /* If there is no note name, then use the default set of
16181 note type strings. */
16182 nt = get_note_type (pnote->type);
16183
16184 else if (const_strneq (pnote->namedata, "GNU"))
16185 /* GNU-specific object file notes. */
16186 nt = get_gnu_elf_note_type (pnote->type);
16187
16188 else if (const_strneq (pnote->namedata, "FreeBSD"))
16189 /* FreeBSD-specific core file notes. */
16190 nt = get_freebsd_elfcore_note_type (pnote->type);
16191
16192 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16193 /* NetBSD-specific core file notes. */
16194 nt = get_netbsd_elfcore_note_type (pnote->type);
16195
16196 else if (const_strneq (pnote->namedata, "NetBSD"))
16197 /* NetBSD-specific core file notes. */
16198 return process_netbsd_elf_note (pnote);
16199
16200 else if (strneq (pnote->namedata, "SPU/", 4))
16201 {
16202 /* SPU-specific core file notes. */
16203 nt = pnote->namedata + 4;
16204 name = "SPU";
16205 }
16206
16207 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16208 /* VMS/ia64-specific file notes. */
16209 nt = get_ia64_vms_note_type (pnote->type);
16210
16211 else if (const_strneq (pnote->namedata, "stapsdt"))
16212 nt = get_stapsdt_note_type (pnote->type);
16213
16214 else
16215 /* Don't recognize this note name; just use the default set of
16216 note type strings. */
16217 nt = get_note_type (pnote->type);
16218
16219 printf (" ");
16220 print_symbol (-20, name);
16221 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
16222
16223 if (const_strneq (pnote->namedata, "IPF/VMS"))
16224 return print_ia64_vms_note (pnote);
16225 else if (const_strneq (pnote->namedata, "GNU"))
16226 return print_gnu_note (pnote);
16227 else if (const_strneq (pnote->namedata, "stapsdt"))
16228 return print_stapsdt_note (pnote);
16229 else if (const_strneq (pnote->namedata, "CORE"))
16230 return print_core_note (pnote);
16231
16232 else if (pnote->descsz)
16233 {
16234 unsigned long i;
16235
16236 printf (_(" description data: "));
16237 for (i = 0; i < pnote->descsz; i++)
16238 printf ("%02x ", pnote->descdata[i]);
16239 printf ("\n");
16240 }
16241
16242 return 1;
16243 }
16244
16245 static int
16246 process_notes_at (FILE * file,
16247 Elf_Internal_Shdr * section,
16248 bfd_vma offset,
16249 bfd_vma length)
16250 {
16251 Elf_External_Note * pnotes;
16252 Elf_External_Note * external;
16253 char * end;
16254 int res = 1;
16255
16256 if (length <= 0)
16257 return 0;
16258
16259 if (section)
16260 {
16261 pnotes = (Elf_External_Note *) get_section_contents (section, file);
16262 if (pnotes)
16263 apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL);
16264 }
16265 else
16266 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16267 _("notes"));
16268 if (pnotes == NULL)
16269 return 0;
16270
16271 external = pnotes;
16272
16273 if (section)
16274 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
16275 else
16276 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16277 (unsigned long) offset, (unsigned long) length);
16278
16279 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16280
16281 end = (char *) pnotes + length;
16282 while ((char *) external < end)
16283 {
16284 Elf_Internal_Note inote;
16285 size_t min_notesz;
16286 char *next;
16287 char * temp = NULL;
16288 size_t data_remaining = end - (char *) external;
16289
16290 if (!is_ia64_vms ())
16291 {
16292 /* PR binutils/15191
16293 Make sure that there is enough data to read. */
16294 min_notesz = offsetof (Elf_External_Note, name);
16295 if (data_remaining < min_notesz)
16296 {
16297 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16298 (int) data_remaining);
16299 break;
16300 }
16301 inote.type = BYTE_GET (external->type);
16302 inote.namesz = BYTE_GET (external->namesz);
16303 inote.namedata = external->name;
16304 inote.descsz = BYTE_GET (external->descsz);
16305 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16306 /* PR 17531: file: 3443835e. */
16307 if (inote.descdata < (char *) pnotes || inote.descdata > end)
16308 {
16309 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16310 inote.descdata = inote.namedata;
16311 inote.namesz = 0;
16312 }
16313
16314 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16315 next = inote.descdata + align_power (inote.descsz, 2);
16316 }
16317 else
16318 {
16319 Elf64_External_VMS_Note *vms_external;
16320
16321 /* PR binutils/15191
16322 Make sure that there is enough data to read. */
16323 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16324 if (data_remaining < min_notesz)
16325 {
16326 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16327 (int) data_remaining);
16328 break;
16329 }
16330
16331 vms_external = (Elf64_External_VMS_Note *) external;
16332 inote.type = BYTE_GET (vms_external->type);
16333 inote.namesz = BYTE_GET (vms_external->namesz);
16334 inote.namedata = vms_external->name;
16335 inote.descsz = BYTE_GET (vms_external->descsz);
16336 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16337 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16338 next = inote.descdata + align_power (inote.descsz, 3);
16339 }
16340
16341 if (inote.descdata < (char *) external + min_notesz
16342 || next < (char *) external + min_notesz
16343 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16344 || inote.namedata + inote.namesz < inote.namedata
16345 || inote.descdata + inote.descsz < inote.descdata
16346 || data_remaining < (size_t)(next - (char *) external))
16347 {
16348 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16349 (unsigned long) ((char *) external - (char *) pnotes));
16350 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16351 inote.type, inote.namesz, inote.descsz);
16352 break;
16353 }
16354
16355 external = (Elf_External_Note *) next;
16356
16357 /* Verify that name is null terminated. It appears that at least
16358 one version of Linux (RedHat 6.0) generates corefiles that don't
16359 comply with the ELF spec by failing to include the null byte in
16360 namesz. */
16361 if (inote.namedata[inote.namesz - 1] != '\0')
16362 {
16363 temp = (char *) malloc (inote.namesz + 1);
16364 if (temp == NULL)
16365 {
16366 error (_("Out of memory allocating space for inote name\n"));
16367 res = 0;
16368 break;
16369 }
16370
16371 strncpy (temp, inote.namedata, inote.namesz);
16372 temp[inote.namesz] = 0;
16373
16374 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16375 inote.namedata = temp;
16376 }
16377
16378 res &= process_note (& inote, file, section);
16379
16380 if (temp != NULL)
16381 {
16382 free (temp);
16383 temp = NULL;
16384 }
16385 }
16386
16387 free (pnotes);
16388
16389 return res;
16390 }
16391
16392 static int
16393 process_corefile_note_segments (FILE * file)
16394 {
16395 Elf_Internal_Phdr * segment;
16396 unsigned int i;
16397 int res = 1;
16398
16399 if (! get_program_headers (file))
16400 return 0;
16401
16402 for (i = 0, segment = program_headers;
16403 i < elf_header.e_phnum;
16404 i++, segment++)
16405 {
16406 if (segment->p_type == PT_NOTE)
16407 res &= process_notes_at (file, NULL,
16408 (bfd_vma) segment->p_offset,
16409 (bfd_vma) segment->p_filesz);
16410 }
16411
16412 return res;
16413 }
16414
16415 static int
16416 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16417 {
16418 Elf_External_Note * pnotes;
16419 Elf_External_Note * external;
16420 char * end;
16421 int res = 1;
16422
16423 if (length <= 0)
16424 return 0;
16425
16426 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16427 _("v850 notes"));
16428 if (pnotes == NULL)
16429 return 0;
16430
16431 external = pnotes;
16432 end = (char*) pnotes + length;
16433
16434 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16435 (unsigned long) offset, (unsigned long) length);
16436
16437 while ((char *) external + sizeof (Elf_External_Note) < end)
16438 {
16439 Elf_External_Note * next;
16440 Elf_Internal_Note inote;
16441
16442 inote.type = BYTE_GET (external->type);
16443 inote.namesz = BYTE_GET (external->namesz);
16444 inote.namedata = external->name;
16445 inote.descsz = BYTE_GET (external->descsz);
16446 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16447 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16448
16449 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16450 {
16451 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16452 inote.descdata = inote.namedata;
16453 inote.namesz = 0;
16454 }
16455
16456 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16457
16458 if ( ((char *) next > end)
16459 || ((char *) next < (char *) pnotes))
16460 {
16461 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16462 (unsigned long) ((char *) external - (char *) pnotes));
16463 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16464 inote.type, inote.namesz, inote.descsz);
16465 break;
16466 }
16467
16468 external = next;
16469
16470 /* Prevent out-of-bounds indexing. */
16471 if ( inote.namedata + inote.namesz > end
16472 || inote.namedata + inote.namesz < inote.namedata)
16473 {
16474 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16475 (unsigned long) ((char *) external - (char *) pnotes));
16476 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16477 inote.type, inote.namesz, inote.descsz);
16478 break;
16479 }
16480
16481 printf (" %s: ", get_v850_elf_note_type (inote.type));
16482
16483 if (! print_v850_note (& inote))
16484 {
16485 res = 0;
16486 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16487 inote.namesz, inote.descsz);
16488 }
16489 }
16490
16491 free (pnotes);
16492
16493 return res;
16494 }
16495
16496 static int
16497 process_note_sections (FILE * file)
16498 {
16499 Elf_Internal_Shdr * section;
16500 unsigned long i;
16501 int n = 0;
16502 int res = 1;
16503
16504 for (i = 0, section = section_headers;
16505 i < elf_header.e_shnum && section != NULL;
16506 i++, section++)
16507 {
16508 if (section->sh_type == SHT_NOTE)
16509 {
16510 res &= process_notes_at (file, section,
16511 (bfd_vma) section->sh_offset,
16512 (bfd_vma) section->sh_size);
16513 n++;
16514 }
16515
16516 if (( elf_header.e_machine == EM_V800
16517 || elf_header.e_machine == EM_V850
16518 || elf_header.e_machine == EM_CYGNUS_V850)
16519 && section->sh_type == SHT_RENESAS_INFO)
16520 {
16521 res &= process_v850_notes (file,
16522 (bfd_vma) section->sh_offset,
16523 (bfd_vma) section->sh_size);
16524 n++;
16525 }
16526 }
16527
16528 if (n == 0)
16529 /* Try processing NOTE segments instead. */
16530 return process_corefile_note_segments (file);
16531
16532 return res;
16533 }
16534
16535 static int
16536 process_notes (FILE * file)
16537 {
16538 /* If we have not been asked to display the notes then do nothing. */
16539 if (! do_notes)
16540 return 1;
16541
16542 if (elf_header.e_type != ET_CORE)
16543 return process_note_sections (file);
16544
16545 /* No program headers means no NOTE segment. */
16546 if (elf_header.e_phnum > 0)
16547 return process_corefile_note_segments (file);
16548
16549 printf (_("No note segments present in the core file.\n"));
16550 return 1;
16551 }
16552
16553 static int
16554 process_arch_specific (FILE * file)
16555 {
16556 if (! do_arch)
16557 return 1;
16558
16559 switch (elf_header.e_machine)
16560 {
16561 case EM_ARM:
16562 return process_arm_specific (file);
16563 case EM_MIPS:
16564 case EM_MIPS_RS3_LE:
16565 return process_mips_specific (file);
16566 break;
16567 case EM_NDS32:
16568 return process_nds32_specific (file);
16569 break;
16570 case EM_PPC:
16571 case EM_PPC64:
16572 return process_power_specific (file);
16573 break;
16574 case EM_S390:
16575 case EM_S390_OLD:
16576 return process_s390_specific (file);
16577 break;
16578 case EM_SPARC:
16579 case EM_SPARC32PLUS:
16580 case EM_SPARCV9:
16581 return process_sparc_specific (file);
16582 break;
16583 case EM_TI_C6000:
16584 return process_tic6x_specific (file);
16585 break;
16586 case EM_MSP430:
16587 return process_msp430x_specific (file);
16588 default:
16589 break;
16590 }
16591 return 1;
16592 }
16593
16594 static int
16595 get_file_header (FILE * file)
16596 {
16597 /* Read in the identity array. */
16598 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16599 return 0;
16600
16601 /* Determine how to read the rest of the header. */
16602 switch (elf_header.e_ident[EI_DATA])
16603 {
16604 default:
16605 case ELFDATANONE:
16606 case ELFDATA2LSB:
16607 byte_get = byte_get_little_endian;
16608 byte_put = byte_put_little_endian;
16609 break;
16610 case ELFDATA2MSB:
16611 byte_get = byte_get_big_endian;
16612 byte_put = byte_put_big_endian;
16613 break;
16614 }
16615
16616 /* For now we only support 32 bit and 64 bit ELF files. */
16617 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16618
16619 /* Read in the rest of the header. */
16620 if (is_32bit_elf)
16621 {
16622 Elf32_External_Ehdr ehdr32;
16623
16624 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16625 return 0;
16626
16627 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16628 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16629 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16630 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16631 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16632 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16633 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16634 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16635 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16636 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16637 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16638 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16639 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16640 }
16641 else
16642 {
16643 Elf64_External_Ehdr ehdr64;
16644
16645 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16646 we will not be able to cope with the 64bit data found in
16647 64 ELF files. Detect this now and abort before we start
16648 overwriting things. */
16649 if (sizeof (bfd_vma) < 8)
16650 {
16651 error (_("This instance of readelf has been built without support for a\n\
16652 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16653 return 0;
16654 }
16655
16656 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16657 return 0;
16658
16659 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16660 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16661 elf_header.e_version = BYTE_GET (ehdr64.e_version);
16662 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16663 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16664 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
16665 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16666 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16667 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16668 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16669 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16670 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16671 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16672 }
16673
16674 if (elf_header.e_shoff)
16675 {
16676 /* There may be some extensions in the first section header. Don't
16677 bomb if we can't read it. */
16678 if (is_32bit_elf)
16679 get_32bit_section_headers (file, TRUE);
16680 else
16681 get_64bit_section_headers (file, TRUE);
16682 }
16683
16684 return 1;
16685 }
16686
16687 /* Process one ELF object file according to the command line options.
16688 This file may actually be stored in an archive. The file is
16689 positioned at the start of the ELF object. */
16690
16691 static int
16692 process_object (char * file_name, FILE * file)
16693 {
16694 unsigned int i;
16695
16696 if (! get_file_header (file))
16697 {
16698 error (_("%s: Failed to read file header\n"), file_name);
16699 return 1;
16700 }
16701
16702 /* Initialise per file variables. */
16703 for (i = ARRAY_SIZE (version_info); i--;)
16704 version_info[i] = 0;
16705
16706 for (i = ARRAY_SIZE (dynamic_info); i--;)
16707 dynamic_info[i] = 0;
16708 dynamic_info_DT_GNU_HASH = 0;
16709
16710 /* Process the file. */
16711 if (show_name)
16712 printf (_("\nFile: %s\n"), file_name);
16713
16714 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16715 Note we do this even if cmdline_dump_sects is empty because we
16716 must make sure that the dump_sets array is zeroed out before each
16717 object file is processed. */
16718 if (num_dump_sects > num_cmdline_dump_sects)
16719 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16720
16721 if (num_cmdline_dump_sects > 0)
16722 {
16723 if (num_dump_sects == 0)
16724 /* A sneaky way of allocating the dump_sects array. */
16725 request_dump_bynumber (num_cmdline_dump_sects, 0);
16726
16727 assert (num_dump_sects >= num_cmdline_dump_sects);
16728 memcpy (dump_sects, cmdline_dump_sects,
16729 num_cmdline_dump_sects * sizeof (* dump_sects));
16730 }
16731
16732 if (! process_file_header ())
16733 return 1;
16734
16735 if (! process_section_headers (file))
16736 {
16737 /* Without loaded section headers we cannot process lots of
16738 things. */
16739 do_unwind = do_version = do_dump = do_arch = 0;
16740
16741 if (! do_using_dynamic)
16742 do_syms = do_dyn_syms = do_reloc = 0;
16743 }
16744
16745 if (! process_section_groups (file))
16746 {
16747 /* Without loaded section groups we cannot process unwind. */
16748 do_unwind = 0;
16749 }
16750
16751 if (process_program_headers (file))
16752 process_dynamic_section (file);
16753
16754 process_relocs (file);
16755
16756 process_unwind (file);
16757
16758 process_symbol_table (file);
16759
16760 process_syminfo (file);
16761
16762 process_version_sections (file);
16763
16764 process_section_contents (file);
16765
16766 process_notes (file);
16767
16768 process_gnu_liblist (file);
16769
16770 process_arch_specific (file);
16771
16772 if (program_headers)
16773 {
16774 free (program_headers);
16775 program_headers = NULL;
16776 }
16777
16778 if (section_headers)
16779 {
16780 free (section_headers);
16781 section_headers = NULL;
16782 }
16783
16784 if (string_table)
16785 {
16786 free (string_table);
16787 string_table = NULL;
16788 string_table_length = 0;
16789 }
16790
16791 if (dynamic_strings)
16792 {
16793 free (dynamic_strings);
16794 dynamic_strings = NULL;
16795 dynamic_strings_length = 0;
16796 }
16797
16798 if (dynamic_symbols)
16799 {
16800 free (dynamic_symbols);
16801 dynamic_symbols = NULL;
16802 num_dynamic_syms = 0;
16803 }
16804
16805 if (dynamic_syminfo)
16806 {
16807 free (dynamic_syminfo);
16808 dynamic_syminfo = NULL;
16809 }
16810
16811 if (dynamic_section)
16812 {
16813 free (dynamic_section);
16814 dynamic_section = NULL;
16815 }
16816
16817 if (section_headers_groups)
16818 {
16819 free (section_headers_groups);
16820 section_headers_groups = NULL;
16821 }
16822
16823 if (section_groups)
16824 {
16825 struct group_list * g;
16826 struct group_list * next;
16827
16828 for (i = 0; i < group_count; i++)
16829 {
16830 for (g = section_groups [i].root; g != NULL; g = next)
16831 {
16832 next = g->next;
16833 free (g);
16834 }
16835 }
16836
16837 free (section_groups);
16838 section_groups = NULL;
16839 }
16840
16841 free_debug_memory ();
16842
16843 return 0;
16844 }
16845
16846 /* Process an ELF archive.
16847 On entry the file is positioned just after the ARMAG string. */
16848
16849 static int
16850 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16851 {
16852 struct archive_info arch;
16853 struct archive_info nested_arch;
16854 size_t got;
16855 int ret;
16856
16857 show_name = 1;
16858
16859 /* The ARCH structure is used to hold information about this archive. */
16860 arch.file_name = NULL;
16861 arch.file = NULL;
16862 arch.index_array = NULL;
16863 arch.sym_table = NULL;
16864 arch.longnames = NULL;
16865
16866 /* The NESTED_ARCH structure is used as a single-item cache of information
16867 about a nested archive (when members of a thin archive reside within
16868 another regular archive file). */
16869 nested_arch.file_name = NULL;
16870 nested_arch.file = NULL;
16871 nested_arch.index_array = NULL;
16872 nested_arch.sym_table = NULL;
16873 nested_arch.longnames = NULL;
16874
16875 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16876 {
16877 ret = 1;
16878 goto out;
16879 }
16880
16881 if (do_archive_index)
16882 {
16883 if (arch.sym_table == NULL)
16884 error (_("%s: unable to dump the index as none was found\n"), file_name);
16885 else
16886 {
16887 unsigned long i, l;
16888 unsigned long current_pos;
16889
16890 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16891 file_name, (unsigned long) arch.index_num, arch.sym_size);
16892 current_pos = ftell (file);
16893
16894 for (i = l = 0; i < arch.index_num; i++)
16895 {
16896 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16897 {
16898 char * member_name;
16899
16900 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16901
16902 if (member_name != NULL)
16903 {
16904 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16905
16906 if (qualified_name != NULL)
16907 {
16908 printf (_("Contents of binary %s at offset "), qualified_name);
16909 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16910 putchar ('\n');
16911 free (qualified_name);
16912 }
16913 }
16914 }
16915
16916 if (l >= arch.sym_size)
16917 {
16918 error (_("%s: end of the symbol table reached before the end of the index\n"),
16919 file_name);
16920 break;
16921 }
16922 /* PR 17531: file: 0b6630b2. */
16923 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16924 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16925 }
16926
16927 if (arch.uses_64bit_indicies)
16928 l = (l + 7) & ~ 7;
16929 else
16930 l += l & 1;
16931
16932 if (l < arch.sym_size)
16933 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16934 file_name, arch.sym_size - l);
16935
16936 if (fseek (file, current_pos, SEEK_SET) != 0)
16937 {
16938 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16939 ret = 1;
16940 goto out;
16941 }
16942 }
16943
16944 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16945 && !do_segments && !do_header && !do_dump && !do_version
16946 && !do_histogram && !do_debugging && !do_arch && !do_notes
16947 && !do_section_groups && !do_dyn_syms)
16948 {
16949 ret = 0; /* Archive index only. */
16950 goto out;
16951 }
16952 }
16953
16954 ret = 0;
16955
16956 while (1)
16957 {
16958 char * name;
16959 size_t namelen;
16960 char * qualified_name;
16961
16962 /* Read the next archive header. */
16963 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16964 {
16965 error (_("%s: failed to seek to next archive header\n"), file_name);
16966 return 1;
16967 }
16968 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16969 if (got != sizeof arch.arhdr)
16970 {
16971 if (got == 0)
16972 break;
16973 error (_("%s: failed to read archive header\n"), file_name);
16974 ret = 1;
16975 break;
16976 }
16977 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16978 {
16979 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16980 ret = 1;
16981 break;
16982 }
16983
16984 arch.next_arhdr_offset += sizeof arch.arhdr;
16985
16986 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16987 if (archive_file_size & 01)
16988 ++archive_file_size;
16989
16990 name = get_archive_member_name (&arch, &nested_arch);
16991 if (name == NULL)
16992 {
16993 error (_("%s: bad archive file name\n"), file_name);
16994 ret = 1;
16995 break;
16996 }
16997 namelen = strlen (name);
16998
16999 qualified_name = make_qualified_name (&arch, &nested_arch, name);
17000 if (qualified_name == NULL)
17001 {
17002 error (_("%s: bad archive file name\n"), file_name);
17003 ret = 1;
17004 break;
17005 }
17006
17007 if (is_thin_archive && arch.nested_member_origin == 0)
17008 {
17009 /* This is a proxy for an external member of a thin archive. */
17010 FILE * member_file;
17011 char * member_file_name = adjust_relative_path (file_name, name, namelen);
17012 if (member_file_name == NULL)
17013 {
17014 ret = 1;
17015 break;
17016 }
17017
17018 member_file = fopen (member_file_name, "rb");
17019 if (member_file == NULL)
17020 {
17021 error (_("Input file '%s' is not readable.\n"), member_file_name);
17022 free (member_file_name);
17023 ret = 1;
17024 break;
17025 }
17026
17027 archive_file_offset = arch.nested_member_origin;
17028
17029 ret |= process_object (qualified_name, member_file);
17030
17031 fclose (member_file);
17032 free (member_file_name);
17033 }
17034 else if (is_thin_archive)
17035 {
17036 /* PR 15140: Allow for corrupt thin archives. */
17037 if (nested_arch.file == NULL)
17038 {
17039 error (_("%s: contains corrupt thin archive: %s\n"),
17040 file_name, name);
17041 ret = 1;
17042 break;
17043 }
17044
17045 /* This is a proxy for a member of a nested archive. */
17046 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17047
17048 /* The nested archive file will have been opened and setup by
17049 get_archive_member_name. */
17050 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17051 {
17052 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17053 ret = 1;
17054 break;
17055 }
17056
17057 ret |= process_object (qualified_name, nested_arch.file);
17058 }
17059 else
17060 {
17061 archive_file_offset = arch.next_arhdr_offset;
17062 arch.next_arhdr_offset += archive_file_size;
17063
17064 ret |= process_object (qualified_name, file);
17065 }
17066
17067 if (dump_sects != NULL)
17068 {
17069 free (dump_sects);
17070 dump_sects = NULL;
17071 num_dump_sects = 0;
17072 }
17073
17074 free (qualified_name);
17075 }
17076
17077 out:
17078 if (nested_arch.file != NULL)
17079 fclose (nested_arch.file);
17080 release_archive (&nested_arch);
17081 release_archive (&arch);
17082
17083 return ret;
17084 }
17085
17086 static int
17087 process_file (char * file_name)
17088 {
17089 FILE * file;
17090 struct stat statbuf;
17091 char armag[SARMAG];
17092 int ret;
17093
17094 if (stat (file_name, &statbuf) < 0)
17095 {
17096 if (errno == ENOENT)
17097 error (_("'%s': No such file\n"), file_name);
17098 else
17099 error (_("Could not locate '%s'. System error message: %s\n"),
17100 file_name, strerror (errno));
17101 return 1;
17102 }
17103
17104 if (! S_ISREG (statbuf.st_mode))
17105 {
17106 error (_("'%s' is not an ordinary file\n"), file_name);
17107 return 1;
17108 }
17109
17110 file = fopen (file_name, "rb");
17111 if (file == NULL)
17112 {
17113 error (_("Input file '%s' is not readable.\n"), file_name);
17114 return 1;
17115 }
17116
17117 if (fread (armag, SARMAG, 1, file) != 1)
17118 {
17119 error (_("%s: Failed to read file's magic number\n"), file_name);
17120 fclose (file);
17121 return 1;
17122 }
17123
17124 current_file_size = (bfd_size_type) statbuf.st_size;
17125
17126 if (memcmp (armag, ARMAG, SARMAG) == 0)
17127 ret = process_archive (file_name, file, FALSE);
17128 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17129 ret = process_archive (file_name, file, TRUE);
17130 else
17131 {
17132 if (do_archive_index)
17133 error (_("File %s is not an archive so its index cannot be displayed.\n"),
17134 file_name);
17135
17136 rewind (file);
17137 archive_file_size = archive_file_offset = 0;
17138 ret = process_object (file_name, file);
17139 }
17140
17141 fclose (file);
17142
17143 current_file_size = 0;
17144 return ret;
17145 }
17146
17147 #ifdef SUPPORT_DISASSEMBLY
17148 /* Needed by the i386 disassembler. For extra credit, someone could
17149 fix this so that we insert symbolic addresses here, esp for GOT/PLT
17150 symbols. */
17151
17152 void
17153 print_address (unsigned int addr, FILE * outfile)
17154 {
17155 fprintf (outfile,"0x%8.8x", addr);
17156 }
17157
17158 /* Needed by the i386 disassembler. */
17159 void
17160 db_task_printsym (unsigned int addr)
17161 {
17162 print_address (addr, stderr);
17163 }
17164 #endif
17165
17166 int
17167 main (int argc, char ** argv)
17168 {
17169 int err;
17170
17171 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17172 setlocale (LC_MESSAGES, "");
17173 #endif
17174 #if defined (HAVE_SETLOCALE)
17175 setlocale (LC_CTYPE, "");
17176 #endif
17177 bindtextdomain (PACKAGE, LOCALEDIR);
17178 textdomain (PACKAGE);
17179
17180 expandargv (&argc, &argv);
17181
17182 parse_args (argc, argv);
17183
17184 if (num_dump_sects > 0)
17185 {
17186 /* Make a copy of the dump_sects array. */
17187 cmdline_dump_sects = (dump_type *)
17188 malloc (num_dump_sects * sizeof (* dump_sects));
17189 if (cmdline_dump_sects == NULL)
17190 error (_("Out of memory allocating dump request table.\n"));
17191 else
17192 {
17193 memcpy (cmdline_dump_sects, dump_sects,
17194 num_dump_sects * sizeof (* dump_sects));
17195 num_cmdline_dump_sects = num_dump_sects;
17196 }
17197 }
17198
17199 if (optind < (argc - 1))
17200 show_name = 1;
17201 else if (optind >= argc)
17202 {
17203 warn (_("Nothing to do.\n"));
17204 usage (stderr);
17205 }
17206
17207 err = 0;
17208 while (optind < argc)
17209 err |= process_file (argv[optind++]);
17210
17211 if (dump_sects != NULL)
17212 free (dump_sects);
17213 if (cmdline_dump_sects != NULL)
17214 free (cmdline_dump_sects);
17215
17216 return err;
17217 }