]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
arc: Remove EF_ARC_CPU_GENERIC constant.
[thirdparty/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/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
131 #include "elf/mt.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 typedef struct elf_section_list
168 {
169 Elf_Internal_Shdr * hdr;
170 struct elf_section_list * next;
171 } elf_section_list;
172
173 char * program_name = "readelf";
174 static unsigned long archive_file_offset;
175 static unsigned long archive_file_size;
176 static bfd_size_type current_file_size;
177 static unsigned long dynamic_addr;
178 static bfd_size_type dynamic_size;
179 static size_t dynamic_nent;
180 static char * dynamic_strings;
181 static unsigned long dynamic_strings_length;
182 static char * string_table;
183 static unsigned long string_table_length;
184 static unsigned long num_dynamic_syms;
185 static Elf_Internal_Sym * dynamic_symbols;
186 static Elf_Internal_Syminfo * dynamic_syminfo;
187 static unsigned long dynamic_syminfo_offset;
188 static unsigned int dynamic_syminfo_nent;
189 static char program_interpreter[PATH_MAX];
190 static bfd_vma dynamic_info[DT_ENCODING];
191 static bfd_vma dynamic_info_DT_GNU_HASH;
192 static bfd_vma version_info[16];
193 static Elf_Internal_Ehdr elf_header;
194 static Elf_Internal_Shdr * section_headers;
195 static Elf_Internal_Phdr * program_headers;
196 static Elf_Internal_Dyn * dynamic_section;
197 static elf_section_list * symtab_shndx_list;
198 static int show_name;
199 static int do_dynamic;
200 static int do_syms;
201 static int do_dyn_syms;
202 static int do_reloc;
203 static int do_sections;
204 static int do_section_groups;
205 static int do_section_details;
206 static int do_segments;
207 static int do_unwind;
208 static int do_using_dynamic;
209 static int do_header;
210 static int do_dump;
211 static int do_version;
212 static int do_histogram;
213 static int do_debugging;
214 static int do_arch;
215 static int do_notes;
216 static int do_archive_index;
217 static int is_32bit_elf;
218 static int decompress_dumps;
219
220 struct group_list
221 {
222 struct group_list * next;
223 unsigned int section_index;
224 };
225
226 struct group
227 {
228 struct group_list * root;
229 unsigned int group_index;
230 };
231
232 static size_t group_count;
233 static struct group * section_groups;
234 static struct group ** section_headers_groups;
235
236
237 /* Flag bits indicating particular types of dump. */
238 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
239 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
240 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
241 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
242 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
243
244 typedef unsigned char dump_type;
245
246 /* A linked list of the section names for which dumps were requested. */
247 struct dump_list_entry
248 {
249 char * name;
250 dump_type type;
251 struct dump_list_entry * next;
252 };
253 static struct dump_list_entry * dump_sects_byname;
254
255 /* A dynamic array of flags indicating for which sections a dump
256 has been requested via command line switches. */
257 static dump_type * cmdline_dump_sects = NULL;
258 static unsigned int num_cmdline_dump_sects = 0;
259
260 /* A dynamic array of flags indicating for which sections a dump of
261 some kind has been requested. It is reset on a per-object file
262 basis and then initialised from the cmdline_dump_sects array,
263 the results of interpreting the -w switch, and the
264 dump_sects_byname list. */
265 static dump_type * dump_sects = NULL;
266 static unsigned int num_dump_sects = 0;
267
268
269 /* How to print a vma value. */
270 typedef enum print_mode
271 {
272 HEX,
273 DEC,
274 DEC_5,
275 UNSIGNED,
276 PREFIX_HEX,
277 FULL_HEX,
278 LONG_HEX
279 }
280 print_mode;
281
282 /* Versioned symbol info. */
283 enum versioned_symbol_info
284 {
285 symbol_undefined,
286 symbol_hidden,
287 symbol_public
288 };
289
290 static const char *get_symbol_version_string
291 (FILE *file, int is_dynsym, const char *strtab,
292 unsigned long int strtab_size, unsigned int si,
293 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294 unsigned short *vna_other);
295
296 #define UNKNOWN -1
297
298 #define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
302 : string_table + (X)->sh_name))
303
304 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
305
306 #define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
309
310 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
314
315 #define REMOVE_ARCH_BITS(ADDR) \
316 do \
317 { \
318 if (elf_header.e_machine == EM_ARM) \
319 (ADDR) &= ~1; \
320 } \
321 while (0)
322 \f
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
328 and REASON is not NULL then emit an error message using REASON as part of the
329 context. */
330
331 static void *
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 bfd_size_type nmemb, const char * reason)
334 {
335 void * mvar;
336 bfd_size_type amt = size * nmemb;
337
338 if (size == 0 || nmemb == 0)
339 return NULL;
340
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type)
345 && ( (bfd_size_type) ((size_t) size) != size
346 || (bfd_size_type) ((size_t) nmemb) != nmemb))
347 {
348 if (reason)
349 error (_("Size truncation prevents reading 0x%llx elements of size 0x%llx for %s\n"),
350 (unsigned long long) nmemb, (unsigned long long) size, reason);
351 return NULL;
352 }
353
354 /* Check for size overflow. */
355 if (amt < nmemb)
356 {
357 if (reason)
358 error (_("Size overflow prevents reading 0x%llx elements of size 0x%llx for %s\n"),
359 (unsigned long long) nmemb, (unsigned long long) size, reason);
360 return NULL;
361 }
362
363 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
364 attempting to allocate memory when the read is bound to fail. */
365 if (amt > current_file_size
366 || offset + archive_file_offset + amt > current_file_size)
367 {
368 if (reason)
369 error (_("Reading 0x%llx bytes extends past end of file for %s\n"),
370 (unsigned long long) amt, reason);
371 return NULL;
372 }
373
374 if (fseek (file, archive_file_offset + offset, SEEK_SET))
375 {
376 if (reason)
377 error (_("Unable to seek to 0x%lx for %s\n"),
378 (unsigned long) archive_file_offset + offset, reason);
379 return NULL;
380 }
381
382 mvar = var;
383 if (mvar == NULL)
384 {
385 /* Check for overflow. */
386 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
387 /* + 1 so that we can '\0' terminate invalid string table sections. */
388 mvar = malloc ((size_t) amt + 1);
389
390 if (mvar == NULL)
391 {
392 if (reason)
393 error (_("Out of memory allocating 0x%llx bytes for %s\n"),
394 (unsigned long long) amt, reason);
395 return NULL;
396 }
397
398 ((char *) mvar)[amt] = '\0';
399 }
400
401 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
402 {
403 if (reason)
404 error (_("Unable to read in 0x%llx bytes of %s\n"),
405 (unsigned long long) amt, reason);
406 if (mvar != var)
407 free (mvar);
408 return NULL;
409 }
410
411 return mvar;
412 }
413
414 /* Print a VMA value. */
415
416 static int
417 print_vma (bfd_vma vma, print_mode mode)
418 {
419 int nc = 0;
420
421 switch (mode)
422 {
423 case FULL_HEX:
424 nc = printf ("0x");
425 /* Drop through. */
426
427 case LONG_HEX:
428 #ifdef BFD64
429 if (is_32bit_elf)
430 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
431 #endif
432 printf_vma (vma);
433 return nc + 16;
434
435 case DEC_5:
436 if (vma <= 99999)
437 return printf ("%5" BFD_VMA_FMT "d", vma);
438 /* Drop through. */
439
440 case PREFIX_HEX:
441 nc = printf ("0x");
442 /* Drop through. */
443
444 case HEX:
445 return nc + printf ("%" BFD_VMA_FMT "x", vma);
446
447 case DEC:
448 return printf ("%" BFD_VMA_FMT "d", vma);
449
450 case UNSIGNED:
451 return printf ("%" BFD_VMA_FMT "u", vma);
452 }
453 return 0;
454 }
455
456 /* Display a symbol on stdout. Handles the display of control characters and
457 multibye characters (assuming the host environment supports them).
458
459 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
460
461 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
462 padding as necessary.
463
464 Returns the number of emitted characters. */
465
466 static unsigned int
467 print_symbol (int width, const char *symbol)
468 {
469 bfd_boolean extra_padding = FALSE;
470 int num_printed = 0;
471 #ifdef HAVE_MBSTATE_T
472 mbstate_t state;
473 #endif
474 int width_remaining;
475
476 if (width < 0)
477 {
478 /* Keep the width positive. This also helps. */
479 width = - width;
480 extra_padding = TRUE;
481 }
482 assert (width != 0);
483
484 if (do_wide)
485 /* Set the remaining width to a very large value.
486 This simplifies the code below. */
487 width_remaining = INT_MAX;
488 else
489 width_remaining = width;
490
491 #ifdef HAVE_MBSTATE_T
492 /* Initialise the multibyte conversion state. */
493 memset (& state, 0, sizeof (state));
494 #endif
495
496 while (width_remaining)
497 {
498 size_t n;
499 const char c = *symbol++;
500
501 if (c == 0)
502 break;
503
504 /* Do not print control characters directly as they can affect terminal
505 settings. Such characters usually appear in the names generated
506 by the assembler for local labels. */
507 if (ISCNTRL (c))
508 {
509 if (width_remaining < 2)
510 break;
511
512 printf ("^%c", c + 0x40);
513 width_remaining -= 2;
514 num_printed += 2;
515 }
516 else if (ISPRINT (c))
517 {
518 putchar (c);
519 width_remaining --;
520 num_printed ++;
521 }
522 else
523 {
524 #ifdef HAVE_MBSTATE_T
525 wchar_t w;
526 #endif
527 /* Let printf do the hard work of displaying multibyte characters. */
528 printf ("%.1s", symbol - 1);
529 width_remaining --;
530 num_printed ++;
531
532 #ifdef HAVE_MBSTATE_T
533 /* Try to find out how many bytes made up the character that was
534 just printed. Advance the symbol pointer past the bytes that
535 were displayed. */
536 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
537 #else
538 n = 1;
539 #endif
540 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
541 symbol += (n - 1);
542 }
543 }
544
545 if (extra_padding && num_printed < width)
546 {
547 /* Fill in the remaining spaces. */
548 printf ("%-*s", width - num_printed, " ");
549 num_printed = width;
550 }
551
552 return num_printed;
553 }
554
555 /* Returns a pointer to a static buffer containing a printable version of
556 the given section's name. Like print_symbol, except that it does not try
557 to print multibyte characters, it just interprets them as hex values. */
558
559 static const char *
560 printable_section_name (const Elf_Internal_Shdr * sec)
561 {
562 #define MAX_PRINT_SEC_NAME_LEN 128
563 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
564 const char * name = SECTION_NAME (sec);
565 char * buf = sec_name_buf;
566 char c;
567 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
568
569 while ((c = * name ++) != 0)
570 {
571 if (ISCNTRL (c))
572 {
573 if (remaining < 2)
574 break;
575
576 * buf ++ = '^';
577 * buf ++ = c + 0x40;
578 remaining -= 2;
579 }
580 else if (ISPRINT (c))
581 {
582 * buf ++ = c;
583 remaining -= 1;
584 }
585 else
586 {
587 static char hex[17] = "0123456789ABCDEF";
588
589 if (remaining < 4)
590 break;
591 * buf ++ = '<';
592 * buf ++ = hex[(c & 0xf0) >> 4];
593 * buf ++ = hex[c & 0x0f];
594 * buf ++ = '>';
595 remaining -= 4;
596 }
597
598 if (remaining == 0)
599 break;
600 }
601
602 * buf = 0;
603 return sec_name_buf;
604 }
605
606 static const char *
607 printable_section_name_from_index (unsigned long ndx)
608 {
609 if (ndx >= elf_header.e_shnum)
610 return _("<corrupt>");
611
612 return printable_section_name (section_headers + ndx);
613 }
614
615 /* Return a pointer to section NAME, or NULL if no such section exists. */
616
617 static Elf_Internal_Shdr *
618 find_section (const char * name)
619 {
620 unsigned int i;
621
622 for (i = 0; i < elf_header.e_shnum; i++)
623 if (streq (SECTION_NAME (section_headers + i), name))
624 return section_headers + i;
625
626 return NULL;
627 }
628
629 /* Return a pointer to a section containing ADDR, or NULL if no such
630 section exists. */
631
632 static Elf_Internal_Shdr *
633 find_section_by_address (bfd_vma addr)
634 {
635 unsigned int i;
636
637 for (i = 0; i < elf_header.e_shnum; i++)
638 {
639 Elf_Internal_Shdr *sec = section_headers + i;
640 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
641 return sec;
642 }
643
644 return NULL;
645 }
646
647 static Elf_Internal_Shdr *
648 find_section_by_type (unsigned int type)
649 {
650 unsigned int i;
651
652 for (i = 0; i < elf_header.e_shnum; i++)
653 {
654 Elf_Internal_Shdr *sec = section_headers + i;
655 if (sec->sh_type == type)
656 return sec;
657 }
658
659 return NULL;
660 }
661
662 /* Return a pointer to section NAME, or NULL if no such section exists,
663 restricted to the list of sections given in SET. */
664
665 static Elf_Internal_Shdr *
666 find_section_in_set (const char * name, unsigned int * set)
667 {
668 unsigned int i;
669
670 if (set != NULL)
671 {
672 while ((i = *set++) > 0)
673 if (streq (SECTION_NAME (section_headers + i), name))
674 return section_headers + i;
675 }
676
677 return find_section (name);
678 }
679
680 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
681 bytes read. */
682
683 static inline unsigned long
684 read_uleb128 (unsigned char *data,
685 unsigned int *length_return,
686 const unsigned char * const end)
687 {
688 return read_leb128 (data, length_return, FALSE, end);
689 }
690
691 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
692 This OS has so many departures from the ELF standard that we test it at
693 many places. */
694
695 static inline int
696 is_ia64_vms (void)
697 {
698 return elf_header.e_machine == EM_IA_64
699 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
700 }
701
702 /* Guess the relocation size commonly used by the specific machines. */
703
704 static int
705 guess_is_rela (unsigned int e_machine)
706 {
707 switch (e_machine)
708 {
709 /* Targets that use REL relocations. */
710 case EM_386:
711 case EM_IAMCU:
712 case EM_960:
713 case EM_ARM:
714 case EM_D10V:
715 case EM_CYGNUS_D10V:
716 case EM_DLX:
717 case EM_MIPS:
718 case EM_MIPS_RS3_LE:
719 case EM_CYGNUS_M32R:
720 case EM_SCORE:
721 case EM_XGATE:
722 return FALSE;
723
724 /* Targets that use RELA relocations. */
725 case EM_68K:
726 case EM_860:
727 case EM_AARCH64:
728 case EM_ADAPTEVA_EPIPHANY:
729 case EM_ALPHA:
730 case EM_ALTERA_NIOS2:
731 case EM_ARC:
732 case EM_ARC_COMPACT:
733 case EM_ARC_COMPACT2:
734 case EM_AVR:
735 case EM_AVR_OLD:
736 case EM_BLACKFIN:
737 case EM_CR16:
738 case EM_CRIS:
739 case EM_CRX:
740 case EM_D30V:
741 case EM_CYGNUS_D30V:
742 case EM_FR30:
743 case EM_FT32:
744 case EM_CYGNUS_FR30:
745 case EM_CYGNUS_FRV:
746 case EM_H8S:
747 case EM_H8_300:
748 case EM_H8_300H:
749 case EM_IA_64:
750 case EM_IP2K:
751 case EM_IP2K_OLD:
752 case EM_IQ2000:
753 case EM_LATTICEMICO32:
754 case EM_M32C_OLD:
755 case EM_M32C:
756 case EM_M32R:
757 case EM_MCORE:
758 case EM_CYGNUS_MEP:
759 case EM_METAG:
760 case EM_MMIX:
761 case EM_MN10200:
762 case EM_CYGNUS_MN10200:
763 case EM_MN10300:
764 case EM_CYGNUS_MN10300:
765 case EM_MOXIE:
766 case EM_MSP430:
767 case EM_MSP430_OLD:
768 case EM_MT:
769 case EM_NDS32:
770 case EM_NIOS32:
771 case EM_OR1K:
772 case EM_PPC64:
773 case EM_PPC:
774 case EM_RL78:
775 case EM_RX:
776 case EM_S390:
777 case EM_S390_OLD:
778 case EM_SH:
779 case EM_SPARC:
780 case EM_SPARC32PLUS:
781 case EM_SPARCV9:
782 case EM_SPU:
783 case EM_TI_C6000:
784 case EM_TILEGX:
785 case EM_TILEPRO:
786 case EM_V800:
787 case EM_V850:
788 case EM_CYGNUS_V850:
789 case EM_VAX:
790 case EM_VISIUM:
791 case EM_X86_64:
792 case EM_L1OM:
793 case EM_K1OM:
794 case EM_XSTORMY16:
795 case EM_XTENSA:
796 case EM_XTENSA_OLD:
797 case EM_MICROBLAZE:
798 case EM_MICROBLAZE_OLD:
799 return TRUE;
800
801 case EM_68HC05:
802 case EM_68HC08:
803 case EM_68HC11:
804 case EM_68HC16:
805 case EM_FX66:
806 case EM_ME16:
807 case EM_MMA:
808 case EM_NCPU:
809 case EM_NDR1:
810 case EM_PCP:
811 case EM_ST100:
812 case EM_ST19:
813 case EM_ST7:
814 case EM_ST9PLUS:
815 case EM_STARCORE:
816 case EM_SVX:
817 case EM_TINYJ:
818 default:
819 warn (_("Don't know about relocations on this machine architecture\n"));
820 return FALSE;
821 }
822 }
823
824 static int
825 slurp_rela_relocs (FILE * file,
826 unsigned long rel_offset,
827 unsigned long rel_size,
828 Elf_Internal_Rela ** relasp,
829 unsigned long * nrelasp)
830 {
831 Elf_Internal_Rela * relas;
832 size_t nrelas;
833 unsigned int i;
834
835 if (is_32bit_elf)
836 {
837 Elf32_External_Rela * erelas;
838
839 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
840 rel_size, _("32-bit relocation data"));
841 if (!erelas)
842 return 0;
843
844 nrelas = rel_size / sizeof (Elf32_External_Rela);
845
846 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
847 sizeof (Elf_Internal_Rela));
848
849 if (relas == NULL)
850 {
851 free (erelas);
852 error (_("out of memory parsing relocs\n"));
853 return 0;
854 }
855
856 for (i = 0; i < nrelas; i++)
857 {
858 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
859 relas[i].r_info = BYTE_GET (erelas[i].r_info);
860 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861 }
862
863 free (erelas);
864 }
865 else
866 {
867 Elf64_External_Rela * erelas;
868
869 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
870 rel_size, _("64-bit relocation data"));
871 if (!erelas)
872 return 0;
873
874 nrelas = rel_size / sizeof (Elf64_External_Rela);
875
876 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
877 sizeof (Elf_Internal_Rela));
878
879 if (relas == NULL)
880 {
881 free (erelas);
882 error (_("out of memory parsing relocs\n"));
883 return 0;
884 }
885
886 for (i = 0; i < nrelas; i++)
887 {
888 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
889 relas[i].r_info = BYTE_GET (erelas[i].r_info);
890 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
891
892 /* The #ifdef BFD64 below is to prevent a compile time
893 warning. We know that if we do not have a 64 bit data
894 type that we will never execute this code anyway. */
895 #ifdef BFD64
896 if (elf_header.e_machine == EM_MIPS
897 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
898 {
899 /* In little-endian objects, r_info isn't really a
900 64-bit little-endian value: it has a 32-bit
901 little-endian symbol index followed by four
902 individual byte fields. Reorder INFO
903 accordingly. */
904 bfd_vma inf = relas[i].r_info;
905 inf = (((inf & 0xffffffff) << 32)
906 | ((inf >> 56) & 0xff)
907 | ((inf >> 40) & 0xff00)
908 | ((inf >> 24) & 0xff0000)
909 | ((inf >> 8) & 0xff000000));
910 relas[i].r_info = inf;
911 }
912 #endif /* BFD64 */
913 }
914
915 free (erelas);
916 }
917 *relasp = relas;
918 *nrelasp = nrelas;
919 return 1;
920 }
921
922 static int
923 slurp_rel_relocs (FILE * file,
924 unsigned long rel_offset,
925 unsigned long rel_size,
926 Elf_Internal_Rela ** relsp,
927 unsigned long * nrelsp)
928 {
929 Elf_Internal_Rela * rels;
930 size_t nrels;
931 unsigned int i;
932
933 if (is_32bit_elf)
934 {
935 Elf32_External_Rel * erels;
936
937 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
938 rel_size, _("32-bit relocation data"));
939 if (!erels)
940 return 0;
941
942 nrels = rel_size / sizeof (Elf32_External_Rel);
943
944 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
945
946 if (rels == NULL)
947 {
948 free (erels);
949 error (_("out of memory parsing relocs\n"));
950 return 0;
951 }
952
953 for (i = 0; i < nrels; i++)
954 {
955 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
956 rels[i].r_info = BYTE_GET (erels[i].r_info);
957 rels[i].r_addend = 0;
958 }
959
960 free (erels);
961 }
962 else
963 {
964 Elf64_External_Rel * erels;
965
966 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
967 rel_size, _("64-bit relocation data"));
968 if (!erels)
969 return 0;
970
971 nrels = rel_size / sizeof (Elf64_External_Rel);
972
973 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
974
975 if (rels == NULL)
976 {
977 free (erels);
978 error (_("out of memory parsing relocs\n"));
979 return 0;
980 }
981
982 for (i = 0; i < nrels; i++)
983 {
984 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
985 rels[i].r_info = BYTE_GET (erels[i].r_info);
986 rels[i].r_addend = 0;
987
988 /* The #ifdef BFD64 below is to prevent a compile time
989 warning. We know that if we do not have a 64 bit data
990 type that we will never execute this code anyway. */
991 #ifdef BFD64
992 if (elf_header.e_machine == EM_MIPS
993 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
994 {
995 /* In little-endian objects, r_info isn't really a
996 64-bit little-endian value: it has a 32-bit
997 little-endian symbol index followed by four
998 individual byte fields. Reorder INFO
999 accordingly. */
1000 bfd_vma inf = rels[i].r_info;
1001 inf = (((inf & 0xffffffff) << 32)
1002 | ((inf >> 56) & 0xff)
1003 | ((inf >> 40) & 0xff00)
1004 | ((inf >> 24) & 0xff0000)
1005 | ((inf >> 8) & 0xff000000));
1006 rels[i].r_info = inf;
1007 }
1008 #endif /* BFD64 */
1009 }
1010
1011 free (erels);
1012 }
1013 *relsp = rels;
1014 *nrelsp = nrels;
1015 return 1;
1016 }
1017
1018 /* Returns the reloc type extracted from the reloc info field. */
1019
1020 static unsigned int
1021 get_reloc_type (bfd_vma reloc_info)
1022 {
1023 if (is_32bit_elf)
1024 return ELF32_R_TYPE (reloc_info);
1025
1026 switch (elf_header.e_machine)
1027 {
1028 case EM_MIPS:
1029 /* Note: We assume that reloc_info has already been adjusted for us. */
1030 return ELF64_MIPS_R_TYPE (reloc_info);
1031
1032 case EM_SPARCV9:
1033 return ELF64_R_TYPE_ID (reloc_info);
1034
1035 default:
1036 return ELF64_R_TYPE (reloc_info);
1037 }
1038 }
1039
1040 /* Return the symbol index extracted from the reloc info field. */
1041
1042 static bfd_vma
1043 get_reloc_symindex (bfd_vma reloc_info)
1044 {
1045 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1046 }
1047
1048 static inline bfd_boolean
1049 uses_msp430x_relocs (void)
1050 {
1051 return
1052 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1053 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1054 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1055 /* TI compiler uses ELFOSABI_NONE. */
1056 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1057 }
1058
1059 /* Display the contents of the relocation data found at the specified
1060 offset. */
1061
1062 static void
1063 dump_relocations (FILE * file,
1064 unsigned long rel_offset,
1065 unsigned long rel_size,
1066 Elf_Internal_Sym * symtab,
1067 unsigned long nsyms,
1068 char * strtab,
1069 unsigned long strtablen,
1070 int is_rela,
1071 int is_dynsym)
1072 {
1073 unsigned int i;
1074 Elf_Internal_Rela * rels;
1075
1076 if (is_rela == UNKNOWN)
1077 is_rela = guess_is_rela (elf_header.e_machine);
1078
1079 if (is_rela)
1080 {
1081 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1082 return;
1083 }
1084 else
1085 {
1086 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1087 return;
1088 }
1089
1090 if (is_32bit_elf)
1091 {
1092 if (is_rela)
1093 {
1094 if (do_wide)
1095 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1096 else
1097 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1098 }
1099 else
1100 {
1101 if (do_wide)
1102 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1103 else
1104 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1105 }
1106 }
1107 else
1108 {
1109 if (is_rela)
1110 {
1111 if (do_wide)
1112 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1113 else
1114 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1115 }
1116 else
1117 {
1118 if (do_wide)
1119 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1120 else
1121 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1122 }
1123 }
1124
1125 for (i = 0; i < rel_size; i++)
1126 {
1127 const char * rtype;
1128 bfd_vma offset;
1129 bfd_vma inf;
1130 bfd_vma symtab_index;
1131 bfd_vma type;
1132
1133 offset = rels[i].r_offset;
1134 inf = rels[i].r_info;
1135
1136 type = get_reloc_type (inf);
1137 symtab_index = get_reloc_symindex (inf);
1138
1139 if (is_32bit_elf)
1140 {
1141 printf ("%8.8lx %8.8lx ",
1142 (unsigned long) offset & 0xffffffff,
1143 (unsigned long) inf & 0xffffffff);
1144 }
1145 else
1146 {
1147 #if BFD_HOST_64BIT_LONG
1148 printf (do_wide
1149 ? "%16.16lx %16.16lx "
1150 : "%12.12lx %12.12lx ",
1151 offset, inf);
1152 #elif BFD_HOST_64BIT_LONG_LONG
1153 #ifndef __MSVCRT__
1154 printf (do_wide
1155 ? "%16.16llx %16.16llx "
1156 : "%12.12llx %12.12llx ",
1157 offset, inf);
1158 #else
1159 printf (do_wide
1160 ? "%16.16I64x %16.16I64x "
1161 : "%12.12I64x %12.12I64x ",
1162 offset, inf);
1163 #endif
1164 #else
1165 printf (do_wide
1166 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1167 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1168 _bfd_int64_high (offset),
1169 _bfd_int64_low (offset),
1170 _bfd_int64_high (inf),
1171 _bfd_int64_low (inf));
1172 #endif
1173 }
1174
1175 switch (elf_header.e_machine)
1176 {
1177 default:
1178 rtype = NULL;
1179 break;
1180
1181 case EM_AARCH64:
1182 rtype = elf_aarch64_reloc_type (type);
1183 break;
1184
1185 case EM_M32R:
1186 case EM_CYGNUS_M32R:
1187 rtype = elf_m32r_reloc_type (type);
1188 break;
1189
1190 case EM_386:
1191 case EM_IAMCU:
1192 rtype = elf_i386_reloc_type (type);
1193 break;
1194
1195 case EM_68HC11:
1196 case EM_68HC12:
1197 rtype = elf_m68hc11_reloc_type (type);
1198 break;
1199
1200 case EM_68K:
1201 rtype = elf_m68k_reloc_type (type);
1202 break;
1203
1204 case EM_960:
1205 rtype = elf_i960_reloc_type (type);
1206 break;
1207
1208 case EM_AVR:
1209 case EM_AVR_OLD:
1210 rtype = elf_avr_reloc_type (type);
1211 break;
1212
1213 case EM_OLD_SPARCV9:
1214 case EM_SPARC32PLUS:
1215 case EM_SPARCV9:
1216 case EM_SPARC:
1217 rtype = elf_sparc_reloc_type (type);
1218 break;
1219
1220 case EM_SPU:
1221 rtype = elf_spu_reloc_type (type);
1222 break;
1223
1224 case EM_V800:
1225 rtype = v800_reloc_type (type);
1226 break;
1227 case EM_V850:
1228 case EM_CYGNUS_V850:
1229 rtype = v850_reloc_type (type);
1230 break;
1231
1232 case EM_D10V:
1233 case EM_CYGNUS_D10V:
1234 rtype = elf_d10v_reloc_type (type);
1235 break;
1236
1237 case EM_D30V:
1238 case EM_CYGNUS_D30V:
1239 rtype = elf_d30v_reloc_type (type);
1240 break;
1241
1242 case EM_DLX:
1243 rtype = elf_dlx_reloc_type (type);
1244 break;
1245
1246 case EM_SH:
1247 rtype = elf_sh_reloc_type (type);
1248 break;
1249
1250 case EM_MN10300:
1251 case EM_CYGNUS_MN10300:
1252 rtype = elf_mn10300_reloc_type (type);
1253 break;
1254
1255 case EM_MN10200:
1256 case EM_CYGNUS_MN10200:
1257 rtype = elf_mn10200_reloc_type (type);
1258 break;
1259
1260 case EM_FR30:
1261 case EM_CYGNUS_FR30:
1262 rtype = elf_fr30_reloc_type (type);
1263 break;
1264
1265 case EM_CYGNUS_FRV:
1266 rtype = elf_frv_reloc_type (type);
1267 break;
1268
1269 case EM_FT32:
1270 rtype = elf_ft32_reloc_type (type);
1271 break;
1272
1273 case EM_MCORE:
1274 rtype = elf_mcore_reloc_type (type);
1275 break;
1276
1277 case EM_MMIX:
1278 rtype = elf_mmix_reloc_type (type);
1279 break;
1280
1281 case EM_MOXIE:
1282 rtype = elf_moxie_reloc_type (type);
1283 break;
1284
1285 case EM_MSP430:
1286 if (uses_msp430x_relocs ())
1287 {
1288 rtype = elf_msp430x_reloc_type (type);
1289 break;
1290 }
1291 case EM_MSP430_OLD:
1292 rtype = elf_msp430_reloc_type (type);
1293 break;
1294
1295 case EM_NDS32:
1296 rtype = elf_nds32_reloc_type (type);
1297 break;
1298
1299 case EM_PPC:
1300 rtype = elf_ppc_reloc_type (type);
1301 break;
1302
1303 case EM_PPC64:
1304 rtype = elf_ppc64_reloc_type (type);
1305 break;
1306
1307 case EM_MIPS:
1308 case EM_MIPS_RS3_LE:
1309 rtype = elf_mips_reloc_type (type);
1310 break;
1311
1312 case EM_ALPHA:
1313 rtype = elf_alpha_reloc_type (type);
1314 break;
1315
1316 case EM_ARM:
1317 rtype = elf_arm_reloc_type (type);
1318 break;
1319
1320 case EM_ARC:
1321 case EM_ARC_COMPACT:
1322 case EM_ARC_COMPACT2:
1323 rtype = elf_arc_reloc_type (type);
1324 break;
1325
1326 case EM_PARISC:
1327 rtype = elf_hppa_reloc_type (type);
1328 break;
1329
1330 case EM_H8_300:
1331 case EM_H8_300H:
1332 case EM_H8S:
1333 rtype = elf_h8_reloc_type (type);
1334 break;
1335
1336 case EM_OR1K:
1337 rtype = elf_or1k_reloc_type (type);
1338 break;
1339
1340 case EM_PJ:
1341 case EM_PJ_OLD:
1342 rtype = elf_pj_reloc_type (type);
1343 break;
1344 case EM_IA_64:
1345 rtype = elf_ia64_reloc_type (type);
1346 break;
1347
1348 case EM_CRIS:
1349 rtype = elf_cris_reloc_type (type);
1350 break;
1351
1352 case EM_860:
1353 rtype = elf_i860_reloc_type (type);
1354 break;
1355
1356 case EM_X86_64:
1357 case EM_L1OM:
1358 case EM_K1OM:
1359 rtype = elf_x86_64_reloc_type (type);
1360 break;
1361
1362 case EM_S370:
1363 rtype = i370_reloc_type (type);
1364 break;
1365
1366 case EM_S390_OLD:
1367 case EM_S390:
1368 rtype = elf_s390_reloc_type (type);
1369 break;
1370
1371 case EM_SCORE:
1372 rtype = elf_score_reloc_type (type);
1373 break;
1374
1375 case EM_XSTORMY16:
1376 rtype = elf_xstormy16_reloc_type (type);
1377 break;
1378
1379 case EM_CRX:
1380 rtype = elf_crx_reloc_type (type);
1381 break;
1382
1383 case EM_VAX:
1384 rtype = elf_vax_reloc_type (type);
1385 break;
1386
1387 case EM_VISIUM:
1388 rtype = elf_visium_reloc_type (type);
1389 break;
1390
1391 case EM_ADAPTEVA_EPIPHANY:
1392 rtype = elf_epiphany_reloc_type (type);
1393 break;
1394
1395 case EM_IP2K:
1396 case EM_IP2K_OLD:
1397 rtype = elf_ip2k_reloc_type (type);
1398 break;
1399
1400 case EM_IQ2000:
1401 rtype = elf_iq2000_reloc_type (type);
1402 break;
1403
1404 case EM_XTENSA_OLD:
1405 case EM_XTENSA:
1406 rtype = elf_xtensa_reloc_type (type);
1407 break;
1408
1409 case EM_LATTICEMICO32:
1410 rtype = elf_lm32_reloc_type (type);
1411 break;
1412
1413 case EM_M32C_OLD:
1414 case EM_M32C:
1415 rtype = elf_m32c_reloc_type (type);
1416 break;
1417
1418 case EM_MT:
1419 rtype = elf_mt_reloc_type (type);
1420 break;
1421
1422 case EM_BLACKFIN:
1423 rtype = elf_bfin_reloc_type (type);
1424 break;
1425
1426 case EM_CYGNUS_MEP:
1427 rtype = elf_mep_reloc_type (type);
1428 break;
1429
1430 case EM_CR16:
1431 rtype = elf_cr16_reloc_type (type);
1432 break;
1433
1434 case EM_MICROBLAZE:
1435 case EM_MICROBLAZE_OLD:
1436 rtype = elf_microblaze_reloc_type (type);
1437 break;
1438
1439 case EM_RL78:
1440 rtype = elf_rl78_reloc_type (type);
1441 break;
1442
1443 case EM_RX:
1444 rtype = elf_rx_reloc_type (type);
1445 break;
1446
1447 case EM_METAG:
1448 rtype = elf_metag_reloc_type (type);
1449 break;
1450
1451 case EM_XC16X:
1452 case EM_C166:
1453 rtype = elf_xc16x_reloc_type (type);
1454 break;
1455
1456 case EM_TI_C6000:
1457 rtype = elf_tic6x_reloc_type (type);
1458 break;
1459
1460 case EM_TILEGX:
1461 rtype = elf_tilegx_reloc_type (type);
1462 break;
1463
1464 case EM_TILEPRO:
1465 rtype = elf_tilepro_reloc_type (type);
1466 break;
1467
1468 case EM_XGATE:
1469 rtype = elf_xgate_reloc_type (type);
1470 break;
1471
1472 case EM_ALTERA_NIOS2:
1473 rtype = elf_nios2_reloc_type (type);
1474 break;
1475 }
1476
1477 if (rtype == NULL)
1478 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1479 else
1480 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1481
1482 if (elf_header.e_machine == EM_ALPHA
1483 && rtype != NULL
1484 && streq (rtype, "R_ALPHA_LITUSE")
1485 && is_rela)
1486 {
1487 switch (rels[i].r_addend)
1488 {
1489 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1490 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1491 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1492 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1493 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1494 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1495 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1496 default: rtype = NULL;
1497 }
1498 if (rtype)
1499 printf (" (%s)", rtype);
1500 else
1501 {
1502 putchar (' ');
1503 printf (_("<unknown addend: %lx>"),
1504 (unsigned long) rels[i].r_addend);
1505 }
1506 }
1507 else if (symtab_index)
1508 {
1509 if (symtab == NULL || symtab_index >= nsyms)
1510 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1511 else
1512 {
1513 Elf_Internal_Sym * psym;
1514 const char * version_string;
1515 enum versioned_symbol_info sym_info;
1516 unsigned short vna_other;
1517
1518 psym = symtab + symtab_index;
1519
1520 version_string
1521 = get_symbol_version_string (file, is_dynsym,
1522 strtab, strtablen,
1523 symtab_index,
1524 psym,
1525 &sym_info,
1526 &vna_other);
1527
1528 printf (" ");
1529
1530 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1531 {
1532 const char * name;
1533 unsigned int len;
1534 unsigned int width = is_32bit_elf ? 8 : 14;
1535
1536 /* Relocations against GNU_IFUNC symbols do not use the value
1537 of the symbol as the address to relocate against. Instead
1538 they invoke the function named by the symbol and use its
1539 result as the address for relocation.
1540
1541 To indicate this to the user, do not display the value of
1542 the symbol in the "Symbols's Value" field. Instead show
1543 its name followed by () as a hint that the symbol is
1544 invoked. */
1545
1546 if (strtab == NULL
1547 || psym->st_name == 0
1548 || psym->st_name >= strtablen)
1549 name = "??";
1550 else
1551 name = strtab + psym->st_name;
1552
1553 len = print_symbol (width, name);
1554 if (version_string)
1555 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1556 version_string);
1557 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1558 }
1559 else
1560 {
1561 print_vma (psym->st_value, LONG_HEX);
1562
1563 printf (is_32bit_elf ? " " : " ");
1564 }
1565
1566 if (psym->st_name == 0)
1567 {
1568 const char * sec_name = "<null>";
1569 char name_buf[40];
1570
1571 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1572 {
1573 if (psym->st_shndx < elf_header.e_shnum)
1574 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1575 else if (psym->st_shndx == SHN_ABS)
1576 sec_name = "ABS";
1577 else if (psym->st_shndx == SHN_COMMON)
1578 sec_name = "COMMON";
1579 else if ((elf_header.e_machine == EM_MIPS
1580 && psym->st_shndx == SHN_MIPS_SCOMMON)
1581 || (elf_header.e_machine == EM_TI_C6000
1582 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1583 sec_name = "SCOMMON";
1584 else if (elf_header.e_machine == EM_MIPS
1585 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1586 sec_name = "SUNDEF";
1587 else if ((elf_header.e_machine == EM_X86_64
1588 || elf_header.e_machine == EM_L1OM
1589 || elf_header.e_machine == EM_K1OM)
1590 && psym->st_shndx == SHN_X86_64_LCOMMON)
1591 sec_name = "LARGE_COMMON";
1592 else if (elf_header.e_machine == EM_IA_64
1593 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1594 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1595 sec_name = "ANSI_COM";
1596 else if (is_ia64_vms ()
1597 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1598 sec_name = "VMS_SYMVEC";
1599 else
1600 {
1601 sprintf (name_buf, "<section 0x%x>",
1602 (unsigned int) psym->st_shndx);
1603 sec_name = name_buf;
1604 }
1605 }
1606 print_symbol (22, sec_name);
1607 }
1608 else if (strtab == NULL)
1609 printf (_("<string table index: %3ld>"), psym->st_name);
1610 else if (psym->st_name >= strtablen)
1611 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1612 else
1613 {
1614 print_symbol (22, strtab + psym->st_name);
1615 if (version_string)
1616 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1617 version_string);
1618 }
1619
1620 if (is_rela)
1621 {
1622 bfd_vma off = rels[i].r_addend;
1623
1624 if ((bfd_signed_vma) off < 0)
1625 printf (" - %" BFD_VMA_FMT "x", - off);
1626 else
1627 printf (" + %" BFD_VMA_FMT "x", off);
1628 }
1629 }
1630 }
1631 else if (is_rela)
1632 {
1633 bfd_vma off = rels[i].r_addend;
1634
1635 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1636 if ((bfd_signed_vma) off < 0)
1637 printf ("-%" BFD_VMA_FMT "x", - off);
1638 else
1639 printf ("%" BFD_VMA_FMT "x", off);
1640 }
1641
1642 if (elf_header.e_machine == EM_SPARCV9
1643 && rtype != NULL
1644 && streq (rtype, "R_SPARC_OLO10"))
1645 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1646
1647 putchar ('\n');
1648
1649 #ifdef BFD64
1650 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1651 {
1652 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1653 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1654 const char * rtype2 = elf_mips_reloc_type (type2);
1655 const char * rtype3 = elf_mips_reloc_type (type3);
1656
1657 printf (" Type2: ");
1658
1659 if (rtype2 == NULL)
1660 printf (_("unrecognized: %-7lx"),
1661 (unsigned long) type2 & 0xffffffff);
1662 else
1663 printf ("%-17.17s", rtype2);
1664
1665 printf ("\n Type3: ");
1666
1667 if (rtype3 == NULL)
1668 printf (_("unrecognized: %-7lx"),
1669 (unsigned long) type3 & 0xffffffff);
1670 else
1671 printf ("%-17.17s", rtype3);
1672
1673 putchar ('\n');
1674 }
1675 #endif /* BFD64 */
1676 }
1677
1678 free (rels);
1679 }
1680
1681 static const char *
1682 get_mips_dynamic_type (unsigned long type)
1683 {
1684 switch (type)
1685 {
1686 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1687 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1688 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1689 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1690 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1691 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1692 case DT_MIPS_MSYM: return "MIPS_MSYM";
1693 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1694 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1695 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1696 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1697 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1698 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1699 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1700 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1701 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1702 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1703 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1704 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1705 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1706 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1707 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1708 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1709 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1710 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1711 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1712 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1713 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1714 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1715 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1716 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1717 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1718 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1719 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1720 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1721 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1722 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1723 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1724 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1725 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1726 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1727 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1728 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1729 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1730 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1731 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1732 default:
1733 return NULL;
1734 }
1735 }
1736
1737 static const char *
1738 get_sparc64_dynamic_type (unsigned long type)
1739 {
1740 switch (type)
1741 {
1742 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1743 default:
1744 return NULL;
1745 }
1746 }
1747
1748 static const char *
1749 get_ppc_dynamic_type (unsigned long type)
1750 {
1751 switch (type)
1752 {
1753 case DT_PPC_GOT: return "PPC_GOT";
1754 case DT_PPC_OPT: return "PPC_OPT";
1755 default:
1756 return NULL;
1757 }
1758 }
1759
1760 static const char *
1761 get_ppc64_dynamic_type (unsigned long type)
1762 {
1763 switch (type)
1764 {
1765 case DT_PPC64_GLINK: return "PPC64_GLINK";
1766 case DT_PPC64_OPD: return "PPC64_OPD";
1767 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1768 case DT_PPC64_OPT: return "PPC64_OPT";
1769 default:
1770 return NULL;
1771 }
1772 }
1773
1774 static const char *
1775 get_parisc_dynamic_type (unsigned long type)
1776 {
1777 switch (type)
1778 {
1779 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1780 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1781 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1782 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1783 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1784 case DT_HP_PREINIT: return "HP_PREINIT";
1785 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1786 case DT_HP_NEEDED: return "HP_NEEDED";
1787 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1788 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1789 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1790 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1791 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1792 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1793 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1794 case DT_HP_FILTERED: return "HP_FILTERED";
1795 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1796 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1797 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1798 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1799 case DT_PLT: return "PLT";
1800 case DT_PLT_SIZE: return "PLT_SIZE";
1801 case DT_DLT: return "DLT";
1802 case DT_DLT_SIZE: return "DLT_SIZE";
1803 default:
1804 return NULL;
1805 }
1806 }
1807
1808 static const char *
1809 get_ia64_dynamic_type (unsigned long type)
1810 {
1811 switch (type)
1812 {
1813 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1814 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1815 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1816 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1817 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1818 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1819 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1820 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1821 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1822 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1823 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1824 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1825 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1826 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1827 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1828 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1829 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1830 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1831 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1832 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1833 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1834 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1835 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1836 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1837 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1838 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1839 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1840 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1841 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1842 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1843 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1844 default:
1845 return NULL;
1846 }
1847 }
1848
1849 static const char *
1850 get_alpha_dynamic_type (unsigned long type)
1851 {
1852 switch (type)
1853 {
1854 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1855 default:
1856 return NULL;
1857 }
1858 }
1859
1860 static const char *
1861 get_score_dynamic_type (unsigned long type)
1862 {
1863 switch (type)
1864 {
1865 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1866 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1867 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1868 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1869 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1870 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1871 default:
1872 return NULL;
1873 }
1874 }
1875
1876 static const char *
1877 get_tic6x_dynamic_type (unsigned long type)
1878 {
1879 switch (type)
1880 {
1881 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1882 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1883 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1884 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1885 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1886 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1887 default:
1888 return NULL;
1889 }
1890 }
1891
1892 static const char *
1893 get_nios2_dynamic_type (unsigned long type)
1894 {
1895 switch (type)
1896 {
1897 case DT_NIOS2_GP: return "NIOS2_GP";
1898 default:
1899 return NULL;
1900 }
1901 }
1902
1903 static const char *
1904 get_dynamic_type (unsigned long type)
1905 {
1906 static char buff[64];
1907
1908 switch (type)
1909 {
1910 case DT_NULL: return "NULL";
1911 case DT_NEEDED: return "NEEDED";
1912 case DT_PLTRELSZ: return "PLTRELSZ";
1913 case DT_PLTGOT: return "PLTGOT";
1914 case DT_HASH: return "HASH";
1915 case DT_STRTAB: return "STRTAB";
1916 case DT_SYMTAB: return "SYMTAB";
1917 case DT_RELA: return "RELA";
1918 case DT_RELASZ: return "RELASZ";
1919 case DT_RELAENT: return "RELAENT";
1920 case DT_STRSZ: return "STRSZ";
1921 case DT_SYMENT: return "SYMENT";
1922 case DT_INIT: return "INIT";
1923 case DT_FINI: return "FINI";
1924 case DT_SONAME: return "SONAME";
1925 case DT_RPATH: return "RPATH";
1926 case DT_SYMBOLIC: return "SYMBOLIC";
1927 case DT_REL: return "REL";
1928 case DT_RELSZ: return "RELSZ";
1929 case DT_RELENT: return "RELENT";
1930 case DT_PLTREL: return "PLTREL";
1931 case DT_DEBUG: return "DEBUG";
1932 case DT_TEXTREL: return "TEXTREL";
1933 case DT_JMPREL: return "JMPREL";
1934 case DT_BIND_NOW: return "BIND_NOW";
1935 case DT_INIT_ARRAY: return "INIT_ARRAY";
1936 case DT_FINI_ARRAY: return "FINI_ARRAY";
1937 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1938 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1939 case DT_RUNPATH: return "RUNPATH";
1940 case DT_FLAGS: return "FLAGS";
1941
1942 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1943 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1944
1945 case DT_CHECKSUM: return "CHECKSUM";
1946 case DT_PLTPADSZ: return "PLTPADSZ";
1947 case DT_MOVEENT: return "MOVEENT";
1948 case DT_MOVESZ: return "MOVESZ";
1949 case DT_FEATURE: return "FEATURE";
1950 case DT_POSFLAG_1: return "POSFLAG_1";
1951 case DT_SYMINSZ: return "SYMINSZ";
1952 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1953
1954 case DT_ADDRRNGLO: return "ADDRRNGLO";
1955 case DT_CONFIG: return "CONFIG";
1956 case DT_DEPAUDIT: return "DEPAUDIT";
1957 case DT_AUDIT: return "AUDIT";
1958 case DT_PLTPAD: return "PLTPAD";
1959 case DT_MOVETAB: return "MOVETAB";
1960 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1961
1962 case DT_VERSYM: return "VERSYM";
1963
1964 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1965 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1966 case DT_RELACOUNT: return "RELACOUNT";
1967 case DT_RELCOUNT: return "RELCOUNT";
1968 case DT_FLAGS_1: return "FLAGS_1";
1969 case DT_VERDEF: return "VERDEF";
1970 case DT_VERDEFNUM: return "VERDEFNUM";
1971 case DT_VERNEED: return "VERNEED";
1972 case DT_VERNEEDNUM: return "VERNEEDNUM";
1973
1974 case DT_AUXILIARY: return "AUXILIARY";
1975 case DT_USED: return "USED";
1976 case DT_FILTER: return "FILTER";
1977
1978 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1979 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1980 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1981 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1982 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1983 case DT_GNU_HASH: return "GNU_HASH";
1984
1985 default:
1986 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1987 {
1988 const char * result;
1989
1990 switch (elf_header.e_machine)
1991 {
1992 case EM_MIPS:
1993 case EM_MIPS_RS3_LE:
1994 result = get_mips_dynamic_type (type);
1995 break;
1996 case EM_SPARCV9:
1997 result = get_sparc64_dynamic_type (type);
1998 break;
1999 case EM_PPC:
2000 result = get_ppc_dynamic_type (type);
2001 break;
2002 case EM_PPC64:
2003 result = get_ppc64_dynamic_type (type);
2004 break;
2005 case EM_IA_64:
2006 result = get_ia64_dynamic_type (type);
2007 break;
2008 case EM_ALPHA:
2009 result = get_alpha_dynamic_type (type);
2010 break;
2011 case EM_SCORE:
2012 result = get_score_dynamic_type (type);
2013 break;
2014 case EM_TI_C6000:
2015 result = get_tic6x_dynamic_type (type);
2016 break;
2017 case EM_ALTERA_NIOS2:
2018 result = get_nios2_dynamic_type (type);
2019 break;
2020 default:
2021 result = NULL;
2022 break;
2023 }
2024
2025 if (result != NULL)
2026 return result;
2027
2028 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2029 }
2030 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2031 || (elf_header.e_machine == EM_PARISC
2032 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2033 {
2034 const char * result;
2035
2036 switch (elf_header.e_machine)
2037 {
2038 case EM_PARISC:
2039 result = get_parisc_dynamic_type (type);
2040 break;
2041 case EM_IA_64:
2042 result = get_ia64_dynamic_type (type);
2043 break;
2044 default:
2045 result = NULL;
2046 break;
2047 }
2048
2049 if (result != NULL)
2050 return result;
2051
2052 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2053 type);
2054 }
2055 else
2056 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2057
2058 return buff;
2059 }
2060 }
2061
2062 static char *
2063 get_file_type (unsigned e_type)
2064 {
2065 static char buff[32];
2066
2067 switch (e_type)
2068 {
2069 case ET_NONE: return _("NONE (None)");
2070 case ET_REL: return _("REL (Relocatable file)");
2071 case ET_EXEC: return _("EXEC (Executable file)");
2072 case ET_DYN: return _("DYN (Shared object file)");
2073 case ET_CORE: return _("CORE (Core file)");
2074
2075 default:
2076 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2077 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2078 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2079 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2080 else
2081 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2082 return buff;
2083 }
2084 }
2085
2086 static char *
2087 get_machine_name (unsigned e_machine)
2088 {
2089 static char buff[64]; /* XXX */
2090
2091 switch (e_machine)
2092 {
2093 case EM_NONE: return _("None");
2094 case EM_AARCH64: return "AArch64";
2095 case EM_M32: return "WE32100";
2096 case EM_SPARC: return "Sparc";
2097 case EM_SPU: return "SPU";
2098 case EM_386: return "Intel 80386";
2099 case EM_68K: return "MC68000";
2100 case EM_88K: return "MC88000";
2101 case EM_IAMCU: return "Intel MCU";
2102 case EM_860: return "Intel 80860";
2103 case EM_MIPS: return "MIPS R3000";
2104 case EM_S370: return "IBM System/370";
2105 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2106 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2107 case EM_PARISC: return "HPPA";
2108 case EM_PPC_OLD: return "Power PC (old)";
2109 case EM_SPARC32PLUS: return "Sparc v8+" ;
2110 case EM_960: return "Intel 90860";
2111 case EM_PPC: return "PowerPC";
2112 case EM_PPC64: return "PowerPC64";
2113 case EM_FR20: return "Fujitsu FR20";
2114 case EM_FT32: return "FTDI FT32";
2115 case EM_RH32: return "TRW RH32";
2116 case EM_MCORE: return "MCORE";
2117 case EM_ARM: return "ARM";
2118 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2119 case EM_SH: return "Renesas / SuperH SH";
2120 case EM_SPARCV9: return "Sparc v9";
2121 case EM_TRICORE: return "Siemens Tricore";
2122 case EM_ARC: return "ARC";
2123 case EM_ARC_COMPACT: return "ARCompact";
2124 case EM_ARC_COMPACT2: return "ARCv2";
2125 case EM_H8_300: return "Renesas H8/300";
2126 case EM_H8_300H: return "Renesas H8/300H";
2127 case EM_H8S: return "Renesas H8S";
2128 case EM_H8_500: return "Renesas H8/500";
2129 case EM_IA_64: return "Intel IA-64";
2130 case EM_MIPS_X: return "Stanford MIPS-X";
2131 case EM_COLDFIRE: return "Motorola Coldfire";
2132 case EM_ALPHA: return "Alpha";
2133 case EM_CYGNUS_D10V:
2134 case EM_D10V: return "d10v";
2135 case EM_CYGNUS_D30V:
2136 case EM_D30V: return "d30v";
2137 case EM_CYGNUS_M32R:
2138 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2139 case EM_CYGNUS_V850:
2140 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2141 case EM_V850: return "Renesas V850";
2142 case EM_CYGNUS_MN10300:
2143 case EM_MN10300: return "mn10300";
2144 case EM_CYGNUS_MN10200:
2145 case EM_MN10200: return "mn10200";
2146 case EM_MOXIE: return "Moxie";
2147 case EM_CYGNUS_FR30:
2148 case EM_FR30: return "Fujitsu FR30";
2149 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2150 case EM_PJ_OLD:
2151 case EM_PJ: return "picoJava";
2152 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2153 case EM_PCP: return "Siemens PCP";
2154 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2155 case EM_NDR1: return "Denso NDR1 microprocesspr";
2156 case EM_STARCORE: return "Motorola Star*Core processor";
2157 case EM_ME16: return "Toyota ME16 processor";
2158 case EM_ST100: return "STMicroelectronics ST100 processor";
2159 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2160 case EM_PDSP: return "Sony DSP processor";
2161 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2162 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2163 case EM_FX66: return "Siemens FX66 microcontroller";
2164 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2165 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2166 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2167 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2168 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2169 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2170 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2171 case EM_SVX: return "Silicon Graphics SVx";
2172 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2173 case EM_VAX: return "Digital VAX";
2174 case EM_VISIUM: return "CDS VISIUMcore processor";
2175 case EM_AVR_OLD:
2176 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2177 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2178 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2179 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2180 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2181 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2182 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2183 case EM_PRISM: return "Vitesse Prism";
2184 case EM_X86_64: return "Advanced Micro Devices X86-64";
2185 case EM_L1OM: return "Intel L1OM";
2186 case EM_K1OM: return "Intel K1OM";
2187 case EM_S390_OLD:
2188 case EM_S390: return "IBM S/390";
2189 case EM_SCORE: return "SUNPLUS S+Core";
2190 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2191 case EM_OR1K: return "OpenRISC 1000";
2192 case EM_CRX: return "National Semiconductor CRX microprocessor";
2193 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2194 case EM_DLX: return "OpenDLX";
2195 case EM_IP2K_OLD:
2196 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2197 case EM_IQ2000: return "Vitesse IQ2000";
2198 case EM_XTENSA_OLD:
2199 case EM_XTENSA: return "Tensilica Xtensa Processor";
2200 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2201 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2202 case EM_NS32K: return "National Semiconductor 32000 series";
2203 case EM_TPC: return "Tenor Network TPC processor";
2204 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2205 case EM_MAX: return "MAX Processor";
2206 case EM_CR: return "National Semiconductor CompactRISC";
2207 case EM_F2MC16: return "Fujitsu F2MC16";
2208 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2209 case EM_LATTICEMICO32: return "Lattice Mico32";
2210 case EM_M32C_OLD:
2211 case EM_M32C: return "Renesas M32c";
2212 case EM_MT: return "Morpho Techologies MT processor";
2213 case EM_BLACKFIN: return "Analog Devices Blackfin";
2214 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2215 case EM_SEP: return "Sharp embedded microprocessor";
2216 case EM_ARCA: return "Arca RISC microprocessor";
2217 case EM_UNICORE: return "Unicore";
2218 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2219 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2220 case EM_NIOS32: return "Altera Nios";
2221 case EM_ALTERA_NIOS2: return "Altera Nios II";
2222 case EM_C166:
2223 case EM_XC16X: return "Infineon Technologies xc16x";
2224 case EM_M16C: return "Renesas M16C series microprocessors";
2225 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2226 case EM_CE: return "Freescale Communication Engine RISC core";
2227 case EM_TSK3000: return "Altium TSK3000 core";
2228 case EM_RS08: return "Freescale RS08 embedded processor";
2229 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2230 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2231 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2232 case EM_SE_C17: return "Seiko Epson C17 family";
2233 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2234 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2235 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2236 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2237 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2238 case EM_R32C: return "Renesas R32C series microprocessors";
2239 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2240 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2241 case EM_8051: return "Intel 8051 and variants";
2242 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2243 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2244 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2245 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2246 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2247 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2248 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2249 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2250 case EM_CR16:
2251 case EM_MICROBLAZE:
2252 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2253 case EM_RL78: return "Renesas RL78";
2254 case EM_RX: return "Renesas RX";
2255 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2256 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2257 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2258 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2259 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2260 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2261 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2262 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2263 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2264 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2265 case EM_CUDA: return "NVIDIA CUDA architecture";
2266 case EM_XGATE: return "Motorola XGATE embedded processor";
2267 default:
2268 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2269 return buff;
2270 }
2271 }
2272
2273 static void
2274 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2275 {
2276 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2277 other compilers don't a specific architecture type in the e_flags, and
2278 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2279 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2280 architectures.
2281
2282 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2283 but also sets a specific architecture type in the e_flags field.
2284
2285 However, when decoding the flags we don't worry if we see an
2286 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2287 ARCEM architecture type. */
2288
2289 switch (e_flags & EF_ARC_MACH_MSK)
2290 {
2291 /* We only expect these to occur for EM_ARC_COMPACT2. */
2292 case EF_ARC_CPU_ARCV2EM:
2293 strcat (buf, ", ARC EM");
2294 break;
2295 case EF_ARC_CPU_ARCV2HS:
2296 strcat (buf, ", ARC HS");
2297 break;
2298
2299 /* We only expect these to occur for EM_ARC_COMPACT. */
2300 case E_ARC_MACH_ARC600:
2301 strcat (buf, ", ARC600");
2302 break;
2303 case E_ARC_MACH_ARC601:
2304 strcat (buf, ", ARC601");
2305 break;
2306 case E_ARC_MACH_ARC700:
2307 strcat (buf, ", ARC700");
2308 break;
2309
2310 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2311 new ELF with new architecture being read by an old version of
2312 readelf, or (c) An ELF built with non-GNU compiler that does not
2313 set the architecture in the e_flags. */
2314 default:
2315 if (e_machine == EM_ARC_COMPACT)
2316 strcat (buf, ", Unknown ARCompact");
2317 else
2318 strcat (buf, ", Unknown ARC");
2319 break;
2320 }
2321
2322 switch (e_flags & EF_ARC_OSABI_MSK)
2323 {
2324 case E_ARC_OSABI_ORIG:
2325 strcat (buf, ", (ABI:legacy)");
2326 break;
2327 case E_ARC_OSABI_V2:
2328 strcat (buf, ", (ABI:v2)");
2329 break;
2330 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2331 case E_ARC_OSABI_V3:
2332 strcat (buf, ", v3 no-legacy-syscalls ABI");
2333 break;
2334 default:
2335 strcat (buf, ", unrecognised ARC OSABI flag");
2336 break;
2337 }
2338 }
2339
2340 static void
2341 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2342 {
2343 unsigned eabi;
2344 int unknown = 0;
2345
2346 eabi = EF_ARM_EABI_VERSION (e_flags);
2347 e_flags &= ~ EF_ARM_EABIMASK;
2348
2349 /* Handle "generic" ARM flags. */
2350 if (e_flags & EF_ARM_RELEXEC)
2351 {
2352 strcat (buf, ", relocatable executable");
2353 e_flags &= ~ EF_ARM_RELEXEC;
2354 }
2355
2356 /* Now handle EABI specific flags. */
2357 switch (eabi)
2358 {
2359 default:
2360 strcat (buf, ", <unrecognized EABI>");
2361 if (e_flags)
2362 unknown = 1;
2363 break;
2364
2365 case EF_ARM_EABI_VER1:
2366 strcat (buf, ", Version1 EABI");
2367 while (e_flags)
2368 {
2369 unsigned flag;
2370
2371 /* Process flags one bit at a time. */
2372 flag = e_flags & - e_flags;
2373 e_flags &= ~ flag;
2374
2375 switch (flag)
2376 {
2377 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2378 strcat (buf, ", sorted symbol tables");
2379 break;
2380
2381 default:
2382 unknown = 1;
2383 break;
2384 }
2385 }
2386 break;
2387
2388 case EF_ARM_EABI_VER2:
2389 strcat (buf, ", Version2 EABI");
2390 while (e_flags)
2391 {
2392 unsigned flag;
2393
2394 /* Process flags one bit at a time. */
2395 flag = e_flags & - e_flags;
2396 e_flags &= ~ flag;
2397
2398 switch (flag)
2399 {
2400 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2401 strcat (buf, ", sorted symbol tables");
2402 break;
2403
2404 case EF_ARM_DYNSYMSUSESEGIDX:
2405 strcat (buf, ", dynamic symbols use segment index");
2406 break;
2407
2408 case EF_ARM_MAPSYMSFIRST:
2409 strcat (buf, ", mapping symbols precede others");
2410 break;
2411
2412 default:
2413 unknown = 1;
2414 break;
2415 }
2416 }
2417 break;
2418
2419 case EF_ARM_EABI_VER3:
2420 strcat (buf, ", Version3 EABI");
2421 break;
2422
2423 case EF_ARM_EABI_VER4:
2424 strcat (buf, ", Version4 EABI");
2425 while (e_flags)
2426 {
2427 unsigned flag;
2428
2429 /* Process flags one bit at a time. */
2430 flag = e_flags & - e_flags;
2431 e_flags &= ~ flag;
2432
2433 switch (flag)
2434 {
2435 case EF_ARM_BE8:
2436 strcat (buf, ", BE8");
2437 break;
2438
2439 case EF_ARM_LE8:
2440 strcat (buf, ", LE8");
2441 break;
2442
2443 default:
2444 unknown = 1;
2445 break;
2446 }
2447 break;
2448 }
2449 break;
2450
2451 case EF_ARM_EABI_VER5:
2452 strcat (buf, ", Version5 EABI");
2453 while (e_flags)
2454 {
2455 unsigned flag;
2456
2457 /* Process flags one bit at a time. */
2458 flag = e_flags & - e_flags;
2459 e_flags &= ~ flag;
2460
2461 switch (flag)
2462 {
2463 case EF_ARM_BE8:
2464 strcat (buf, ", BE8");
2465 break;
2466
2467 case EF_ARM_LE8:
2468 strcat (buf, ", LE8");
2469 break;
2470
2471 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2472 strcat (buf, ", soft-float ABI");
2473 break;
2474
2475 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2476 strcat (buf, ", hard-float ABI");
2477 break;
2478
2479 default:
2480 unknown = 1;
2481 break;
2482 }
2483 }
2484 break;
2485
2486 case EF_ARM_EABI_UNKNOWN:
2487 strcat (buf, ", GNU EABI");
2488 while (e_flags)
2489 {
2490 unsigned flag;
2491
2492 /* Process flags one bit at a time. */
2493 flag = e_flags & - e_flags;
2494 e_flags &= ~ flag;
2495
2496 switch (flag)
2497 {
2498 case EF_ARM_INTERWORK:
2499 strcat (buf, ", interworking enabled");
2500 break;
2501
2502 case EF_ARM_APCS_26:
2503 strcat (buf, ", uses APCS/26");
2504 break;
2505
2506 case EF_ARM_APCS_FLOAT:
2507 strcat (buf, ", uses APCS/float");
2508 break;
2509
2510 case EF_ARM_PIC:
2511 strcat (buf, ", position independent");
2512 break;
2513
2514 case EF_ARM_ALIGN8:
2515 strcat (buf, ", 8 bit structure alignment");
2516 break;
2517
2518 case EF_ARM_NEW_ABI:
2519 strcat (buf, ", uses new ABI");
2520 break;
2521
2522 case EF_ARM_OLD_ABI:
2523 strcat (buf, ", uses old ABI");
2524 break;
2525
2526 case EF_ARM_SOFT_FLOAT:
2527 strcat (buf, ", software FP");
2528 break;
2529
2530 case EF_ARM_VFP_FLOAT:
2531 strcat (buf, ", VFP");
2532 break;
2533
2534 case EF_ARM_MAVERICK_FLOAT:
2535 strcat (buf, ", Maverick FP");
2536 break;
2537
2538 default:
2539 unknown = 1;
2540 break;
2541 }
2542 }
2543 }
2544
2545 if (unknown)
2546 strcat (buf,_(", <unknown>"));
2547 }
2548
2549 static void
2550 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2551 {
2552 --size; /* Leave space for null terminator. */
2553
2554 switch (e_flags & EF_AVR_MACH)
2555 {
2556 case E_AVR_MACH_AVR1:
2557 strncat (buf, ", avr:1", size);
2558 break;
2559 case E_AVR_MACH_AVR2:
2560 strncat (buf, ", avr:2", size);
2561 break;
2562 case E_AVR_MACH_AVR25:
2563 strncat (buf, ", avr:25", size);
2564 break;
2565 case E_AVR_MACH_AVR3:
2566 strncat (buf, ", avr:3", size);
2567 break;
2568 case E_AVR_MACH_AVR31:
2569 strncat (buf, ", avr:31", size);
2570 break;
2571 case E_AVR_MACH_AVR35:
2572 strncat (buf, ", avr:35", size);
2573 break;
2574 case E_AVR_MACH_AVR4:
2575 strncat (buf, ", avr:4", size);
2576 break;
2577 case E_AVR_MACH_AVR5:
2578 strncat (buf, ", avr:5", size);
2579 break;
2580 case E_AVR_MACH_AVR51:
2581 strncat (buf, ", avr:51", size);
2582 break;
2583 case E_AVR_MACH_AVR6:
2584 strncat (buf, ", avr:6", size);
2585 break;
2586 case E_AVR_MACH_AVRTINY:
2587 strncat (buf, ", avr:100", size);
2588 break;
2589 case E_AVR_MACH_XMEGA1:
2590 strncat (buf, ", avr:101", size);
2591 break;
2592 case E_AVR_MACH_XMEGA2:
2593 strncat (buf, ", avr:102", size);
2594 break;
2595 case E_AVR_MACH_XMEGA3:
2596 strncat (buf, ", avr:103", size);
2597 break;
2598 case E_AVR_MACH_XMEGA4:
2599 strncat (buf, ", avr:104", size);
2600 break;
2601 case E_AVR_MACH_XMEGA5:
2602 strncat (buf, ", avr:105", size);
2603 break;
2604 case E_AVR_MACH_XMEGA6:
2605 strncat (buf, ", avr:106", size);
2606 break;
2607 case E_AVR_MACH_XMEGA7:
2608 strncat (buf, ", avr:107", size);
2609 break;
2610 default:
2611 strncat (buf, ", avr:<unknown>", size);
2612 break;
2613 }
2614
2615 size -= strlen (buf);
2616 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2617 strncat (buf, ", link-relax", size);
2618 }
2619
2620 static void
2621 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2622 {
2623 unsigned abi;
2624 unsigned arch;
2625 unsigned config;
2626 unsigned version;
2627 int has_fpu = 0;
2628 int r = 0;
2629
2630 static const char *ABI_STRINGS[] =
2631 {
2632 "ABI v0", /* use r5 as return register; only used in N1213HC */
2633 "ABI v1", /* use r0 as return register */
2634 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2635 "ABI v2fp", /* for FPU */
2636 "AABI",
2637 "ABI2 FP+"
2638 };
2639 static const char *VER_STRINGS[] =
2640 {
2641 "Andes ELF V1.3 or older",
2642 "Andes ELF V1.3.1",
2643 "Andes ELF V1.4"
2644 };
2645 static const char *ARCH_STRINGS[] =
2646 {
2647 "",
2648 "Andes Star v1.0",
2649 "Andes Star v2.0",
2650 "Andes Star v3.0",
2651 "Andes Star v3.0m"
2652 };
2653
2654 abi = EF_NDS_ABI & e_flags;
2655 arch = EF_NDS_ARCH & e_flags;
2656 config = EF_NDS_INST & e_flags;
2657 version = EF_NDS32_ELF_VERSION & e_flags;
2658
2659 memset (buf, 0, size);
2660
2661 switch (abi)
2662 {
2663 case E_NDS_ABI_V0:
2664 case E_NDS_ABI_V1:
2665 case E_NDS_ABI_V2:
2666 case E_NDS_ABI_V2FP:
2667 case E_NDS_ABI_AABI:
2668 case E_NDS_ABI_V2FP_PLUS:
2669 /* In case there are holes in the array. */
2670 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2671 break;
2672
2673 default:
2674 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2675 break;
2676 }
2677
2678 switch (version)
2679 {
2680 case E_NDS32_ELF_VER_1_2:
2681 case E_NDS32_ELF_VER_1_3:
2682 case E_NDS32_ELF_VER_1_4:
2683 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2684 break;
2685
2686 default:
2687 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2688 break;
2689 }
2690
2691 if (E_NDS_ABI_V0 == abi)
2692 {
2693 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2694 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2695 if (arch == E_NDS_ARCH_STAR_V1_0)
2696 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2697 return;
2698 }
2699
2700 switch (arch)
2701 {
2702 case E_NDS_ARCH_STAR_V1_0:
2703 case E_NDS_ARCH_STAR_V2_0:
2704 case E_NDS_ARCH_STAR_V3_0:
2705 case E_NDS_ARCH_STAR_V3_M:
2706 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2707 break;
2708
2709 default:
2710 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2711 /* ARCH version determines how the e_flags are interpreted.
2712 If it is unknown, we cannot proceed. */
2713 return;
2714 }
2715
2716 /* Newer ABI; Now handle architecture specific flags. */
2717 if (arch == E_NDS_ARCH_STAR_V1_0)
2718 {
2719 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2720 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2721
2722 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2723 r += snprintf (buf + r, size -r, ", MAC");
2724
2725 if (config & E_NDS32_HAS_DIV_INST)
2726 r += snprintf (buf + r, size -r, ", DIV");
2727
2728 if (config & E_NDS32_HAS_16BIT_INST)
2729 r += snprintf (buf + r, size -r, ", 16b");
2730 }
2731 else
2732 {
2733 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2734 {
2735 if (version <= E_NDS32_ELF_VER_1_3)
2736 r += snprintf (buf + r, size -r, ", [B8]");
2737 else
2738 r += snprintf (buf + r, size -r, ", EX9");
2739 }
2740
2741 if (config & E_NDS32_HAS_MAC_DX_INST)
2742 r += snprintf (buf + r, size -r, ", MAC_DX");
2743
2744 if (config & E_NDS32_HAS_DIV_DX_INST)
2745 r += snprintf (buf + r, size -r, ", DIV_DX");
2746
2747 if (config & E_NDS32_HAS_16BIT_INST)
2748 {
2749 if (version <= E_NDS32_ELF_VER_1_3)
2750 r += snprintf (buf + r, size -r, ", 16b");
2751 else
2752 r += snprintf (buf + r, size -r, ", IFC");
2753 }
2754 }
2755
2756 if (config & E_NDS32_HAS_EXT_INST)
2757 r += snprintf (buf + r, size -r, ", PERF1");
2758
2759 if (config & E_NDS32_HAS_EXT2_INST)
2760 r += snprintf (buf + r, size -r, ", PERF2");
2761
2762 if (config & E_NDS32_HAS_FPU_INST)
2763 {
2764 has_fpu = 1;
2765 r += snprintf (buf + r, size -r, ", FPU_SP");
2766 }
2767
2768 if (config & E_NDS32_HAS_FPU_DP_INST)
2769 {
2770 has_fpu = 1;
2771 r += snprintf (buf + r, size -r, ", FPU_DP");
2772 }
2773
2774 if (config & E_NDS32_HAS_FPU_MAC_INST)
2775 {
2776 has_fpu = 1;
2777 r += snprintf (buf + r, size -r, ", FPU_MAC");
2778 }
2779
2780 if (has_fpu)
2781 {
2782 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2783 {
2784 case E_NDS32_FPU_REG_8SP_4DP:
2785 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2786 break;
2787 case E_NDS32_FPU_REG_16SP_8DP:
2788 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2789 break;
2790 case E_NDS32_FPU_REG_32SP_16DP:
2791 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2792 break;
2793 case E_NDS32_FPU_REG_32SP_32DP:
2794 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2795 break;
2796 }
2797 }
2798
2799 if (config & E_NDS32_HAS_AUDIO_INST)
2800 r += snprintf (buf + r, size -r, ", AUDIO");
2801
2802 if (config & E_NDS32_HAS_STRING_INST)
2803 r += snprintf (buf + r, size -r, ", STR");
2804
2805 if (config & E_NDS32_HAS_REDUCED_REGS)
2806 r += snprintf (buf + r, size -r, ", 16REG");
2807
2808 if (config & E_NDS32_HAS_VIDEO_INST)
2809 {
2810 if (version <= E_NDS32_ELF_VER_1_3)
2811 r += snprintf (buf + r, size -r, ", VIDEO");
2812 else
2813 r += snprintf (buf + r, size -r, ", SATURATION");
2814 }
2815
2816 if (config & E_NDS32_HAS_ENCRIPT_INST)
2817 r += snprintf (buf + r, size -r, ", ENCRP");
2818
2819 if (config & E_NDS32_HAS_L2C_INST)
2820 r += snprintf (buf + r, size -r, ", L2C");
2821 }
2822
2823 static char *
2824 get_machine_flags (unsigned e_flags, unsigned e_machine)
2825 {
2826 static char buf[1024];
2827
2828 buf[0] = '\0';
2829
2830 if (e_flags)
2831 {
2832 switch (e_machine)
2833 {
2834 default:
2835 break;
2836
2837 case EM_ARC_COMPACT2:
2838 case EM_ARC_COMPACT:
2839 decode_ARC_machine_flags (e_flags, e_machine, buf);
2840 break;
2841
2842 case EM_ARM:
2843 decode_ARM_machine_flags (e_flags, buf);
2844 break;
2845
2846 case EM_AVR:
2847 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2848 break;
2849
2850 case EM_BLACKFIN:
2851 if (e_flags & EF_BFIN_PIC)
2852 strcat (buf, ", PIC");
2853
2854 if (e_flags & EF_BFIN_FDPIC)
2855 strcat (buf, ", FDPIC");
2856
2857 if (e_flags & EF_BFIN_CODE_IN_L1)
2858 strcat (buf, ", code in L1");
2859
2860 if (e_flags & EF_BFIN_DATA_IN_L1)
2861 strcat (buf, ", data in L1");
2862
2863 break;
2864
2865 case EM_CYGNUS_FRV:
2866 switch (e_flags & EF_FRV_CPU_MASK)
2867 {
2868 case EF_FRV_CPU_GENERIC:
2869 break;
2870
2871 default:
2872 strcat (buf, ", fr???");
2873 break;
2874
2875 case EF_FRV_CPU_FR300:
2876 strcat (buf, ", fr300");
2877 break;
2878
2879 case EF_FRV_CPU_FR400:
2880 strcat (buf, ", fr400");
2881 break;
2882 case EF_FRV_CPU_FR405:
2883 strcat (buf, ", fr405");
2884 break;
2885
2886 case EF_FRV_CPU_FR450:
2887 strcat (buf, ", fr450");
2888 break;
2889
2890 case EF_FRV_CPU_FR500:
2891 strcat (buf, ", fr500");
2892 break;
2893 case EF_FRV_CPU_FR550:
2894 strcat (buf, ", fr550");
2895 break;
2896
2897 case EF_FRV_CPU_SIMPLE:
2898 strcat (buf, ", simple");
2899 break;
2900 case EF_FRV_CPU_TOMCAT:
2901 strcat (buf, ", tomcat");
2902 break;
2903 }
2904 break;
2905
2906 case EM_68K:
2907 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2908 strcat (buf, ", m68000");
2909 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2910 strcat (buf, ", cpu32");
2911 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2912 strcat (buf, ", fido_a");
2913 else
2914 {
2915 char const * isa = _("unknown");
2916 char const * mac = _("unknown mac");
2917 char const * additional = NULL;
2918
2919 switch (e_flags & EF_M68K_CF_ISA_MASK)
2920 {
2921 case EF_M68K_CF_ISA_A_NODIV:
2922 isa = "A";
2923 additional = ", nodiv";
2924 break;
2925 case EF_M68K_CF_ISA_A:
2926 isa = "A";
2927 break;
2928 case EF_M68K_CF_ISA_A_PLUS:
2929 isa = "A+";
2930 break;
2931 case EF_M68K_CF_ISA_B_NOUSP:
2932 isa = "B";
2933 additional = ", nousp";
2934 break;
2935 case EF_M68K_CF_ISA_B:
2936 isa = "B";
2937 break;
2938 case EF_M68K_CF_ISA_C:
2939 isa = "C";
2940 break;
2941 case EF_M68K_CF_ISA_C_NODIV:
2942 isa = "C";
2943 additional = ", nodiv";
2944 break;
2945 }
2946 strcat (buf, ", cf, isa ");
2947 strcat (buf, isa);
2948 if (additional)
2949 strcat (buf, additional);
2950 if (e_flags & EF_M68K_CF_FLOAT)
2951 strcat (buf, ", float");
2952 switch (e_flags & EF_M68K_CF_MAC_MASK)
2953 {
2954 case 0:
2955 mac = NULL;
2956 break;
2957 case EF_M68K_CF_MAC:
2958 mac = "mac";
2959 break;
2960 case EF_M68K_CF_EMAC:
2961 mac = "emac";
2962 break;
2963 case EF_M68K_CF_EMAC_B:
2964 mac = "emac_b";
2965 break;
2966 }
2967 if (mac)
2968 {
2969 strcat (buf, ", ");
2970 strcat (buf, mac);
2971 }
2972 }
2973 break;
2974
2975 case EM_CYGNUS_MEP:
2976 switch (e_flags & EF_MEP_CPU_MASK)
2977 {
2978 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
2979 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
2980 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
2981 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
2982 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
2983 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
2984 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
2985 }
2986
2987 switch (e_flags & EF_MEP_COP_MASK)
2988 {
2989 case EF_MEP_COP_NONE: break;
2990 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
2991 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
2992 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
2993 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
2994 default: strcat (buf, _("<unknown MeP copro type>")); break;
2995 }
2996
2997 if (e_flags & EF_MEP_LIBRARY)
2998 strcat (buf, ", Built for Library");
2999
3000 if (e_flags & EF_MEP_INDEX_MASK)
3001 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3002 e_flags & EF_MEP_INDEX_MASK);
3003
3004 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3005 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3006 e_flags & ~ EF_MEP_ALL_FLAGS);
3007 break;
3008
3009 case EM_PPC:
3010 if (e_flags & EF_PPC_EMB)
3011 strcat (buf, ", emb");
3012
3013 if (e_flags & EF_PPC_RELOCATABLE)
3014 strcat (buf, _(", relocatable"));
3015
3016 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3017 strcat (buf, _(", relocatable-lib"));
3018 break;
3019
3020 case EM_PPC64:
3021 if (e_flags & EF_PPC64_ABI)
3022 {
3023 char abi[] = ", abiv0";
3024
3025 abi[6] += e_flags & EF_PPC64_ABI;
3026 strcat (buf, abi);
3027 }
3028 break;
3029
3030 case EM_V800:
3031 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3032 strcat (buf, ", RH850 ABI");
3033
3034 if (e_flags & EF_V800_850E3)
3035 strcat (buf, ", V3 architecture");
3036
3037 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3038 strcat (buf, ", FPU not used");
3039
3040 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3041 strcat (buf, ", regmode: COMMON");
3042
3043 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3044 strcat (buf, ", r4 not used");
3045
3046 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3047 strcat (buf, ", r30 not used");
3048
3049 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3050 strcat (buf, ", r5 not used");
3051
3052 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3053 strcat (buf, ", r2 not used");
3054
3055 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3056 {
3057 switch (e_flags & - e_flags)
3058 {
3059 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3060 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3061 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3062 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3063 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3064 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3065 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3066 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3067 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3068 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3069 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3070 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3071 default: break;
3072 }
3073 }
3074 break;
3075
3076 case EM_V850:
3077 case EM_CYGNUS_V850:
3078 switch (e_flags & EF_V850_ARCH)
3079 {
3080 case E_V850E3V5_ARCH:
3081 strcat (buf, ", v850e3v5");
3082 break;
3083 case E_V850E2V3_ARCH:
3084 strcat (buf, ", v850e2v3");
3085 break;
3086 case E_V850E2_ARCH:
3087 strcat (buf, ", v850e2");
3088 break;
3089 case E_V850E1_ARCH:
3090 strcat (buf, ", v850e1");
3091 break;
3092 case E_V850E_ARCH:
3093 strcat (buf, ", v850e");
3094 break;
3095 case E_V850_ARCH:
3096 strcat (buf, ", v850");
3097 break;
3098 default:
3099 strcat (buf, _(", unknown v850 architecture variant"));
3100 break;
3101 }
3102 break;
3103
3104 case EM_M32R:
3105 case EM_CYGNUS_M32R:
3106 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3107 strcat (buf, ", m32r");
3108 break;
3109
3110 case EM_MIPS:
3111 case EM_MIPS_RS3_LE:
3112 if (e_flags & EF_MIPS_NOREORDER)
3113 strcat (buf, ", noreorder");
3114
3115 if (e_flags & EF_MIPS_PIC)
3116 strcat (buf, ", pic");
3117
3118 if (e_flags & EF_MIPS_CPIC)
3119 strcat (buf, ", cpic");
3120
3121 if (e_flags & EF_MIPS_UCODE)
3122 strcat (buf, ", ugen_reserved");
3123
3124 if (e_flags & EF_MIPS_ABI2)
3125 strcat (buf, ", abi2");
3126
3127 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3128 strcat (buf, ", odk first");
3129
3130 if (e_flags & EF_MIPS_32BITMODE)
3131 strcat (buf, ", 32bitmode");
3132
3133 if (e_flags & EF_MIPS_NAN2008)
3134 strcat (buf, ", nan2008");
3135
3136 if (e_flags & EF_MIPS_FP64)
3137 strcat (buf, ", fp64");
3138
3139 switch ((e_flags & EF_MIPS_MACH))
3140 {
3141 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3142 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3143 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3144 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3145 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3146 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3147 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3148 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3149 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3150 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3151 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3152 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3153 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3154 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3155 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3156 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3157 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3158 case 0:
3159 /* We simply ignore the field in this case to avoid confusion:
3160 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3161 extension. */
3162 break;
3163 default: strcat (buf, _(", unknown CPU")); break;
3164 }
3165
3166 switch ((e_flags & EF_MIPS_ABI))
3167 {
3168 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3169 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3170 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3171 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3172 case 0:
3173 /* We simply ignore the field in this case to avoid confusion:
3174 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3175 This means it is likely to be an o32 file, but not for
3176 sure. */
3177 break;
3178 default: strcat (buf, _(", unknown ABI")); break;
3179 }
3180
3181 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3182 strcat (buf, ", mdmx");
3183
3184 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3185 strcat (buf, ", mips16");
3186
3187 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3188 strcat (buf, ", micromips");
3189
3190 switch ((e_flags & EF_MIPS_ARCH))
3191 {
3192 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3193 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3194 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3195 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3196 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3197 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3198 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3199 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3200 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3201 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3202 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3203 default: strcat (buf, _(", unknown ISA")); break;
3204 }
3205 break;
3206
3207 case EM_NDS32:
3208 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3209 break;
3210
3211 case EM_SH:
3212 switch ((e_flags & EF_SH_MACH_MASK))
3213 {
3214 case EF_SH1: strcat (buf, ", sh1"); break;
3215 case EF_SH2: strcat (buf, ", sh2"); break;
3216 case EF_SH3: strcat (buf, ", sh3"); break;
3217 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3218 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3219 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3220 case EF_SH3E: strcat (buf, ", sh3e"); break;
3221 case EF_SH4: strcat (buf, ", sh4"); break;
3222 case EF_SH5: strcat (buf, ", sh5"); break;
3223 case EF_SH2E: strcat (buf, ", sh2e"); break;
3224 case EF_SH4A: strcat (buf, ", sh4a"); break;
3225 case EF_SH2A: strcat (buf, ", sh2a"); break;
3226 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3227 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3228 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3229 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3230 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3231 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3232 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3233 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3234 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3235 default: strcat (buf, _(", unknown ISA")); break;
3236 }
3237
3238 if (e_flags & EF_SH_PIC)
3239 strcat (buf, ", pic");
3240
3241 if (e_flags & EF_SH_FDPIC)
3242 strcat (buf, ", fdpic");
3243 break;
3244
3245 case EM_OR1K:
3246 if (e_flags & EF_OR1K_NODELAY)
3247 strcat (buf, ", no delay");
3248 break;
3249
3250 case EM_SPARCV9:
3251 if (e_flags & EF_SPARC_32PLUS)
3252 strcat (buf, ", v8+");
3253
3254 if (e_flags & EF_SPARC_SUN_US1)
3255 strcat (buf, ", ultrasparcI");
3256
3257 if (e_flags & EF_SPARC_SUN_US3)
3258 strcat (buf, ", ultrasparcIII");
3259
3260 if (e_flags & EF_SPARC_HAL_R1)
3261 strcat (buf, ", halr1");
3262
3263 if (e_flags & EF_SPARC_LEDATA)
3264 strcat (buf, ", ledata");
3265
3266 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3267 strcat (buf, ", tso");
3268
3269 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3270 strcat (buf, ", pso");
3271
3272 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3273 strcat (buf, ", rmo");
3274 break;
3275
3276 case EM_PARISC:
3277 switch (e_flags & EF_PARISC_ARCH)
3278 {
3279 case EFA_PARISC_1_0:
3280 strcpy (buf, ", PA-RISC 1.0");
3281 break;
3282 case EFA_PARISC_1_1:
3283 strcpy (buf, ", PA-RISC 1.1");
3284 break;
3285 case EFA_PARISC_2_0:
3286 strcpy (buf, ", PA-RISC 2.0");
3287 break;
3288 default:
3289 break;
3290 }
3291 if (e_flags & EF_PARISC_TRAPNIL)
3292 strcat (buf, ", trapnil");
3293 if (e_flags & EF_PARISC_EXT)
3294 strcat (buf, ", ext");
3295 if (e_flags & EF_PARISC_LSB)
3296 strcat (buf, ", lsb");
3297 if (e_flags & EF_PARISC_WIDE)
3298 strcat (buf, ", wide");
3299 if (e_flags & EF_PARISC_NO_KABP)
3300 strcat (buf, ", no kabp");
3301 if (e_flags & EF_PARISC_LAZYSWAP)
3302 strcat (buf, ", lazyswap");
3303 break;
3304
3305 case EM_PJ:
3306 case EM_PJ_OLD:
3307 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3308 strcat (buf, ", new calling convention");
3309
3310 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3311 strcat (buf, ", gnu calling convention");
3312 break;
3313
3314 case EM_IA_64:
3315 if ((e_flags & EF_IA_64_ABI64))
3316 strcat (buf, ", 64-bit");
3317 else
3318 strcat (buf, ", 32-bit");
3319 if ((e_flags & EF_IA_64_REDUCEDFP))
3320 strcat (buf, ", reduced fp model");
3321 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3322 strcat (buf, ", no function descriptors, constant gp");
3323 else if ((e_flags & EF_IA_64_CONS_GP))
3324 strcat (buf, ", constant gp");
3325 if ((e_flags & EF_IA_64_ABSOLUTE))
3326 strcat (buf, ", absolute");
3327 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3328 {
3329 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3330 strcat (buf, ", vms_linkages");
3331 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3332 {
3333 case EF_IA_64_VMS_COMCOD_SUCCESS:
3334 break;
3335 case EF_IA_64_VMS_COMCOD_WARNING:
3336 strcat (buf, ", warning");
3337 break;
3338 case EF_IA_64_VMS_COMCOD_ERROR:
3339 strcat (buf, ", error");
3340 break;
3341 case EF_IA_64_VMS_COMCOD_ABORT:
3342 strcat (buf, ", abort");
3343 break;
3344 default:
3345 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3346 e_flags & EF_IA_64_VMS_COMCOD);
3347 strcat (buf, ", <unknown>");
3348 }
3349 }
3350 break;
3351
3352 case EM_VAX:
3353 if ((e_flags & EF_VAX_NONPIC))
3354 strcat (buf, ", non-PIC");
3355 if ((e_flags & EF_VAX_DFLOAT))
3356 strcat (buf, ", D-Float");
3357 if ((e_flags & EF_VAX_GFLOAT))
3358 strcat (buf, ", G-Float");
3359 break;
3360
3361 case EM_VISIUM:
3362 if (e_flags & EF_VISIUM_ARCH_MCM)
3363 strcat (buf, ", mcm");
3364 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3365 strcat (buf, ", mcm24");
3366 if (e_flags & EF_VISIUM_ARCH_GR6)
3367 strcat (buf, ", gr6");
3368 break;
3369
3370 case EM_RL78:
3371 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3372 {
3373 case E_FLAG_RL78_ANY_CPU: break;
3374 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3375 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3376 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3377 }
3378 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3379 strcat (buf, ", 64-bit doubles");
3380 break;
3381
3382 case EM_RX:
3383 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3384 strcat (buf, ", 64-bit doubles");
3385 if (e_flags & E_FLAG_RX_DSP)
3386 strcat (buf, ", dsp");
3387 if (e_flags & E_FLAG_RX_PID)
3388 strcat (buf, ", pid");
3389 if (e_flags & E_FLAG_RX_ABI)
3390 strcat (buf, ", RX ABI");
3391 if (e_flags & E_FLAG_RX_SINSNS_SET)
3392 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3393 ? ", uses String instructions" : ", bans String instructions");
3394 if (e_flags & E_FLAG_RX_V2)
3395 strcat (buf, ", V2");
3396 break;
3397
3398 case EM_S390:
3399 if (e_flags & EF_S390_HIGH_GPRS)
3400 strcat (buf, ", highgprs");
3401 break;
3402
3403 case EM_TI_C6000:
3404 if ((e_flags & EF_C6000_REL))
3405 strcat (buf, ", relocatable module");
3406 break;
3407
3408 case EM_MSP430:
3409 strcat (buf, _(": architecture variant: "));
3410 switch (e_flags & EF_MSP430_MACH)
3411 {
3412 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3413 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3414 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3415 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3416 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3417 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3418 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3419 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3420 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3421 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3422 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3423 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3424 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3425 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3426 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3427 default:
3428 strcat (buf, _(": unknown")); break;
3429 }
3430
3431 if (e_flags & ~ EF_MSP430_MACH)
3432 strcat (buf, _(": unknown extra flag bits also present"));
3433 }
3434 }
3435
3436 return buf;
3437 }
3438
3439 static const char *
3440 get_osabi_name (unsigned int osabi)
3441 {
3442 static char buff[32];
3443
3444 switch (osabi)
3445 {
3446 case ELFOSABI_NONE: return "UNIX - System V";
3447 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3448 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3449 case ELFOSABI_GNU: return "UNIX - GNU";
3450 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3451 case ELFOSABI_AIX: return "UNIX - AIX";
3452 case ELFOSABI_IRIX: return "UNIX - IRIX";
3453 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3454 case ELFOSABI_TRU64: return "UNIX - TRU64";
3455 case ELFOSABI_MODESTO: return "Novell - Modesto";
3456 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3457 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3458 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3459 case ELFOSABI_AROS: return "AROS";
3460 case ELFOSABI_FENIXOS: return "FenixOS";
3461 default:
3462 if (osabi >= 64)
3463 switch (elf_header.e_machine)
3464 {
3465 case EM_ARM:
3466 switch (osabi)
3467 {
3468 case ELFOSABI_ARM: return "ARM";
3469 default:
3470 break;
3471 }
3472 break;
3473
3474 case EM_MSP430:
3475 case EM_MSP430_OLD:
3476 case EM_VISIUM:
3477 switch (osabi)
3478 {
3479 case ELFOSABI_STANDALONE: return _("Standalone App");
3480 default:
3481 break;
3482 }
3483 break;
3484
3485 case EM_TI_C6000:
3486 switch (osabi)
3487 {
3488 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3489 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3490 default:
3491 break;
3492 }
3493 break;
3494
3495 default:
3496 break;
3497 }
3498 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3499 return buff;
3500 }
3501 }
3502
3503 static const char *
3504 get_aarch64_segment_type (unsigned long type)
3505 {
3506 switch (type)
3507 {
3508 case PT_AARCH64_ARCHEXT:
3509 return "AARCH64_ARCHEXT";
3510 default:
3511 break;
3512 }
3513
3514 return NULL;
3515 }
3516
3517 static const char *
3518 get_arm_segment_type (unsigned long type)
3519 {
3520 switch (type)
3521 {
3522 case PT_ARM_EXIDX:
3523 return "EXIDX";
3524 default:
3525 break;
3526 }
3527
3528 return NULL;
3529 }
3530
3531 static const char *
3532 get_mips_segment_type (unsigned long type)
3533 {
3534 switch (type)
3535 {
3536 case PT_MIPS_REGINFO:
3537 return "REGINFO";
3538 case PT_MIPS_RTPROC:
3539 return "RTPROC";
3540 case PT_MIPS_OPTIONS:
3541 return "OPTIONS";
3542 case PT_MIPS_ABIFLAGS:
3543 return "ABIFLAGS";
3544 default:
3545 break;
3546 }
3547
3548 return NULL;
3549 }
3550
3551 static const char *
3552 get_parisc_segment_type (unsigned long type)
3553 {
3554 switch (type)
3555 {
3556 case PT_HP_TLS: return "HP_TLS";
3557 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3558 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3559 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3560 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3561 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3562 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3563 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3564 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3565 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3566 case PT_HP_PARALLEL: return "HP_PARALLEL";
3567 case PT_HP_FASTBIND: return "HP_FASTBIND";
3568 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3569 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3570 case PT_HP_STACK: return "HP_STACK";
3571 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3572 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3573 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3574 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3575 default:
3576 break;
3577 }
3578
3579 return NULL;
3580 }
3581
3582 static const char *
3583 get_ia64_segment_type (unsigned long type)
3584 {
3585 switch (type)
3586 {
3587 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3588 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3589 case PT_HP_TLS: return "HP_TLS";
3590 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3591 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3592 case PT_IA_64_HP_STACK: return "HP_STACK";
3593 default:
3594 break;
3595 }
3596
3597 return NULL;
3598 }
3599
3600 static const char *
3601 get_tic6x_segment_type (unsigned long type)
3602 {
3603 switch (type)
3604 {
3605 case PT_C6000_PHATTR: return "C6000_PHATTR";
3606 default:
3607 break;
3608 }
3609
3610 return NULL;
3611 }
3612
3613 static const char *
3614 get_segment_type (unsigned long p_type)
3615 {
3616 static char buff[32];
3617
3618 switch (p_type)
3619 {
3620 case PT_NULL: return "NULL";
3621 case PT_LOAD: return "LOAD";
3622 case PT_DYNAMIC: return "DYNAMIC";
3623 case PT_INTERP: return "INTERP";
3624 case PT_NOTE: return "NOTE";
3625 case PT_SHLIB: return "SHLIB";
3626 case PT_PHDR: return "PHDR";
3627 case PT_TLS: return "TLS";
3628
3629 case PT_GNU_EH_FRAME:
3630 return "GNU_EH_FRAME";
3631 case PT_GNU_STACK: return "GNU_STACK";
3632 case PT_GNU_RELRO: return "GNU_RELRO";
3633
3634 default:
3635 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3636 {
3637 const char * result;
3638
3639 switch (elf_header.e_machine)
3640 {
3641 case EM_AARCH64:
3642 result = get_aarch64_segment_type (p_type);
3643 break;
3644 case EM_ARM:
3645 result = get_arm_segment_type (p_type);
3646 break;
3647 case EM_MIPS:
3648 case EM_MIPS_RS3_LE:
3649 result = get_mips_segment_type (p_type);
3650 break;
3651 case EM_PARISC:
3652 result = get_parisc_segment_type (p_type);
3653 break;
3654 case EM_IA_64:
3655 result = get_ia64_segment_type (p_type);
3656 break;
3657 case EM_TI_C6000:
3658 result = get_tic6x_segment_type (p_type);
3659 break;
3660 default:
3661 result = NULL;
3662 break;
3663 }
3664
3665 if (result != NULL)
3666 return result;
3667
3668 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3669 }
3670 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3671 {
3672 const char * result;
3673
3674 switch (elf_header.e_machine)
3675 {
3676 case EM_PARISC:
3677 result = get_parisc_segment_type (p_type);
3678 break;
3679 case EM_IA_64:
3680 result = get_ia64_segment_type (p_type);
3681 break;
3682 default:
3683 result = NULL;
3684 break;
3685 }
3686
3687 if (result != NULL)
3688 return result;
3689
3690 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3691 }
3692 else
3693 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3694
3695 return buff;
3696 }
3697 }
3698
3699 static const char *
3700 get_mips_section_type_name (unsigned int sh_type)
3701 {
3702 switch (sh_type)
3703 {
3704 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3705 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3706 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3707 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3708 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3709 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3710 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3711 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3712 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3713 case SHT_MIPS_RELD: return "MIPS_RELD";
3714 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3715 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3716 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3717 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3718 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3719 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3720 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3721 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3722 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3723 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3724 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3725 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3726 case SHT_MIPS_LINE: return "MIPS_LINE";
3727 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3728 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3729 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3730 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3731 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3732 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3733 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3734 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3735 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3736 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3737 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3738 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3739 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3740 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3741 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3742 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3743 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3744 default:
3745 break;
3746 }
3747 return NULL;
3748 }
3749
3750 static const char *
3751 get_parisc_section_type_name (unsigned int sh_type)
3752 {
3753 switch (sh_type)
3754 {
3755 case SHT_PARISC_EXT: return "PARISC_EXT";
3756 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3757 case SHT_PARISC_DOC: return "PARISC_DOC";
3758 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3759 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3760 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3761 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3762 default:
3763 break;
3764 }
3765 return NULL;
3766 }
3767
3768 static const char *
3769 get_ia64_section_type_name (unsigned int sh_type)
3770 {
3771 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3772 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3773 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3774
3775 switch (sh_type)
3776 {
3777 case SHT_IA_64_EXT: return "IA_64_EXT";
3778 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3779 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3780 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3781 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3782 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3783 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3784 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3785 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3786 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3787 default:
3788 break;
3789 }
3790 return NULL;
3791 }
3792
3793 static const char *
3794 get_x86_64_section_type_name (unsigned int sh_type)
3795 {
3796 switch (sh_type)
3797 {
3798 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3799 default:
3800 break;
3801 }
3802 return NULL;
3803 }
3804
3805 static const char *
3806 get_aarch64_section_type_name (unsigned int sh_type)
3807 {
3808 switch (sh_type)
3809 {
3810 case SHT_AARCH64_ATTRIBUTES:
3811 return "AARCH64_ATTRIBUTES";
3812 default:
3813 break;
3814 }
3815 return NULL;
3816 }
3817
3818 static const char *
3819 get_arm_section_type_name (unsigned int sh_type)
3820 {
3821 switch (sh_type)
3822 {
3823 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3824 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3825 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3826 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3827 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3828 default:
3829 break;
3830 }
3831 return NULL;
3832 }
3833
3834 static const char *
3835 get_tic6x_section_type_name (unsigned int sh_type)
3836 {
3837 switch (sh_type)
3838 {
3839 case SHT_C6000_UNWIND:
3840 return "C6000_UNWIND";
3841 case SHT_C6000_PREEMPTMAP:
3842 return "C6000_PREEMPTMAP";
3843 case SHT_C6000_ATTRIBUTES:
3844 return "C6000_ATTRIBUTES";
3845 case SHT_TI_ICODE:
3846 return "TI_ICODE";
3847 case SHT_TI_XREF:
3848 return "TI_XREF";
3849 case SHT_TI_HANDLER:
3850 return "TI_HANDLER";
3851 case SHT_TI_INITINFO:
3852 return "TI_INITINFO";
3853 case SHT_TI_PHATTRS:
3854 return "TI_PHATTRS";
3855 default:
3856 break;
3857 }
3858 return NULL;
3859 }
3860
3861 static const char *
3862 get_msp430x_section_type_name (unsigned int sh_type)
3863 {
3864 switch (sh_type)
3865 {
3866 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3867 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3868 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3869 default: return NULL;
3870 }
3871 }
3872
3873 static const char *
3874 get_v850_section_type_name (unsigned int sh_type)
3875 {
3876 switch (sh_type)
3877 {
3878 case SHT_V850_SCOMMON: return "V850 Small Common";
3879 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3880 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3881 case SHT_RENESAS_IOP: return "RENESAS IOP";
3882 case SHT_RENESAS_INFO: return "RENESAS INFO";
3883 default: return NULL;
3884 }
3885 }
3886
3887 static const char *
3888 get_section_type_name (unsigned int sh_type)
3889 {
3890 static char buff[32];
3891 const char * result;
3892
3893 switch (sh_type)
3894 {
3895 case SHT_NULL: return "NULL";
3896 case SHT_PROGBITS: return "PROGBITS";
3897 case SHT_SYMTAB: return "SYMTAB";
3898 case SHT_STRTAB: return "STRTAB";
3899 case SHT_RELA: return "RELA";
3900 case SHT_HASH: return "HASH";
3901 case SHT_DYNAMIC: return "DYNAMIC";
3902 case SHT_NOTE: return "NOTE";
3903 case SHT_NOBITS: return "NOBITS";
3904 case SHT_REL: return "REL";
3905 case SHT_SHLIB: return "SHLIB";
3906 case SHT_DYNSYM: return "DYNSYM";
3907 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3908 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3909 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3910 case SHT_GNU_HASH: return "GNU_HASH";
3911 case SHT_GROUP: return "GROUP";
3912 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3913 case SHT_GNU_verdef: return "VERDEF";
3914 case SHT_GNU_verneed: return "VERNEED";
3915 case SHT_GNU_versym: return "VERSYM";
3916 case 0x6ffffff0: return "VERSYM";
3917 case 0x6ffffffc: return "VERDEF";
3918 case 0x7ffffffd: return "AUXILIARY";
3919 case 0x7fffffff: return "FILTER";
3920 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3921
3922 default:
3923 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3924 {
3925 switch (elf_header.e_machine)
3926 {
3927 case EM_MIPS:
3928 case EM_MIPS_RS3_LE:
3929 result = get_mips_section_type_name (sh_type);
3930 break;
3931 case EM_PARISC:
3932 result = get_parisc_section_type_name (sh_type);
3933 break;
3934 case EM_IA_64:
3935 result = get_ia64_section_type_name (sh_type);
3936 break;
3937 case EM_X86_64:
3938 case EM_L1OM:
3939 case EM_K1OM:
3940 result = get_x86_64_section_type_name (sh_type);
3941 break;
3942 case EM_AARCH64:
3943 result = get_aarch64_section_type_name (sh_type);
3944 break;
3945 case EM_ARM:
3946 result = get_arm_section_type_name (sh_type);
3947 break;
3948 case EM_TI_C6000:
3949 result = get_tic6x_section_type_name (sh_type);
3950 break;
3951 case EM_MSP430:
3952 result = get_msp430x_section_type_name (sh_type);
3953 break;
3954 case EM_V800:
3955 case EM_V850:
3956 case EM_CYGNUS_V850:
3957 result = get_v850_section_type_name (sh_type);
3958 break;
3959 default:
3960 result = NULL;
3961 break;
3962 }
3963
3964 if (result != NULL)
3965 return result;
3966
3967 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
3968 }
3969 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3970 {
3971 switch (elf_header.e_machine)
3972 {
3973 case EM_IA_64:
3974 result = get_ia64_section_type_name (sh_type);
3975 break;
3976 default:
3977 result = NULL;
3978 break;
3979 }
3980
3981 if (result != NULL)
3982 return result;
3983
3984 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
3985 }
3986 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3987 {
3988 switch (elf_header.e_machine)
3989 {
3990 case EM_V800:
3991 case EM_V850:
3992 case EM_CYGNUS_V850:
3993 result = get_v850_section_type_name (sh_type);
3994 break;
3995 default:
3996 result = NULL;
3997 break;
3998 }
3999
4000 if (result != NULL)
4001 return result;
4002
4003 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4004 }
4005 else
4006 /* This message is probably going to be displayed in a 15
4007 character wide field, so put the hex value first. */
4008 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4009
4010 return buff;
4011 }
4012 }
4013
4014 #define OPTION_DEBUG_DUMP 512
4015 #define OPTION_DYN_SYMS 513
4016 #define OPTION_DWARF_DEPTH 514
4017 #define OPTION_DWARF_START 515
4018 #define OPTION_DWARF_CHECK 516
4019
4020 static struct option options[] =
4021 {
4022 {"all", no_argument, 0, 'a'},
4023 {"file-header", no_argument, 0, 'h'},
4024 {"program-headers", no_argument, 0, 'l'},
4025 {"headers", no_argument, 0, 'e'},
4026 {"histogram", no_argument, 0, 'I'},
4027 {"segments", no_argument, 0, 'l'},
4028 {"sections", no_argument, 0, 'S'},
4029 {"section-headers", no_argument, 0, 'S'},
4030 {"section-groups", no_argument, 0, 'g'},
4031 {"section-details", no_argument, 0, 't'},
4032 {"full-section-name",no_argument, 0, 'N'},
4033 {"symbols", no_argument, 0, 's'},
4034 {"syms", no_argument, 0, 's'},
4035 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4036 {"relocs", no_argument, 0, 'r'},
4037 {"notes", no_argument, 0, 'n'},
4038 {"dynamic", no_argument, 0, 'd'},
4039 {"arch-specific", no_argument, 0, 'A'},
4040 {"version-info", no_argument, 0, 'V'},
4041 {"use-dynamic", no_argument, 0, 'D'},
4042 {"unwind", no_argument, 0, 'u'},
4043 {"archive-index", no_argument, 0, 'c'},
4044 {"hex-dump", required_argument, 0, 'x'},
4045 {"relocated-dump", required_argument, 0, 'R'},
4046 {"string-dump", required_argument, 0, 'p'},
4047 {"decompress", no_argument, 0, 'z'},
4048 #ifdef SUPPORT_DISASSEMBLY
4049 {"instruction-dump", required_argument, 0, 'i'},
4050 #endif
4051 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4052
4053 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4054 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4055 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4056
4057 {"version", no_argument, 0, 'v'},
4058 {"wide", no_argument, 0, 'W'},
4059 {"help", no_argument, 0, 'H'},
4060 {0, no_argument, 0, 0}
4061 };
4062
4063 static void
4064 usage (FILE * stream)
4065 {
4066 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4067 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4068 fprintf (stream, _(" Options are:\n\
4069 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4070 -h --file-header Display the ELF file header\n\
4071 -l --program-headers Display the program headers\n\
4072 --segments An alias for --program-headers\n\
4073 -S --section-headers Display the sections' header\n\
4074 --sections An alias for --section-headers\n\
4075 -g --section-groups Display the section groups\n\
4076 -t --section-details Display the section details\n\
4077 -e --headers Equivalent to: -h -l -S\n\
4078 -s --syms Display the symbol table\n\
4079 --symbols An alias for --syms\n\
4080 --dyn-syms Display the dynamic symbol table\n\
4081 -n --notes Display the core notes (if present)\n\
4082 -r --relocs Display the relocations (if present)\n\
4083 -u --unwind Display the unwind info (if present)\n\
4084 -d --dynamic Display the dynamic section (if present)\n\
4085 -V --version-info Display the version sections (if present)\n\
4086 -A --arch-specific Display architecture specific information (if any)\n\
4087 -c --archive-index Display the symbol/file index in an archive\n\
4088 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4089 -x --hex-dump=<number|name>\n\
4090 Dump the contents of section <number|name> as bytes\n\
4091 -p --string-dump=<number|name>\n\
4092 Dump the contents of section <number|name> as strings\n\
4093 -R --relocated-dump=<number|name>\n\
4094 Dump the contents of section <number|name> as relocated bytes\n\
4095 -z --decompress Decompress section before dumping it\n\
4096 -w[lLiaprmfFsoRt] or\n\
4097 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4098 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4099 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4100 =addr,=cu_index]\n\
4101 Display the contents of DWARF2 debug sections\n"));
4102 fprintf (stream, _("\
4103 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4104 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4105 or deeper\n"));
4106 #ifdef SUPPORT_DISASSEMBLY
4107 fprintf (stream, _("\
4108 -i --instruction-dump=<number|name>\n\
4109 Disassemble the contents of section <number|name>\n"));
4110 #endif
4111 fprintf (stream, _("\
4112 -I --histogram Display histogram of bucket list lengths\n\
4113 -W --wide Allow output width to exceed 80 characters\n\
4114 @<file> Read options from <file>\n\
4115 -H --help Display this information\n\
4116 -v --version Display the version number of readelf\n"));
4117
4118 if (REPORT_BUGS_TO[0] && stream == stdout)
4119 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4120
4121 exit (stream == stdout ? 0 : 1);
4122 }
4123
4124 /* Record the fact that the user wants the contents of section number
4125 SECTION to be displayed using the method(s) encoded as flags bits
4126 in TYPE. Note, TYPE can be zero if we are creating the array for
4127 the first time. */
4128
4129 static void
4130 request_dump_bynumber (unsigned int section, dump_type type)
4131 {
4132 if (section >= num_dump_sects)
4133 {
4134 dump_type * new_dump_sects;
4135
4136 new_dump_sects = (dump_type *) calloc (section + 1,
4137 sizeof (* dump_sects));
4138
4139 if (new_dump_sects == NULL)
4140 error (_("Out of memory allocating dump request table.\n"));
4141 else
4142 {
4143 /* Copy current flag settings. */
4144 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4145
4146 free (dump_sects);
4147
4148 dump_sects = new_dump_sects;
4149 num_dump_sects = section + 1;
4150 }
4151 }
4152
4153 if (dump_sects)
4154 dump_sects[section] |= type;
4155
4156 return;
4157 }
4158
4159 /* Request a dump by section name. */
4160
4161 static void
4162 request_dump_byname (const char * section, dump_type type)
4163 {
4164 struct dump_list_entry * new_request;
4165
4166 new_request = (struct dump_list_entry *)
4167 malloc (sizeof (struct dump_list_entry));
4168 if (!new_request)
4169 error (_("Out of memory allocating dump request table.\n"));
4170
4171 new_request->name = strdup (section);
4172 if (!new_request->name)
4173 error (_("Out of memory allocating dump request table.\n"));
4174
4175 new_request->type = type;
4176
4177 new_request->next = dump_sects_byname;
4178 dump_sects_byname = new_request;
4179 }
4180
4181 static inline void
4182 request_dump (dump_type type)
4183 {
4184 int section;
4185 char * cp;
4186
4187 do_dump++;
4188 section = strtoul (optarg, & cp, 0);
4189
4190 if (! *cp && section >= 0)
4191 request_dump_bynumber (section, type);
4192 else
4193 request_dump_byname (optarg, type);
4194 }
4195
4196
4197 static void
4198 parse_args (int argc, char ** argv)
4199 {
4200 int c;
4201
4202 if (argc < 2)
4203 usage (stderr);
4204
4205 while ((c = getopt_long
4206 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4207 {
4208 switch (c)
4209 {
4210 case 0:
4211 /* Long options. */
4212 break;
4213 case 'H':
4214 usage (stdout);
4215 break;
4216
4217 case 'a':
4218 do_syms++;
4219 do_reloc++;
4220 do_unwind++;
4221 do_dynamic++;
4222 do_header++;
4223 do_sections++;
4224 do_section_groups++;
4225 do_segments++;
4226 do_version++;
4227 do_histogram++;
4228 do_arch++;
4229 do_notes++;
4230 break;
4231 case 'g':
4232 do_section_groups++;
4233 break;
4234 case 't':
4235 case 'N':
4236 do_sections++;
4237 do_section_details++;
4238 break;
4239 case 'e':
4240 do_header++;
4241 do_sections++;
4242 do_segments++;
4243 break;
4244 case 'A':
4245 do_arch++;
4246 break;
4247 case 'D':
4248 do_using_dynamic++;
4249 break;
4250 case 'r':
4251 do_reloc++;
4252 break;
4253 case 'u':
4254 do_unwind++;
4255 break;
4256 case 'h':
4257 do_header++;
4258 break;
4259 case 'l':
4260 do_segments++;
4261 break;
4262 case 's':
4263 do_syms++;
4264 break;
4265 case 'S':
4266 do_sections++;
4267 break;
4268 case 'd':
4269 do_dynamic++;
4270 break;
4271 case 'I':
4272 do_histogram++;
4273 break;
4274 case 'n':
4275 do_notes++;
4276 break;
4277 case 'c':
4278 do_archive_index++;
4279 break;
4280 case 'x':
4281 request_dump (HEX_DUMP);
4282 break;
4283 case 'p':
4284 request_dump (STRING_DUMP);
4285 break;
4286 case 'R':
4287 request_dump (RELOC_DUMP);
4288 break;
4289 case 'z':
4290 decompress_dumps++;
4291 break;
4292 case 'w':
4293 do_dump++;
4294 if (optarg == 0)
4295 {
4296 do_debugging = 1;
4297 dwarf_select_sections_all ();
4298 }
4299 else
4300 {
4301 do_debugging = 0;
4302 dwarf_select_sections_by_letters (optarg);
4303 }
4304 break;
4305 case OPTION_DEBUG_DUMP:
4306 do_dump++;
4307 if (optarg == 0)
4308 do_debugging = 1;
4309 else
4310 {
4311 do_debugging = 0;
4312 dwarf_select_sections_by_names (optarg);
4313 }
4314 break;
4315 case OPTION_DWARF_DEPTH:
4316 {
4317 char *cp;
4318
4319 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4320 }
4321 break;
4322 case OPTION_DWARF_START:
4323 {
4324 char *cp;
4325
4326 dwarf_start_die = strtoul (optarg, & cp, 0);
4327 }
4328 break;
4329 case OPTION_DWARF_CHECK:
4330 dwarf_check = 1;
4331 break;
4332 case OPTION_DYN_SYMS:
4333 do_dyn_syms++;
4334 break;
4335 #ifdef SUPPORT_DISASSEMBLY
4336 case 'i':
4337 request_dump (DISASS_DUMP);
4338 break;
4339 #endif
4340 case 'v':
4341 print_version (program_name);
4342 break;
4343 case 'V':
4344 do_version++;
4345 break;
4346 case 'W':
4347 do_wide++;
4348 break;
4349 default:
4350 /* xgettext:c-format */
4351 error (_("Invalid option '-%c'\n"), c);
4352 /* Drop through. */
4353 case '?':
4354 usage (stderr);
4355 }
4356 }
4357
4358 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4359 && !do_segments && !do_header && !do_dump && !do_version
4360 && !do_histogram && !do_debugging && !do_arch && !do_notes
4361 && !do_section_groups && !do_archive_index
4362 && !do_dyn_syms)
4363 usage (stderr);
4364 }
4365
4366 static const char *
4367 get_elf_class (unsigned int elf_class)
4368 {
4369 static char buff[32];
4370
4371 switch (elf_class)
4372 {
4373 case ELFCLASSNONE: return _("none");
4374 case ELFCLASS32: return "ELF32";
4375 case ELFCLASS64: return "ELF64";
4376 default:
4377 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4378 return buff;
4379 }
4380 }
4381
4382 static const char *
4383 get_data_encoding (unsigned int encoding)
4384 {
4385 static char buff[32];
4386
4387 switch (encoding)
4388 {
4389 case ELFDATANONE: return _("none");
4390 case ELFDATA2LSB: return _("2's complement, little endian");
4391 case ELFDATA2MSB: return _("2's complement, big endian");
4392 default:
4393 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4394 return buff;
4395 }
4396 }
4397
4398 /* Decode the data held in 'elf_header'. */
4399
4400 static int
4401 process_file_header (void)
4402 {
4403 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4404 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4405 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4406 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4407 {
4408 error
4409 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4410 return 0;
4411 }
4412
4413 init_dwarf_regnames (elf_header.e_machine);
4414
4415 if (do_header)
4416 {
4417 int i;
4418
4419 printf (_("ELF Header:\n"));
4420 printf (_(" Magic: "));
4421 for (i = 0; i < EI_NIDENT; i++)
4422 printf ("%2.2x ", elf_header.e_ident[i]);
4423 printf ("\n");
4424 printf (_(" Class: %s\n"),
4425 get_elf_class (elf_header.e_ident[EI_CLASS]));
4426 printf (_(" Data: %s\n"),
4427 get_data_encoding (elf_header.e_ident[EI_DATA]));
4428 printf (_(" Version: %d %s\n"),
4429 elf_header.e_ident[EI_VERSION],
4430 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4431 ? "(current)"
4432 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4433 ? _("<unknown: %lx>")
4434 : "")));
4435 printf (_(" OS/ABI: %s\n"),
4436 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4437 printf (_(" ABI Version: %d\n"),
4438 elf_header.e_ident[EI_ABIVERSION]);
4439 printf (_(" Type: %s\n"),
4440 get_file_type (elf_header.e_type));
4441 printf (_(" Machine: %s\n"),
4442 get_machine_name (elf_header.e_machine));
4443 printf (_(" Version: 0x%lx\n"),
4444 (unsigned long) elf_header.e_version);
4445
4446 printf (_(" Entry point address: "));
4447 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4448 printf (_("\n Start of program headers: "));
4449 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4450 printf (_(" (bytes into file)\n Start of section headers: "));
4451 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4452 printf (_(" (bytes into file)\n"));
4453
4454 printf (_(" Flags: 0x%lx%s\n"),
4455 (unsigned long) elf_header.e_flags,
4456 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4457 printf (_(" Size of this header: %ld (bytes)\n"),
4458 (long) elf_header.e_ehsize);
4459 printf (_(" Size of program headers: %ld (bytes)\n"),
4460 (long) elf_header.e_phentsize);
4461 printf (_(" Number of program headers: %ld"),
4462 (long) elf_header.e_phnum);
4463 if (section_headers != NULL
4464 && elf_header.e_phnum == PN_XNUM
4465 && section_headers[0].sh_info != 0)
4466 printf (" (%ld)", (long) section_headers[0].sh_info);
4467 putc ('\n', stdout);
4468 printf (_(" Size of section headers: %ld (bytes)\n"),
4469 (long) elf_header.e_shentsize);
4470 printf (_(" Number of section headers: %ld"),
4471 (long) elf_header.e_shnum);
4472 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4473 printf (" (%ld)", (long) section_headers[0].sh_size);
4474 putc ('\n', stdout);
4475 printf (_(" Section header string table index: %ld"),
4476 (long) elf_header.e_shstrndx);
4477 if (section_headers != NULL
4478 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4479 printf (" (%u)", section_headers[0].sh_link);
4480 else if (elf_header.e_shstrndx != SHN_UNDEF
4481 && elf_header.e_shstrndx >= elf_header.e_shnum)
4482 printf (_(" <corrupt: out of range>"));
4483 putc ('\n', stdout);
4484 }
4485
4486 if (section_headers != NULL)
4487 {
4488 if (elf_header.e_phnum == PN_XNUM
4489 && section_headers[0].sh_info != 0)
4490 elf_header.e_phnum = section_headers[0].sh_info;
4491 if (elf_header.e_shnum == SHN_UNDEF)
4492 elf_header.e_shnum = section_headers[0].sh_size;
4493 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4494 elf_header.e_shstrndx = section_headers[0].sh_link;
4495 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4496 elf_header.e_shstrndx = SHN_UNDEF;
4497 free (section_headers);
4498 section_headers = NULL;
4499 }
4500
4501 return 1;
4502 }
4503
4504 static bfd_boolean
4505 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4506 {
4507 Elf32_External_Phdr * phdrs;
4508 Elf32_External_Phdr * external;
4509 Elf_Internal_Phdr * internal;
4510 unsigned int i;
4511 unsigned int size = elf_header.e_phentsize;
4512 unsigned int num = elf_header.e_phnum;
4513
4514 /* PR binutils/17531: Cope with unexpected section header sizes. */
4515 if (size == 0 || num == 0)
4516 return FALSE;
4517 if (size < sizeof * phdrs)
4518 {
4519 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4520 return FALSE;
4521 }
4522 if (size > sizeof * phdrs)
4523 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4524
4525 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4526 size, num, _("program headers"));
4527 if (phdrs == NULL)
4528 return FALSE;
4529
4530 for (i = 0, internal = pheaders, external = phdrs;
4531 i < elf_header.e_phnum;
4532 i++, internal++, external++)
4533 {
4534 internal->p_type = BYTE_GET (external->p_type);
4535 internal->p_offset = BYTE_GET (external->p_offset);
4536 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4537 internal->p_paddr = BYTE_GET (external->p_paddr);
4538 internal->p_filesz = BYTE_GET (external->p_filesz);
4539 internal->p_memsz = BYTE_GET (external->p_memsz);
4540 internal->p_flags = BYTE_GET (external->p_flags);
4541 internal->p_align = BYTE_GET (external->p_align);
4542 }
4543
4544 free (phdrs);
4545 return TRUE;
4546 }
4547
4548 static bfd_boolean
4549 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4550 {
4551 Elf64_External_Phdr * phdrs;
4552 Elf64_External_Phdr * external;
4553 Elf_Internal_Phdr * internal;
4554 unsigned int i;
4555 unsigned int size = elf_header.e_phentsize;
4556 unsigned int num = elf_header.e_phnum;
4557
4558 /* PR binutils/17531: Cope with unexpected section header sizes. */
4559 if (size == 0 || num == 0)
4560 return FALSE;
4561 if (size < sizeof * phdrs)
4562 {
4563 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4564 return FALSE;
4565 }
4566 if (size > sizeof * phdrs)
4567 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4568
4569 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4570 size, num, _("program headers"));
4571 if (!phdrs)
4572 return FALSE;
4573
4574 for (i = 0, internal = pheaders, external = phdrs;
4575 i < elf_header.e_phnum;
4576 i++, internal++, external++)
4577 {
4578 internal->p_type = BYTE_GET (external->p_type);
4579 internal->p_flags = BYTE_GET (external->p_flags);
4580 internal->p_offset = BYTE_GET (external->p_offset);
4581 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4582 internal->p_paddr = BYTE_GET (external->p_paddr);
4583 internal->p_filesz = BYTE_GET (external->p_filesz);
4584 internal->p_memsz = BYTE_GET (external->p_memsz);
4585 internal->p_align = BYTE_GET (external->p_align);
4586 }
4587
4588 free (phdrs);
4589 return TRUE;
4590 }
4591
4592 /* Returns 1 if the program headers were read into `program_headers'. */
4593
4594 static int
4595 get_program_headers (FILE * file)
4596 {
4597 Elf_Internal_Phdr * phdrs;
4598
4599 /* Check cache of prior read. */
4600 if (program_headers != NULL)
4601 return 1;
4602
4603 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4604 sizeof (Elf_Internal_Phdr));
4605
4606 if (phdrs == NULL)
4607 {
4608 error (_("Out of memory reading %u program headers\n"),
4609 elf_header.e_phnum);
4610 return 0;
4611 }
4612
4613 if (is_32bit_elf
4614 ? get_32bit_program_headers (file, phdrs)
4615 : get_64bit_program_headers (file, phdrs))
4616 {
4617 program_headers = phdrs;
4618 return 1;
4619 }
4620
4621 free (phdrs);
4622 return 0;
4623 }
4624
4625 /* Returns 1 if the program headers were loaded. */
4626
4627 static int
4628 process_program_headers (FILE * file)
4629 {
4630 Elf_Internal_Phdr * segment;
4631 unsigned int i;
4632
4633 if (elf_header.e_phnum == 0)
4634 {
4635 /* PR binutils/12467. */
4636 if (elf_header.e_phoff != 0)
4637 warn (_("possibly corrupt ELF header - it has a non-zero program"
4638 " header offset, but no program headers\n"));
4639 else if (do_segments)
4640 printf (_("\nThere are no program headers in this file.\n"));
4641 return 0;
4642 }
4643
4644 if (do_segments && !do_header)
4645 {
4646 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4647 printf (_("Entry point "));
4648 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4649 printf (_("\nThere are %d program headers, starting at offset "),
4650 elf_header.e_phnum);
4651 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4652 printf ("\n");
4653 }
4654
4655 if (! get_program_headers (file))
4656 return 0;
4657
4658 if (do_segments)
4659 {
4660 if (elf_header.e_phnum > 1)
4661 printf (_("\nProgram Headers:\n"));
4662 else
4663 printf (_("\nProgram Headers:\n"));
4664
4665 if (is_32bit_elf)
4666 printf
4667 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4668 else if (do_wide)
4669 printf
4670 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4671 else
4672 {
4673 printf
4674 (_(" Type Offset VirtAddr PhysAddr\n"));
4675 printf
4676 (_(" FileSiz MemSiz Flags Align\n"));
4677 }
4678 }
4679
4680 dynamic_addr = 0;
4681 dynamic_size = 0;
4682
4683 for (i = 0, segment = program_headers;
4684 i < elf_header.e_phnum;
4685 i++, segment++)
4686 {
4687 if (do_segments)
4688 {
4689 printf (" %-14.14s ", get_segment_type (segment->p_type));
4690
4691 if (is_32bit_elf)
4692 {
4693 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4694 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4695 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4696 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4697 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4698 printf ("%c%c%c ",
4699 (segment->p_flags & PF_R ? 'R' : ' '),
4700 (segment->p_flags & PF_W ? 'W' : ' '),
4701 (segment->p_flags & PF_X ? 'E' : ' '));
4702 printf ("%#lx", (unsigned long) segment->p_align);
4703 }
4704 else if (do_wide)
4705 {
4706 if ((unsigned long) segment->p_offset == segment->p_offset)
4707 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4708 else
4709 {
4710 print_vma (segment->p_offset, FULL_HEX);
4711 putchar (' ');
4712 }
4713
4714 print_vma (segment->p_vaddr, FULL_HEX);
4715 putchar (' ');
4716 print_vma (segment->p_paddr, FULL_HEX);
4717 putchar (' ');
4718
4719 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4720 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4721 else
4722 {
4723 print_vma (segment->p_filesz, FULL_HEX);
4724 putchar (' ');
4725 }
4726
4727 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4728 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4729 else
4730 {
4731 print_vma (segment->p_memsz, FULL_HEX);
4732 }
4733
4734 printf (" %c%c%c ",
4735 (segment->p_flags & PF_R ? 'R' : ' '),
4736 (segment->p_flags & PF_W ? 'W' : ' '),
4737 (segment->p_flags & PF_X ? 'E' : ' '));
4738
4739 if ((unsigned long) segment->p_align == segment->p_align)
4740 printf ("%#lx", (unsigned long) segment->p_align);
4741 else
4742 {
4743 print_vma (segment->p_align, PREFIX_HEX);
4744 }
4745 }
4746 else
4747 {
4748 print_vma (segment->p_offset, FULL_HEX);
4749 putchar (' ');
4750 print_vma (segment->p_vaddr, FULL_HEX);
4751 putchar (' ');
4752 print_vma (segment->p_paddr, FULL_HEX);
4753 printf ("\n ");
4754 print_vma (segment->p_filesz, FULL_HEX);
4755 putchar (' ');
4756 print_vma (segment->p_memsz, FULL_HEX);
4757 printf (" %c%c%c ",
4758 (segment->p_flags & PF_R ? 'R' : ' '),
4759 (segment->p_flags & PF_W ? 'W' : ' '),
4760 (segment->p_flags & PF_X ? 'E' : ' '));
4761 print_vma (segment->p_align, HEX);
4762 }
4763 }
4764
4765 if (do_segments)
4766 putc ('\n', stdout);
4767
4768 switch (segment->p_type)
4769 {
4770 case PT_DYNAMIC:
4771 if (dynamic_addr)
4772 error (_("more than one dynamic segment\n"));
4773
4774 /* By default, assume that the .dynamic section is the first
4775 section in the DYNAMIC segment. */
4776 dynamic_addr = segment->p_offset;
4777 dynamic_size = segment->p_filesz;
4778 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4779 if (dynamic_addr + dynamic_size >= current_file_size)
4780 {
4781 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4782 dynamic_addr = dynamic_size = 0;
4783 }
4784
4785 /* Try to locate the .dynamic section. If there is
4786 a section header table, we can easily locate it. */
4787 if (section_headers != NULL)
4788 {
4789 Elf_Internal_Shdr * sec;
4790
4791 sec = find_section (".dynamic");
4792 if (sec == NULL || sec->sh_size == 0)
4793 {
4794 /* A corresponding .dynamic section is expected, but on
4795 IA-64/OpenVMS it is OK for it to be missing. */
4796 if (!is_ia64_vms ())
4797 error (_("no .dynamic section in the dynamic segment\n"));
4798 break;
4799 }
4800
4801 if (sec->sh_type == SHT_NOBITS)
4802 {
4803 dynamic_size = 0;
4804 break;
4805 }
4806
4807 dynamic_addr = sec->sh_offset;
4808 dynamic_size = sec->sh_size;
4809
4810 if (dynamic_addr < segment->p_offset
4811 || dynamic_addr > segment->p_offset + segment->p_filesz)
4812 warn (_("the .dynamic section is not contained"
4813 " within the dynamic segment\n"));
4814 else if (dynamic_addr > segment->p_offset)
4815 warn (_("the .dynamic section is not the first section"
4816 " in the dynamic segment.\n"));
4817 }
4818 break;
4819
4820 case PT_INTERP:
4821 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4822 SEEK_SET))
4823 error (_("Unable to find program interpreter name\n"));
4824 else
4825 {
4826 char fmt [32];
4827 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4828
4829 if (ret >= (int) sizeof (fmt) || ret < 0)
4830 error (_("Internal error: failed to create format string to display program interpreter\n"));
4831
4832 program_interpreter[0] = 0;
4833 if (fscanf (file, fmt, program_interpreter) <= 0)
4834 error (_("Unable to read program interpreter name\n"));
4835
4836 if (do_segments)
4837 printf (_(" [Requesting program interpreter: %s]\n"),
4838 program_interpreter);
4839 }
4840 break;
4841 }
4842 }
4843
4844 if (do_segments && section_headers != NULL && string_table != NULL)
4845 {
4846 printf (_("\n Section to Segment mapping:\n"));
4847 printf (_(" Segment Sections...\n"));
4848
4849 for (i = 0; i < elf_header.e_phnum; i++)
4850 {
4851 unsigned int j;
4852 Elf_Internal_Shdr * section;
4853
4854 segment = program_headers + i;
4855 section = section_headers + 1;
4856
4857 printf (" %2.2d ", i);
4858
4859 for (j = 1; j < elf_header.e_shnum; j++, section++)
4860 {
4861 if (!ELF_TBSS_SPECIAL (section, segment)
4862 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4863 printf ("%s ", printable_section_name (section));
4864 }
4865
4866 putc ('\n',stdout);
4867 }
4868 }
4869
4870 return 1;
4871 }
4872
4873
4874 /* Find the file offset corresponding to VMA by using the program headers. */
4875
4876 static long
4877 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4878 {
4879 Elf_Internal_Phdr * seg;
4880
4881 if (! get_program_headers (file))
4882 {
4883 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4884 return (long) vma;
4885 }
4886
4887 for (seg = program_headers;
4888 seg < program_headers + elf_header.e_phnum;
4889 ++seg)
4890 {
4891 if (seg->p_type != PT_LOAD)
4892 continue;
4893
4894 if (vma >= (seg->p_vaddr & -seg->p_align)
4895 && vma + size <= seg->p_vaddr + seg->p_filesz)
4896 return vma - seg->p_vaddr + seg->p_offset;
4897 }
4898
4899 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4900 (unsigned long) vma);
4901 return (long) vma;
4902 }
4903
4904
4905 /* Allocate memory and load the sections headers into the global pointer
4906 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4907 generate any error messages if the load fails. */
4908
4909 static bfd_boolean
4910 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4911 {
4912 Elf32_External_Shdr * shdrs;
4913 Elf_Internal_Shdr * internal;
4914 unsigned int i;
4915 unsigned int size = elf_header.e_shentsize;
4916 unsigned int num = probe ? 1 : elf_header.e_shnum;
4917
4918 /* PR binutils/17531: Cope with unexpected section header sizes. */
4919 if (size == 0 || num == 0)
4920 return FALSE;
4921 if (size < sizeof * shdrs)
4922 {
4923 if (! probe)
4924 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4925 return FALSE;
4926 }
4927 if (!probe && size > sizeof * shdrs)
4928 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4929
4930 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4931 size, num,
4932 probe ? NULL : _("section headers"));
4933 if (shdrs == NULL)
4934 return FALSE;
4935
4936 if (section_headers != NULL)
4937 free (section_headers);
4938 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4939 sizeof (Elf_Internal_Shdr));
4940 if (section_headers == NULL)
4941 {
4942 if (!probe)
4943 error (_("Out of memory reading %u section headers\n"), num);
4944 return FALSE;
4945 }
4946
4947 for (i = 0, internal = section_headers;
4948 i < num;
4949 i++, internal++)
4950 {
4951 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4952 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4953 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4954 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4955 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4956 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4957 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4958 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4959 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4960 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4961 }
4962
4963 free (shdrs);
4964 return TRUE;
4965 }
4966
4967 static bfd_boolean
4968 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4969 {
4970 Elf64_External_Shdr * shdrs;
4971 Elf_Internal_Shdr * internal;
4972 unsigned int i;
4973 unsigned int size = elf_header.e_shentsize;
4974 unsigned int num = probe ? 1 : elf_header.e_shnum;
4975
4976 /* PR binutils/17531: Cope with unexpected section header sizes. */
4977 if (size == 0 || num == 0)
4978 return FALSE;
4979 if (size < sizeof * shdrs)
4980 {
4981 if (! probe)
4982 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4983 return FALSE;
4984 }
4985 if (! probe && size > sizeof * shdrs)
4986 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4987
4988 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4989 size, num,
4990 probe ? NULL : _("section headers"));
4991 if (shdrs == NULL)
4992 return FALSE;
4993
4994 if (section_headers != NULL)
4995 free (section_headers);
4996 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4997 sizeof (Elf_Internal_Shdr));
4998 if (section_headers == NULL)
4999 {
5000 if (! probe)
5001 error (_("Out of memory reading %u section headers\n"), num);
5002 return FALSE;
5003 }
5004
5005 for (i = 0, internal = section_headers;
5006 i < num;
5007 i++, internal++)
5008 {
5009 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5010 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5011 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5012 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5013 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5014 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5015 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5016 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5017 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5018 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5019 }
5020
5021 free (shdrs);
5022 return TRUE;
5023 }
5024
5025 static Elf_Internal_Sym *
5026 get_32bit_elf_symbols (FILE * file,
5027 Elf_Internal_Shdr * section,
5028 unsigned long * num_syms_return)
5029 {
5030 unsigned long number = 0;
5031 Elf32_External_Sym * esyms = NULL;
5032 Elf_External_Sym_Shndx * shndx = NULL;
5033 Elf_Internal_Sym * isyms = NULL;
5034 Elf_Internal_Sym * psym;
5035 unsigned int j;
5036
5037 if (section->sh_size == 0)
5038 {
5039 if (num_syms_return != NULL)
5040 * num_syms_return = 0;
5041 return NULL;
5042 }
5043
5044 /* Run some sanity checks first. */
5045 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5046 {
5047 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5048 printable_section_name (section), (unsigned long) section->sh_entsize);
5049 goto exit_point;
5050 }
5051
5052 if (section->sh_size > current_file_size)
5053 {
5054 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5055 printable_section_name (section), (unsigned long) section->sh_size);
5056 goto exit_point;
5057 }
5058
5059 number = section->sh_size / section->sh_entsize;
5060
5061 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5062 {
5063 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5064 (unsigned long) section->sh_size,
5065 printable_section_name (section),
5066 (unsigned long) section->sh_entsize);
5067 goto exit_point;
5068 }
5069
5070 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5071 section->sh_size, _("symbols"));
5072 if (esyms == NULL)
5073 goto exit_point;
5074
5075 {
5076 elf_section_list * entry;
5077
5078 shndx = NULL;
5079 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5080 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5081 {
5082 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5083 entry->hdr->sh_offset,
5084 1, entry->hdr->sh_size,
5085 _("symbol table section indicies"));
5086 if (shndx == NULL)
5087 goto exit_point;
5088 /* PR17531: file: heap-buffer-overflow */
5089 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5090 {
5091 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5092 printable_section_name (entry->hdr),
5093 (unsigned long) entry->hdr->sh_size,
5094 (unsigned long) section->sh_size);
5095 goto exit_point;
5096 }
5097 }
5098 }
5099
5100 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5101
5102 if (isyms == NULL)
5103 {
5104 error (_("Out of memory reading %lu symbols\n"),
5105 (unsigned long) number);
5106 goto exit_point;
5107 }
5108
5109 for (j = 0, psym = isyms; j < number; j++, psym++)
5110 {
5111 psym->st_name = BYTE_GET (esyms[j].st_name);
5112 psym->st_value = BYTE_GET (esyms[j].st_value);
5113 psym->st_size = BYTE_GET (esyms[j].st_size);
5114 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5115 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5116 psym->st_shndx
5117 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5118 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5119 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5120 psym->st_info = BYTE_GET (esyms[j].st_info);
5121 psym->st_other = BYTE_GET (esyms[j].st_other);
5122 }
5123
5124 exit_point:
5125 if (shndx != NULL)
5126 free (shndx);
5127 if (esyms != NULL)
5128 free (esyms);
5129
5130 if (num_syms_return != NULL)
5131 * num_syms_return = isyms == NULL ? 0 : number;
5132
5133 return isyms;
5134 }
5135
5136 static Elf_Internal_Sym *
5137 get_64bit_elf_symbols (FILE * file,
5138 Elf_Internal_Shdr * section,
5139 unsigned long * num_syms_return)
5140 {
5141 unsigned long number = 0;
5142 Elf64_External_Sym * esyms = NULL;
5143 Elf_External_Sym_Shndx * shndx = NULL;
5144 Elf_Internal_Sym * isyms = NULL;
5145 Elf_Internal_Sym * psym;
5146 unsigned int j;
5147
5148 if (section->sh_size == 0)
5149 {
5150 if (num_syms_return != NULL)
5151 * num_syms_return = 0;
5152 return NULL;
5153 }
5154
5155 /* Run some sanity checks first. */
5156 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5157 {
5158 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5159 printable_section_name (section),
5160 (unsigned long) section->sh_entsize);
5161 goto exit_point;
5162 }
5163
5164 if (section->sh_size > current_file_size)
5165 {
5166 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5167 printable_section_name (section),
5168 (unsigned long) section->sh_size);
5169 goto exit_point;
5170 }
5171
5172 number = section->sh_size / section->sh_entsize;
5173
5174 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5175 {
5176 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5177 (unsigned long) section->sh_size,
5178 printable_section_name (section),
5179 (unsigned long) section->sh_entsize);
5180 goto exit_point;
5181 }
5182
5183 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5184 section->sh_size, _("symbols"));
5185 if (!esyms)
5186 goto exit_point;
5187
5188 {
5189 elf_section_list * entry;
5190
5191 shndx = NULL;
5192 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5193 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5194 {
5195 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5196 entry->hdr->sh_offset,
5197 1, entry->hdr->sh_size,
5198 _("symbol table section indicies"));
5199 if (shndx == NULL)
5200 goto exit_point;
5201 /* PR17531: file: heap-buffer-overflow */
5202 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5203 {
5204 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5205 printable_section_name (entry->hdr),
5206 (unsigned long) entry->hdr->sh_size,
5207 (unsigned long) section->sh_size);
5208 goto exit_point;
5209 }
5210 }
5211 }
5212
5213 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5214
5215 if (isyms == NULL)
5216 {
5217 error (_("Out of memory reading %lu symbols\n"),
5218 (unsigned long) number);
5219 goto exit_point;
5220 }
5221
5222 for (j = 0, psym = isyms; j < number; j++, psym++)
5223 {
5224 psym->st_name = BYTE_GET (esyms[j].st_name);
5225 psym->st_info = BYTE_GET (esyms[j].st_info);
5226 psym->st_other = BYTE_GET (esyms[j].st_other);
5227 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5228
5229 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5230 psym->st_shndx
5231 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5232 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5233 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5234
5235 psym->st_value = BYTE_GET (esyms[j].st_value);
5236 psym->st_size = BYTE_GET (esyms[j].st_size);
5237 }
5238
5239 exit_point:
5240 if (shndx != NULL)
5241 free (shndx);
5242 if (esyms != NULL)
5243 free (esyms);
5244
5245 if (num_syms_return != NULL)
5246 * num_syms_return = isyms == NULL ? 0 : number;
5247
5248 return isyms;
5249 }
5250
5251 static const char *
5252 get_elf_section_flags (bfd_vma sh_flags)
5253 {
5254 static char buff[1024];
5255 char * p = buff;
5256 int field_size = is_32bit_elf ? 8 : 16;
5257 int sindex;
5258 int size = sizeof (buff) - (field_size + 4 + 1);
5259 bfd_vma os_flags = 0;
5260 bfd_vma proc_flags = 0;
5261 bfd_vma unknown_flags = 0;
5262 static const struct
5263 {
5264 const char * str;
5265 int len;
5266 }
5267 flags [] =
5268 {
5269 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5270 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5271 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5272 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5273 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5274 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5275 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5276 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5277 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5278 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5279 /* IA-64 specific. */
5280 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5281 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5282 /* IA-64 OpenVMS specific. */
5283 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5284 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5285 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5286 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5287 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5288 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5289 /* Generic. */
5290 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5291 /* SPARC specific. */
5292 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5293 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5294 /* ARM specific. */
5295 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5296 /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5297 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5298 };
5299
5300 if (do_section_details)
5301 {
5302 sprintf (buff, "[%*.*lx]: ",
5303 field_size, field_size, (unsigned long) sh_flags);
5304 p += field_size + 4;
5305 }
5306
5307 while (sh_flags)
5308 {
5309 bfd_vma flag;
5310
5311 flag = sh_flags & - sh_flags;
5312 sh_flags &= ~ flag;
5313
5314 if (do_section_details)
5315 {
5316 switch (flag)
5317 {
5318 case SHF_WRITE: sindex = 0; break;
5319 case SHF_ALLOC: sindex = 1; break;
5320 case SHF_EXECINSTR: sindex = 2; break;
5321 case SHF_MERGE: sindex = 3; break;
5322 case SHF_STRINGS: sindex = 4; break;
5323 case SHF_INFO_LINK: sindex = 5; break;
5324 case SHF_LINK_ORDER: sindex = 6; break;
5325 case SHF_OS_NONCONFORMING: sindex = 7; break;
5326 case SHF_GROUP: sindex = 8; break;
5327 case SHF_TLS: sindex = 9; break;
5328 case SHF_EXCLUDE: sindex = 18; break;
5329 case SHF_COMPRESSED: sindex = 20; break;
5330
5331 default:
5332 sindex = -1;
5333 switch (elf_header.e_machine)
5334 {
5335 case EM_IA_64:
5336 if (flag == SHF_IA_64_SHORT)
5337 sindex = 10;
5338 else if (flag == SHF_IA_64_NORECOV)
5339 sindex = 11;
5340 #ifdef BFD64
5341 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5342 switch (flag)
5343 {
5344 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5345 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5346 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5347 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5348 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5349 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5350 default: break;
5351 }
5352 #endif
5353 break;
5354
5355 case EM_386:
5356 case EM_IAMCU:
5357 case EM_X86_64:
5358 case EM_L1OM:
5359 case EM_K1OM:
5360 case EM_OLD_SPARCV9:
5361 case EM_SPARC32PLUS:
5362 case EM_SPARCV9:
5363 case EM_SPARC:
5364 if (flag == SHF_ORDERED)
5365 sindex = 19;
5366 break;
5367
5368 case EM_ARM:
5369 switch (flag)
5370 {
5371 case SHF_ENTRYSECT: sindex = 21; break;
5372 case SHF_ARM_NOREAD: sindex = 22; break;
5373 case SHF_COMDEF: sindex = 23; break;
5374 default: break;
5375 }
5376 break;
5377
5378 default:
5379 break;
5380 }
5381 }
5382
5383 if (sindex != -1)
5384 {
5385 if (p != buff + field_size + 4)
5386 {
5387 if (size < (10 + 2))
5388 {
5389 warn (_("Internal error: not enough buffer room for section flag info"));
5390 return _("<unknown>");
5391 }
5392 size -= 2;
5393 *p++ = ',';
5394 *p++ = ' ';
5395 }
5396
5397 size -= flags [sindex].len;
5398 p = stpcpy (p, flags [sindex].str);
5399 }
5400 else if (flag & SHF_MASKOS)
5401 os_flags |= flag;
5402 else if (flag & SHF_MASKPROC)
5403 proc_flags |= flag;
5404 else
5405 unknown_flags |= flag;
5406 }
5407 else
5408 {
5409 switch (flag)
5410 {
5411 case SHF_WRITE: *p = 'W'; break;
5412 case SHF_ALLOC: *p = 'A'; break;
5413 case SHF_EXECINSTR: *p = 'X'; break;
5414 case SHF_MERGE: *p = 'M'; break;
5415 case SHF_STRINGS: *p = 'S'; break;
5416 case SHF_INFO_LINK: *p = 'I'; break;
5417 case SHF_LINK_ORDER: *p = 'L'; break;
5418 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5419 case SHF_GROUP: *p = 'G'; break;
5420 case SHF_TLS: *p = 'T'; break;
5421 case SHF_EXCLUDE: *p = 'E'; break;
5422 case SHF_COMPRESSED: *p = 'C'; break;
5423
5424 default:
5425 if ((elf_header.e_machine == EM_X86_64
5426 || elf_header.e_machine == EM_L1OM
5427 || elf_header.e_machine == EM_K1OM)
5428 && flag == SHF_X86_64_LARGE)
5429 *p = 'l';
5430 else if (elf_header.e_machine == EM_ARM
5431 && flag == SHF_ARM_NOREAD)
5432 *p = 'y';
5433 else if (flag & SHF_MASKOS)
5434 {
5435 *p = 'o';
5436 sh_flags &= ~ SHF_MASKOS;
5437 }
5438 else if (flag & SHF_MASKPROC)
5439 {
5440 *p = 'p';
5441 sh_flags &= ~ SHF_MASKPROC;
5442 }
5443 else
5444 *p = 'x';
5445 break;
5446 }
5447 p++;
5448 }
5449 }
5450
5451 if (do_section_details)
5452 {
5453 if (os_flags)
5454 {
5455 size -= 5 + field_size;
5456 if (p != buff + field_size + 4)
5457 {
5458 if (size < (2 + 1))
5459 {
5460 warn (_("Internal error: not enough buffer room for section flag info"));
5461 return _("<unknown>");
5462 }
5463 size -= 2;
5464 *p++ = ',';
5465 *p++ = ' ';
5466 }
5467 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5468 (unsigned long) os_flags);
5469 p += 5 + field_size;
5470 }
5471 if (proc_flags)
5472 {
5473 size -= 7 + field_size;
5474 if (p != buff + field_size + 4)
5475 {
5476 if (size < (2 + 1))
5477 {
5478 warn (_("Internal error: not enough buffer room for section flag info"));
5479 return _("<unknown>");
5480 }
5481 size -= 2;
5482 *p++ = ',';
5483 *p++ = ' ';
5484 }
5485 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5486 (unsigned long) proc_flags);
5487 p += 7 + field_size;
5488 }
5489 if (unknown_flags)
5490 {
5491 size -= 10 + field_size;
5492 if (p != buff + field_size + 4)
5493 {
5494 if (size < (2 + 1))
5495 {
5496 warn (_("Internal error: not enough buffer room for section flag info"));
5497 return _("<unknown>");
5498 }
5499 size -= 2;
5500 *p++ = ',';
5501 *p++ = ' ';
5502 }
5503 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5504 (unsigned long) unknown_flags);
5505 p += 10 + field_size;
5506 }
5507 }
5508
5509 *p = '\0';
5510 return buff;
5511 }
5512
5513 static unsigned int
5514 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5515 {
5516 if (is_32bit_elf)
5517 {
5518 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5519 chdr->ch_type = BYTE_GET (echdr->ch_type);
5520 chdr->ch_size = BYTE_GET (echdr->ch_size);
5521 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5522 return sizeof (*echdr);
5523 }
5524 else
5525 {
5526 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5527 chdr->ch_type = BYTE_GET (echdr->ch_type);
5528 chdr->ch_size = BYTE_GET (echdr->ch_size);
5529 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5530 return sizeof (*echdr);
5531 }
5532 }
5533
5534 static int
5535 process_section_headers (FILE * file)
5536 {
5537 Elf_Internal_Shdr * section;
5538 unsigned int i;
5539
5540 section_headers = NULL;
5541
5542 if (elf_header.e_shnum == 0)
5543 {
5544 /* PR binutils/12467. */
5545 if (elf_header.e_shoff != 0)
5546 warn (_("possibly corrupt ELF file header - it has a non-zero"
5547 " section header offset, but no section headers\n"));
5548 else if (do_sections)
5549 printf (_("\nThere are no sections in this file.\n"));
5550
5551 return 1;
5552 }
5553
5554 if (do_sections && !do_header)
5555 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5556 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5557
5558 if (is_32bit_elf)
5559 {
5560 if (! get_32bit_section_headers (file, FALSE))
5561 return 0;
5562 }
5563 else if (! get_64bit_section_headers (file, FALSE))
5564 return 0;
5565
5566 /* Read in the string table, so that we have names to display. */
5567 if (elf_header.e_shstrndx != SHN_UNDEF
5568 && elf_header.e_shstrndx < elf_header.e_shnum)
5569 {
5570 section = section_headers + elf_header.e_shstrndx;
5571
5572 if (section->sh_size != 0)
5573 {
5574 string_table = (char *) get_data (NULL, file, section->sh_offset,
5575 1, section->sh_size,
5576 _("string table"));
5577
5578 string_table_length = string_table != NULL ? section->sh_size : 0;
5579 }
5580 }
5581
5582 /* Scan the sections for the dynamic symbol table
5583 and dynamic string table and debug sections. */
5584 dynamic_symbols = NULL;
5585 dynamic_strings = NULL;
5586 dynamic_syminfo = NULL;
5587 symtab_shndx_list = NULL;
5588
5589 eh_addr_size = is_32bit_elf ? 4 : 8;
5590 switch (elf_header.e_machine)
5591 {
5592 case EM_MIPS:
5593 case EM_MIPS_RS3_LE:
5594 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5595 FDE addresses. However, the ABI also has a semi-official ILP32
5596 variant for which the normal FDE address size rules apply.
5597
5598 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5599 section, where XX is the size of longs in bits. Unfortunately,
5600 earlier compilers provided no way of distinguishing ILP32 objects
5601 from LP64 objects, so if there's any doubt, we should assume that
5602 the official LP64 form is being used. */
5603 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5604 && find_section (".gcc_compiled_long32") == NULL)
5605 eh_addr_size = 8;
5606 break;
5607
5608 case EM_H8_300:
5609 case EM_H8_300H:
5610 switch (elf_header.e_flags & EF_H8_MACH)
5611 {
5612 case E_H8_MACH_H8300:
5613 case E_H8_MACH_H8300HN:
5614 case E_H8_MACH_H8300SN:
5615 case E_H8_MACH_H8300SXN:
5616 eh_addr_size = 2;
5617 break;
5618 case E_H8_MACH_H8300H:
5619 case E_H8_MACH_H8300S:
5620 case E_H8_MACH_H8300SX:
5621 eh_addr_size = 4;
5622 break;
5623 }
5624 break;
5625
5626 case EM_M32C_OLD:
5627 case EM_M32C:
5628 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5629 {
5630 case EF_M32C_CPU_M16C:
5631 eh_addr_size = 2;
5632 break;
5633 }
5634 break;
5635 }
5636
5637 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5638 do \
5639 { \
5640 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5641 if (section->sh_entsize != expected_entsize) \
5642 { \
5643 char buf[40]; \
5644 sprintf_vma (buf, section->sh_entsize); \
5645 /* Note: coded this way so that there is a single string for \
5646 translation. */ \
5647 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5648 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5649 (unsigned) expected_entsize); \
5650 section->sh_entsize = expected_entsize; \
5651 } \
5652 } \
5653 while (0)
5654
5655 #define CHECK_ENTSIZE(section, i, type) \
5656 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5657 sizeof (Elf64_External_##type))
5658
5659 for (i = 0, section = section_headers;
5660 i < elf_header.e_shnum;
5661 i++, section++)
5662 {
5663 char * name = SECTION_NAME (section);
5664
5665 if (section->sh_type == SHT_DYNSYM)
5666 {
5667 if (dynamic_symbols != NULL)
5668 {
5669 error (_("File contains multiple dynamic symbol tables\n"));
5670 continue;
5671 }
5672
5673 CHECK_ENTSIZE (section, i, Sym);
5674 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5675 }
5676 else if (section->sh_type == SHT_STRTAB
5677 && streq (name, ".dynstr"))
5678 {
5679 if (dynamic_strings != NULL)
5680 {
5681 error (_("File contains multiple dynamic string tables\n"));
5682 continue;
5683 }
5684
5685 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5686 1, section->sh_size,
5687 _("dynamic strings"));
5688 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5689 }
5690 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5691 {
5692 elf_section_list * entry = xmalloc (sizeof * entry);
5693 entry->hdr = section;
5694 entry->next = symtab_shndx_list;
5695 symtab_shndx_list = entry;
5696 }
5697 else if (section->sh_type == SHT_SYMTAB)
5698 CHECK_ENTSIZE (section, i, Sym);
5699 else if (section->sh_type == SHT_GROUP)
5700 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5701 else if (section->sh_type == SHT_REL)
5702 CHECK_ENTSIZE (section, i, Rel);
5703 else if (section->sh_type == SHT_RELA)
5704 CHECK_ENTSIZE (section, i, Rela);
5705 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5706 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5707 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5708 || do_debug_str || do_debug_loc || do_debug_ranges
5709 || do_debug_addr || do_debug_cu_index)
5710 && (const_strneq (name, ".debug_")
5711 || const_strneq (name, ".zdebug_")))
5712 {
5713 if (name[1] == 'z')
5714 name += sizeof (".zdebug_") - 1;
5715 else
5716 name += sizeof (".debug_") - 1;
5717
5718 if (do_debugging
5719 || (do_debug_info && const_strneq (name, "info"))
5720 || (do_debug_info && const_strneq (name, "types"))
5721 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5722 || (do_debug_lines && strcmp (name, "line") == 0)
5723 || (do_debug_lines && const_strneq (name, "line."))
5724 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5725 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5726 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5727 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5728 || (do_debug_aranges && const_strneq (name, "aranges"))
5729 || (do_debug_ranges && const_strneq (name, "ranges"))
5730 || (do_debug_frames && const_strneq (name, "frame"))
5731 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5732 || (do_debug_macinfo && const_strneq (name, "macro"))
5733 || (do_debug_str && const_strneq (name, "str"))
5734 || (do_debug_loc && const_strneq (name, "loc"))
5735 || (do_debug_addr && const_strneq (name, "addr"))
5736 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5737 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5738 )
5739 request_dump_bynumber (i, DEBUG_DUMP);
5740 }
5741 /* Linkonce section to be combined with .debug_info at link time. */
5742 else if ((do_debugging || do_debug_info)
5743 && const_strneq (name, ".gnu.linkonce.wi."))
5744 request_dump_bynumber (i, DEBUG_DUMP);
5745 else if (do_debug_frames && streq (name, ".eh_frame"))
5746 request_dump_bynumber (i, DEBUG_DUMP);
5747 else if (do_gdb_index && streq (name, ".gdb_index"))
5748 request_dump_bynumber (i, DEBUG_DUMP);
5749 /* Trace sections for Itanium VMS. */
5750 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5751 || do_trace_aranges)
5752 && const_strneq (name, ".trace_"))
5753 {
5754 name += sizeof (".trace_") - 1;
5755
5756 if (do_debugging
5757 || (do_trace_info && streq (name, "info"))
5758 || (do_trace_abbrevs && streq (name, "abbrev"))
5759 || (do_trace_aranges && streq (name, "aranges"))
5760 )
5761 request_dump_bynumber (i, DEBUG_DUMP);
5762 }
5763 }
5764
5765 if (! do_sections)
5766 return 1;
5767
5768 if (elf_header.e_shnum > 1)
5769 printf (_("\nSection Headers:\n"));
5770 else
5771 printf (_("\nSection Header:\n"));
5772
5773 if (is_32bit_elf)
5774 {
5775 if (do_section_details)
5776 {
5777 printf (_(" [Nr] Name\n"));
5778 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5779 }
5780 else
5781 printf
5782 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5783 }
5784 else if (do_wide)
5785 {
5786 if (do_section_details)
5787 {
5788 printf (_(" [Nr] Name\n"));
5789 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5790 }
5791 else
5792 printf
5793 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5794 }
5795 else
5796 {
5797 if (do_section_details)
5798 {
5799 printf (_(" [Nr] Name\n"));
5800 printf (_(" Type Address Offset Link\n"));
5801 printf (_(" Size EntSize Info Align\n"));
5802 }
5803 else
5804 {
5805 printf (_(" [Nr] Name Type Address Offset\n"));
5806 printf (_(" Size EntSize Flags Link Info Align\n"));
5807 }
5808 }
5809
5810 if (do_section_details)
5811 printf (_(" Flags\n"));
5812
5813 for (i = 0, section = section_headers;
5814 i < elf_header.e_shnum;
5815 i++, section++)
5816 {
5817 printf (" [%2u] ", i);
5818 if (do_section_details)
5819 printf ("%s\n ", printable_section_name (section));
5820 else
5821 print_symbol (-17, SECTION_NAME (section));
5822
5823 printf (do_wide ? " %-15s " : " %-15.15s ",
5824 get_section_type_name (section->sh_type));
5825
5826 if (is_32bit_elf)
5827 {
5828 const char * link_too_big = NULL;
5829
5830 print_vma (section->sh_addr, LONG_HEX);
5831
5832 printf ( " %6.6lx %6.6lx %2.2lx",
5833 (unsigned long) section->sh_offset,
5834 (unsigned long) section->sh_size,
5835 (unsigned long) section->sh_entsize);
5836
5837 if (do_section_details)
5838 fputs (" ", stdout);
5839 else
5840 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5841
5842 if (section->sh_link >= elf_header.e_shnum)
5843 {
5844 link_too_big = "";
5845 /* The sh_link value is out of range. Normally this indicates
5846 an error but it can have special values in Solaris binaries. */
5847 switch (elf_header.e_machine)
5848 {
5849 case EM_386:
5850 case EM_IAMCU:
5851 case EM_X86_64:
5852 case EM_L1OM:
5853 case EM_K1OM:
5854 case EM_OLD_SPARCV9:
5855 case EM_SPARC32PLUS:
5856 case EM_SPARCV9:
5857 case EM_SPARC:
5858 if (section->sh_link == (SHN_BEFORE & 0xffff))
5859 link_too_big = "BEFORE";
5860 else if (section->sh_link == (SHN_AFTER & 0xffff))
5861 link_too_big = "AFTER";
5862 break;
5863 default:
5864 break;
5865 }
5866 }
5867
5868 if (do_section_details)
5869 {
5870 if (link_too_big != NULL && * link_too_big)
5871 printf ("<%s> ", link_too_big);
5872 else
5873 printf ("%2u ", section->sh_link);
5874 printf ("%3u %2lu\n", section->sh_info,
5875 (unsigned long) section->sh_addralign);
5876 }
5877 else
5878 printf ("%2u %3u %2lu\n",
5879 section->sh_link,
5880 section->sh_info,
5881 (unsigned long) section->sh_addralign);
5882
5883 if (link_too_big && ! * link_too_big)
5884 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5885 i, section->sh_link);
5886 }
5887 else if (do_wide)
5888 {
5889 print_vma (section->sh_addr, LONG_HEX);
5890
5891 if ((long) section->sh_offset == section->sh_offset)
5892 printf (" %6.6lx", (unsigned long) section->sh_offset);
5893 else
5894 {
5895 putchar (' ');
5896 print_vma (section->sh_offset, LONG_HEX);
5897 }
5898
5899 if ((unsigned long) section->sh_size == section->sh_size)
5900 printf (" %6.6lx", (unsigned long) section->sh_size);
5901 else
5902 {
5903 putchar (' ');
5904 print_vma (section->sh_size, LONG_HEX);
5905 }
5906
5907 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5908 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5909 else
5910 {
5911 putchar (' ');
5912 print_vma (section->sh_entsize, LONG_HEX);
5913 }
5914
5915 if (do_section_details)
5916 fputs (" ", stdout);
5917 else
5918 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5919
5920 printf ("%2u %3u ", section->sh_link, section->sh_info);
5921
5922 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5923 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5924 else
5925 {
5926 print_vma (section->sh_addralign, DEC);
5927 putchar ('\n');
5928 }
5929 }
5930 else if (do_section_details)
5931 {
5932 printf (" %-15.15s ",
5933 get_section_type_name (section->sh_type));
5934 print_vma (section->sh_addr, LONG_HEX);
5935 if ((long) section->sh_offset == section->sh_offset)
5936 printf (" %16.16lx", (unsigned long) section->sh_offset);
5937 else
5938 {
5939 printf (" ");
5940 print_vma (section->sh_offset, LONG_HEX);
5941 }
5942 printf (" %u\n ", section->sh_link);
5943 print_vma (section->sh_size, LONG_HEX);
5944 putchar (' ');
5945 print_vma (section->sh_entsize, LONG_HEX);
5946
5947 printf (" %-16u %lu\n",
5948 section->sh_info,
5949 (unsigned long) section->sh_addralign);
5950 }
5951 else
5952 {
5953 putchar (' ');
5954 print_vma (section->sh_addr, LONG_HEX);
5955 if ((long) section->sh_offset == section->sh_offset)
5956 printf (" %8.8lx", (unsigned long) section->sh_offset);
5957 else
5958 {
5959 printf (" ");
5960 print_vma (section->sh_offset, LONG_HEX);
5961 }
5962 printf ("\n ");
5963 print_vma (section->sh_size, LONG_HEX);
5964 printf (" ");
5965 print_vma (section->sh_entsize, LONG_HEX);
5966
5967 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5968
5969 printf (" %2u %3u %lu\n",
5970 section->sh_link,
5971 section->sh_info,
5972 (unsigned long) section->sh_addralign);
5973 }
5974
5975 if (do_section_details)
5976 {
5977 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5978 if ((section->sh_flags & SHF_COMPRESSED) != 0)
5979 {
5980 /* Minimum section size is 12 bytes for 32-bit compression
5981 header + 12 bytes for compressed data header. */
5982 unsigned char buf[24];
5983 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
5984 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
5985 sizeof (buf), _("compression header")))
5986 {
5987 Elf_Internal_Chdr chdr;
5988 get_compression_header (&chdr, buf);
5989 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
5990 printf (" ZLIB, ");
5991 else
5992 printf (_(" [<unknown>: 0x%x], "),
5993 chdr.ch_type);
5994 print_vma (chdr.ch_size, LONG_HEX);
5995 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
5996 }
5997 }
5998 }
5999 }
6000
6001 if (!do_section_details)
6002 {
6003 /* The ordering of the letters shown here matches the ordering of the
6004 corresponding SHF_xxx values, and hence the order in which these
6005 letters will be displayed to the user. */
6006 printf (_("Key to Flags:\n\
6007 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6008 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6009 C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
6010 if (elf_header.e_machine == EM_X86_64
6011 || elf_header.e_machine == EM_L1OM
6012 || elf_header.e_machine == EM_K1OM)
6013 printf (_("l (large), "));
6014 else if (elf_header.e_machine == EM_ARM)
6015 printf (_("y (noread), "));
6016 printf ("p (processor specific)\n");
6017 }
6018
6019 return 1;
6020 }
6021
6022 static const char *
6023 get_group_flags (unsigned int flags)
6024 {
6025 static char buff[32];
6026 switch (flags)
6027 {
6028 case 0:
6029 return "";
6030
6031 case GRP_COMDAT:
6032 return "COMDAT ";
6033
6034 default:
6035 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6036 break;
6037 }
6038 return buff;
6039 }
6040
6041 static int
6042 process_section_groups (FILE * file)
6043 {
6044 Elf_Internal_Shdr * section;
6045 unsigned int i;
6046 struct group * group;
6047 Elf_Internal_Shdr * symtab_sec;
6048 Elf_Internal_Shdr * strtab_sec;
6049 Elf_Internal_Sym * symtab;
6050 unsigned long num_syms;
6051 char * strtab;
6052 size_t strtab_size;
6053
6054 /* Don't process section groups unless needed. */
6055 if (!do_unwind && !do_section_groups)
6056 return 1;
6057
6058 if (elf_header.e_shnum == 0)
6059 {
6060 if (do_section_groups)
6061 printf (_("\nThere are no sections to group in this file.\n"));
6062
6063 return 1;
6064 }
6065
6066 if (section_headers == NULL)
6067 {
6068 error (_("Section headers are not available!\n"));
6069 /* PR 13622: This can happen with a corrupt ELF header. */
6070 return 0;
6071 }
6072
6073 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6074 sizeof (struct group *));
6075
6076 if (section_headers_groups == NULL)
6077 {
6078 error (_("Out of memory reading %u section group headers\n"),
6079 elf_header.e_shnum);
6080 return 0;
6081 }
6082
6083 /* Scan the sections for the group section. */
6084 group_count = 0;
6085 for (i = 0, section = section_headers;
6086 i < elf_header.e_shnum;
6087 i++, section++)
6088 if (section->sh_type == SHT_GROUP)
6089 group_count++;
6090
6091 if (group_count == 0)
6092 {
6093 if (do_section_groups)
6094 printf (_("\nThere are no section groups in this file.\n"));
6095
6096 return 1;
6097 }
6098
6099 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6100
6101 if (section_groups == NULL)
6102 {
6103 error (_("Out of memory reading %lu groups\n"),
6104 (unsigned long) group_count);
6105 return 0;
6106 }
6107
6108 symtab_sec = NULL;
6109 strtab_sec = NULL;
6110 symtab = NULL;
6111 num_syms = 0;
6112 strtab = NULL;
6113 strtab_size = 0;
6114 for (i = 0, section = section_headers, group = section_groups;
6115 i < elf_header.e_shnum;
6116 i++, section++)
6117 {
6118 if (section->sh_type == SHT_GROUP)
6119 {
6120 const char * name = printable_section_name (section);
6121 const char * group_name;
6122 unsigned char * start;
6123 unsigned char * indices;
6124 unsigned int entry, j, size;
6125 Elf_Internal_Shdr * sec;
6126 Elf_Internal_Sym * sym;
6127
6128 /* Get the symbol table. */
6129 if (section->sh_link >= elf_header.e_shnum
6130 || ((sec = section_headers + section->sh_link)->sh_type
6131 != SHT_SYMTAB))
6132 {
6133 error (_("Bad sh_link in group section `%s'\n"), name);
6134 continue;
6135 }
6136
6137 if (symtab_sec != sec)
6138 {
6139 symtab_sec = sec;
6140 if (symtab)
6141 free (symtab);
6142 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6143 }
6144
6145 if (symtab == NULL)
6146 {
6147 error (_("Corrupt header in group section `%s'\n"), name);
6148 continue;
6149 }
6150
6151 if (section->sh_info >= num_syms)
6152 {
6153 error (_("Bad sh_info in group section `%s'\n"), name);
6154 continue;
6155 }
6156
6157 sym = symtab + section->sh_info;
6158
6159 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6160 {
6161 if (sym->st_shndx == 0
6162 || sym->st_shndx >= elf_header.e_shnum)
6163 {
6164 error (_("Bad sh_info in group section `%s'\n"), name);
6165 continue;
6166 }
6167
6168 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6169 strtab_sec = NULL;
6170 if (strtab)
6171 free (strtab);
6172 strtab = NULL;
6173 strtab_size = 0;
6174 }
6175 else
6176 {
6177 /* Get the string table. */
6178 if (symtab_sec->sh_link >= elf_header.e_shnum)
6179 {
6180 strtab_sec = NULL;
6181 if (strtab)
6182 free (strtab);
6183 strtab = NULL;
6184 strtab_size = 0;
6185 }
6186 else if (strtab_sec
6187 != (sec = section_headers + symtab_sec->sh_link))
6188 {
6189 strtab_sec = sec;
6190 if (strtab)
6191 free (strtab);
6192
6193 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6194 1, strtab_sec->sh_size,
6195 _("string table"));
6196 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6197 }
6198 group_name = sym->st_name < strtab_size
6199 ? strtab + sym->st_name : _("<corrupt>");
6200 }
6201
6202 /* PR 17531: file: loop. */
6203 if (section->sh_entsize > section->sh_size)
6204 {
6205 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6206 printable_section_name (section),
6207 (unsigned long) section->sh_entsize,
6208 (unsigned long) section->sh_size);
6209 break;
6210 }
6211
6212 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6213 1, section->sh_size,
6214 _("section data"));
6215 if (start == NULL)
6216 continue;
6217
6218 indices = start;
6219 size = (section->sh_size / section->sh_entsize) - 1;
6220 entry = byte_get (indices, 4);
6221 indices += 4;
6222
6223 if (do_section_groups)
6224 {
6225 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6226 get_group_flags (entry), i, name, group_name, size);
6227
6228 printf (_(" [Index] Name\n"));
6229 }
6230
6231 group->group_index = i;
6232
6233 for (j = 0; j < size; j++)
6234 {
6235 struct group_list * g;
6236
6237 entry = byte_get (indices, 4);
6238 indices += 4;
6239
6240 if (entry >= elf_header.e_shnum)
6241 {
6242 static unsigned num_group_errors = 0;
6243
6244 if (num_group_errors ++ < 10)
6245 {
6246 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6247 entry, i, elf_header.e_shnum - 1);
6248 if (num_group_errors == 10)
6249 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6250 }
6251 continue;
6252 }
6253
6254 if (section_headers_groups [entry] != NULL)
6255 {
6256 if (entry)
6257 {
6258 static unsigned num_errs = 0;
6259
6260 if (num_errs ++ < 10)
6261 {
6262 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6263 entry, i,
6264 section_headers_groups [entry]->group_index);
6265 if (num_errs == 10)
6266 warn (_("Further error messages about already contained group sections suppressed\n"));
6267 }
6268 continue;
6269 }
6270 else
6271 {
6272 /* Intel C/C++ compiler may put section 0 in a
6273 section group. We just warn it the first time
6274 and ignore it afterwards. */
6275 static int warned = 0;
6276 if (!warned)
6277 {
6278 error (_("section 0 in group section [%5u]\n"),
6279 section_headers_groups [entry]->group_index);
6280 warned++;
6281 }
6282 }
6283 }
6284
6285 section_headers_groups [entry] = group;
6286
6287 if (do_section_groups)
6288 {
6289 sec = section_headers + entry;
6290 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6291 }
6292
6293 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6294 g->section_index = entry;
6295 g->next = group->root;
6296 group->root = g;
6297 }
6298
6299 if (start)
6300 free (start);
6301
6302 group++;
6303 }
6304 }
6305
6306 if (symtab)
6307 free (symtab);
6308 if (strtab)
6309 free (strtab);
6310 return 1;
6311 }
6312
6313 /* Data used to display dynamic fixups. */
6314
6315 struct ia64_vms_dynfixup
6316 {
6317 bfd_vma needed_ident; /* Library ident number. */
6318 bfd_vma needed; /* Index in the dstrtab of the library name. */
6319 bfd_vma fixup_needed; /* Index of the library. */
6320 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6321 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6322 };
6323
6324 /* Data used to display dynamic relocations. */
6325
6326 struct ia64_vms_dynimgrela
6327 {
6328 bfd_vma img_rela_cnt; /* Number of relocations. */
6329 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6330 };
6331
6332 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6333 library). */
6334
6335 static void
6336 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6337 const char *strtab, unsigned int strtab_sz)
6338 {
6339 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6340 long i;
6341 const char *lib_name;
6342
6343 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6344 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6345 _("dynamic section image fixups"));
6346 if (!imfs)
6347 return;
6348
6349 if (fixup->needed < strtab_sz)
6350 lib_name = strtab + fixup->needed;
6351 else
6352 {
6353 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6354 (unsigned long) fixup->needed);
6355 lib_name = "???";
6356 }
6357 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6358 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6359 printf
6360 (_("Seg Offset Type SymVec DataType\n"));
6361
6362 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6363 {
6364 unsigned int type;
6365 const char *rtype;
6366
6367 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6368 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6369 type = BYTE_GET (imfs [i].type);
6370 rtype = elf_ia64_reloc_type (type);
6371 if (rtype == NULL)
6372 printf (" 0x%08x ", type);
6373 else
6374 printf (" %-32s ", rtype);
6375 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6376 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6377 }
6378
6379 free (imfs);
6380 }
6381
6382 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6383
6384 static void
6385 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6386 {
6387 Elf64_External_VMS_IMAGE_RELA *imrs;
6388 long i;
6389
6390 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6391 1, imgrela->img_rela_cnt * sizeof (*imrs),
6392 _("dynamic section image relocations"));
6393 if (!imrs)
6394 return;
6395
6396 printf (_("\nImage relocs\n"));
6397 printf
6398 (_("Seg Offset Type Addend Seg Sym Off\n"));
6399
6400 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6401 {
6402 unsigned int type;
6403 const char *rtype;
6404
6405 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6406 printf ("%08" BFD_VMA_FMT "x ",
6407 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6408 type = BYTE_GET (imrs [i].type);
6409 rtype = elf_ia64_reloc_type (type);
6410 if (rtype == NULL)
6411 printf ("0x%08x ", type);
6412 else
6413 printf ("%-31s ", rtype);
6414 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6415 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6416 printf ("%08" BFD_VMA_FMT "x\n",
6417 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6418 }
6419
6420 free (imrs);
6421 }
6422
6423 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6424
6425 static int
6426 process_ia64_vms_dynamic_relocs (FILE *file)
6427 {
6428 struct ia64_vms_dynfixup fixup;
6429 struct ia64_vms_dynimgrela imgrela;
6430 Elf_Internal_Dyn *entry;
6431 int res = 0;
6432 bfd_vma strtab_off = 0;
6433 bfd_vma strtab_sz = 0;
6434 char *strtab = NULL;
6435
6436 memset (&fixup, 0, sizeof (fixup));
6437 memset (&imgrela, 0, sizeof (imgrela));
6438
6439 /* Note: the order of the entries is specified by the OpenVMS specs. */
6440 for (entry = dynamic_section;
6441 entry < dynamic_section + dynamic_nent;
6442 entry++)
6443 {
6444 switch (entry->d_tag)
6445 {
6446 case DT_IA_64_VMS_STRTAB_OFFSET:
6447 strtab_off = entry->d_un.d_val;
6448 break;
6449 case DT_STRSZ:
6450 strtab_sz = entry->d_un.d_val;
6451 if (strtab == NULL)
6452 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6453 1, strtab_sz, _("dynamic string section"));
6454 break;
6455
6456 case DT_IA_64_VMS_NEEDED_IDENT:
6457 fixup.needed_ident = entry->d_un.d_val;
6458 break;
6459 case DT_NEEDED:
6460 fixup.needed = entry->d_un.d_val;
6461 break;
6462 case DT_IA_64_VMS_FIXUP_NEEDED:
6463 fixup.fixup_needed = entry->d_un.d_val;
6464 break;
6465 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6466 fixup.fixup_rela_cnt = entry->d_un.d_val;
6467 break;
6468 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6469 fixup.fixup_rela_off = entry->d_un.d_val;
6470 res++;
6471 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6472 break;
6473
6474 case DT_IA_64_VMS_IMG_RELA_CNT:
6475 imgrela.img_rela_cnt = entry->d_un.d_val;
6476 break;
6477 case DT_IA_64_VMS_IMG_RELA_OFF:
6478 imgrela.img_rela_off = entry->d_un.d_val;
6479 res++;
6480 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6481 break;
6482
6483 default:
6484 break;
6485 }
6486 }
6487
6488 if (strtab != NULL)
6489 free (strtab);
6490
6491 return res;
6492 }
6493
6494 static struct
6495 {
6496 const char * name;
6497 int reloc;
6498 int size;
6499 int rela;
6500 } dynamic_relocations [] =
6501 {
6502 { "REL", DT_REL, DT_RELSZ, FALSE },
6503 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6504 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6505 };
6506
6507 /* Process the reloc section. */
6508
6509 static int
6510 process_relocs (FILE * file)
6511 {
6512 unsigned long rel_size;
6513 unsigned long rel_offset;
6514
6515
6516 if (!do_reloc)
6517 return 1;
6518
6519 if (do_using_dynamic)
6520 {
6521 int is_rela;
6522 const char * name;
6523 int has_dynamic_reloc;
6524 unsigned int i;
6525
6526 has_dynamic_reloc = 0;
6527
6528 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6529 {
6530 is_rela = dynamic_relocations [i].rela;
6531 name = dynamic_relocations [i].name;
6532 rel_size = dynamic_info [dynamic_relocations [i].size];
6533 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6534
6535 has_dynamic_reloc |= rel_size;
6536
6537 if (is_rela == UNKNOWN)
6538 {
6539 if (dynamic_relocations [i].reloc == DT_JMPREL)
6540 switch (dynamic_info[DT_PLTREL])
6541 {
6542 case DT_REL:
6543 is_rela = FALSE;
6544 break;
6545 case DT_RELA:
6546 is_rela = TRUE;
6547 break;
6548 }
6549 }
6550
6551 if (rel_size)
6552 {
6553 printf
6554 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6555 name, rel_offset, rel_size);
6556
6557 dump_relocations (file,
6558 offset_from_vma (file, rel_offset, rel_size),
6559 rel_size,
6560 dynamic_symbols, num_dynamic_syms,
6561 dynamic_strings, dynamic_strings_length,
6562 is_rela, 1);
6563 }
6564 }
6565
6566 if (is_ia64_vms ())
6567 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6568
6569 if (! has_dynamic_reloc)
6570 printf (_("\nThere are no dynamic relocations in this file.\n"));
6571 }
6572 else
6573 {
6574 Elf_Internal_Shdr * section;
6575 unsigned long i;
6576 int found = 0;
6577
6578 for (i = 0, section = section_headers;
6579 i < elf_header.e_shnum;
6580 i++, section++)
6581 {
6582 if ( section->sh_type != SHT_RELA
6583 && section->sh_type != SHT_REL)
6584 continue;
6585
6586 rel_offset = section->sh_offset;
6587 rel_size = section->sh_size;
6588
6589 if (rel_size)
6590 {
6591 Elf_Internal_Shdr * strsec;
6592 int is_rela;
6593
6594 printf (_("\nRelocation section "));
6595
6596 if (string_table == NULL)
6597 printf ("%d", section->sh_name);
6598 else
6599 printf ("'%s'", printable_section_name (section));
6600
6601 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6602 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6603
6604 is_rela = section->sh_type == SHT_RELA;
6605
6606 if (section->sh_link != 0
6607 && section->sh_link < elf_header.e_shnum)
6608 {
6609 Elf_Internal_Shdr * symsec;
6610 Elf_Internal_Sym * symtab;
6611 unsigned long nsyms;
6612 unsigned long strtablen = 0;
6613 char * strtab = NULL;
6614
6615 symsec = section_headers + section->sh_link;
6616 if (symsec->sh_type != SHT_SYMTAB
6617 && symsec->sh_type != SHT_DYNSYM)
6618 continue;
6619
6620 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6621
6622 if (symtab == NULL)
6623 continue;
6624
6625 if (symsec->sh_link != 0
6626 && symsec->sh_link < elf_header.e_shnum)
6627 {
6628 strsec = section_headers + symsec->sh_link;
6629
6630 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6631 1, strsec->sh_size,
6632 _("string table"));
6633 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6634 }
6635
6636 dump_relocations (file, rel_offset, rel_size,
6637 symtab, nsyms, strtab, strtablen,
6638 is_rela,
6639 symsec->sh_type == SHT_DYNSYM);
6640 if (strtab)
6641 free (strtab);
6642 free (symtab);
6643 }
6644 else
6645 dump_relocations (file, rel_offset, rel_size,
6646 NULL, 0, NULL, 0, is_rela, 0);
6647
6648 found = 1;
6649 }
6650 }
6651
6652 if (! found)
6653 printf (_("\nThere are no relocations in this file.\n"));
6654 }
6655
6656 return 1;
6657 }
6658
6659 /* An absolute address consists of a section and an offset. If the
6660 section is NULL, the offset itself is the address, otherwise, the
6661 address equals to LOAD_ADDRESS(section) + offset. */
6662
6663 struct absaddr
6664 {
6665 unsigned short section;
6666 bfd_vma offset;
6667 };
6668
6669 #define ABSADDR(a) \
6670 ((a).section \
6671 ? section_headers [(a).section].sh_addr + (a).offset \
6672 : (a).offset)
6673
6674 /* Find the nearest symbol at or below ADDR. Returns the symbol
6675 name, if found, and the offset from the symbol to ADDR. */
6676
6677 static void
6678 find_symbol_for_address (Elf_Internal_Sym * symtab,
6679 unsigned long nsyms,
6680 const char * strtab,
6681 unsigned long strtab_size,
6682 struct absaddr addr,
6683 const char ** symname,
6684 bfd_vma * offset)
6685 {
6686 bfd_vma dist = 0x100000;
6687 Elf_Internal_Sym * sym;
6688 Elf_Internal_Sym * beg;
6689 Elf_Internal_Sym * end;
6690 Elf_Internal_Sym * best = NULL;
6691
6692 REMOVE_ARCH_BITS (addr.offset);
6693 beg = symtab;
6694 end = symtab + nsyms;
6695
6696 while (beg < end)
6697 {
6698 bfd_vma value;
6699
6700 sym = beg + (end - beg) / 2;
6701
6702 value = sym->st_value;
6703 REMOVE_ARCH_BITS (value);
6704
6705 if (sym->st_name != 0
6706 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6707 && addr.offset >= value
6708 && addr.offset - value < dist)
6709 {
6710 best = sym;
6711 dist = addr.offset - value;
6712 if (!dist)
6713 break;
6714 }
6715
6716 if (addr.offset < value)
6717 end = sym;
6718 else
6719 beg = sym + 1;
6720 }
6721
6722 if (best)
6723 {
6724 *symname = (best->st_name >= strtab_size
6725 ? _("<corrupt>") : strtab + best->st_name);
6726 *offset = dist;
6727 return;
6728 }
6729
6730 *symname = NULL;
6731 *offset = addr.offset;
6732 }
6733
6734 static int
6735 symcmp (const void *p, const void *q)
6736 {
6737 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6738 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6739
6740 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6741 }
6742
6743 /* Process the unwind section. */
6744
6745 #include "unwind-ia64.h"
6746
6747 struct ia64_unw_table_entry
6748 {
6749 struct absaddr start;
6750 struct absaddr end;
6751 struct absaddr info;
6752 };
6753
6754 struct ia64_unw_aux_info
6755 {
6756 struct ia64_unw_table_entry *table; /* Unwind table. */
6757 unsigned long table_len; /* Length of unwind table. */
6758 unsigned char * info; /* Unwind info. */
6759 unsigned long info_size; /* Size of unwind info. */
6760 bfd_vma info_addr; /* Starting address of unwind info. */
6761 bfd_vma seg_base; /* Starting address of segment. */
6762 Elf_Internal_Sym * symtab; /* The symbol table. */
6763 unsigned long nsyms; /* Number of symbols. */
6764 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6765 unsigned long nfuns; /* Number of entries in funtab. */
6766 char * strtab; /* The string table. */
6767 unsigned long strtab_size; /* Size of string table. */
6768 };
6769
6770 static void
6771 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6772 {
6773 struct ia64_unw_table_entry * tp;
6774 unsigned long j, nfuns;
6775 int in_body;
6776
6777 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6778 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6779 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6780 aux->funtab[nfuns++] = aux->symtab[j];
6781 aux->nfuns = nfuns;
6782 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6783
6784 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6785 {
6786 bfd_vma stamp;
6787 bfd_vma offset;
6788 const unsigned char * dp;
6789 const unsigned char * head;
6790 const unsigned char * end;
6791 const char * procname;
6792
6793 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6794 aux->strtab_size, tp->start, &procname, &offset);
6795
6796 fputs ("\n<", stdout);
6797
6798 if (procname)
6799 {
6800 fputs (procname, stdout);
6801
6802 if (offset)
6803 printf ("+%lx", (unsigned long) offset);
6804 }
6805
6806 fputs (">: [", stdout);
6807 print_vma (tp->start.offset, PREFIX_HEX);
6808 fputc ('-', stdout);
6809 print_vma (tp->end.offset, PREFIX_HEX);
6810 printf ("], info at +0x%lx\n",
6811 (unsigned long) (tp->info.offset - aux->seg_base));
6812
6813 /* PR 17531: file: 86232b32. */
6814 if (aux->info == NULL)
6815 continue;
6816
6817 /* PR 17531: file: 0997b4d1. */
6818 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6819 {
6820 warn (_("Invalid offset %lx in table entry %ld\n"),
6821 (long) tp->info.offset, (long) (tp - aux->table));
6822 continue;
6823 }
6824
6825 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6826 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6827
6828 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6829 (unsigned) UNW_VER (stamp),
6830 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6831 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6832 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6833 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6834
6835 if (UNW_VER (stamp) != 1)
6836 {
6837 printf (_("\tUnknown version.\n"));
6838 continue;
6839 }
6840
6841 in_body = 0;
6842 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6843 /* PR 17531: file: 16ceda89. */
6844 if (end > aux->info + aux->info_size)
6845 end = aux->info + aux->info_size;
6846 for (dp = head + 8; dp < end;)
6847 dp = unw_decode (dp, in_body, & in_body, end);
6848 }
6849
6850 free (aux->funtab);
6851 }
6852
6853 static bfd_boolean
6854 slurp_ia64_unwind_table (FILE * file,
6855 struct ia64_unw_aux_info * aux,
6856 Elf_Internal_Shdr * sec)
6857 {
6858 unsigned long size, nrelas, i;
6859 Elf_Internal_Phdr * seg;
6860 struct ia64_unw_table_entry * tep;
6861 Elf_Internal_Shdr * relsec;
6862 Elf_Internal_Rela * rela;
6863 Elf_Internal_Rela * rp;
6864 unsigned char * table;
6865 unsigned char * tp;
6866 Elf_Internal_Sym * sym;
6867 const char * relname;
6868
6869 aux->table_len = 0;
6870
6871 /* First, find the starting address of the segment that includes
6872 this section: */
6873
6874 if (elf_header.e_phnum)
6875 {
6876 if (! get_program_headers (file))
6877 return FALSE;
6878
6879 for (seg = program_headers;
6880 seg < program_headers + elf_header.e_phnum;
6881 ++seg)
6882 {
6883 if (seg->p_type != PT_LOAD)
6884 continue;
6885
6886 if (sec->sh_addr >= seg->p_vaddr
6887 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6888 {
6889 aux->seg_base = seg->p_vaddr;
6890 break;
6891 }
6892 }
6893 }
6894
6895 /* Second, build the unwind table from the contents of the unwind section: */
6896 size = sec->sh_size;
6897 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6898 _("unwind table"));
6899 if (!table)
6900 return FALSE;
6901
6902 aux->table_len = size / (3 * eh_addr_size);
6903 aux->table = (struct ia64_unw_table_entry *)
6904 xcmalloc (aux->table_len, sizeof (aux->table[0]));
6905 tep = aux->table;
6906
6907 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6908 {
6909 tep->start.section = SHN_UNDEF;
6910 tep->end.section = SHN_UNDEF;
6911 tep->info.section = SHN_UNDEF;
6912 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6913 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6914 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6915 tep->start.offset += aux->seg_base;
6916 tep->end.offset += aux->seg_base;
6917 tep->info.offset += aux->seg_base;
6918 }
6919 free (table);
6920
6921 /* Third, apply any relocations to the unwind table: */
6922 for (relsec = section_headers;
6923 relsec < section_headers + elf_header.e_shnum;
6924 ++relsec)
6925 {
6926 if (relsec->sh_type != SHT_RELA
6927 || relsec->sh_info >= elf_header.e_shnum
6928 || section_headers + relsec->sh_info != sec)
6929 continue;
6930
6931 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6932 & rela, & nrelas))
6933 {
6934 free (aux->table);
6935 aux->table = NULL;
6936 aux->table_len = 0;
6937 return FALSE;
6938 }
6939
6940 for (rp = rela; rp < rela + nrelas; ++rp)
6941 {
6942 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6943 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6944
6945 /* PR 17531: file: 9fa67536. */
6946 if (relname == NULL)
6947 {
6948 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6949 continue;
6950 }
6951
6952 if (! const_strneq (relname, "R_IA64_SEGREL"))
6953 {
6954 warn (_("Skipping unexpected relocation type: %s\n"), relname);
6955 continue;
6956 }
6957
6958 i = rp->r_offset / (3 * eh_addr_size);
6959
6960 /* PR 17531: file: 5bc8d9bf. */
6961 if (i >= aux->table_len)
6962 {
6963 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6964 continue;
6965 }
6966
6967 switch (rp->r_offset / eh_addr_size % 3)
6968 {
6969 case 0:
6970 aux->table[i].start.section = sym->st_shndx;
6971 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6972 break;
6973 case 1:
6974 aux->table[i].end.section = sym->st_shndx;
6975 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6976 break;
6977 case 2:
6978 aux->table[i].info.section = sym->st_shndx;
6979 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6980 break;
6981 default:
6982 break;
6983 }
6984 }
6985
6986 free (rela);
6987 }
6988
6989 return TRUE;
6990 }
6991
6992 static void
6993 ia64_process_unwind (FILE * file)
6994 {
6995 Elf_Internal_Shdr * sec;
6996 Elf_Internal_Shdr * unwsec = NULL;
6997 Elf_Internal_Shdr * strsec;
6998 unsigned long i, unwcount = 0, unwstart = 0;
6999 struct ia64_unw_aux_info aux;
7000
7001 memset (& aux, 0, sizeof (aux));
7002
7003 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7004 {
7005 if (sec->sh_type == SHT_SYMTAB
7006 && sec->sh_link < elf_header.e_shnum)
7007 {
7008 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7009
7010 strsec = section_headers + sec->sh_link;
7011 if (aux.strtab != NULL)
7012 {
7013 error (_("Multiple auxillary string tables encountered\n"));
7014 free (aux.strtab);
7015 }
7016 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7017 1, strsec->sh_size,
7018 _("string table"));
7019 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7020 }
7021 else if (sec->sh_type == SHT_IA_64_UNWIND)
7022 unwcount++;
7023 }
7024
7025 if (!unwcount)
7026 printf (_("\nThere are no unwind sections in this file.\n"));
7027
7028 while (unwcount-- > 0)
7029 {
7030 char * suffix;
7031 size_t len, len2;
7032
7033 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7034 i < elf_header.e_shnum; ++i, ++sec)
7035 if (sec->sh_type == SHT_IA_64_UNWIND)
7036 {
7037 unwsec = sec;
7038 break;
7039 }
7040 /* We have already counted the number of SHT_IA64_UNWIND
7041 sections so the loop above should never fail. */
7042 assert (unwsec != NULL);
7043
7044 unwstart = i + 1;
7045 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7046
7047 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7048 {
7049 /* We need to find which section group it is in. */
7050 struct group_list * g;
7051
7052 if (section_headers_groups == NULL
7053 || section_headers_groups [i] == NULL)
7054 i = elf_header.e_shnum;
7055 else
7056 {
7057 g = section_headers_groups [i]->root;
7058
7059 for (; g != NULL; g = g->next)
7060 {
7061 sec = section_headers + g->section_index;
7062
7063 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7064 break;
7065 }
7066
7067 if (g == NULL)
7068 i = elf_header.e_shnum;
7069 }
7070 }
7071 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7072 {
7073 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7074 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7075 suffix = SECTION_NAME (unwsec) + len;
7076 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7077 ++i, ++sec)
7078 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7079 && streq (SECTION_NAME (sec) + len2, suffix))
7080 break;
7081 }
7082 else
7083 {
7084 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7085 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7086 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7087 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7088 suffix = "";
7089 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7090 suffix = SECTION_NAME (unwsec) + len;
7091 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7092 ++i, ++sec)
7093 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7094 && streq (SECTION_NAME (sec) + len2, suffix))
7095 break;
7096 }
7097
7098 if (i == elf_header.e_shnum)
7099 {
7100 printf (_("\nCould not find unwind info section for "));
7101
7102 if (string_table == NULL)
7103 printf ("%d", unwsec->sh_name);
7104 else
7105 printf ("'%s'", printable_section_name (unwsec));
7106 }
7107 else
7108 {
7109 aux.info_addr = sec->sh_addr;
7110 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7111 sec->sh_size,
7112 _("unwind info"));
7113 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7114
7115 printf (_("\nUnwind section "));
7116
7117 if (string_table == NULL)
7118 printf ("%d", unwsec->sh_name);
7119 else
7120 printf ("'%s'", printable_section_name (unwsec));
7121
7122 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7123 (unsigned long) unwsec->sh_offset,
7124 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7125
7126 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7127 && aux.table_len > 0)
7128 dump_ia64_unwind (& aux);
7129
7130 if (aux.table)
7131 free ((char *) aux.table);
7132 if (aux.info)
7133 free ((char *) aux.info);
7134 aux.table = NULL;
7135 aux.info = NULL;
7136 }
7137 }
7138
7139 if (aux.symtab)
7140 free (aux.symtab);
7141 if (aux.strtab)
7142 free ((char *) aux.strtab);
7143 }
7144
7145 struct hppa_unw_table_entry
7146 {
7147 struct absaddr start;
7148 struct absaddr end;
7149 unsigned int Cannot_unwind:1; /* 0 */
7150 unsigned int Millicode:1; /* 1 */
7151 unsigned int Millicode_save_sr0:1; /* 2 */
7152 unsigned int Region_description:2; /* 3..4 */
7153 unsigned int reserved1:1; /* 5 */
7154 unsigned int Entry_SR:1; /* 6 */
7155 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7156 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7157 unsigned int Args_stored:1; /* 16 */
7158 unsigned int Variable_Frame:1; /* 17 */
7159 unsigned int Separate_Package_Body:1; /* 18 */
7160 unsigned int Frame_Extension_Millicode:1; /* 19 */
7161 unsigned int Stack_Overflow_Check:1; /* 20 */
7162 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7163 unsigned int Ada_Region:1; /* 22 */
7164 unsigned int cxx_info:1; /* 23 */
7165 unsigned int cxx_try_catch:1; /* 24 */
7166 unsigned int sched_entry_seq:1; /* 25 */
7167 unsigned int reserved2:1; /* 26 */
7168 unsigned int Save_SP:1; /* 27 */
7169 unsigned int Save_RP:1; /* 28 */
7170 unsigned int Save_MRP_in_frame:1; /* 29 */
7171 unsigned int extn_ptr_defined:1; /* 30 */
7172 unsigned int Cleanup_defined:1; /* 31 */
7173
7174 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7175 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7176 unsigned int Large_frame:1; /* 2 */
7177 unsigned int Pseudo_SP_Set:1; /* 3 */
7178 unsigned int reserved4:1; /* 4 */
7179 unsigned int Total_frame_size:27; /* 5..31 */
7180 };
7181
7182 struct hppa_unw_aux_info
7183 {
7184 struct hppa_unw_table_entry * table; /* Unwind table. */
7185 unsigned long table_len; /* Length of unwind table. */
7186 bfd_vma seg_base; /* Starting address of segment. */
7187 Elf_Internal_Sym * symtab; /* The symbol table. */
7188 unsigned long nsyms; /* Number of symbols. */
7189 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7190 unsigned long nfuns; /* Number of entries in funtab. */
7191 char * strtab; /* The string table. */
7192 unsigned long strtab_size; /* Size of string table. */
7193 };
7194
7195 static void
7196 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7197 {
7198 struct hppa_unw_table_entry * tp;
7199 unsigned long j, nfuns;
7200
7201 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7202 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7203 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7204 aux->funtab[nfuns++] = aux->symtab[j];
7205 aux->nfuns = nfuns;
7206 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7207
7208 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7209 {
7210 bfd_vma offset;
7211 const char * procname;
7212
7213 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7214 aux->strtab_size, tp->start, &procname,
7215 &offset);
7216
7217 fputs ("\n<", stdout);
7218
7219 if (procname)
7220 {
7221 fputs (procname, stdout);
7222
7223 if (offset)
7224 printf ("+%lx", (unsigned long) offset);
7225 }
7226
7227 fputs (">: [", stdout);
7228 print_vma (tp->start.offset, PREFIX_HEX);
7229 fputc ('-', stdout);
7230 print_vma (tp->end.offset, PREFIX_HEX);
7231 printf ("]\n\t");
7232
7233 #define PF(_m) if (tp->_m) printf (#_m " ");
7234 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7235 PF(Cannot_unwind);
7236 PF(Millicode);
7237 PF(Millicode_save_sr0);
7238 /* PV(Region_description); */
7239 PF(Entry_SR);
7240 PV(Entry_FR);
7241 PV(Entry_GR);
7242 PF(Args_stored);
7243 PF(Variable_Frame);
7244 PF(Separate_Package_Body);
7245 PF(Frame_Extension_Millicode);
7246 PF(Stack_Overflow_Check);
7247 PF(Two_Instruction_SP_Increment);
7248 PF(Ada_Region);
7249 PF(cxx_info);
7250 PF(cxx_try_catch);
7251 PF(sched_entry_seq);
7252 PF(Save_SP);
7253 PF(Save_RP);
7254 PF(Save_MRP_in_frame);
7255 PF(extn_ptr_defined);
7256 PF(Cleanup_defined);
7257 PF(MPE_XL_interrupt_marker);
7258 PF(HP_UX_interrupt_marker);
7259 PF(Large_frame);
7260 PF(Pseudo_SP_Set);
7261 PV(Total_frame_size);
7262 #undef PF
7263 #undef PV
7264 }
7265
7266 printf ("\n");
7267
7268 free (aux->funtab);
7269 }
7270
7271 static int
7272 slurp_hppa_unwind_table (FILE * file,
7273 struct hppa_unw_aux_info * aux,
7274 Elf_Internal_Shdr * sec)
7275 {
7276 unsigned long size, unw_ent_size, nentries, nrelas, i;
7277 Elf_Internal_Phdr * seg;
7278 struct hppa_unw_table_entry * tep;
7279 Elf_Internal_Shdr * relsec;
7280 Elf_Internal_Rela * rela;
7281 Elf_Internal_Rela * rp;
7282 unsigned char * table;
7283 unsigned char * tp;
7284 Elf_Internal_Sym * sym;
7285 const char * relname;
7286
7287 /* First, find the starting address of the segment that includes
7288 this section. */
7289
7290 if (elf_header.e_phnum)
7291 {
7292 if (! get_program_headers (file))
7293 return 0;
7294
7295 for (seg = program_headers;
7296 seg < program_headers + elf_header.e_phnum;
7297 ++seg)
7298 {
7299 if (seg->p_type != PT_LOAD)
7300 continue;
7301
7302 if (sec->sh_addr >= seg->p_vaddr
7303 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7304 {
7305 aux->seg_base = seg->p_vaddr;
7306 break;
7307 }
7308 }
7309 }
7310
7311 /* Second, build the unwind table from the contents of the unwind
7312 section. */
7313 size = sec->sh_size;
7314 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7315 _("unwind table"));
7316 if (!table)
7317 return 0;
7318
7319 unw_ent_size = 16;
7320 nentries = size / unw_ent_size;
7321 size = unw_ent_size * nentries;
7322
7323 tep = aux->table = (struct hppa_unw_table_entry *)
7324 xcmalloc (nentries, sizeof (aux->table[0]));
7325
7326 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7327 {
7328 unsigned int tmp1, tmp2;
7329
7330 tep->start.section = SHN_UNDEF;
7331 tep->end.section = SHN_UNDEF;
7332
7333 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7334 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7335 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7336 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7337
7338 tep->start.offset += aux->seg_base;
7339 tep->end.offset += aux->seg_base;
7340
7341 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7342 tep->Millicode = (tmp1 >> 30) & 0x1;
7343 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7344 tep->Region_description = (tmp1 >> 27) & 0x3;
7345 tep->reserved1 = (tmp1 >> 26) & 0x1;
7346 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7347 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7348 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7349 tep->Args_stored = (tmp1 >> 15) & 0x1;
7350 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7351 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7352 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7353 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7354 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7355 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7356 tep->cxx_info = (tmp1 >> 8) & 0x1;
7357 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7358 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7359 tep->reserved2 = (tmp1 >> 5) & 0x1;
7360 tep->Save_SP = (tmp1 >> 4) & 0x1;
7361 tep->Save_RP = (tmp1 >> 3) & 0x1;
7362 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7363 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7364 tep->Cleanup_defined = tmp1 & 0x1;
7365
7366 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7367 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7368 tep->Large_frame = (tmp2 >> 29) & 0x1;
7369 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7370 tep->reserved4 = (tmp2 >> 27) & 0x1;
7371 tep->Total_frame_size = tmp2 & 0x7ffffff;
7372 }
7373 free (table);
7374
7375 /* Third, apply any relocations to the unwind table. */
7376 for (relsec = section_headers;
7377 relsec < section_headers + elf_header.e_shnum;
7378 ++relsec)
7379 {
7380 if (relsec->sh_type != SHT_RELA
7381 || relsec->sh_info >= elf_header.e_shnum
7382 || section_headers + relsec->sh_info != sec)
7383 continue;
7384
7385 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7386 & rela, & nrelas))
7387 return 0;
7388
7389 for (rp = rela; rp < rela + nrelas; ++rp)
7390 {
7391 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7392 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7393
7394 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7395 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7396 {
7397 warn (_("Skipping unexpected relocation type %s\n"), relname);
7398 continue;
7399 }
7400
7401 i = rp->r_offset / unw_ent_size;
7402
7403 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7404 {
7405 case 0:
7406 aux->table[i].start.section = sym->st_shndx;
7407 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7408 break;
7409 case 1:
7410 aux->table[i].end.section = sym->st_shndx;
7411 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7412 break;
7413 default:
7414 break;
7415 }
7416 }
7417
7418 free (rela);
7419 }
7420
7421 aux->table_len = nentries;
7422
7423 return 1;
7424 }
7425
7426 static void
7427 hppa_process_unwind (FILE * file)
7428 {
7429 struct hppa_unw_aux_info aux;
7430 Elf_Internal_Shdr * unwsec = NULL;
7431 Elf_Internal_Shdr * strsec;
7432 Elf_Internal_Shdr * sec;
7433 unsigned long i;
7434
7435 if (string_table == NULL)
7436 return;
7437
7438 memset (& aux, 0, sizeof (aux));
7439
7440 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7441 {
7442 if (sec->sh_type == SHT_SYMTAB
7443 && sec->sh_link < elf_header.e_shnum)
7444 {
7445 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7446
7447 strsec = section_headers + sec->sh_link;
7448 if (aux.strtab != NULL)
7449 {
7450 error (_("Multiple auxillary string tables encountered\n"));
7451 free (aux.strtab);
7452 }
7453 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7454 1, strsec->sh_size,
7455 _("string table"));
7456 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7457 }
7458 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7459 unwsec = sec;
7460 }
7461
7462 if (!unwsec)
7463 printf (_("\nThere are no unwind sections in this file.\n"));
7464
7465 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7466 {
7467 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7468 {
7469 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7470 printable_section_name (sec),
7471 (unsigned long) sec->sh_offset,
7472 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7473
7474 slurp_hppa_unwind_table (file, &aux, sec);
7475 if (aux.table_len > 0)
7476 dump_hppa_unwind (&aux);
7477
7478 if (aux.table)
7479 free ((char *) aux.table);
7480 aux.table = NULL;
7481 }
7482 }
7483
7484 if (aux.symtab)
7485 free (aux.symtab);
7486 if (aux.strtab)
7487 free ((char *) aux.strtab);
7488 }
7489
7490 struct arm_section
7491 {
7492 unsigned char * data; /* The unwind data. */
7493 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7494 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7495 unsigned long nrelas; /* The number of relocations. */
7496 unsigned int rel_type; /* REL or RELA ? */
7497 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7498 };
7499
7500 struct arm_unw_aux_info
7501 {
7502 FILE * file; /* The file containing the unwind sections. */
7503 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7504 unsigned long nsyms; /* Number of symbols. */
7505 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7506 unsigned long nfuns; /* Number of these symbols. */
7507 char * strtab; /* The file's string table. */
7508 unsigned long strtab_size; /* Size of string table. */
7509 };
7510
7511 static const char *
7512 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7513 bfd_vma fn, struct absaddr addr)
7514 {
7515 const char *procname;
7516 bfd_vma sym_offset;
7517
7518 if (addr.section == SHN_UNDEF)
7519 addr.offset = fn;
7520
7521 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7522 aux->strtab_size, addr, &procname,
7523 &sym_offset);
7524
7525 print_vma (fn, PREFIX_HEX);
7526
7527 if (procname)
7528 {
7529 fputs (" <", stdout);
7530 fputs (procname, stdout);
7531
7532 if (sym_offset)
7533 printf ("+0x%lx", (unsigned long) sym_offset);
7534 fputc ('>', stdout);
7535 }
7536
7537 return procname;
7538 }
7539
7540 static void
7541 arm_free_section (struct arm_section *arm_sec)
7542 {
7543 if (arm_sec->data != NULL)
7544 free (arm_sec->data);
7545
7546 if (arm_sec->rela != NULL)
7547 free (arm_sec->rela);
7548 }
7549
7550 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7551 cached section and install SEC instead.
7552 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7553 and return its valued in * WORDP, relocating if necessary.
7554 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7555 relocation's offset in ADDR.
7556 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7557 into the string table of the symbol associated with the reloc. If no
7558 reloc was applied store -1 there.
7559 5) Return TRUE upon success, FALSE otherwise. */
7560
7561 static bfd_boolean
7562 get_unwind_section_word (struct arm_unw_aux_info * aux,
7563 struct arm_section * arm_sec,
7564 Elf_Internal_Shdr * sec,
7565 bfd_vma word_offset,
7566 unsigned int * wordp,
7567 struct absaddr * addr,
7568 bfd_vma * sym_name)
7569 {
7570 Elf_Internal_Rela *rp;
7571 Elf_Internal_Sym *sym;
7572 const char * relname;
7573 unsigned int word;
7574 bfd_boolean wrapped;
7575
7576 if (sec == NULL || arm_sec == NULL)
7577 return FALSE;
7578
7579 addr->section = SHN_UNDEF;
7580 addr->offset = 0;
7581
7582 if (sym_name != NULL)
7583 *sym_name = (bfd_vma) -1;
7584
7585 /* If necessary, update the section cache. */
7586 if (sec != arm_sec->sec)
7587 {
7588 Elf_Internal_Shdr *relsec;
7589
7590 arm_free_section (arm_sec);
7591
7592 arm_sec->sec = sec;
7593 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7594 sec->sh_size, _("unwind data"));
7595 arm_sec->rela = NULL;
7596 arm_sec->nrelas = 0;
7597
7598 for (relsec = section_headers;
7599 relsec < section_headers + elf_header.e_shnum;
7600 ++relsec)
7601 {
7602 if (relsec->sh_info >= elf_header.e_shnum
7603 || section_headers + relsec->sh_info != sec
7604 /* PR 15745: Check the section type as well. */
7605 || (relsec->sh_type != SHT_REL
7606 && relsec->sh_type != SHT_RELA))
7607 continue;
7608
7609 arm_sec->rel_type = relsec->sh_type;
7610 if (relsec->sh_type == SHT_REL)
7611 {
7612 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7613 relsec->sh_size,
7614 & arm_sec->rela, & arm_sec->nrelas))
7615 return FALSE;
7616 }
7617 else /* relsec->sh_type == SHT_RELA */
7618 {
7619 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7620 relsec->sh_size,
7621 & arm_sec->rela, & arm_sec->nrelas))
7622 return FALSE;
7623 }
7624 break;
7625 }
7626
7627 arm_sec->next_rela = arm_sec->rela;
7628 }
7629
7630 /* If there is no unwind data we can do nothing. */
7631 if (arm_sec->data == NULL)
7632 return FALSE;
7633
7634 /* If the offset is invalid then fail. */
7635 if (word_offset > (sec->sh_size - 4)
7636 /* PR 18879 */
7637 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7638 || ((bfd_signed_vma) word_offset) < 0)
7639 return FALSE;
7640
7641 /* Get the word at the required offset. */
7642 word = byte_get (arm_sec->data + word_offset, 4);
7643
7644 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7645 if (arm_sec->rela == NULL)
7646 {
7647 * wordp = word;
7648 return TRUE;
7649 }
7650
7651 /* Look through the relocs to find the one that applies to the provided offset. */
7652 wrapped = FALSE;
7653 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7654 {
7655 bfd_vma prelval, offset;
7656
7657 if (rp->r_offset > word_offset && !wrapped)
7658 {
7659 rp = arm_sec->rela;
7660 wrapped = TRUE;
7661 }
7662 if (rp->r_offset > word_offset)
7663 break;
7664
7665 if (rp->r_offset & 3)
7666 {
7667 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7668 (unsigned long) rp->r_offset);
7669 continue;
7670 }
7671
7672 if (rp->r_offset < word_offset)
7673 continue;
7674
7675 /* PR 17531: file: 027-161405-0.004 */
7676 if (aux->symtab == NULL)
7677 continue;
7678
7679 if (arm_sec->rel_type == SHT_REL)
7680 {
7681 offset = word & 0x7fffffff;
7682 if (offset & 0x40000000)
7683 offset |= ~ (bfd_vma) 0x7fffffff;
7684 }
7685 else if (arm_sec->rel_type == SHT_RELA)
7686 offset = rp->r_addend;
7687 else
7688 {
7689 error (_("Unknown section relocation type %d encountered\n"),
7690 arm_sec->rel_type);
7691 break;
7692 }
7693
7694 /* PR 17531 file: 027-1241568-0.004. */
7695 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7696 {
7697 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7698 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7699 break;
7700 }
7701
7702 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7703 offset += sym->st_value;
7704 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7705
7706 /* Check that we are processing the expected reloc type. */
7707 if (elf_header.e_machine == EM_ARM)
7708 {
7709 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7710 if (relname == NULL)
7711 {
7712 warn (_("Skipping unknown ARM relocation type: %d\n"),
7713 (int) ELF32_R_TYPE (rp->r_info));
7714 continue;
7715 }
7716
7717 if (streq (relname, "R_ARM_NONE"))
7718 continue;
7719
7720 if (! streq (relname, "R_ARM_PREL31"))
7721 {
7722 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7723 continue;
7724 }
7725 }
7726 else if (elf_header.e_machine == EM_TI_C6000)
7727 {
7728 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7729 if (relname == NULL)
7730 {
7731 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7732 (int) ELF32_R_TYPE (rp->r_info));
7733 continue;
7734 }
7735
7736 if (streq (relname, "R_C6000_NONE"))
7737 continue;
7738
7739 if (! streq (relname, "R_C6000_PREL31"))
7740 {
7741 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7742 continue;
7743 }
7744
7745 prelval >>= 1;
7746 }
7747 else
7748 {
7749 /* This function currently only supports ARM and TI unwinders. */
7750 warn (_("Only TI and ARM unwinders are currently supported\n"));
7751 break;
7752 }
7753
7754 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7755 addr->section = sym->st_shndx;
7756 addr->offset = offset;
7757
7758 if (sym_name)
7759 * sym_name = sym->st_name;
7760 break;
7761 }
7762
7763 *wordp = word;
7764 arm_sec->next_rela = rp;
7765
7766 return TRUE;
7767 }
7768
7769 static const char *tic6x_unwind_regnames[16] =
7770 {
7771 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7772 "A14", "A13", "A12", "A11", "A10",
7773 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7774 };
7775
7776 static void
7777 decode_tic6x_unwind_regmask (unsigned int mask)
7778 {
7779 int i;
7780
7781 for (i = 12; mask; mask >>= 1, i--)
7782 {
7783 if (mask & 1)
7784 {
7785 fputs (tic6x_unwind_regnames[i], stdout);
7786 if (mask > 1)
7787 fputs (", ", stdout);
7788 }
7789 }
7790 }
7791
7792 #define ADVANCE \
7793 if (remaining == 0 && more_words) \
7794 { \
7795 data_offset += 4; \
7796 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7797 data_offset, & word, & addr, NULL)) \
7798 return; \
7799 remaining = 4; \
7800 more_words--; \
7801 } \
7802
7803 #define GET_OP(OP) \
7804 ADVANCE; \
7805 if (remaining) \
7806 { \
7807 remaining--; \
7808 (OP) = word >> 24; \
7809 word <<= 8; \
7810 } \
7811 else \
7812 { \
7813 printf (_("[Truncated opcode]\n")); \
7814 return; \
7815 } \
7816 printf ("0x%02x ", OP)
7817
7818 static void
7819 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7820 unsigned int word,
7821 unsigned int remaining,
7822 unsigned int more_words,
7823 bfd_vma data_offset,
7824 Elf_Internal_Shdr * data_sec,
7825 struct arm_section * data_arm_sec)
7826 {
7827 struct absaddr addr;
7828
7829 /* Decode the unwinding instructions. */
7830 while (1)
7831 {
7832 unsigned int op, op2;
7833
7834 ADVANCE;
7835 if (remaining == 0)
7836 break;
7837 remaining--;
7838 op = word >> 24;
7839 word <<= 8;
7840
7841 printf (" 0x%02x ", op);
7842
7843 if ((op & 0xc0) == 0x00)
7844 {
7845 int offset = ((op & 0x3f) << 2) + 4;
7846
7847 printf (" vsp = vsp + %d", offset);
7848 }
7849 else if ((op & 0xc0) == 0x40)
7850 {
7851 int offset = ((op & 0x3f) << 2) + 4;
7852
7853 printf (" vsp = vsp - %d", offset);
7854 }
7855 else if ((op & 0xf0) == 0x80)
7856 {
7857 GET_OP (op2);
7858 if (op == 0x80 && op2 == 0)
7859 printf (_("Refuse to unwind"));
7860 else
7861 {
7862 unsigned int mask = ((op & 0x0f) << 8) | op2;
7863 int first = 1;
7864 int i;
7865
7866 printf ("pop {");
7867 for (i = 0; i < 12; i++)
7868 if (mask & (1 << i))
7869 {
7870 if (first)
7871 first = 0;
7872 else
7873 printf (", ");
7874 printf ("r%d", 4 + i);
7875 }
7876 printf ("}");
7877 }
7878 }
7879 else if ((op & 0xf0) == 0x90)
7880 {
7881 if (op == 0x9d || op == 0x9f)
7882 printf (_(" [Reserved]"));
7883 else
7884 printf (" vsp = r%d", op & 0x0f);
7885 }
7886 else if ((op & 0xf0) == 0xa0)
7887 {
7888 int end = 4 + (op & 0x07);
7889 int first = 1;
7890 int i;
7891
7892 printf (" pop {");
7893 for (i = 4; i <= end; i++)
7894 {
7895 if (first)
7896 first = 0;
7897 else
7898 printf (", ");
7899 printf ("r%d", i);
7900 }
7901 if (op & 0x08)
7902 {
7903 if (!first)
7904 printf (", ");
7905 printf ("r14");
7906 }
7907 printf ("}");
7908 }
7909 else if (op == 0xb0)
7910 printf (_(" finish"));
7911 else if (op == 0xb1)
7912 {
7913 GET_OP (op2);
7914 if (op2 == 0 || (op2 & 0xf0) != 0)
7915 printf (_("[Spare]"));
7916 else
7917 {
7918 unsigned int mask = op2 & 0x0f;
7919 int first = 1;
7920 int i;
7921
7922 printf ("pop {");
7923 for (i = 0; i < 12; i++)
7924 if (mask & (1 << i))
7925 {
7926 if (first)
7927 first = 0;
7928 else
7929 printf (", ");
7930 printf ("r%d", i);
7931 }
7932 printf ("}");
7933 }
7934 }
7935 else if (op == 0xb2)
7936 {
7937 unsigned char buf[9];
7938 unsigned int i, len;
7939 unsigned long offset;
7940
7941 for (i = 0; i < sizeof (buf); i++)
7942 {
7943 GET_OP (buf[i]);
7944 if ((buf[i] & 0x80) == 0)
7945 break;
7946 }
7947 if (i == sizeof (buf))
7948 printf (_("corrupt change to vsp"));
7949 else
7950 {
7951 offset = read_uleb128 (buf, &len, buf + i + 1);
7952 assert (len == i + 1);
7953 offset = offset * 4 + 0x204;
7954 printf ("vsp = vsp + %ld", offset);
7955 }
7956 }
7957 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7958 {
7959 unsigned int first, last;
7960
7961 GET_OP (op2);
7962 first = op2 >> 4;
7963 last = op2 & 0x0f;
7964 if (op == 0xc8)
7965 first = first + 16;
7966 printf ("pop {D%d", first);
7967 if (last)
7968 printf ("-D%d", first + last);
7969 printf ("}");
7970 }
7971 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7972 {
7973 unsigned int count = op & 0x07;
7974
7975 printf ("pop {D8");
7976 if (count)
7977 printf ("-D%d", 8 + count);
7978 printf ("}");
7979 }
7980 else if (op >= 0xc0 && op <= 0xc5)
7981 {
7982 unsigned int count = op & 0x07;
7983
7984 printf (" pop {wR10");
7985 if (count)
7986 printf ("-wR%d", 10 + count);
7987 printf ("}");
7988 }
7989 else if (op == 0xc6)
7990 {
7991 unsigned int first, last;
7992
7993 GET_OP (op2);
7994 first = op2 >> 4;
7995 last = op2 & 0x0f;
7996 printf ("pop {wR%d", first);
7997 if (last)
7998 printf ("-wR%d", first + last);
7999 printf ("}");
8000 }
8001 else if (op == 0xc7)
8002 {
8003 GET_OP (op2);
8004 if (op2 == 0 || (op2 & 0xf0) != 0)
8005 printf (_("[Spare]"));
8006 else
8007 {
8008 unsigned int mask = op2 & 0x0f;
8009 int first = 1;
8010 int i;
8011
8012 printf ("pop {");
8013 for (i = 0; i < 4; i++)
8014 if (mask & (1 << i))
8015 {
8016 if (first)
8017 first = 0;
8018 else
8019 printf (", ");
8020 printf ("wCGR%d", i);
8021 }
8022 printf ("}");
8023 }
8024 }
8025 else
8026 printf (_(" [unsupported opcode]"));
8027 printf ("\n");
8028 }
8029 }
8030
8031 static void
8032 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8033 unsigned int word,
8034 unsigned int remaining,
8035 unsigned int more_words,
8036 bfd_vma data_offset,
8037 Elf_Internal_Shdr * data_sec,
8038 struct arm_section * data_arm_sec)
8039 {
8040 struct absaddr addr;
8041
8042 /* Decode the unwinding instructions. */
8043 while (1)
8044 {
8045 unsigned int op, op2;
8046
8047 ADVANCE;
8048 if (remaining == 0)
8049 break;
8050 remaining--;
8051 op = word >> 24;
8052 word <<= 8;
8053
8054 printf (" 0x%02x ", op);
8055
8056 if ((op & 0xc0) == 0x00)
8057 {
8058 int offset = ((op & 0x3f) << 3) + 8;
8059 printf (" sp = sp + %d", offset);
8060 }
8061 else if ((op & 0xc0) == 0x80)
8062 {
8063 GET_OP (op2);
8064 if (op == 0x80 && op2 == 0)
8065 printf (_("Refuse to unwind"));
8066 else
8067 {
8068 unsigned int mask = ((op & 0x1f) << 8) | op2;
8069 if (op & 0x20)
8070 printf ("pop compact {");
8071 else
8072 printf ("pop {");
8073
8074 decode_tic6x_unwind_regmask (mask);
8075 printf("}");
8076 }
8077 }
8078 else if ((op & 0xf0) == 0xc0)
8079 {
8080 unsigned int reg;
8081 unsigned int nregs;
8082 unsigned int i;
8083 const char *name;
8084 struct
8085 {
8086 unsigned int offset;
8087 unsigned int reg;
8088 } regpos[16];
8089
8090 /* Scan entire instruction first so that GET_OP output is not
8091 interleaved with disassembly. */
8092 nregs = 0;
8093 for (i = 0; nregs < (op & 0xf); i++)
8094 {
8095 GET_OP (op2);
8096 reg = op2 >> 4;
8097 if (reg != 0xf)
8098 {
8099 regpos[nregs].offset = i * 2;
8100 regpos[nregs].reg = reg;
8101 nregs++;
8102 }
8103
8104 reg = op2 & 0xf;
8105 if (reg != 0xf)
8106 {
8107 regpos[nregs].offset = i * 2 + 1;
8108 regpos[nregs].reg = reg;
8109 nregs++;
8110 }
8111 }
8112
8113 printf (_("pop frame {"));
8114 reg = nregs - 1;
8115 for (i = i * 2; i > 0; i--)
8116 {
8117 if (regpos[reg].offset == i - 1)
8118 {
8119 name = tic6x_unwind_regnames[regpos[reg].reg];
8120 if (reg > 0)
8121 reg--;
8122 }
8123 else
8124 name = _("[pad]");
8125
8126 fputs (name, stdout);
8127 if (i > 1)
8128 printf (", ");
8129 }
8130
8131 printf ("}");
8132 }
8133 else if (op == 0xd0)
8134 printf (" MOV FP, SP");
8135 else if (op == 0xd1)
8136 printf (" __c6xabi_pop_rts");
8137 else if (op == 0xd2)
8138 {
8139 unsigned char buf[9];
8140 unsigned int i, len;
8141 unsigned long offset;
8142
8143 for (i = 0; i < sizeof (buf); i++)
8144 {
8145 GET_OP (buf[i]);
8146 if ((buf[i] & 0x80) == 0)
8147 break;
8148 }
8149 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8150 if (i == sizeof (buf))
8151 {
8152 printf ("<corrupt sp adjust>\n");
8153 warn (_("Corrupt stack pointer adjustment detected\n"));
8154 return;
8155 }
8156
8157 offset = read_uleb128 (buf, &len, buf + i + 1);
8158 assert (len == i + 1);
8159 offset = offset * 8 + 0x408;
8160 printf (_("sp = sp + %ld"), offset);
8161 }
8162 else if ((op & 0xf0) == 0xe0)
8163 {
8164 if ((op & 0x0f) == 7)
8165 printf (" RETURN");
8166 else
8167 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8168 }
8169 else
8170 {
8171 printf (_(" [unsupported opcode]"));
8172 }
8173 putchar ('\n');
8174 }
8175 }
8176
8177 static bfd_vma
8178 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8179 {
8180 bfd_vma offset;
8181
8182 offset = word & 0x7fffffff;
8183 if (offset & 0x40000000)
8184 offset |= ~ (bfd_vma) 0x7fffffff;
8185
8186 if (elf_header.e_machine == EM_TI_C6000)
8187 offset <<= 1;
8188
8189 return offset + where;
8190 }
8191
8192 static void
8193 decode_arm_unwind (struct arm_unw_aux_info * aux,
8194 unsigned int word,
8195 unsigned int remaining,
8196 bfd_vma data_offset,
8197 Elf_Internal_Shdr * data_sec,
8198 struct arm_section * data_arm_sec)
8199 {
8200 int per_index;
8201 unsigned int more_words = 0;
8202 struct absaddr addr;
8203 bfd_vma sym_name = (bfd_vma) -1;
8204
8205 if (remaining == 0)
8206 {
8207 /* Fetch the first word.
8208 Note - when decoding an object file the address extracted
8209 here will always be 0. So we also pass in the sym_name
8210 parameter so that we can find the symbol associated with
8211 the personality routine. */
8212 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8213 & word, & addr, & sym_name))
8214 return;
8215
8216 remaining = 4;
8217 }
8218
8219 if ((word & 0x80000000) == 0)
8220 {
8221 /* Expand prel31 for personality routine. */
8222 bfd_vma fn;
8223 const char *procname;
8224
8225 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8226 printf (_(" Personality routine: "));
8227 if (fn == 0
8228 && addr.section == SHN_UNDEF && addr.offset == 0
8229 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8230 {
8231 procname = aux->strtab + sym_name;
8232 print_vma (fn, PREFIX_HEX);
8233 if (procname)
8234 {
8235 fputs (" <", stdout);
8236 fputs (procname, stdout);
8237 fputc ('>', stdout);
8238 }
8239 }
8240 else
8241 procname = arm_print_vma_and_name (aux, fn, addr);
8242 fputc ('\n', stdout);
8243
8244 /* The GCC personality routines use the standard compact
8245 encoding, starting with one byte giving the number of
8246 words. */
8247 if (procname != NULL
8248 && (const_strneq (procname, "__gcc_personality_v0")
8249 || const_strneq (procname, "__gxx_personality_v0")
8250 || const_strneq (procname, "__gcj_personality_v0")
8251 || const_strneq (procname, "__gnu_objc_personality_v0")))
8252 {
8253 remaining = 0;
8254 more_words = 1;
8255 ADVANCE;
8256 if (!remaining)
8257 {
8258 printf (_(" [Truncated data]\n"));
8259 return;
8260 }
8261 more_words = word >> 24;
8262 word <<= 8;
8263 remaining--;
8264 per_index = -1;
8265 }
8266 else
8267 return;
8268 }
8269 else
8270 {
8271 /* ARM EHABI Section 6.3:
8272
8273 An exception-handling table entry for the compact model looks like:
8274
8275 31 30-28 27-24 23-0
8276 -- ----- ----- ----
8277 1 0 index Data for personalityRoutine[index] */
8278
8279 if (elf_header.e_machine == EM_ARM
8280 && (word & 0x70000000))
8281 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8282
8283 per_index = (word >> 24) & 0x7f;
8284 printf (_(" Compact model index: %d\n"), per_index);
8285 if (per_index == 0)
8286 {
8287 more_words = 0;
8288 word <<= 8;
8289 remaining--;
8290 }
8291 else if (per_index < 3)
8292 {
8293 more_words = (word >> 16) & 0xff;
8294 word <<= 16;
8295 remaining -= 2;
8296 }
8297 }
8298
8299 switch (elf_header.e_machine)
8300 {
8301 case EM_ARM:
8302 if (per_index < 3)
8303 {
8304 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8305 data_offset, data_sec, data_arm_sec);
8306 }
8307 else
8308 {
8309 warn (_("Unknown ARM compact model index encountered\n"));
8310 printf (_(" [reserved]\n"));
8311 }
8312 break;
8313
8314 case EM_TI_C6000:
8315 if (per_index < 3)
8316 {
8317 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8318 data_offset, data_sec, data_arm_sec);
8319 }
8320 else if (per_index < 5)
8321 {
8322 if (((word >> 17) & 0x7f) == 0x7f)
8323 printf (_(" Restore stack from frame pointer\n"));
8324 else
8325 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8326 printf (_(" Registers restored: "));
8327 if (per_index == 4)
8328 printf (" (compact) ");
8329 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8330 putchar ('\n');
8331 printf (_(" Return register: %s\n"),
8332 tic6x_unwind_regnames[word & 0xf]);
8333 }
8334 else
8335 printf (_(" [reserved (%d)]\n"), per_index);
8336 break;
8337
8338 default:
8339 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8340 elf_header.e_machine);
8341 }
8342
8343 /* Decode the descriptors. Not implemented. */
8344 }
8345
8346 static void
8347 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8348 {
8349 struct arm_section exidx_arm_sec, extab_arm_sec;
8350 unsigned int i, exidx_len;
8351 unsigned long j, nfuns;
8352
8353 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8354 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8355 exidx_len = exidx_sec->sh_size / 8;
8356
8357 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8358 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8359 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8360 aux->funtab[nfuns++] = aux->symtab[j];
8361 aux->nfuns = nfuns;
8362 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8363
8364 for (i = 0; i < exidx_len; i++)
8365 {
8366 unsigned int exidx_fn, exidx_entry;
8367 struct absaddr fn_addr, entry_addr;
8368 bfd_vma fn;
8369
8370 fputc ('\n', stdout);
8371
8372 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8373 8 * i, & exidx_fn, & fn_addr, NULL)
8374 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8375 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8376 {
8377 free (aux->funtab);
8378 arm_free_section (& exidx_arm_sec);
8379 arm_free_section (& extab_arm_sec);
8380 return;
8381 }
8382
8383 /* ARM EHABI, Section 5:
8384 An index table entry consists of 2 words.
8385 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8386 if (exidx_fn & 0x80000000)
8387 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8388
8389 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8390
8391 arm_print_vma_and_name (aux, fn, fn_addr);
8392 fputs (": ", stdout);
8393
8394 if (exidx_entry == 1)
8395 {
8396 print_vma (exidx_entry, PREFIX_HEX);
8397 fputs (" [cantunwind]\n", stdout);
8398 }
8399 else if (exidx_entry & 0x80000000)
8400 {
8401 print_vma (exidx_entry, PREFIX_HEX);
8402 fputc ('\n', stdout);
8403 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8404 }
8405 else
8406 {
8407 bfd_vma table, table_offset = 0;
8408 Elf_Internal_Shdr *table_sec;
8409
8410 fputs ("@", stdout);
8411 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8412 print_vma (table, PREFIX_HEX);
8413 printf ("\n");
8414
8415 /* Locate the matching .ARM.extab. */
8416 if (entry_addr.section != SHN_UNDEF
8417 && entry_addr.section < elf_header.e_shnum)
8418 {
8419 table_sec = section_headers + entry_addr.section;
8420 table_offset = entry_addr.offset;
8421 /* PR 18879 */
8422 if (table_offset > table_sec->sh_size
8423 || ((bfd_signed_vma) table_offset) < 0)
8424 {
8425 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8426 (unsigned long) table_offset,
8427 printable_section_name (table_sec));
8428 continue;
8429 }
8430 }
8431 else
8432 {
8433 table_sec = find_section_by_address (table);
8434 if (table_sec != NULL)
8435 table_offset = table - table_sec->sh_addr;
8436 }
8437 if (table_sec == NULL)
8438 {
8439 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8440 (unsigned long) table);
8441 continue;
8442 }
8443 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8444 &extab_arm_sec);
8445 }
8446 }
8447
8448 printf ("\n");
8449
8450 free (aux->funtab);
8451 arm_free_section (&exidx_arm_sec);
8452 arm_free_section (&extab_arm_sec);
8453 }
8454
8455 /* Used for both ARM and C6X unwinding tables. */
8456
8457 static void
8458 arm_process_unwind (FILE *file)
8459 {
8460 struct arm_unw_aux_info aux;
8461 Elf_Internal_Shdr *unwsec = NULL;
8462 Elf_Internal_Shdr *strsec;
8463 Elf_Internal_Shdr *sec;
8464 unsigned long i;
8465 unsigned int sec_type;
8466
8467 switch (elf_header.e_machine)
8468 {
8469 case EM_ARM:
8470 sec_type = SHT_ARM_EXIDX;
8471 break;
8472
8473 case EM_TI_C6000:
8474 sec_type = SHT_C6000_UNWIND;
8475 break;
8476
8477 default:
8478 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8479 elf_header.e_machine);
8480 return;
8481 }
8482
8483 if (string_table == NULL)
8484 return;
8485
8486 memset (& aux, 0, sizeof (aux));
8487 aux.file = file;
8488
8489 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8490 {
8491 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8492 {
8493 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8494
8495 strsec = section_headers + sec->sh_link;
8496
8497 /* PR binutils/17531 file: 011-12666-0.004. */
8498 if (aux.strtab != NULL)
8499 {
8500 error (_("Multiple string tables found in file.\n"));
8501 free (aux.strtab);
8502 }
8503 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8504 1, strsec->sh_size, _("string table"));
8505 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8506 }
8507 else if (sec->sh_type == sec_type)
8508 unwsec = sec;
8509 }
8510
8511 if (unwsec == NULL)
8512 printf (_("\nThere are no unwind sections in this file.\n"));
8513 else
8514 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8515 {
8516 if (sec->sh_type == sec_type)
8517 {
8518 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8519 printable_section_name (sec),
8520 (unsigned long) sec->sh_offset,
8521 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8522
8523 dump_arm_unwind (&aux, sec);
8524 }
8525 }
8526
8527 if (aux.symtab)
8528 free (aux.symtab);
8529 if (aux.strtab)
8530 free ((char *) aux.strtab);
8531 }
8532
8533 static void
8534 process_unwind (FILE * file)
8535 {
8536 struct unwind_handler
8537 {
8538 int machtype;
8539 void (* handler)(FILE *);
8540 } handlers[] =
8541 {
8542 { EM_ARM, arm_process_unwind },
8543 { EM_IA_64, ia64_process_unwind },
8544 { EM_PARISC, hppa_process_unwind },
8545 { EM_TI_C6000, arm_process_unwind },
8546 { 0, 0 }
8547 };
8548 int i;
8549
8550 if (!do_unwind)
8551 return;
8552
8553 for (i = 0; handlers[i].handler != NULL; i++)
8554 if (elf_header.e_machine == handlers[i].machtype)
8555 {
8556 handlers[i].handler (file);
8557 return;
8558 }
8559
8560 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8561 get_machine_name (elf_header.e_machine));
8562 }
8563
8564 static void
8565 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8566 {
8567 switch (entry->d_tag)
8568 {
8569 case DT_MIPS_FLAGS:
8570 if (entry->d_un.d_val == 0)
8571 printf (_("NONE"));
8572 else
8573 {
8574 static const char * opts[] =
8575 {
8576 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8577 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8578 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8579 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8580 "RLD_ORDER_SAFE"
8581 };
8582 unsigned int cnt;
8583 int first = 1;
8584
8585 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8586 if (entry->d_un.d_val & (1 << cnt))
8587 {
8588 printf ("%s%s", first ? "" : " ", opts[cnt]);
8589 first = 0;
8590 }
8591 }
8592 break;
8593
8594 case DT_MIPS_IVERSION:
8595 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8596 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8597 else
8598 {
8599 char buf[40];
8600 sprintf_vma (buf, entry->d_un.d_ptr);
8601 /* Note: coded this way so that there is a single string for translation. */
8602 printf (_("<corrupt: %s>"), buf);
8603 }
8604 break;
8605
8606 case DT_MIPS_TIME_STAMP:
8607 {
8608 char timebuf[20];
8609 struct tm * tmp;
8610 time_t atime = entry->d_un.d_val;
8611
8612 tmp = gmtime (&atime);
8613 /* PR 17531: file: 6accc532. */
8614 if (tmp == NULL)
8615 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8616 else
8617 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8618 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8619 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8620 printf (_("Time Stamp: %s"), timebuf);
8621 }
8622 break;
8623
8624 case DT_MIPS_RLD_VERSION:
8625 case DT_MIPS_LOCAL_GOTNO:
8626 case DT_MIPS_CONFLICTNO:
8627 case DT_MIPS_LIBLISTNO:
8628 case DT_MIPS_SYMTABNO:
8629 case DT_MIPS_UNREFEXTNO:
8630 case DT_MIPS_HIPAGENO:
8631 case DT_MIPS_DELTA_CLASS_NO:
8632 case DT_MIPS_DELTA_INSTANCE_NO:
8633 case DT_MIPS_DELTA_RELOC_NO:
8634 case DT_MIPS_DELTA_SYM_NO:
8635 case DT_MIPS_DELTA_CLASSSYM_NO:
8636 case DT_MIPS_COMPACT_SIZE:
8637 print_vma (entry->d_un.d_ptr, DEC);
8638 break;
8639
8640 default:
8641 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8642 }
8643 putchar ('\n');
8644 }
8645
8646 static void
8647 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8648 {
8649 switch (entry->d_tag)
8650 {
8651 case DT_HP_DLD_FLAGS:
8652 {
8653 static struct
8654 {
8655 long int bit;
8656 const char * str;
8657 }
8658 flags[] =
8659 {
8660 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8661 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8662 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8663 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8664 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8665 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8666 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8667 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8668 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8669 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8670 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8671 { DT_HP_GST, "HP_GST" },
8672 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8673 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8674 { DT_HP_NODELETE, "HP_NODELETE" },
8675 { DT_HP_GROUP, "HP_GROUP" },
8676 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8677 };
8678 int first = 1;
8679 size_t cnt;
8680 bfd_vma val = entry->d_un.d_val;
8681
8682 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8683 if (val & flags[cnt].bit)
8684 {
8685 if (! first)
8686 putchar (' ');
8687 fputs (flags[cnt].str, stdout);
8688 first = 0;
8689 val ^= flags[cnt].bit;
8690 }
8691
8692 if (val != 0 || first)
8693 {
8694 if (! first)
8695 putchar (' ');
8696 print_vma (val, HEX);
8697 }
8698 }
8699 break;
8700
8701 default:
8702 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8703 break;
8704 }
8705 putchar ('\n');
8706 }
8707
8708 #ifdef BFD64
8709
8710 /* VMS vs Unix time offset and factor. */
8711
8712 #define VMS_EPOCH_OFFSET 35067168000000000LL
8713 #define VMS_GRANULARITY_FACTOR 10000000
8714
8715 /* Display a VMS time in a human readable format. */
8716
8717 static void
8718 print_vms_time (bfd_int64_t vmstime)
8719 {
8720 struct tm *tm;
8721 time_t unxtime;
8722
8723 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8724 tm = gmtime (&unxtime);
8725 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8726 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8727 tm->tm_hour, tm->tm_min, tm->tm_sec);
8728 }
8729 #endif /* BFD64 */
8730
8731 static void
8732 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8733 {
8734 switch (entry->d_tag)
8735 {
8736 case DT_IA_64_PLT_RESERVE:
8737 /* First 3 slots reserved. */
8738 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8739 printf (" -- ");
8740 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8741 break;
8742
8743 case DT_IA_64_VMS_LINKTIME:
8744 #ifdef BFD64
8745 print_vms_time (entry->d_un.d_val);
8746 #endif
8747 break;
8748
8749 case DT_IA_64_VMS_LNKFLAGS:
8750 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8751 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8752 printf (" CALL_DEBUG");
8753 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8754 printf (" NOP0BUFS");
8755 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8756 printf (" P0IMAGE");
8757 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8758 printf (" MKTHREADS");
8759 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8760 printf (" UPCALLS");
8761 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8762 printf (" IMGSTA");
8763 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8764 printf (" INITIALIZE");
8765 if (entry->d_un.d_val & VMS_LF_MAIN)
8766 printf (" MAIN");
8767 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8768 printf (" EXE_INIT");
8769 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8770 printf (" TBK_IN_IMG");
8771 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8772 printf (" DBG_IN_IMG");
8773 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8774 printf (" TBK_IN_DSF");
8775 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8776 printf (" DBG_IN_DSF");
8777 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8778 printf (" SIGNATURES");
8779 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8780 printf (" REL_SEG_OFF");
8781 break;
8782
8783 default:
8784 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8785 break;
8786 }
8787 putchar ('\n');
8788 }
8789
8790 static int
8791 get_32bit_dynamic_section (FILE * file)
8792 {
8793 Elf32_External_Dyn * edyn;
8794 Elf32_External_Dyn * ext;
8795 Elf_Internal_Dyn * entry;
8796
8797 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8798 dynamic_size, _("dynamic section"));
8799 if (!edyn)
8800 return 0;
8801
8802 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8803 might not have the luxury of section headers. Look for the DT_NULL
8804 terminator to determine the number of entries. */
8805 for (ext = edyn, dynamic_nent = 0;
8806 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8807 ext++)
8808 {
8809 dynamic_nent++;
8810 if (BYTE_GET (ext->d_tag) == DT_NULL)
8811 break;
8812 }
8813
8814 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8815 sizeof (* entry));
8816 if (dynamic_section == NULL)
8817 {
8818 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8819 (unsigned long) dynamic_nent);
8820 free (edyn);
8821 return 0;
8822 }
8823
8824 for (ext = edyn, entry = dynamic_section;
8825 entry < dynamic_section + dynamic_nent;
8826 ext++, entry++)
8827 {
8828 entry->d_tag = BYTE_GET (ext->d_tag);
8829 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8830 }
8831
8832 free (edyn);
8833
8834 return 1;
8835 }
8836
8837 static int
8838 get_64bit_dynamic_section (FILE * file)
8839 {
8840 Elf64_External_Dyn * edyn;
8841 Elf64_External_Dyn * ext;
8842 Elf_Internal_Dyn * entry;
8843
8844 /* Read in the data. */
8845 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8846 dynamic_size, _("dynamic section"));
8847 if (!edyn)
8848 return 0;
8849
8850 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8851 might not have the luxury of section headers. Look for the DT_NULL
8852 terminator to determine the number of entries. */
8853 for (ext = edyn, dynamic_nent = 0;
8854 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
8855 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8856 ext++)
8857 {
8858 dynamic_nent++;
8859 if (BYTE_GET (ext->d_tag) == DT_NULL)
8860 break;
8861 }
8862
8863 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8864 sizeof (* entry));
8865 if (dynamic_section == NULL)
8866 {
8867 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8868 (unsigned long) dynamic_nent);
8869 free (edyn);
8870 return 0;
8871 }
8872
8873 /* Convert from external to internal formats. */
8874 for (ext = edyn, entry = dynamic_section;
8875 entry < dynamic_section + dynamic_nent;
8876 ext++, entry++)
8877 {
8878 entry->d_tag = BYTE_GET (ext->d_tag);
8879 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8880 }
8881
8882 free (edyn);
8883
8884 return 1;
8885 }
8886
8887 static void
8888 print_dynamic_flags (bfd_vma flags)
8889 {
8890 int first = 1;
8891
8892 while (flags)
8893 {
8894 bfd_vma flag;
8895
8896 flag = flags & - flags;
8897 flags &= ~ flag;
8898
8899 if (first)
8900 first = 0;
8901 else
8902 putc (' ', stdout);
8903
8904 switch (flag)
8905 {
8906 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8907 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8908 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8909 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8910 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8911 default: fputs (_("unknown"), stdout); break;
8912 }
8913 }
8914 puts ("");
8915 }
8916
8917 /* Parse and display the contents of the dynamic section. */
8918
8919 static int
8920 process_dynamic_section (FILE * file)
8921 {
8922 Elf_Internal_Dyn * entry;
8923
8924 if (dynamic_size == 0)
8925 {
8926 if (do_dynamic)
8927 printf (_("\nThere is no dynamic section in this file.\n"));
8928
8929 return 1;
8930 }
8931
8932 if (is_32bit_elf)
8933 {
8934 if (! get_32bit_dynamic_section (file))
8935 return 0;
8936 }
8937 else if (! get_64bit_dynamic_section (file))
8938 return 0;
8939
8940 /* Find the appropriate symbol table. */
8941 if (dynamic_symbols == NULL)
8942 {
8943 for (entry = dynamic_section;
8944 entry < dynamic_section + dynamic_nent;
8945 ++entry)
8946 {
8947 Elf_Internal_Shdr section;
8948
8949 if (entry->d_tag != DT_SYMTAB)
8950 continue;
8951
8952 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8953
8954 /* Since we do not know how big the symbol table is,
8955 we default to reading in the entire file (!) and
8956 processing that. This is overkill, I know, but it
8957 should work. */
8958 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8959
8960 if (archive_file_offset != 0)
8961 section.sh_size = archive_file_size - section.sh_offset;
8962 else
8963 {
8964 if (fseek (file, 0, SEEK_END))
8965 error (_("Unable to seek to end of file!\n"));
8966
8967 section.sh_size = ftell (file) - section.sh_offset;
8968 }
8969
8970 if (is_32bit_elf)
8971 section.sh_entsize = sizeof (Elf32_External_Sym);
8972 else
8973 section.sh_entsize = sizeof (Elf64_External_Sym);
8974 section.sh_name = string_table_length;
8975
8976 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8977 if (num_dynamic_syms < 1)
8978 {
8979 error (_("Unable to determine the number of symbols to load\n"));
8980 continue;
8981 }
8982 }
8983 }
8984
8985 /* Similarly find a string table. */
8986 if (dynamic_strings == NULL)
8987 {
8988 for (entry = dynamic_section;
8989 entry < dynamic_section + dynamic_nent;
8990 ++entry)
8991 {
8992 unsigned long offset;
8993 long str_tab_len;
8994
8995 if (entry->d_tag != DT_STRTAB)
8996 continue;
8997
8998 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8999
9000 /* Since we do not know how big the string table is,
9001 we default to reading in the entire file (!) and
9002 processing that. This is overkill, I know, but it
9003 should work. */
9004
9005 offset = offset_from_vma (file, entry->d_un.d_val, 0);
9006
9007 if (archive_file_offset != 0)
9008 str_tab_len = archive_file_size - offset;
9009 else
9010 {
9011 if (fseek (file, 0, SEEK_END))
9012 error (_("Unable to seek to end of file\n"));
9013 str_tab_len = ftell (file) - offset;
9014 }
9015
9016 if (str_tab_len < 1)
9017 {
9018 error
9019 (_("Unable to determine the length of the dynamic string table\n"));
9020 continue;
9021 }
9022
9023 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9024 str_tab_len,
9025 _("dynamic string table"));
9026 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9027 break;
9028 }
9029 }
9030
9031 /* And find the syminfo section if available. */
9032 if (dynamic_syminfo == NULL)
9033 {
9034 unsigned long syminsz = 0;
9035
9036 for (entry = dynamic_section;
9037 entry < dynamic_section + dynamic_nent;
9038 ++entry)
9039 {
9040 if (entry->d_tag == DT_SYMINENT)
9041 {
9042 /* Note: these braces are necessary to avoid a syntax
9043 error from the SunOS4 C compiler. */
9044 /* PR binutils/17531: A corrupt file can trigger this test.
9045 So do not use an assert, instead generate an error message. */
9046 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9047 error (_("Bad value (%d) for SYMINENT entry\n"),
9048 (int) entry->d_un.d_val);
9049 }
9050 else if (entry->d_tag == DT_SYMINSZ)
9051 syminsz = entry->d_un.d_val;
9052 else if (entry->d_tag == DT_SYMINFO)
9053 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9054 syminsz);
9055 }
9056
9057 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9058 {
9059 Elf_External_Syminfo * extsyminfo;
9060 Elf_External_Syminfo * extsym;
9061 Elf_Internal_Syminfo * syminfo;
9062
9063 /* There is a syminfo section. Read the data. */
9064 extsyminfo = (Elf_External_Syminfo *)
9065 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9066 _("symbol information"));
9067 if (!extsyminfo)
9068 return 0;
9069
9070 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9071 if (dynamic_syminfo == NULL)
9072 {
9073 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9074 (unsigned long) syminsz);
9075 return 0;
9076 }
9077
9078 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9079 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9080 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9081 ++syminfo, ++extsym)
9082 {
9083 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9084 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9085 }
9086
9087 free (extsyminfo);
9088 }
9089 }
9090
9091 if (do_dynamic && dynamic_addr)
9092 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9093 dynamic_addr, (unsigned long) dynamic_nent);
9094 if (do_dynamic)
9095 printf (_(" Tag Type Name/Value\n"));
9096
9097 for (entry = dynamic_section;
9098 entry < dynamic_section + dynamic_nent;
9099 entry++)
9100 {
9101 if (do_dynamic)
9102 {
9103 const char * dtype;
9104
9105 putchar (' ');
9106 print_vma (entry->d_tag, FULL_HEX);
9107 dtype = get_dynamic_type (entry->d_tag);
9108 printf (" (%s)%*s", dtype,
9109 ((is_32bit_elf ? 27 : 19)
9110 - (int) strlen (dtype)),
9111 " ");
9112 }
9113
9114 switch (entry->d_tag)
9115 {
9116 case DT_FLAGS:
9117 if (do_dynamic)
9118 print_dynamic_flags (entry->d_un.d_val);
9119 break;
9120
9121 case DT_AUXILIARY:
9122 case DT_FILTER:
9123 case DT_CONFIG:
9124 case DT_DEPAUDIT:
9125 case DT_AUDIT:
9126 if (do_dynamic)
9127 {
9128 switch (entry->d_tag)
9129 {
9130 case DT_AUXILIARY:
9131 printf (_("Auxiliary library"));
9132 break;
9133
9134 case DT_FILTER:
9135 printf (_("Filter library"));
9136 break;
9137
9138 case DT_CONFIG:
9139 printf (_("Configuration file"));
9140 break;
9141
9142 case DT_DEPAUDIT:
9143 printf (_("Dependency audit library"));
9144 break;
9145
9146 case DT_AUDIT:
9147 printf (_("Audit library"));
9148 break;
9149 }
9150
9151 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9152 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9153 else
9154 {
9155 printf (": ");
9156 print_vma (entry->d_un.d_val, PREFIX_HEX);
9157 putchar ('\n');
9158 }
9159 }
9160 break;
9161
9162 case DT_FEATURE:
9163 if (do_dynamic)
9164 {
9165 printf (_("Flags:"));
9166
9167 if (entry->d_un.d_val == 0)
9168 printf (_(" None\n"));
9169 else
9170 {
9171 unsigned long int val = entry->d_un.d_val;
9172
9173 if (val & DTF_1_PARINIT)
9174 {
9175 printf (" PARINIT");
9176 val ^= DTF_1_PARINIT;
9177 }
9178 if (val & DTF_1_CONFEXP)
9179 {
9180 printf (" CONFEXP");
9181 val ^= DTF_1_CONFEXP;
9182 }
9183 if (val != 0)
9184 printf (" %lx", val);
9185 puts ("");
9186 }
9187 }
9188 break;
9189
9190 case DT_POSFLAG_1:
9191 if (do_dynamic)
9192 {
9193 printf (_("Flags:"));
9194
9195 if (entry->d_un.d_val == 0)
9196 printf (_(" None\n"));
9197 else
9198 {
9199 unsigned long int val = entry->d_un.d_val;
9200
9201 if (val & DF_P1_LAZYLOAD)
9202 {
9203 printf (" LAZYLOAD");
9204 val ^= DF_P1_LAZYLOAD;
9205 }
9206 if (val & DF_P1_GROUPPERM)
9207 {
9208 printf (" GROUPPERM");
9209 val ^= DF_P1_GROUPPERM;
9210 }
9211 if (val != 0)
9212 printf (" %lx", val);
9213 puts ("");
9214 }
9215 }
9216 break;
9217
9218 case DT_FLAGS_1:
9219 if (do_dynamic)
9220 {
9221 printf (_("Flags:"));
9222 if (entry->d_un.d_val == 0)
9223 printf (_(" None\n"));
9224 else
9225 {
9226 unsigned long int val = entry->d_un.d_val;
9227
9228 if (val & DF_1_NOW)
9229 {
9230 printf (" NOW");
9231 val ^= DF_1_NOW;
9232 }
9233 if (val & DF_1_GLOBAL)
9234 {
9235 printf (" GLOBAL");
9236 val ^= DF_1_GLOBAL;
9237 }
9238 if (val & DF_1_GROUP)
9239 {
9240 printf (" GROUP");
9241 val ^= DF_1_GROUP;
9242 }
9243 if (val & DF_1_NODELETE)
9244 {
9245 printf (" NODELETE");
9246 val ^= DF_1_NODELETE;
9247 }
9248 if (val & DF_1_LOADFLTR)
9249 {
9250 printf (" LOADFLTR");
9251 val ^= DF_1_LOADFLTR;
9252 }
9253 if (val & DF_1_INITFIRST)
9254 {
9255 printf (" INITFIRST");
9256 val ^= DF_1_INITFIRST;
9257 }
9258 if (val & DF_1_NOOPEN)
9259 {
9260 printf (" NOOPEN");
9261 val ^= DF_1_NOOPEN;
9262 }
9263 if (val & DF_1_ORIGIN)
9264 {
9265 printf (" ORIGIN");
9266 val ^= DF_1_ORIGIN;
9267 }
9268 if (val & DF_1_DIRECT)
9269 {
9270 printf (" DIRECT");
9271 val ^= DF_1_DIRECT;
9272 }
9273 if (val & DF_1_TRANS)
9274 {
9275 printf (" TRANS");
9276 val ^= DF_1_TRANS;
9277 }
9278 if (val & DF_1_INTERPOSE)
9279 {
9280 printf (" INTERPOSE");
9281 val ^= DF_1_INTERPOSE;
9282 }
9283 if (val & DF_1_NODEFLIB)
9284 {
9285 printf (" NODEFLIB");
9286 val ^= DF_1_NODEFLIB;
9287 }
9288 if (val & DF_1_NODUMP)
9289 {
9290 printf (" NODUMP");
9291 val ^= DF_1_NODUMP;
9292 }
9293 if (val & DF_1_CONFALT)
9294 {
9295 printf (" CONFALT");
9296 val ^= DF_1_CONFALT;
9297 }
9298 if (val & DF_1_ENDFILTEE)
9299 {
9300 printf (" ENDFILTEE");
9301 val ^= DF_1_ENDFILTEE;
9302 }
9303 if (val & DF_1_DISPRELDNE)
9304 {
9305 printf (" DISPRELDNE");
9306 val ^= DF_1_DISPRELDNE;
9307 }
9308 if (val & DF_1_DISPRELPND)
9309 {
9310 printf (" DISPRELPND");
9311 val ^= DF_1_DISPRELPND;
9312 }
9313 if (val & DF_1_NODIRECT)
9314 {
9315 printf (" NODIRECT");
9316 val ^= DF_1_NODIRECT;
9317 }
9318 if (val & DF_1_IGNMULDEF)
9319 {
9320 printf (" IGNMULDEF");
9321 val ^= DF_1_IGNMULDEF;
9322 }
9323 if (val & DF_1_NOKSYMS)
9324 {
9325 printf (" NOKSYMS");
9326 val ^= DF_1_NOKSYMS;
9327 }
9328 if (val & DF_1_NOHDR)
9329 {
9330 printf (" NOHDR");
9331 val ^= DF_1_NOHDR;
9332 }
9333 if (val & DF_1_EDITED)
9334 {
9335 printf (" EDITED");
9336 val ^= DF_1_EDITED;
9337 }
9338 if (val & DF_1_NORELOC)
9339 {
9340 printf (" NORELOC");
9341 val ^= DF_1_NORELOC;
9342 }
9343 if (val & DF_1_SYMINTPOSE)
9344 {
9345 printf (" SYMINTPOSE");
9346 val ^= DF_1_SYMINTPOSE;
9347 }
9348 if (val & DF_1_GLOBAUDIT)
9349 {
9350 printf (" GLOBAUDIT");
9351 val ^= DF_1_GLOBAUDIT;
9352 }
9353 if (val & DF_1_SINGLETON)
9354 {
9355 printf (" SINGLETON");
9356 val ^= DF_1_SINGLETON;
9357 }
9358 if (val & DF_1_STUB)
9359 {
9360 printf (" STUB");
9361 val ^= DF_1_STUB;
9362 }
9363 if (val & DF_1_PIE)
9364 {
9365 printf (" PIE");
9366 val ^= DF_1_PIE;
9367 }
9368 if (val != 0)
9369 printf (" %lx", val);
9370 puts ("");
9371 }
9372 }
9373 break;
9374
9375 case DT_PLTREL:
9376 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9377 if (do_dynamic)
9378 puts (get_dynamic_type (entry->d_un.d_val));
9379 break;
9380
9381 case DT_NULL :
9382 case DT_NEEDED :
9383 case DT_PLTGOT :
9384 case DT_HASH :
9385 case DT_STRTAB :
9386 case DT_SYMTAB :
9387 case DT_RELA :
9388 case DT_INIT :
9389 case DT_FINI :
9390 case DT_SONAME :
9391 case DT_RPATH :
9392 case DT_SYMBOLIC:
9393 case DT_REL :
9394 case DT_DEBUG :
9395 case DT_TEXTREL :
9396 case DT_JMPREL :
9397 case DT_RUNPATH :
9398 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9399
9400 if (do_dynamic)
9401 {
9402 char * name;
9403
9404 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9405 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9406 else
9407 name = NULL;
9408
9409 if (name)
9410 {
9411 switch (entry->d_tag)
9412 {
9413 case DT_NEEDED:
9414 printf (_("Shared library: [%s]"), name);
9415
9416 if (streq (name, program_interpreter))
9417 printf (_(" program interpreter"));
9418 break;
9419
9420 case DT_SONAME:
9421 printf (_("Library soname: [%s]"), name);
9422 break;
9423
9424 case DT_RPATH:
9425 printf (_("Library rpath: [%s]"), name);
9426 break;
9427
9428 case DT_RUNPATH:
9429 printf (_("Library runpath: [%s]"), name);
9430 break;
9431
9432 default:
9433 print_vma (entry->d_un.d_val, PREFIX_HEX);
9434 break;
9435 }
9436 }
9437 else
9438 print_vma (entry->d_un.d_val, PREFIX_HEX);
9439
9440 putchar ('\n');
9441 }
9442 break;
9443
9444 case DT_PLTRELSZ:
9445 case DT_RELASZ :
9446 case DT_STRSZ :
9447 case DT_RELSZ :
9448 case DT_RELAENT :
9449 case DT_SYMENT :
9450 case DT_RELENT :
9451 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9452 case DT_PLTPADSZ:
9453 case DT_MOVEENT :
9454 case DT_MOVESZ :
9455 case DT_INIT_ARRAYSZ:
9456 case DT_FINI_ARRAYSZ:
9457 case DT_GNU_CONFLICTSZ:
9458 case DT_GNU_LIBLISTSZ:
9459 if (do_dynamic)
9460 {
9461 print_vma (entry->d_un.d_val, UNSIGNED);
9462 printf (_(" (bytes)\n"));
9463 }
9464 break;
9465
9466 case DT_VERDEFNUM:
9467 case DT_VERNEEDNUM:
9468 case DT_RELACOUNT:
9469 case DT_RELCOUNT:
9470 if (do_dynamic)
9471 {
9472 print_vma (entry->d_un.d_val, UNSIGNED);
9473 putchar ('\n');
9474 }
9475 break;
9476
9477 case DT_SYMINSZ:
9478 case DT_SYMINENT:
9479 case DT_SYMINFO:
9480 case DT_USED:
9481 case DT_INIT_ARRAY:
9482 case DT_FINI_ARRAY:
9483 if (do_dynamic)
9484 {
9485 if (entry->d_tag == DT_USED
9486 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9487 {
9488 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9489
9490 if (*name)
9491 {
9492 printf (_("Not needed object: [%s]\n"), name);
9493 break;
9494 }
9495 }
9496
9497 print_vma (entry->d_un.d_val, PREFIX_HEX);
9498 putchar ('\n');
9499 }
9500 break;
9501
9502 case DT_BIND_NOW:
9503 /* The value of this entry is ignored. */
9504 if (do_dynamic)
9505 putchar ('\n');
9506 break;
9507
9508 case DT_GNU_PRELINKED:
9509 if (do_dynamic)
9510 {
9511 struct tm * tmp;
9512 time_t atime = entry->d_un.d_val;
9513
9514 tmp = gmtime (&atime);
9515 /* PR 17533 file: 041-1244816-0.004. */
9516 if (tmp == NULL)
9517 printf (_("<corrupt time val: %lx"),
9518 (unsigned long) atime);
9519 else
9520 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9521 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9522 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9523
9524 }
9525 break;
9526
9527 case DT_GNU_HASH:
9528 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9529 if (do_dynamic)
9530 {
9531 print_vma (entry->d_un.d_val, PREFIX_HEX);
9532 putchar ('\n');
9533 }
9534 break;
9535
9536 default:
9537 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9538 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9539 entry->d_un.d_val;
9540
9541 if (do_dynamic)
9542 {
9543 switch (elf_header.e_machine)
9544 {
9545 case EM_MIPS:
9546 case EM_MIPS_RS3_LE:
9547 dynamic_section_mips_val (entry);
9548 break;
9549 case EM_PARISC:
9550 dynamic_section_parisc_val (entry);
9551 break;
9552 case EM_IA_64:
9553 dynamic_section_ia64_val (entry);
9554 break;
9555 default:
9556 print_vma (entry->d_un.d_val, PREFIX_HEX);
9557 putchar ('\n');
9558 }
9559 }
9560 break;
9561 }
9562 }
9563
9564 return 1;
9565 }
9566
9567 static char *
9568 get_ver_flags (unsigned int flags)
9569 {
9570 static char buff[32];
9571
9572 buff[0] = 0;
9573
9574 if (flags == 0)
9575 return _("none");
9576
9577 if (flags & VER_FLG_BASE)
9578 strcat (buff, "BASE ");
9579
9580 if (flags & VER_FLG_WEAK)
9581 {
9582 if (flags & VER_FLG_BASE)
9583 strcat (buff, "| ");
9584
9585 strcat (buff, "WEAK ");
9586 }
9587
9588 if (flags & VER_FLG_INFO)
9589 {
9590 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9591 strcat (buff, "| ");
9592
9593 strcat (buff, "INFO ");
9594 }
9595
9596 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9597 strcat (buff, _("| <unknown>"));
9598
9599 return buff;
9600 }
9601
9602 /* Display the contents of the version sections. */
9603
9604 static int
9605 process_version_sections (FILE * file)
9606 {
9607 Elf_Internal_Shdr * section;
9608 unsigned i;
9609 int found = 0;
9610
9611 if (! do_version)
9612 return 1;
9613
9614 for (i = 0, section = section_headers;
9615 i < elf_header.e_shnum;
9616 i++, section++)
9617 {
9618 switch (section->sh_type)
9619 {
9620 case SHT_GNU_verdef:
9621 {
9622 Elf_External_Verdef * edefs;
9623 unsigned int idx;
9624 unsigned int cnt;
9625 char * endbuf;
9626
9627 found = 1;
9628
9629 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9630 printable_section_name (section),
9631 section->sh_info);
9632
9633 printf (_(" Addr: 0x"));
9634 printf_vma (section->sh_addr);
9635 printf (_(" Offset: %#08lx Link: %u (%s)"),
9636 (unsigned long) section->sh_offset, section->sh_link,
9637 printable_section_name_from_index (section->sh_link));
9638
9639 edefs = (Elf_External_Verdef *)
9640 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9641 _("version definition section"));
9642 if (!edefs)
9643 break;
9644 endbuf = (char *) edefs + section->sh_size;
9645
9646 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9647 {
9648 char * vstart;
9649 Elf_External_Verdef * edef;
9650 Elf_Internal_Verdef ent;
9651 Elf_External_Verdaux * eaux;
9652 Elf_Internal_Verdaux aux;
9653 int j;
9654 int isum;
9655
9656 /* Check for very large indicies. */
9657 if (idx > (size_t) (endbuf - (char *) edefs))
9658 break;
9659
9660 vstart = ((char *) edefs) + idx;
9661 if (vstart + sizeof (*edef) > endbuf)
9662 break;
9663
9664 edef = (Elf_External_Verdef *) vstart;
9665
9666 ent.vd_version = BYTE_GET (edef->vd_version);
9667 ent.vd_flags = BYTE_GET (edef->vd_flags);
9668 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9669 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9670 ent.vd_hash = BYTE_GET (edef->vd_hash);
9671 ent.vd_aux = BYTE_GET (edef->vd_aux);
9672 ent.vd_next = BYTE_GET (edef->vd_next);
9673
9674 printf (_(" %#06x: Rev: %d Flags: %s"),
9675 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9676
9677 printf (_(" Index: %d Cnt: %d "),
9678 ent.vd_ndx, ent.vd_cnt);
9679
9680 /* Check for overflow. */
9681 if (ent.vd_aux > (size_t) (endbuf - vstart))
9682 break;
9683
9684 vstart += ent.vd_aux;
9685
9686 eaux = (Elf_External_Verdaux *) vstart;
9687
9688 aux.vda_name = BYTE_GET (eaux->vda_name);
9689 aux.vda_next = BYTE_GET (eaux->vda_next);
9690
9691 if (VALID_DYNAMIC_NAME (aux.vda_name))
9692 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9693 else
9694 printf (_("Name index: %ld\n"), aux.vda_name);
9695
9696 isum = idx + ent.vd_aux;
9697
9698 for (j = 1; j < ent.vd_cnt; j++)
9699 {
9700 /* Check for overflow. */
9701 if (aux.vda_next > (size_t) (endbuf - vstart))
9702 break;
9703
9704 isum += aux.vda_next;
9705 vstart += aux.vda_next;
9706
9707 eaux = (Elf_External_Verdaux *) vstart;
9708 if (vstart + sizeof (*eaux) > endbuf)
9709 break;
9710
9711 aux.vda_name = BYTE_GET (eaux->vda_name);
9712 aux.vda_next = BYTE_GET (eaux->vda_next);
9713
9714 if (VALID_DYNAMIC_NAME (aux.vda_name))
9715 printf (_(" %#06x: Parent %d: %s\n"),
9716 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9717 else
9718 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9719 isum, j, aux.vda_name);
9720 }
9721
9722 if (j < ent.vd_cnt)
9723 printf (_(" Version def aux past end of section\n"));
9724
9725 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9726 if (idx + ent.vd_next <= idx)
9727 break;
9728
9729 idx += ent.vd_next;
9730 }
9731
9732 if (cnt < section->sh_info)
9733 printf (_(" Version definition past end of section\n"));
9734
9735 free (edefs);
9736 }
9737 break;
9738
9739 case SHT_GNU_verneed:
9740 {
9741 Elf_External_Verneed * eneed;
9742 unsigned int idx;
9743 unsigned int cnt;
9744 char * endbuf;
9745
9746 found = 1;
9747
9748 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9749 printable_section_name (section), section->sh_info);
9750
9751 printf (_(" Addr: 0x"));
9752 printf_vma (section->sh_addr);
9753 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9754 (unsigned long) section->sh_offset, section->sh_link,
9755 printable_section_name_from_index (section->sh_link));
9756
9757 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9758 section->sh_offset, 1,
9759 section->sh_size,
9760 _("Version Needs section"));
9761 if (!eneed)
9762 break;
9763 endbuf = (char *) eneed + section->sh_size;
9764
9765 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9766 {
9767 Elf_External_Verneed * entry;
9768 Elf_Internal_Verneed ent;
9769 int j;
9770 int isum;
9771 char * vstart;
9772
9773 if (idx > (size_t) (endbuf - (char *) eneed))
9774 break;
9775
9776 vstart = ((char *) eneed) + idx;
9777 if (vstart + sizeof (*entry) > endbuf)
9778 break;
9779
9780 entry = (Elf_External_Verneed *) vstart;
9781
9782 ent.vn_version = BYTE_GET (entry->vn_version);
9783 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9784 ent.vn_file = BYTE_GET (entry->vn_file);
9785 ent.vn_aux = BYTE_GET (entry->vn_aux);
9786 ent.vn_next = BYTE_GET (entry->vn_next);
9787
9788 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9789
9790 if (VALID_DYNAMIC_NAME (ent.vn_file))
9791 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9792 else
9793 printf (_(" File: %lx"), ent.vn_file);
9794
9795 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9796
9797 /* Check for overflow. */
9798 if (ent.vn_aux > (size_t) (endbuf - vstart))
9799 break;
9800 vstart += ent.vn_aux;
9801
9802 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9803 {
9804 Elf_External_Vernaux * eaux;
9805 Elf_Internal_Vernaux aux;
9806
9807 if (vstart + sizeof (*eaux) > endbuf)
9808 break;
9809 eaux = (Elf_External_Vernaux *) vstart;
9810
9811 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9812 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9813 aux.vna_other = BYTE_GET (eaux->vna_other);
9814 aux.vna_name = BYTE_GET (eaux->vna_name);
9815 aux.vna_next = BYTE_GET (eaux->vna_next);
9816
9817 if (VALID_DYNAMIC_NAME (aux.vna_name))
9818 printf (_(" %#06x: Name: %s"),
9819 isum, GET_DYNAMIC_NAME (aux.vna_name));
9820 else
9821 printf (_(" %#06x: Name index: %lx"),
9822 isum, aux.vna_name);
9823
9824 printf (_(" Flags: %s Version: %d\n"),
9825 get_ver_flags (aux.vna_flags), aux.vna_other);
9826
9827 /* Check for overflow. */
9828 if (aux.vna_next > (size_t) (endbuf - vstart)
9829 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9830 {
9831 warn (_("Invalid vna_next field of %lx\n"),
9832 aux.vna_next);
9833 j = ent.vn_cnt;
9834 break;
9835 }
9836 isum += aux.vna_next;
9837 vstart += aux.vna_next;
9838 }
9839
9840 if (j < ent.vn_cnt)
9841 warn (_("Missing Version Needs auxillary information\n"));
9842
9843 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9844 {
9845 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9846 cnt = section->sh_info;
9847 break;
9848 }
9849 idx += ent.vn_next;
9850 }
9851
9852 if (cnt < section->sh_info)
9853 warn (_("Missing Version Needs information\n"));
9854
9855 free (eneed);
9856 }
9857 break;
9858
9859 case SHT_GNU_versym:
9860 {
9861 Elf_Internal_Shdr * link_section;
9862 size_t total;
9863 unsigned int cnt;
9864 unsigned char * edata;
9865 unsigned short * data;
9866 char * strtab;
9867 Elf_Internal_Sym * symbols;
9868 Elf_Internal_Shdr * string_sec;
9869 unsigned long num_syms;
9870 long off;
9871
9872 if (section->sh_link >= elf_header.e_shnum)
9873 break;
9874
9875 link_section = section_headers + section->sh_link;
9876 total = section->sh_size / sizeof (Elf_External_Versym);
9877
9878 if (link_section->sh_link >= elf_header.e_shnum)
9879 break;
9880
9881 found = 1;
9882
9883 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9884 if (symbols == NULL)
9885 break;
9886
9887 string_sec = section_headers + link_section->sh_link;
9888
9889 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9890 string_sec->sh_size,
9891 _("version string table"));
9892 if (!strtab)
9893 {
9894 free (symbols);
9895 break;
9896 }
9897
9898 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9899 printable_section_name (section), (unsigned long) total);
9900
9901 printf (_(" Addr: "));
9902 printf_vma (section->sh_addr);
9903 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9904 (unsigned long) section->sh_offset, section->sh_link,
9905 printable_section_name (link_section));
9906
9907 off = offset_from_vma (file,
9908 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9909 total * sizeof (short));
9910 edata = (unsigned char *) get_data (NULL, file, off, total,
9911 sizeof (short),
9912 _("version symbol data"));
9913 if (!edata)
9914 {
9915 free (strtab);
9916 free (symbols);
9917 break;
9918 }
9919
9920 data = (short unsigned int *) cmalloc (total, sizeof (short));
9921
9922 for (cnt = total; cnt --;)
9923 data[cnt] = byte_get (edata + cnt * sizeof (short),
9924 sizeof (short));
9925
9926 free (edata);
9927
9928 for (cnt = 0; cnt < total; cnt += 4)
9929 {
9930 int j, nn;
9931 char *name;
9932 char *invalid = _("*invalid*");
9933
9934 printf (" %03x:", cnt);
9935
9936 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9937 switch (data[cnt + j])
9938 {
9939 case 0:
9940 fputs (_(" 0 (*local*) "), stdout);
9941 break;
9942
9943 case 1:
9944 fputs (_(" 1 (*global*) "), stdout);
9945 break;
9946
9947 default:
9948 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9949 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9950
9951 /* If this index value is greater than the size of the symbols
9952 array, break to avoid an out-of-bounds read. */
9953 if ((unsigned long)(cnt + j) >= num_syms)
9954 {
9955 warn (_("invalid index into symbol array\n"));
9956 break;
9957 }
9958
9959 name = NULL;
9960 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9961 {
9962 Elf_Internal_Verneed ivn;
9963 unsigned long offset;
9964
9965 offset = offset_from_vma
9966 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9967 sizeof (Elf_External_Verneed));
9968
9969 do
9970 {
9971 Elf_Internal_Vernaux ivna;
9972 Elf_External_Verneed evn;
9973 Elf_External_Vernaux evna;
9974 unsigned long a_off;
9975
9976 if (get_data (&evn, file, offset, sizeof (evn), 1,
9977 _("version need")) == NULL)
9978 break;
9979
9980 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9981 ivn.vn_next = BYTE_GET (evn.vn_next);
9982
9983 a_off = offset + ivn.vn_aux;
9984
9985 do
9986 {
9987 if (get_data (&evna, file, a_off, sizeof (evna),
9988 1, _("version need aux (2)")) == NULL)
9989 {
9990 ivna.vna_next = 0;
9991 ivna.vna_other = 0;
9992 }
9993 else
9994 {
9995 ivna.vna_next = BYTE_GET (evna.vna_next);
9996 ivna.vna_other = BYTE_GET (evna.vna_other);
9997 }
9998
9999 a_off += ivna.vna_next;
10000 }
10001 while (ivna.vna_other != data[cnt + j]
10002 && ivna.vna_next != 0);
10003
10004 if (ivna.vna_other == data[cnt + j])
10005 {
10006 ivna.vna_name = BYTE_GET (evna.vna_name);
10007
10008 if (ivna.vna_name >= string_sec->sh_size)
10009 name = invalid;
10010 else
10011 name = strtab + ivna.vna_name;
10012 break;
10013 }
10014
10015 offset += ivn.vn_next;
10016 }
10017 while (ivn.vn_next);
10018 }
10019
10020 if (data[cnt + j] != 0x8001
10021 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10022 {
10023 Elf_Internal_Verdef ivd;
10024 Elf_External_Verdef evd;
10025 unsigned long offset;
10026
10027 offset = offset_from_vma
10028 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10029 sizeof evd);
10030
10031 do
10032 {
10033 if (get_data (&evd, file, offset, sizeof (evd), 1,
10034 _("version def")) == NULL)
10035 {
10036 ivd.vd_next = 0;
10037 /* PR 17531: file: 046-1082287-0.004. */
10038 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10039 break;
10040 }
10041 else
10042 {
10043 ivd.vd_next = BYTE_GET (evd.vd_next);
10044 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10045 }
10046
10047 offset += ivd.vd_next;
10048 }
10049 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10050 && ivd.vd_next != 0);
10051
10052 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10053 {
10054 Elf_External_Verdaux evda;
10055 Elf_Internal_Verdaux ivda;
10056
10057 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10058
10059 if (get_data (&evda, file,
10060 offset - ivd.vd_next + ivd.vd_aux,
10061 sizeof (evda), 1,
10062 _("version def aux")) == NULL)
10063 break;
10064
10065 ivda.vda_name = BYTE_GET (evda.vda_name);
10066
10067 if (ivda.vda_name >= string_sec->sh_size)
10068 name = invalid;
10069 else if (name != NULL && name != invalid)
10070 name = _("*both*");
10071 else
10072 name = strtab + ivda.vda_name;
10073 }
10074 }
10075 if (name != NULL)
10076 nn += printf ("(%s%-*s",
10077 name,
10078 12 - (int) strlen (name),
10079 ")");
10080
10081 if (nn < 18)
10082 printf ("%*c", 18 - nn, ' ');
10083 }
10084
10085 putchar ('\n');
10086 }
10087
10088 free (data);
10089 free (strtab);
10090 free (symbols);
10091 }
10092 break;
10093
10094 default:
10095 break;
10096 }
10097 }
10098
10099 if (! found)
10100 printf (_("\nNo version information found in this file.\n"));
10101
10102 return 1;
10103 }
10104
10105 static const char *
10106 get_symbol_binding (unsigned int binding)
10107 {
10108 static char buff[32];
10109
10110 switch (binding)
10111 {
10112 case STB_LOCAL: return "LOCAL";
10113 case STB_GLOBAL: return "GLOBAL";
10114 case STB_WEAK: return "WEAK";
10115 default:
10116 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10117 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10118 binding);
10119 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10120 {
10121 if (binding == STB_GNU_UNIQUE
10122 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10123 /* GNU is still using the default value 0. */
10124 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10125 return "UNIQUE";
10126 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10127 }
10128 else
10129 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10130 return buff;
10131 }
10132 }
10133
10134 static const char *
10135 get_symbol_type (unsigned int type)
10136 {
10137 static char buff[32];
10138
10139 switch (type)
10140 {
10141 case STT_NOTYPE: return "NOTYPE";
10142 case STT_OBJECT: return "OBJECT";
10143 case STT_FUNC: return "FUNC";
10144 case STT_SECTION: return "SECTION";
10145 case STT_FILE: return "FILE";
10146 case STT_COMMON: return "COMMON";
10147 case STT_TLS: return "TLS";
10148 case STT_RELC: return "RELC";
10149 case STT_SRELC: return "SRELC";
10150 default:
10151 if (type >= STT_LOPROC && type <= STT_HIPROC)
10152 {
10153 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10154 return "THUMB_FUNC";
10155
10156 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10157 return "REGISTER";
10158
10159 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10160 return "PARISC_MILLI";
10161
10162 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10163 }
10164 else if (type >= STT_LOOS && type <= STT_HIOS)
10165 {
10166 if (elf_header.e_machine == EM_PARISC)
10167 {
10168 if (type == STT_HP_OPAQUE)
10169 return "HP_OPAQUE";
10170 if (type == STT_HP_STUB)
10171 return "HP_STUB";
10172 }
10173
10174 if (type == STT_GNU_IFUNC
10175 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10176 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10177 /* GNU is still using the default value 0. */
10178 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10179 return "IFUNC";
10180
10181 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10182 }
10183 else
10184 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10185 return buff;
10186 }
10187 }
10188
10189 static const char *
10190 get_symbol_visibility (unsigned int visibility)
10191 {
10192 switch (visibility)
10193 {
10194 case STV_DEFAULT: return "DEFAULT";
10195 case STV_INTERNAL: return "INTERNAL";
10196 case STV_HIDDEN: return "HIDDEN";
10197 case STV_PROTECTED: return "PROTECTED";
10198 default:
10199 error (_("Unrecognized visibility value: %u"), visibility);
10200 return _("<unknown>");
10201 }
10202 }
10203
10204 static const char *
10205 get_mips_symbol_other (unsigned int other)
10206 {
10207 switch (other)
10208 {
10209 case STO_OPTIONAL:
10210 return "OPTIONAL";
10211 case STO_MIPS_PLT:
10212 return "MIPS PLT";
10213 case STO_MIPS_PIC:
10214 return "MIPS PIC";
10215 case STO_MICROMIPS:
10216 return "MICROMIPS";
10217 case STO_MICROMIPS | STO_MIPS_PIC:
10218 return "MICROMIPS, MIPS PIC";
10219 case STO_MIPS16:
10220 return "MIPS16";
10221 default:
10222 return NULL;
10223 }
10224 }
10225
10226 static const char *
10227 get_ia64_symbol_other (unsigned int other)
10228 {
10229 if (is_ia64_vms ())
10230 {
10231 static char res[32];
10232
10233 res[0] = 0;
10234
10235 /* Function types is for images and .STB files only. */
10236 switch (elf_header.e_type)
10237 {
10238 case ET_DYN:
10239 case ET_EXEC:
10240 switch (VMS_ST_FUNC_TYPE (other))
10241 {
10242 case VMS_SFT_CODE_ADDR:
10243 strcat (res, " CA");
10244 break;
10245 case VMS_SFT_SYMV_IDX:
10246 strcat (res, " VEC");
10247 break;
10248 case VMS_SFT_FD:
10249 strcat (res, " FD");
10250 break;
10251 case VMS_SFT_RESERVE:
10252 strcat (res, " RSV");
10253 break;
10254 default:
10255 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10256 VMS_ST_FUNC_TYPE (other));
10257 strcat (res, " <unknown>");
10258 break;
10259 }
10260 break;
10261 default:
10262 break;
10263 }
10264 switch (VMS_ST_LINKAGE (other))
10265 {
10266 case VMS_STL_IGNORE:
10267 strcat (res, " IGN");
10268 break;
10269 case VMS_STL_RESERVE:
10270 strcat (res, " RSV");
10271 break;
10272 case VMS_STL_STD:
10273 strcat (res, " STD");
10274 break;
10275 case VMS_STL_LNK:
10276 strcat (res, " LNK");
10277 break;
10278 default:
10279 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10280 VMS_ST_LINKAGE (other));
10281 strcat (res, " <unknown>");
10282 break;
10283 }
10284
10285 if (res[0] != 0)
10286 return res + 1;
10287 else
10288 return res;
10289 }
10290 return NULL;
10291 }
10292
10293 static const char *
10294 get_ppc64_symbol_other (unsigned int other)
10295 {
10296 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10297 {
10298 static char buf[32];
10299 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10300 PPC64_LOCAL_ENTRY_OFFSET (other));
10301 return buf;
10302 }
10303 return NULL;
10304 }
10305
10306 static const char *
10307 get_symbol_other (unsigned int other)
10308 {
10309 const char * result = NULL;
10310 static char buff [32];
10311
10312 if (other == 0)
10313 return "";
10314
10315 switch (elf_header.e_machine)
10316 {
10317 case EM_MIPS:
10318 result = get_mips_symbol_other (other);
10319 break;
10320 case EM_IA_64:
10321 result = get_ia64_symbol_other (other);
10322 break;
10323 case EM_PPC64:
10324 result = get_ppc64_symbol_other (other);
10325 break;
10326 default:
10327 break;
10328 }
10329
10330 if (result)
10331 return result;
10332
10333 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10334 return buff;
10335 }
10336
10337 static const char *
10338 get_symbol_index_type (unsigned int type)
10339 {
10340 static char buff[32];
10341
10342 switch (type)
10343 {
10344 case SHN_UNDEF: return "UND";
10345 case SHN_ABS: return "ABS";
10346 case SHN_COMMON: return "COM";
10347 default:
10348 if (type == SHN_IA_64_ANSI_COMMON
10349 && elf_header.e_machine == EM_IA_64
10350 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10351 return "ANSI_COM";
10352 else if ((elf_header.e_machine == EM_X86_64
10353 || elf_header.e_machine == EM_L1OM
10354 || elf_header.e_machine == EM_K1OM)
10355 && type == SHN_X86_64_LCOMMON)
10356 return "LARGE_COM";
10357 else if ((type == SHN_MIPS_SCOMMON
10358 && elf_header.e_machine == EM_MIPS)
10359 || (type == SHN_TIC6X_SCOMMON
10360 && elf_header.e_machine == EM_TI_C6000))
10361 return "SCOM";
10362 else if (type == SHN_MIPS_SUNDEFINED
10363 && elf_header.e_machine == EM_MIPS)
10364 return "SUND";
10365 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10366 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10367 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10368 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10369 else if (type >= SHN_LORESERVE)
10370 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10371 else if (type >= elf_header.e_shnum)
10372 sprintf (buff, _("bad section index[%3d]"), type);
10373 else
10374 sprintf (buff, "%3d", type);
10375 break;
10376 }
10377
10378 return buff;
10379 }
10380
10381 static bfd_vma *
10382 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10383 {
10384 unsigned char * e_data;
10385 bfd_vma * i_data;
10386
10387 /* If the size_t type is smaller than the bfd_size_type, eg because
10388 you are building a 32-bit tool on a 64-bit host, then make sure
10389 that when (number) is cast to (size_t) no information is lost. */
10390 if (sizeof (size_t) < sizeof (bfd_size_type)
10391 && (bfd_size_type) ((size_t) number) != number)
10392 {
10393 error (_("Size truncation prevents reading %llu elements of size %u\n"),
10394 (unsigned long long) number, ent_size);
10395 return NULL;
10396 }
10397
10398 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10399 attempting to allocate memory when the read is bound to fail. */
10400 if (ent_size * number > current_file_size)
10401 {
10402 error (_("Invalid number of dynamic entries: %llu\n"),
10403 (unsigned long long) number);
10404 return NULL;
10405 }
10406
10407 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10408 if (e_data == NULL)
10409 {
10410 error (_("Out of memory reading %llu dynamic entries\n"),
10411 (unsigned long long) number);
10412 return NULL;
10413 }
10414
10415 if (fread (e_data, ent_size, (size_t) number, file) != number)
10416 {
10417 error (_("Unable to read in %llu bytes of dynamic data\n"),
10418 (unsigned long long) (number * ent_size));
10419 free (e_data);
10420 return NULL;
10421 }
10422
10423 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10424 if (i_data == NULL)
10425 {
10426 error (_("Out of memory allocating space for %llu dynamic entries\n"),
10427 (unsigned long long) number);
10428 free (e_data);
10429 return NULL;
10430 }
10431
10432 while (number--)
10433 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10434
10435 free (e_data);
10436
10437 return i_data;
10438 }
10439
10440 static void
10441 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10442 {
10443 Elf_Internal_Sym * psym;
10444 int n;
10445
10446 n = print_vma (si, DEC_5);
10447 if (n < 5)
10448 fputs (&" "[n], stdout);
10449 printf (" %3lu: ", hn);
10450
10451 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10452 {
10453 printf (_("<No info available for dynamic symbol number %lu>\n"),
10454 (unsigned long) si);
10455 return;
10456 }
10457
10458 psym = dynamic_symbols + si;
10459 print_vma (psym->st_value, LONG_HEX);
10460 putchar (' ');
10461 print_vma (psym->st_size, DEC_5);
10462
10463 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10464 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10465 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10466 /* Check to see if any other bits in the st_other field are set.
10467 Note - displaying this information disrupts the layout of the
10468 table being generated, but for the moment this case is very
10469 rare. */
10470 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10471 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10472 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10473 if (VALID_DYNAMIC_NAME (psym->st_name))
10474 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10475 else
10476 printf (_(" <corrupt: %14ld>"), psym->st_name);
10477 putchar ('\n');
10478 }
10479
10480 static const char *
10481 get_symbol_version_string (FILE *file, int is_dynsym,
10482 const char *strtab,
10483 unsigned long int strtab_size,
10484 unsigned int si, Elf_Internal_Sym *psym,
10485 enum versioned_symbol_info *sym_info,
10486 unsigned short *vna_other)
10487 {
10488 unsigned char data[2];
10489 unsigned short vers_data;
10490 unsigned long offset;
10491
10492 if (!is_dynsym
10493 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10494 return NULL;
10495
10496 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10497 sizeof data + si * sizeof (vers_data));
10498
10499 if (get_data (&data, file, offset + si * sizeof (vers_data),
10500 sizeof (data), 1, _("version data")) == NULL)
10501 return NULL;
10502
10503 vers_data = byte_get (data, 2);
10504
10505 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10506 return NULL;
10507
10508 /* Usually we'd only see verdef for defined symbols, and verneed for
10509 undefined symbols. However, symbols defined by the linker in
10510 .dynbss for variables copied from a shared library in order to
10511 avoid text relocations are defined yet have verneed. We could
10512 use a heuristic to detect the special case, for example, check
10513 for verneed first on symbols defined in SHT_NOBITS sections, but
10514 it is simpler and more reliable to just look for both verdef and
10515 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10516
10517 if (psym->st_shndx != SHN_UNDEF
10518 && vers_data != 0x8001
10519 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10520 {
10521 Elf_Internal_Verdef ivd;
10522 Elf_Internal_Verdaux ivda;
10523 Elf_External_Verdaux evda;
10524 unsigned long off;
10525
10526 off = offset_from_vma (file,
10527 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10528 sizeof (Elf_External_Verdef));
10529
10530 do
10531 {
10532 Elf_External_Verdef evd;
10533
10534 if (get_data (&evd, file, off, sizeof (evd), 1,
10535 _("version def")) == NULL)
10536 {
10537 ivd.vd_ndx = 0;
10538 ivd.vd_aux = 0;
10539 ivd.vd_next = 0;
10540 }
10541 else
10542 {
10543 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10544 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10545 ivd.vd_next = BYTE_GET (evd.vd_next);
10546 }
10547
10548 off += ivd.vd_next;
10549 }
10550 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10551
10552 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10553 {
10554 off -= ivd.vd_next;
10555 off += ivd.vd_aux;
10556
10557 if (get_data (&evda, file, off, sizeof (evda), 1,
10558 _("version def aux")) != NULL)
10559 {
10560 ivda.vda_name = BYTE_GET (evda.vda_name);
10561
10562 if (psym->st_name != ivda.vda_name)
10563 {
10564 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10565 ? symbol_hidden : symbol_public);
10566 return (ivda.vda_name < strtab_size
10567 ? strtab + ivda.vda_name : _("<corrupt>"));
10568 }
10569 }
10570 }
10571 }
10572
10573 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10574 {
10575 Elf_External_Verneed evn;
10576 Elf_Internal_Verneed ivn;
10577 Elf_Internal_Vernaux ivna;
10578
10579 offset = offset_from_vma (file,
10580 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10581 sizeof evn);
10582 do
10583 {
10584 unsigned long vna_off;
10585
10586 if (get_data (&evn, file, offset, sizeof (evn), 1,
10587 _("version need")) == NULL)
10588 {
10589 ivna.vna_next = 0;
10590 ivna.vna_other = 0;
10591 ivna.vna_name = 0;
10592 break;
10593 }
10594
10595 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10596 ivn.vn_next = BYTE_GET (evn.vn_next);
10597
10598 vna_off = offset + ivn.vn_aux;
10599
10600 do
10601 {
10602 Elf_External_Vernaux evna;
10603
10604 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10605 _("version need aux (3)")) == NULL)
10606 {
10607 ivna.vna_next = 0;
10608 ivna.vna_other = 0;
10609 ivna.vna_name = 0;
10610 }
10611 else
10612 {
10613 ivna.vna_other = BYTE_GET (evna.vna_other);
10614 ivna.vna_next = BYTE_GET (evna.vna_next);
10615 ivna.vna_name = BYTE_GET (evna.vna_name);
10616 }
10617
10618 vna_off += ivna.vna_next;
10619 }
10620 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10621
10622 if (ivna.vna_other == vers_data)
10623 break;
10624
10625 offset += ivn.vn_next;
10626 }
10627 while (ivn.vn_next != 0);
10628
10629 if (ivna.vna_other == vers_data)
10630 {
10631 *sym_info = symbol_undefined;
10632 *vna_other = ivna.vna_other;
10633 return (ivna.vna_name < strtab_size
10634 ? strtab + ivna.vna_name : _("<corrupt>"));
10635 }
10636 }
10637 return NULL;
10638 }
10639
10640 /* Dump the symbol table. */
10641 static int
10642 process_symbol_table (FILE * file)
10643 {
10644 Elf_Internal_Shdr * section;
10645 bfd_size_type nbuckets = 0;
10646 bfd_size_type nchains = 0;
10647 bfd_vma * buckets = NULL;
10648 bfd_vma * chains = NULL;
10649 bfd_vma ngnubuckets = 0;
10650 bfd_vma * gnubuckets = NULL;
10651 bfd_vma * gnuchains = NULL;
10652 bfd_vma gnusymidx = 0;
10653 bfd_size_type ngnuchains = 0;
10654
10655 if (!do_syms && !do_dyn_syms && !do_histogram)
10656 return 1;
10657
10658 if (dynamic_info[DT_HASH]
10659 && (do_histogram
10660 || (do_using_dynamic
10661 && !do_dyn_syms
10662 && dynamic_strings != NULL)))
10663 {
10664 unsigned char nb[8];
10665 unsigned char nc[8];
10666 unsigned int hash_ent_size = 4;
10667
10668 if ((elf_header.e_machine == EM_ALPHA
10669 || elf_header.e_machine == EM_S390
10670 || elf_header.e_machine == EM_S390_OLD)
10671 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10672 hash_ent_size = 8;
10673
10674 if (fseek (file,
10675 (archive_file_offset
10676 + offset_from_vma (file, dynamic_info[DT_HASH],
10677 sizeof nb + sizeof nc)),
10678 SEEK_SET))
10679 {
10680 error (_("Unable to seek to start of dynamic information\n"));
10681 goto no_hash;
10682 }
10683
10684 if (fread (nb, hash_ent_size, 1, file) != 1)
10685 {
10686 error (_("Failed to read in number of buckets\n"));
10687 goto no_hash;
10688 }
10689
10690 if (fread (nc, hash_ent_size, 1, file) != 1)
10691 {
10692 error (_("Failed to read in number of chains\n"));
10693 goto no_hash;
10694 }
10695
10696 nbuckets = byte_get (nb, hash_ent_size);
10697 nchains = byte_get (nc, hash_ent_size);
10698
10699 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10700 chains = get_dynamic_data (file, nchains, hash_ent_size);
10701
10702 no_hash:
10703 if (buckets == NULL || chains == NULL)
10704 {
10705 if (do_using_dynamic)
10706 return 0;
10707 free (buckets);
10708 free (chains);
10709 buckets = NULL;
10710 chains = NULL;
10711 nbuckets = 0;
10712 nchains = 0;
10713 }
10714 }
10715
10716 if (dynamic_info_DT_GNU_HASH
10717 && (do_histogram
10718 || (do_using_dynamic
10719 && !do_dyn_syms
10720 && dynamic_strings != NULL)))
10721 {
10722 unsigned char nb[16];
10723 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10724 bfd_vma buckets_vma;
10725
10726 if (fseek (file,
10727 (archive_file_offset
10728 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10729 sizeof nb)),
10730 SEEK_SET))
10731 {
10732 error (_("Unable to seek to start of dynamic information\n"));
10733 goto no_gnu_hash;
10734 }
10735
10736 if (fread (nb, 16, 1, file) != 1)
10737 {
10738 error (_("Failed to read in number of buckets\n"));
10739 goto no_gnu_hash;
10740 }
10741
10742 ngnubuckets = byte_get (nb, 4);
10743 gnusymidx = byte_get (nb + 4, 4);
10744 bitmaskwords = byte_get (nb + 8, 4);
10745 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10746 if (is_32bit_elf)
10747 buckets_vma += bitmaskwords * 4;
10748 else
10749 buckets_vma += bitmaskwords * 8;
10750
10751 if (fseek (file,
10752 (archive_file_offset
10753 + offset_from_vma (file, buckets_vma, 4)),
10754 SEEK_SET))
10755 {
10756 error (_("Unable to seek to start of dynamic information\n"));
10757 goto no_gnu_hash;
10758 }
10759
10760 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10761
10762 if (gnubuckets == NULL)
10763 goto no_gnu_hash;
10764
10765 for (i = 0; i < ngnubuckets; i++)
10766 if (gnubuckets[i] != 0)
10767 {
10768 if (gnubuckets[i] < gnusymidx)
10769 return 0;
10770
10771 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10772 maxchain = gnubuckets[i];
10773 }
10774
10775 if (maxchain == 0xffffffff)
10776 goto no_gnu_hash;
10777
10778 maxchain -= gnusymidx;
10779
10780 if (fseek (file,
10781 (archive_file_offset
10782 + offset_from_vma (file, buckets_vma
10783 + 4 * (ngnubuckets + maxchain), 4)),
10784 SEEK_SET))
10785 {
10786 error (_("Unable to seek to start of dynamic information\n"));
10787 goto no_gnu_hash;
10788 }
10789
10790 do
10791 {
10792 if (fread (nb, 4, 1, file) != 1)
10793 {
10794 error (_("Failed to determine last chain length\n"));
10795 goto no_gnu_hash;
10796 }
10797
10798 if (maxchain + 1 == 0)
10799 goto no_gnu_hash;
10800
10801 ++maxchain;
10802 }
10803 while ((byte_get (nb, 4) & 1) == 0);
10804
10805 if (fseek (file,
10806 (archive_file_offset
10807 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10808 SEEK_SET))
10809 {
10810 error (_("Unable to seek to start of dynamic information\n"));
10811 goto no_gnu_hash;
10812 }
10813
10814 gnuchains = get_dynamic_data (file, maxchain, 4);
10815 ngnuchains = maxchain;
10816
10817 no_gnu_hash:
10818 if (gnuchains == NULL)
10819 {
10820 free (gnubuckets);
10821 gnubuckets = NULL;
10822 ngnubuckets = 0;
10823 if (do_using_dynamic)
10824 return 0;
10825 }
10826 }
10827
10828 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10829 && do_syms
10830 && do_using_dynamic
10831 && dynamic_strings != NULL
10832 && dynamic_symbols != NULL)
10833 {
10834 unsigned long hn;
10835
10836 if (dynamic_info[DT_HASH])
10837 {
10838 bfd_vma si;
10839
10840 printf (_("\nSymbol table for image:\n"));
10841 if (is_32bit_elf)
10842 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10843 else
10844 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10845
10846 for (hn = 0; hn < nbuckets; hn++)
10847 {
10848 if (! buckets[hn])
10849 continue;
10850
10851 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10852 print_dynamic_symbol (si, hn);
10853 }
10854 }
10855
10856 if (dynamic_info_DT_GNU_HASH)
10857 {
10858 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10859 if (is_32bit_elf)
10860 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10861 else
10862 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10863
10864 for (hn = 0; hn < ngnubuckets; ++hn)
10865 if (gnubuckets[hn] != 0)
10866 {
10867 bfd_vma si = gnubuckets[hn];
10868 bfd_vma off = si - gnusymidx;
10869
10870 do
10871 {
10872 print_dynamic_symbol (si, hn);
10873 si++;
10874 }
10875 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10876 }
10877 }
10878 }
10879 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10880 && section_headers != NULL)
10881 {
10882 unsigned int i;
10883
10884 for (i = 0, section = section_headers;
10885 i < elf_header.e_shnum;
10886 i++, section++)
10887 {
10888 unsigned int si;
10889 char * strtab = NULL;
10890 unsigned long int strtab_size = 0;
10891 Elf_Internal_Sym * symtab;
10892 Elf_Internal_Sym * psym;
10893 unsigned long num_syms;
10894
10895 if ((section->sh_type != SHT_SYMTAB
10896 && section->sh_type != SHT_DYNSYM)
10897 || (!do_syms
10898 && section->sh_type == SHT_SYMTAB))
10899 continue;
10900
10901 if (section->sh_entsize == 0)
10902 {
10903 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10904 printable_section_name (section));
10905 continue;
10906 }
10907
10908 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10909 printable_section_name (section),
10910 (unsigned long) (section->sh_size / section->sh_entsize));
10911
10912 if (is_32bit_elf)
10913 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10914 else
10915 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10916
10917 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10918 if (symtab == NULL)
10919 continue;
10920
10921 if (section->sh_link == elf_header.e_shstrndx)
10922 {
10923 strtab = string_table;
10924 strtab_size = string_table_length;
10925 }
10926 else if (section->sh_link < elf_header.e_shnum)
10927 {
10928 Elf_Internal_Shdr * string_sec;
10929
10930 string_sec = section_headers + section->sh_link;
10931
10932 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10933 1, string_sec->sh_size,
10934 _("string table"));
10935 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10936 }
10937
10938 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10939 {
10940 const char *version_string;
10941 enum versioned_symbol_info sym_info;
10942 unsigned short vna_other;
10943
10944 printf ("%6d: ", si);
10945 print_vma (psym->st_value, LONG_HEX);
10946 putchar (' ');
10947 print_vma (psym->st_size, DEC_5);
10948 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10949 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10950 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10951 /* Check to see if any other bits in the st_other field are set.
10952 Note - displaying this information disrupts the layout of the
10953 table being generated, but for the moment this case is very rare. */
10954 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10955 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10956 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10957 print_symbol (25, psym->st_name < strtab_size
10958 ? strtab + psym->st_name : _("<corrupt>"));
10959
10960 version_string
10961 = get_symbol_version_string (file,
10962 section->sh_type == SHT_DYNSYM,
10963 strtab, strtab_size, si,
10964 psym, &sym_info, &vna_other);
10965 if (version_string)
10966 {
10967 if (sym_info == symbol_undefined)
10968 printf ("@%s (%d)", version_string, vna_other);
10969 else
10970 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10971 version_string);
10972 }
10973
10974 putchar ('\n');
10975 }
10976
10977 free (symtab);
10978 if (strtab != string_table)
10979 free (strtab);
10980 }
10981 }
10982 else if (do_syms)
10983 printf
10984 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10985
10986 if (do_histogram && buckets != NULL)
10987 {
10988 unsigned long * lengths;
10989 unsigned long * counts;
10990 unsigned long hn;
10991 bfd_vma si;
10992 unsigned long maxlength = 0;
10993 unsigned long nzero_counts = 0;
10994 unsigned long nsyms = 0;
10995 unsigned long chained;
10996
10997 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10998 (unsigned long) nbuckets);
10999
11000 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11001 if (lengths == NULL)
11002 {
11003 error (_("Out of memory allocating space for histogram buckets\n"));
11004 return 0;
11005 }
11006
11007 printf (_(" Length Number %% of total Coverage\n"));
11008 for (hn = 0; hn < nbuckets; ++hn)
11009 {
11010 for (si = buckets[hn], chained = 0;
11011 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11012 si = chains[si], ++chained)
11013 {
11014 ++nsyms;
11015 if (maxlength < ++lengths[hn])
11016 ++maxlength;
11017 }
11018
11019 /* PR binutils/17531: A corrupt binary could contain broken
11020 histogram data. Do not go into an infinite loop trying
11021 to process it. */
11022 if (chained > nchains)
11023 {
11024 error (_("histogram chain is corrupt\n"));
11025 break;
11026 }
11027 }
11028
11029 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11030 if (counts == NULL)
11031 {
11032 free (lengths);
11033 error (_("Out of memory allocating space for histogram counts\n"));
11034 return 0;
11035 }
11036
11037 for (hn = 0; hn < nbuckets; ++hn)
11038 ++counts[lengths[hn]];
11039
11040 if (nbuckets > 0)
11041 {
11042 unsigned long i;
11043 printf (" 0 %-10lu (%5.1f%%)\n",
11044 counts[0], (counts[0] * 100.0) / nbuckets);
11045 for (i = 1; i <= maxlength; ++i)
11046 {
11047 nzero_counts += counts[i] * i;
11048 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11049 i, counts[i], (counts[i] * 100.0) / nbuckets,
11050 (nzero_counts * 100.0) / nsyms);
11051 }
11052 }
11053
11054 free (counts);
11055 free (lengths);
11056 }
11057
11058 if (buckets != NULL)
11059 {
11060 free (buckets);
11061 free (chains);
11062 }
11063
11064 if (do_histogram && gnubuckets != NULL)
11065 {
11066 unsigned long * lengths;
11067 unsigned long * counts;
11068 unsigned long hn;
11069 unsigned long maxlength = 0;
11070 unsigned long nzero_counts = 0;
11071 unsigned long nsyms = 0;
11072
11073 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11074 (unsigned long) ngnubuckets);
11075
11076 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11077 if (lengths == NULL)
11078 {
11079 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11080 return 0;
11081 }
11082
11083 printf (_(" Length Number %% of total Coverage\n"));
11084
11085 for (hn = 0; hn < ngnubuckets; ++hn)
11086 if (gnubuckets[hn] != 0)
11087 {
11088 bfd_vma off, length = 1;
11089
11090 for (off = gnubuckets[hn] - gnusymidx;
11091 /* PR 17531 file: 010-77222-0.004. */
11092 off < ngnuchains && (gnuchains[off] & 1) == 0;
11093 ++off)
11094 ++length;
11095 lengths[hn] = length;
11096 if (length > maxlength)
11097 maxlength = length;
11098 nsyms += length;
11099 }
11100
11101 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11102 if (counts == NULL)
11103 {
11104 free (lengths);
11105 error (_("Out of memory allocating space for gnu histogram counts\n"));
11106 return 0;
11107 }
11108
11109 for (hn = 0; hn < ngnubuckets; ++hn)
11110 ++counts[lengths[hn]];
11111
11112 if (ngnubuckets > 0)
11113 {
11114 unsigned long j;
11115 printf (" 0 %-10lu (%5.1f%%)\n",
11116 counts[0], (counts[0] * 100.0) / ngnubuckets);
11117 for (j = 1; j <= maxlength; ++j)
11118 {
11119 nzero_counts += counts[j] * j;
11120 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11121 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11122 (nzero_counts * 100.0) / nsyms);
11123 }
11124 }
11125
11126 free (counts);
11127 free (lengths);
11128 free (gnubuckets);
11129 free (gnuchains);
11130 }
11131
11132 return 1;
11133 }
11134
11135 static int
11136 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11137 {
11138 unsigned int i;
11139
11140 if (dynamic_syminfo == NULL
11141 || !do_dynamic)
11142 /* No syminfo, this is ok. */
11143 return 1;
11144
11145 /* There better should be a dynamic symbol section. */
11146 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11147 return 0;
11148
11149 if (dynamic_addr)
11150 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11151 dynamic_syminfo_offset, dynamic_syminfo_nent);
11152
11153 printf (_(" Num: Name BoundTo Flags\n"));
11154 for (i = 0; i < dynamic_syminfo_nent; ++i)
11155 {
11156 unsigned short int flags = dynamic_syminfo[i].si_flags;
11157
11158 printf ("%4d: ", i);
11159 if (i >= num_dynamic_syms)
11160 printf (_("<corrupt index>"));
11161 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11162 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11163 else
11164 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11165 putchar (' ');
11166
11167 switch (dynamic_syminfo[i].si_boundto)
11168 {
11169 case SYMINFO_BT_SELF:
11170 fputs ("SELF ", stdout);
11171 break;
11172 case SYMINFO_BT_PARENT:
11173 fputs ("PARENT ", stdout);
11174 break;
11175 default:
11176 if (dynamic_syminfo[i].si_boundto > 0
11177 && dynamic_syminfo[i].si_boundto < dynamic_nent
11178 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11179 {
11180 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11181 putchar (' ' );
11182 }
11183 else
11184 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11185 break;
11186 }
11187
11188 if (flags & SYMINFO_FLG_DIRECT)
11189 printf (" DIRECT");
11190 if (flags & SYMINFO_FLG_PASSTHRU)
11191 printf (" PASSTHRU");
11192 if (flags & SYMINFO_FLG_COPY)
11193 printf (" COPY");
11194 if (flags & SYMINFO_FLG_LAZYLOAD)
11195 printf (" LAZYLOAD");
11196
11197 puts ("");
11198 }
11199
11200 return 1;
11201 }
11202
11203 /* Check to see if the given reloc needs to be handled in a target specific
11204 manner. If so then process the reloc and return TRUE otherwise return
11205 FALSE. */
11206
11207 static bfd_boolean
11208 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11209 unsigned char * start,
11210 Elf_Internal_Sym * symtab)
11211 {
11212 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11213
11214 switch (elf_header.e_machine)
11215 {
11216 case EM_MSP430:
11217 case EM_MSP430_OLD:
11218 {
11219 static Elf_Internal_Sym * saved_sym = NULL;
11220
11221 switch (reloc_type)
11222 {
11223 case 10: /* R_MSP430_SYM_DIFF */
11224 if (uses_msp430x_relocs ())
11225 break;
11226 case 21: /* R_MSP430X_SYM_DIFF */
11227 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11228 return TRUE;
11229
11230 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11231 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11232 goto handle_sym_diff;
11233
11234 case 5: /* R_MSP430_16_BYTE */
11235 case 9: /* R_MSP430_8 */
11236 if (uses_msp430x_relocs ())
11237 break;
11238 goto handle_sym_diff;
11239
11240 case 2: /* R_MSP430_ABS16 */
11241 case 15: /* R_MSP430X_ABS16 */
11242 if (! uses_msp430x_relocs ())
11243 break;
11244 goto handle_sym_diff;
11245
11246 handle_sym_diff:
11247 if (saved_sym != NULL)
11248 {
11249 bfd_vma value;
11250
11251 value = reloc->r_addend
11252 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11253 - saved_sym->st_value);
11254
11255 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11256
11257 saved_sym = NULL;
11258 return TRUE;
11259 }
11260 break;
11261
11262 default:
11263 if (saved_sym != NULL)
11264 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11265 break;
11266 }
11267 break;
11268 }
11269
11270 case EM_MN10300:
11271 case EM_CYGNUS_MN10300:
11272 {
11273 static Elf_Internal_Sym * saved_sym = NULL;
11274
11275 switch (reloc_type)
11276 {
11277 case 34: /* R_MN10300_ALIGN */
11278 return TRUE;
11279 case 33: /* R_MN10300_SYM_DIFF */
11280 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11281 return TRUE;
11282 case 1: /* R_MN10300_32 */
11283 case 2: /* R_MN10300_16 */
11284 if (saved_sym != NULL)
11285 {
11286 bfd_vma value;
11287
11288 value = reloc->r_addend
11289 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11290 - saved_sym->st_value);
11291
11292 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11293
11294 saved_sym = NULL;
11295 return TRUE;
11296 }
11297 break;
11298 default:
11299 if (saved_sym != NULL)
11300 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11301 break;
11302 }
11303 break;
11304 }
11305
11306 case EM_RL78:
11307 {
11308 static bfd_vma saved_sym1 = 0;
11309 static bfd_vma saved_sym2 = 0;
11310 static bfd_vma value;
11311
11312 switch (reloc_type)
11313 {
11314 case 0x80: /* R_RL78_SYM. */
11315 saved_sym1 = saved_sym2;
11316 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11317 saved_sym2 += reloc->r_addend;
11318 return TRUE;
11319
11320 case 0x83: /* R_RL78_OPsub. */
11321 value = saved_sym1 - saved_sym2;
11322 saved_sym2 = saved_sym1 = 0;
11323 return TRUE;
11324 break;
11325
11326 case 0x41: /* R_RL78_ABS32. */
11327 byte_put (start + reloc->r_offset, value, 4);
11328 value = 0;
11329 return TRUE;
11330
11331 case 0x43: /* R_RL78_ABS16. */
11332 byte_put (start + reloc->r_offset, value, 2);
11333 value = 0;
11334 return TRUE;
11335
11336 default:
11337 break;
11338 }
11339 break;
11340 }
11341 }
11342
11343 return FALSE;
11344 }
11345
11346 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11347 DWARF debug sections. This is a target specific test. Note - we do not
11348 go through the whole including-target-headers-multiple-times route, (as
11349 we have already done with <elf/h8.h>) because this would become very
11350 messy and even then this function would have to contain target specific
11351 information (the names of the relocs instead of their numeric values).
11352 FIXME: This is not the correct way to solve this problem. The proper way
11353 is to have target specific reloc sizing and typing functions created by
11354 the reloc-macros.h header, in the same way that it already creates the
11355 reloc naming functions. */
11356
11357 static bfd_boolean
11358 is_32bit_abs_reloc (unsigned int reloc_type)
11359 {
11360 switch (elf_header.e_machine)
11361 {
11362 case EM_386:
11363 case EM_IAMCU:
11364 return reloc_type == 1; /* R_386_32. */
11365 case EM_68K:
11366 return reloc_type == 1; /* R_68K_32. */
11367 case EM_860:
11368 return reloc_type == 1; /* R_860_32. */
11369 case EM_960:
11370 return reloc_type == 2; /* R_960_32. */
11371 case EM_AARCH64:
11372 return reloc_type == 258; /* R_AARCH64_ABS32 */
11373 case EM_ALPHA:
11374 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11375 case EM_ARC:
11376 return reloc_type == 1; /* R_ARC_32. */
11377 case EM_ARC_COMPACT:
11378 case EM_ARC_COMPACT2:
11379 return reloc_type == 4; /* R_ARC_32. */
11380 case EM_ARM:
11381 return reloc_type == 2; /* R_ARM_ABS32 */
11382 case EM_AVR_OLD:
11383 case EM_AVR:
11384 return reloc_type == 1;
11385 case EM_ADAPTEVA_EPIPHANY:
11386 return reloc_type == 3;
11387 case EM_BLACKFIN:
11388 return reloc_type == 0x12; /* R_byte4_data. */
11389 case EM_CRIS:
11390 return reloc_type == 3; /* R_CRIS_32. */
11391 case EM_CR16:
11392 return reloc_type == 3; /* R_CR16_NUM32. */
11393 case EM_CRX:
11394 return reloc_type == 15; /* R_CRX_NUM32. */
11395 case EM_CYGNUS_FRV:
11396 return reloc_type == 1;
11397 case EM_CYGNUS_D10V:
11398 case EM_D10V:
11399 return reloc_type == 6; /* R_D10V_32. */
11400 case EM_CYGNUS_D30V:
11401 case EM_D30V:
11402 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11403 case EM_DLX:
11404 return reloc_type == 3; /* R_DLX_RELOC_32. */
11405 case EM_CYGNUS_FR30:
11406 case EM_FR30:
11407 return reloc_type == 3; /* R_FR30_32. */
11408 case EM_FT32:
11409 return reloc_type == 1; /* R_FT32_32. */
11410 case EM_H8S:
11411 case EM_H8_300:
11412 case EM_H8_300H:
11413 return reloc_type == 1; /* R_H8_DIR32. */
11414 case EM_IA_64:
11415 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11416 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11417 case EM_IP2K_OLD:
11418 case EM_IP2K:
11419 return reloc_type == 2; /* R_IP2K_32. */
11420 case EM_IQ2000:
11421 return reloc_type == 2; /* R_IQ2000_32. */
11422 case EM_LATTICEMICO32:
11423 return reloc_type == 3; /* R_LM32_32. */
11424 case EM_M32C_OLD:
11425 case EM_M32C:
11426 return reloc_type == 3; /* R_M32C_32. */
11427 case EM_M32R:
11428 return reloc_type == 34; /* R_M32R_32_RELA. */
11429 case EM_68HC11:
11430 case EM_68HC12:
11431 return reloc_type == 6; /* R_M68HC11_32. */
11432 case EM_MCORE:
11433 return reloc_type == 1; /* R_MCORE_ADDR32. */
11434 case EM_CYGNUS_MEP:
11435 return reloc_type == 4; /* R_MEP_32. */
11436 case EM_METAG:
11437 return reloc_type == 2; /* R_METAG_ADDR32. */
11438 case EM_MICROBLAZE:
11439 return reloc_type == 1; /* R_MICROBLAZE_32. */
11440 case EM_MIPS:
11441 return reloc_type == 2; /* R_MIPS_32. */
11442 case EM_MMIX:
11443 return reloc_type == 4; /* R_MMIX_32. */
11444 case EM_CYGNUS_MN10200:
11445 case EM_MN10200:
11446 return reloc_type == 1; /* R_MN10200_32. */
11447 case EM_CYGNUS_MN10300:
11448 case EM_MN10300:
11449 return reloc_type == 1; /* R_MN10300_32. */
11450 case EM_MOXIE:
11451 return reloc_type == 1; /* R_MOXIE_32. */
11452 case EM_MSP430_OLD:
11453 case EM_MSP430:
11454 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11455 case EM_MT:
11456 return reloc_type == 2; /* R_MT_32. */
11457 case EM_NDS32:
11458 return reloc_type == 20; /* R_NDS32_RELA. */
11459 case EM_ALTERA_NIOS2:
11460 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11461 case EM_NIOS32:
11462 return reloc_type == 1; /* R_NIOS_32. */
11463 case EM_OR1K:
11464 return reloc_type == 1; /* R_OR1K_32. */
11465 case EM_PARISC:
11466 return (reloc_type == 1 /* R_PARISC_DIR32. */
11467 || reloc_type == 41); /* R_PARISC_SECREL32. */
11468 case EM_PJ:
11469 case EM_PJ_OLD:
11470 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11471 case EM_PPC64:
11472 return reloc_type == 1; /* R_PPC64_ADDR32. */
11473 case EM_PPC:
11474 return reloc_type == 1; /* R_PPC_ADDR32. */
11475 case EM_RL78:
11476 return reloc_type == 1; /* R_RL78_DIR32. */
11477 case EM_RX:
11478 return reloc_type == 1; /* R_RX_DIR32. */
11479 case EM_S370:
11480 return reloc_type == 1; /* R_I370_ADDR31. */
11481 case EM_S390_OLD:
11482 case EM_S390:
11483 return reloc_type == 4; /* R_S390_32. */
11484 case EM_SCORE:
11485 return reloc_type == 8; /* R_SCORE_ABS32. */
11486 case EM_SH:
11487 return reloc_type == 1; /* R_SH_DIR32. */
11488 case EM_SPARC32PLUS:
11489 case EM_SPARCV9:
11490 case EM_SPARC:
11491 return reloc_type == 3 /* R_SPARC_32. */
11492 || reloc_type == 23; /* R_SPARC_UA32. */
11493 case EM_SPU:
11494 return reloc_type == 6; /* R_SPU_ADDR32 */
11495 case EM_TI_C6000:
11496 return reloc_type == 1; /* R_C6000_ABS32. */
11497 case EM_TILEGX:
11498 return reloc_type == 2; /* R_TILEGX_32. */
11499 case EM_TILEPRO:
11500 return reloc_type == 1; /* R_TILEPRO_32. */
11501 case EM_CYGNUS_V850:
11502 case EM_V850:
11503 return reloc_type == 6; /* R_V850_ABS32. */
11504 case EM_V800:
11505 return reloc_type == 0x33; /* R_V810_WORD. */
11506 case EM_VAX:
11507 return reloc_type == 1; /* R_VAX_32. */
11508 case EM_VISIUM:
11509 return reloc_type == 3; /* R_VISIUM_32. */
11510 case EM_X86_64:
11511 case EM_L1OM:
11512 case EM_K1OM:
11513 return reloc_type == 10; /* R_X86_64_32. */
11514 case EM_XC16X:
11515 case EM_C166:
11516 return reloc_type == 3; /* R_XC16C_ABS_32. */
11517 case EM_XGATE:
11518 return reloc_type == 4; /* R_XGATE_32. */
11519 case EM_XSTORMY16:
11520 return reloc_type == 1; /* R_XSTROMY16_32. */
11521 case EM_XTENSA_OLD:
11522 case EM_XTENSA:
11523 return reloc_type == 1; /* R_XTENSA_32. */
11524 default:
11525 {
11526 static unsigned int prev_warn = 0;
11527
11528 /* Avoid repeating the same warning multiple times. */
11529 if (prev_warn != elf_header.e_machine)
11530 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11531 elf_header.e_machine);
11532 prev_warn = elf_header.e_machine;
11533 return FALSE;
11534 }
11535 }
11536 }
11537
11538 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11539 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11540
11541 static bfd_boolean
11542 is_32bit_pcrel_reloc (unsigned int reloc_type)
11543 {
11544 switch (elf_header.e_machine)
11545 {
11546 case EM_386:
11547 case EM_IAMCU:
11548 return reloc_type == 2; /* R_386_PC32. */
11549 case EM_68K:
11550 return reloc_type == 4; /* R_68K_PC32. */
11551 case EM_AARCH64:
11552 return reloc_type == 261; /* R_AARCH64_PREL32 */
11553 case EM_ADAPTEVA_EPIPHANY:
11554 return reloc_type == 6;
11555 case EM_ALPHA:
11556 return reloc_type == 10; /* R_ALPHA_SREL32. */
11557 case EM_ARC_COMPACT:
11558 case EM_ARC_COMPACT2:
11559 return reloc_type == 49; /* R_ARC_32_PCREL. */
11560 case EM_ARM:
11561 return reloc_type == 3; /* R_ARM_REL32 */
11562 case EM_MICROBLAZE:
11563 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11564 case EM_OR1K:
11565 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11566 case EM_PARISC:
11567 return reloc_type == 9; /* R_PARISC_PCREL32. */
11568 case EM_PPC:
11569 return reloc_type == 26; /* R_PPC_REL32. */
11570 case EM_PPC64:
11571 return reloc_type == 26; /* R_PPC64_REL32. */
11572 case EM_S390_OLD:
11573 case EM_S390:
11574 return reloc_type == 5; /* R_390_PC32. */
11575 case EM_SH:
11576 return reloc_type == 2; /* R_SH_REL32. */
11577 case EM_SPARC32PLUS:
11578 case EM_SPARCV9:
11579 case EM_SPARC:
11580 return reloc_type == 6; /* R_SPARC_DISP32. */
11581 case EM_SPU:
11582 return reloc_type == 13; /* R_SPU_REL32. */
11583 case EM_TILEGX:
11584 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11585 case EM_TILEPRO:
11586 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11587 case EM_VISIUM:
11588 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11589 case EM_X86_64:
11590 case EM_L1OM:
11591 case EM_K1OM:
11592 return reloc_type == 2; /* R_X86_64_PC32. */
11593 case EM_XTENSA_OLD:
11594 case EM_XTENSA:
11595 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11596 default:
11597 /* Do not abort or issue an error message here. Not all targets use
11598 pc-relative 32-bit relocs in their DWARF debug information and we
11599 have already tested for target coverage in is_32bit_abs_reloc. A
11600 more helpful warning message will be generated by apply_relocations
11601 anyway, so just return. */
11602 return FALSE;
11603 }
11604 }
11605
11606 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11607 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11608
11609 static bfd_boolean
11610 is_64bit_abs_reloc (unsigned int reloc_type)
11611 {
11612 switch (elf_header.e_machine)
11613 {
11614 case EM_AARCH64:
11615 return reloc_type == 257; /* R_AARCH64_ABS64. */
11616 case EM_ALPHA:
11617 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11618 case EM_IA_64:
11619 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11620 case EM_PARISC:
11621 return reloc_type == 80; /* R_PARISC_DIR64. */
11622 case EM_PPC64:
11623 return reloc_type == 38; /* R_PPC64_ADDR64. */
11624 case EM_SPARC32PLUS:
11625 case EM_SPARCV9:
11626 case EM_SPARC:
11627 return reloc_type == 54; /* R_SPARC_UA64. */
11628 case EM_X86_64:
11629 case EM_L1OM:
11630 case EM_K1OM:
11631 return reloc_type == 1; /* R_X86_64_64. */
11632 case EM_S390_OLD:
11633 case EM_S390:
11634 return reloc_type == 22; /* R_S390_64. */
11635 case EM_TILEGX:
11636 return reloc_type == 1; /* R_TILEGX_64. */
11637 case EM_MIPS:
11638 return reloc_type == 18; /* R_MIPS_64. */
11639 default:
11640 return FALSE;
11641 }
11642 }
11643
11644 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11645 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11646
11647 static bfd_boolean
11648 is_64bit_pcrel_reloc (unsigned int reloc_type)
11649 {
11650 switch (elf_header.e_machine)
11651 {
11652 case EM_AARCH64:
11653 return reloc_type == 260; /* R_AARCH64_PREL64. */
11654 case EM_ALPHA:
11655 return reloc_type == 11; /* R_ALPHA_SREL64. */
11656 case EM_IA_64:
11657 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11658 case EM_PARISC:
11659 return reloc_type == 72; /* R_PARISC_PCREL64. */
11660 case EM_PPC64:
11661 return reloc_type == 44; /* R_PPC64_REL64. */
11662 case EM_SPARC32PLUS:
11663 case EM_SPARCV9:
11664 case EM_SPARC:
11665 return reloc_type == 46; /* R_SPARC_DISP64. */
11666 case EM_X86_64:
11667 case EM_L1OM:
11668 case EM_K1OM:
11669 return reloc_type == 24; /* R_X86_64_PC64. */
11670 case EM_S390_OLD:
11671 case EM_S390:
11672 return reloc_type == 23; /* R_S390_PC64. */
11673 case EM_TILEGX:
11674 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11675 default:
11676 return FALSE;
11677 }
11678 }
11679
11680 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11681 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11682
11683 static bfd_boolean
11684 is_24bit_abs_reloc (unsigned int reloc_type)
11685 {
11686 switch (elf_header.e_machine)
11687 {
11688 case EM_CYGNUS_MN10200:
11689 case EM_MN10200:
11690 return reloc_type == 4; /* R_MN10200_24. */
11691 default:
11692 return FALSE;
11693 }
11694 }
11695
11696 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11697 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11698
11699 static bfd_boolean
11700 is_16bit_abs_reloc (unsigned int reloc_type)
11701 {
11702 switch (elf_header.e_machine)
11703 {
11704 case EM_ARC:
11705 case EM_ARC_COMPACT:
11706 case EM_ARC_COMPACT2:
11707 return reloc_type == 2; /* R_ARC_16. */
11708 case EM_AVR_OLD:
11709 case EM_AVR:
11710 return reloc_type == 4; /* R_AVR_16. */
11711 case EM_ADAPTEVA_EPIPHANY:
11712 return reloc_type == 5;
11713 case EM_CYGNUS_D10V:
11714 case EM_D10V:
11715 return reloc_type == 3; /* R_D10V_16. */
11716 case EM_H8S:
11717 case EM_H8_300:
11718 case EM_H8_300H:
11719 return reloc_type == R_H8_DIR16;
11720 case EM_IP2K_OLD:
11721 case EM_IP2K:
11722 return reloc_type == 1; /* R_IP2K_16. */
11723 case EM_M32C_OLD:
11724 case EM_M32C:
11725 return reloc_type == 1; /* R_M32C_16 */
11726 case EM_MSP430:
11727 if (uses_msp430x_relocs ())
11728 return reloc_type == 2; /* R_MSP430_ABS16. */
11729 case EM_MSP430_OLD:
11730 return reloc_type == 5; /* R_MSP430_16_BYTE. */
11731 case EM_NDS32:
11732 return reloc_type == 19; /* R_NDS32_RELA. */
11733 case EM_ALTERA_NIOS2:
11734 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
11735 case EM_NIOS32:
11736 return reloc_type == 9; /* R_NIOS_16. */
11737 case EM_OR1K:
11738 return reloc_type == 2; /* R_OR1K_16. */
11739 case EM_TI_C6000:
11740 return reloc_type == 2; /* R_C6000_ABS16. */
11741 case EM_XC16X:
11742 case EM_C166:
11743 return reloc_type == 2; /* R_XC16C_ABS_16. */
11744 case EM_CYGNUS_MN10200:
11745 case EM_MN10200:
11746 return reloc_type == 2; /* R_MN10200_16. */
11747 case EM_CYGNUS_MN10300:
11748 case EM_MN10300:
11749 return reloc_type == 2; /* R_MN10300_16. */
11750 case EM_VISIUM:
11751 return reloc_type == 2; /* R_VISIUM_16. */
11752 case EM_XGATE:
11753 return reloc_type == 3; /* R_XGATE_16. */
11754 default:
11755 return FALSE;
11756 }
11757 }
11758
11759 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11760 relocation entries (possibly formerly used for SHT_GROUP sections). */
11761
11762 static bfd_boolean
11763 is_none_reloc (unsigned int reloc_type)
11764 {
11765 switch (elf_header.e_machine)
11766 {
11767 case EM_68K: /* R_68K_NONE. */
11768 case EM_386: /* R_386_NONE. */
11769 case EM_SPARC32PLUS:
11770 case EM_SPARCV9:
11771 case EM_SPARC: /* R_SPARC_NONE. */
11772 case EM_MIPS: /* R_MIPS_NONE. */
11773 case EM_PARISC: /* R_PARISC_NONE. */
11774 case EM_ALPHA: /* R_ALPHA_NONE. */
11775 case EM_ADAPTEVA_EPIPHANY:
11776 case EM_PPC: /* R_PPC_NONE. */
11777 case EM_PPC64: /* R_PPC64_NONE. */
11778 case EM_ARC: /* R_ARC_NONE. */
11779 case EM_ARC_COMPACT: /* R_ARC_NONE. */
11780 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
11781 case EM_ARM: /* R_ARM_NONE. */
11782 case EM_IA_64: /* R_IA64_NONE. */
11783 case EM_SH: /* R_SH_NONE. */
11784 case EM_S390_OLD:
11785 case EM_S390: /* R_390_NONE. */
11786 case EM_CRIS: /* R_CRIS_NONE. */
11787 case EM_X86_64: /* R_X86_64_NONE. */
11788 case EM_L1OM: /* R_X86_64_NONE. */
11789 case EM_K1OM: /* R_X86_64_NONE. */
11790 case EM_MN10300: /* R_MN10300_NONE. */
11791 case EM_FT32: /* R_FT32_NONE. */
11792 case EM_MOXIE: /* R_MOXIE_NONE. */
11793 case EM_M32R: /* R_M32R_NONE. */
11794 case EM_TI_C6000:/* R_C6000_NONE. */
11795 case EM_TILEGX: /* R_TILEGX_NONE. */
11796 case EM_TILEPRO: /* R_TILEPRO_NONE. */
11797 case EM_XC16X:
11798 case EM_C166: /* R_XC16X_NONE. */
11799 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11800 case EM_NIOS32: /* R_NIOS_NONE. */
11801 case EM_OR1K: /* R_OR1K_NONE. */
11802 return reloc_type == 0;
11803 case EM_AARCH64:
11804 return reloc_type == 0 || reloc_type == 256;
11805 case EM_NDS32:
11806 return (reloc_type == 0 /* R_XTENSA_NONE. */
11807 || reloc_type == 204 /* R_NDS32_DIFF8. */
11808 || reloc_type == 205 /* R_NDS32_DIFF16. */
11809 || reloc_type == 206 /* R_NDS32_DIFF32. */
11810 || reloc_type == 207 /* R_NDS32_ULEB128. */);
11811 case EM_XTENSA_OLD:
11812 case EM_XTENSA:
11813 return (reloc_type == 0 /* R_XTENSA_NONE. */
11814 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11815 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11816 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
11817 case EM_METAG:
11818 return reloc_type == 3; /* R_METAG_NONE. */
11819 }
11820 return FALSE;
11821 }
11822
11823 /* Returns TRUE if there is a relocation against
11824 section NAME at OFFSET bytes. */
11825
11826 bfd_boolean
11827 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11828 {
11829 Elf_Internal_Rela * relocs;
11830 Elf_Internal_Rela * rp;
11831
11832 if (dsec == NULL || dsec->reloc_info == NULL)
11833 return FALSE;
11834
11835 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11836
11837 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11838 if (rp->r_offset == offset)
11839 return TRUE;
11840
11841 return FALSE;
11842 }
11843
11844 /* Apply relocations to a section.
11845 Note: So far support has been added only for those relocations
11846 which can be found in debug sections.
11847 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11848 loaded relocs. It is then the caller's responsibility to free them.
11849 FIXME: Add support for more relocations ? */
11850
11851 static void
11852 apply_relocations (void * file,
11853 const Elf_Internal_Shdr * section,
11854 unsigned char * start,
11855 bfd_size_type size,
11856 void ** relocs_return,
11857 unsigned long * num_relocs_return)
11858 {
11859 Elf_Internal_Shdr * relsec;
11860 unsigned char * end = start + size;
11861
11862 if (relocs_return != NULL)
11863 {
11864 * (Elf_Internal_Rela **) relocs_return = NULL;
11865 * num_relocs_return = 0;
11866 }
11867
11868 if (elf_header.e_type != ET_REL)
11869 return;
11870
11871 /* Find the reloc section associated with the section. */
11872 for (relsec = section_headers;
11873 relsec < section_headers + elf_header.e_shnum;
11874 ++relsec)
11875 {
11876 bfd_boolean is_rela;
11877 unsigned long num_relocs;
11878 Elf_Internal_Rela * relocs;
11879 Elf_Internal_Rela * rp;
11880 Elf_Internal_Shdr * symsec;
11881 Elf_Internal_Sym * symtab;
11882 unsigned long num_syms;
11883 Elf_Internal_Sym * sym;
11884
11885 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11886 || relsec->sh_info >= elf_header.e_shnum
11887 || section_headers + relsec->sh_info != section
11888 || relsec->sh_size == 0
11889 || relsec->sh_link >= elf_header.e_shnum)
11890 continue;
11891
11892 is_rela = relsec->sh_type == SHT_RELA;
11893
11894 if (is_rela)
11895 {
11896 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11897 relsec->sh_size, & relocs, & num_relocs))
11898 return;
11899 }
11900 else
11901 {
11902 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11903 relsec->sh_size, & relocs, & num_relocs))
11904 return;
11905 }
11906
11907 /* SH uses RELA but uses in place value instead of the addend field. */
11908 if (elf_header.e_machine == EM_SH)
11909 is_rela = FALSE;
11910
11911 symsec = section_headers + relsec->sh_link;
11912 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11913
11914 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11915 {
11916 bfd_vma addend;
11917 unsigned int reloc_type;
11918 unsigned int reloc_size;
11919 unsigned char * rloc;
11920 unsigned long sym_index;
11921
11922 reloc_type = get_reloc_type (rp->r_info);
11923
11924 if (target_specific_reloc_handling (rp, start, symtab))
11925 continue;
11926 else if (is_none_reloc (reloc_type))
11927 continue;
11928 else if (is_32bit_abs_reloc (reloc_type)
11929 || is_32bit_pcrel_reloc (reloc_type))
11930 reloc_size = 4;
11931 else if (is_64bit_abs_reloc (reloc_type)
11932 || is_64bit_pcrel_reloc (reloc_type))
11933 reloc_size = 8;
11934 else if (is_24bit_abs_reloc (reloc_type))
11935 reloc_size = 3;
11936 else if (is_16bit_abs_reloc (reloc_type))
11937 reloc_size = 2;
11938 else
11939 {
11940 static unsigned int prev_reloc = 0;
11941 if (reloc_type != prev_reloc)
11942 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11943 reloc_type, printable_section_name (section));
11944 prev_reloc = reloc_type;
11945 continue;
11946 }
11947
11948 rloc = start + rp->r_offset;
11949 if ((rloc + reloc_size) > end || (rloc < start))
11950 {
11951 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11952 (unsigned long) rp->r_offset,
11953 printable_section_name (section));
11954 continue;
11955 }
11956
11957 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11958 if (sym_index >= num_syms)
11959 {
11960 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11961 sym_index, printable_section_name (section));
11962 continue;
11963 }
11964 sym = symtab + sym_index;
11965
11966 /* If the reloc has a symbol associated with it,
11967 make sure that it is of an appropriate type.
11968
11969 Relocations against symbols without type can happen.
11970 Gcc -feliminate-dwarf2-dups may generate symbols
11971 without type for debug info.
11972
11973 Icc generates relocations against function symbols
11974 instead of local labels.
11975
11976 Relocations against object symbols can happen, eg when
11977 referencing a global array. For an example of this see
11978 the _clz.o binary in libgcc.a. */
11979 if (sym != symtab
11980 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
11981 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11982 {
11983 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11984 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11985 (long int)(rp - relocs),
11986 printable_section_name (relsec));
11987 continue;
11988 }
11989
11990 addend = 0;
11991 if (is_rela)
11992 addend += rp->r_addend;
11993 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11994 partial_inplace. */
11995 if (!is_rela
11996 || (elf_header.e_machine == EM_XTENSA
11997 && reloc_type == 1)
11998 || ((elf_header.e_machine == EM_PJ
11999 || elf_header.e_machine == EM_PJ_OLD)
12000 && reloc_type == 1)
12001 || ((elf_header.e_machine == EM_D30V
12002 || elf_header.e_machine == EM_CYGNUS_D30V)
12003 && reloc_type == 12))
12004 addend += byte_get (rloc, reloc_size);
12005
12006 if (is_32bit_pcrel_reloc (reloc_type)
12007 || is_64bit_pcrel_reloc (reloc_type))
12008 {
12009 /* On HPPA, all pc-relative relocations are biased by 8. */
12010 if (elf_header.e_machine == EM_PARISC)
12011 addend -= 8;
12012 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12013 reloc_size);
12014 }
12015 else
12016 byte_put (rloc, addend + sym->st_value, reloc_size);
12017 }
12018
12019 free (symtab);
12020
12021 if (relocs_return)
12022 {
12023 * (Elf_Internal_Rela **) relocs_return = relocs;
12024 * num_relocs_return = num_relocs;
12025 }
12026 else
12027 free (relocs);
12028
12029 break;
12030 }
12031 }
12032
12033 #ifdef SUPPORT_DISASSEMBLY
12034 static int
12035 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12036 {
12037 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12038
12039 /* FIXME: XXX -- to be done --- XXX */
12040
12041 return 1;
12042 }
12043 #endif
12044
12045 /* Reads in the contents of SECTION from FILE, returning a pointer
12046 to a malloc'ed buffer or NULL if something went wrong. */
12047
12048 static char *
12049 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12050 {
12051 bfd_size_type num_bytes;
12052
12053 num_bytes = section->sh_size;
12054
12055 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12056 {
12057 printf (_("\nSection '%s' has no data to dump.\n"),
12058 printable_section_name (section));
12059 return NULL;
12060 }
12061
12062 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12063 _("section contents"));
12064 }
12065
12066 /* Uncompresses a section that was compressed using zlib, in place. */
12067
12068 static bfd_boolean
12069 uncompress_section_contents (unsigned char **buffer,
12070 dwarf_size_type uncompressed_size,
12071 dwarf_size_type *size)
12072 {
12073 dwarf_size_type compressed_size = *size;
12074 unsigned char * compressed_buffer = *buffer;
12075 unsigned char * uncompressed_buffer;
12076 z_stream strm;
12077 int rc;
12078
12079 /* It is possible the section consists of several compressed
12080 buffers concatenated together, so we uncompress in a loop. */
12081 /* PR 18313: The state field in the z_stream structure is supposed
12082 to be invisible to the user (ie us), but some compilers will
12083 still complain about it being used without initialisation. So
12084 we first zero the entire z_stream structure and then set the fields
12085 that we need. */
12086 memset (& strm, 0, sizeof strm);
12087 strm.avail_in = compressed_size;
12088 strm.next_in = (Bytef *) compressed_buffer;
12089 strm.avail_out = uncompressed_size;
12090 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12091
12092 rc = inflateInit (& strm);
12093 while (strm.avail_in > 0)
12094 {
12095 if (rc != Z_OK)
12096 goto fail;
12097 strm.next_out = ((Bytef *) uncompressed_buffer
12098 + (uncompressed_size - strm.avail_out));
12099 rc = inflate (&strm, Z_FINISH);
12100 if (rc != Z_STREAM_END)
12101 goto fail;
12102 rc = inflateReset (& strm);
12103 }
12104 rc = inflateEnd (& strm);
12105 if (rc != Z_OK
12106 || strm.avail_out != 0)
12107 goto fail;
12108
12109 *buffer = uncompressed_buffer;
12110 *size = uncompressed_size;
12111 return TRUE;
12112
12113 fail:
12114 free (uncompressed_buffer);
12115 /* Indicate decompression failure. */
12116 *buffer = NULL;
12117 return FALSE;
12118 }
12119
12120 static void
12121 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12122 {
12123 Elf_Internal_Shdr * relsec;
12124 bfd_size_type num_bytes;
12125 unsigned char * data;
12126 unsigned char * end;
12127 unsigned char * real_start;
12128 unsigned char * start;
12129 bfd_boolean some_strings_shown;
12130
12131 real_start = start = (unsigned char *) get_section_contents (section,
12132 file);
12133 if (start == NULL)
12134 return;
12135 num_bytes = section->sh_size;
12136
12137 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12138
12139 if (decompress_dumps)
12140 {
12141 dwarf_size_type new_size = num_bytes;
12142 dwarf_size_type uncompressed_size = 0;
12143
12144 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12145 {
12146 Elf_Internal_Chdr chdr;
12147 unsigned int compression_header_size
12148 = get_compression_header (& chdr, (unsigned char *) start);
12149
12150 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12151 {
12152 warn (_("section '%s' has unsupported compress type: %d\n"),
12153 printable_section_name (section), chdr.ch_type);
12154 return;
12155 }
12156 else if (chdr.ch_addralign != section->sh_addralign)
12157 {
12158 warn (_("compressed section '%s' is corrupted\n"),
12159 printable_section_name (section));
12160 return;
12161 }
12162 uncompressed_size = chdr.ch_size;
12163 start += compression_header_size;
12164 new_size -= compression_header_size;
12165 }
12166 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12167 {
12168 /* Read the zlib header. In this case, it should be "ZLIB"
12169 followed by the uncompressed section size, 8 bytes in
12170 big-endian order. */
12171 uncompressed_size = start[4]; uncompressed_size <<= 8;
12172 uncompressed_size += start[5]; uncompressed_size <<= 8;
12173 uncompressed_size += start[6]; uncompressed_size <<= 8;
12174 uncompressed_size += start[7]; uncompressed_size <<= 8;
12175 uncompressed_size += start[8]; uncompressed_size <<= 8;
12176 uncompressed_size += start[9]; uncompressed_size <<= 8;
12177 uncompressed_size += start[10]; uncompressed_size <<= 8;
12178 uncompressed_size += start[11];
12179 start += 12;
12180 new_size -= 12;
12181 }
12182
12183 if (uncompressed_size
12184 && uncompress_section_contents (& start,
12185 uncompressed_size, & new_size))
12186 num_bytes = new_size;
12187 }
12188
12189 /* If the section being dumped has relocations against it the user might
12190 be expecting these relocations to have been applied. Check for this
12191 case and issue a warning message in order to avoid confusion.
12192 FIXME: Maybe we ought to have an option that dumps a section with
12193 relocs applied ? */
12194 for (relsec = section_headers;
12195 relsec < section_headers + elf_header.e_shnum;
12196 ++relsec)
12197 {
12198 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12199 || relsec->sh_info >= elf_header.e_shnum
12200 || section_headers + relsec->sh_info != section
12201 || relsec->sh_size == 0
12202 || relsec->sh_link >= elf_header.e_shnum)
12203 continue;
12204
12205 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12206 break;
12207 }
12208
12209 data = start;
12210 end = start + num_bytes;
12211 some_strings_shown = FALSE;
12212
12213 while (data < end)
12214 {
12215 while (!ISPRINT (* data))
12216 if (++ data >= end)
12217 break;
12218
12219 if (data < end)
12220 {
12221 size_t maxlen = end - data;
12222
12223 #ifndef __MSVCRT__
12224 /* PR 11128: Use two separate invocations in order to work
12225 around bugs in the Solaris 8 implementation of printf. */
12226 printf (" [%6tx] ", data - start);
12227 #else
12228 printf (" [%6Ix] ", (size_t) (data - start));
12229 #endif
12230 if (maxlen > 0)
12231 {
12232 print_symbol ((int) maxlen, (const char *) data);
12233 putchar ('\n');
12234 data += strnlen ((const char *) data, maxlen);
12235 }
12236 else
12237 {
12238 printf (_("<corrupt>\n"));
12239 data = end;
12240 }
12241 some_strings_shown = TRUE;
12242 }
12243 }
12244
12245 if (! some_strings_shown)
12246 printf (_(" No strings found in this section."));
12247
12248 free (real_start);
12249
12250 putchar ('\n');
12251 }
12252
12253 static void
12254 dump_section_as_bytes (Elf_Internal_Shdr * section,
12255 FILE * file,
12256 bfd_boolean relocate)
12257 {
12258 Elf_Internal_Shdr * relsec;
12259 bfd_size_type bytes;
12260 bfd_size_type section_size;
12261 bfd_vma addr;
12262 unsigned char * data;
12263 unsigned char * real_start;
12264 unsigned char * start;
12265
12266 real_start = start = (unsigned char *) get_section_contents (section, file);
12267 if (start == NULL)
12268 return;
12269 section_size = section->sh_size;
12270
12271 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12272
12273 if (decompress_dumps)
12274 {
12275 dwarf_size_type new_size = section_size;
12276 dwarf_size_type uncompressed_size = 0;
12277
12278 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12279 {
12280 Elf_Internal_Chdr chdr;
12281 unsigned int compression_header_size
12282 = get_compression_header (& chdr, start);
12283
12284 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12285 {
12286 warn (_("section '%s' has unsupported compress type: %d\n"),
12287 printable_section_name (section), chdr.ch_type);
12288 return;
12289 }
12290 else if (chdr.ch_addralign != section->sh_addralign)
12291 {
12292 warn (_("compressed section '%s' is corrupted\n"),
12293 printable_section_name (section));
12294 return;
12295 }
12296 uncompressed_size = chdr.ch_size;
12297 start += compression_header_size;
12298 new_size -= compression_header_size;
12299 }
12300 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12301 {
12302 /* Read the zlib header. In this case, it should be "ZLIB"
12303 followed by the uncompressed section size, 8 bytes in
12304 big-endian order. */
12305 uncompressed_size = start[4]; uncompressed_size <<= 8;
12306 uncompressed_size += start[5]; uncompressed_size <<= 8;
12307 uncompressed_size += start[6]; uncompressed_size <<= 8;
12308 uncompressed_size += start[7]; uncompressed_size <<= 8;
12309 uncompressed_size += start[8]; uncompressed_size <<= 8;
12310 uncompressed_size += start[9]; uncompressed_size <<= 8;
12311 uncompressed_size += start[10]; uncompressed_size <<= 8;
12312 uncompressed_size += start[11];
12313 start += 12;
12314 new_size -= 12;
12315 }
12316
12317 if (uncompressed_size
12318 && uncompress_section_contents (& start, uncompressed_size,
12319 & new_size))
12320 section_size = new_size;
12321 }
12322
12323 if (relocate)
12324 {
12325 apply_relocations (file, section, start, section_size, NULL, NULL);
12326 }
12327 else
12328 {
12329 /* If the section being dumped has relocations against it the user might
12330 be expecting these relocations to have been applied. Check for this
12331 case and issue a warning message in order to avoid confusion.
12332 FIXME: Maybe we ought to have an option that dumps a section with
12333 relocs applied ? */
12334 for (relsec = section_headers;
12335 relsec < section_headers + elf_header.e_shnum;
12336 ++relsec)
12337 {
12338 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12339 || relsec->sh_info >= elf_header.e_shnum
12340 || section_headers + relsec->sh_info != section
12341 || relsec->sh_size == 0
12342 || relsec->sh_link >= elf_header.e_shnum)
12343 continue;
12344
12345 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12346 break;
12347 }
12348 }
12349
12350 addr = section->sh_addr;
12351 bytes = section_size;
12352 data = start;
12353
12354 while (bytes)
12355 {
12356 int j;
12357 int k;
12358 int lbytes;
12359
12360 lbytes = (bytes > 16 ? 16 : bytes);
12361
12362 printf (" 0x%8.8lx ", (unsigned long) addr);
12363
12364 for (j = 0; j < 16; j++)
12365 {
12366 if (j < lbytes)
12367 printf ("%2.2x", data[j]);
12368 else
12369 printf (" ");
12370
12371 if ((j & 3) == 3)
12372 printf (" ");
12373 }
12374
12375 for (j = 0; j < lbytes; j++)
12376 {
12377 k = data[j];
12378 if (k >= ' ' && k < 0x7f)
12379 printf ("%c", k);
12380 else
12381 printf (".");
12382 }
12383
12384 putchar ('\n');
12385
12386 data += lbytes;
12387 addr += lbytes;
12388 bytes -= lbytes;
12389 }
12390
12391 free (real_start);
12392
12393 putchar ('\n');
12394 }
12395
12396 static int
12397 load_specific_debug_section (enum dwarf_section_display_enum debug,
12398 const Elf_Internal_Shdr * sec, void * file)
12399 {
12400 struct dwarf_section * section = &debug_displays [debug].section;
12401 char buf [64];
12402
12403 /* If it is already loaded, do nothing. */
12404 if (section->start != NULL)
12405 return 1;
12406
12407 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12408 section->address = sec->sh_addr;
12409 section->user_data = NULL;
12410 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12411 sec->sh_offset, 1,
12412 sec->sh_size, buf);
12413 if (section->start == NULL)
12414 section->size = 0;
12415 else
12416 {
12417 unsigned char *start = section->start;
12418 dwarf_size_type size = sec->sh_size;
12419 dwarf_size_type uncompressed_size = 0;
12420
12421 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12422 {
12423 Elf_Internal_Chdr chdr;
12424 unsigned int compression_header_size
12425 = get_compression_header (&chdr, start);
12426 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12427 {
12428 warn (_("section '%s' has unsupported compress type: %d\n"),
12429 section->name, chdr.ch_type);
12430 return 0;
12431 }
12432 else if (chdr.ch_addralign != sec->sh_addralign)
12433 {
12434 warn (_("compressed section '%s' is corrupted\n"),
12435 section->name);
12436 return 0;
12437 }
12438 uncompressed_size = chdr.ch_size;
12439 start += compression_header_size;
12440 size -= compression_header_size;
12441 }
12442 else if (size > 12 && streq ((char *) start, "ZLIB"))
12443 {
12444 /* Read the zlib header. In this case, it should be "ZLIB"
12445 followed by the uncompressed section size, 8 bytes in
12446 big-endian order. */
12447 uncompressed_size = start[4]; uncompressed_size <<= 8;
12448 uncompressed_size += start[5]; uncompressed_size <<= 8;
12449 uncompressed_size += start[6]; uncompressed_size <<= 8;
12450 uncompressed_size += start[7]; uncompressed_size <<= 8;
12451 uncompressed_size += start[8]; uncompressed_size <<= 8;
12452 uncompressed_size += start[9]; uncompressed_size <<= 8;
12453 uncompressed_size += start[10]; uncompressed_size <<= 8;
12454 uncompressed_size += start[11];
12455 start += 12;
12456 size -= 12;
12457 }
12458
12459 if (uncompressed_size
12460 && uncompress_section_contents (&start, uncompressed_size,
12461 &size))
12462 {
12463 /* Free the compressed buffer, update the section buffer
12464 and the section size if uncompress is successful. */
12465 free (section->start);
12466 section->start = start;
12467 }
12468 section->size = size;
12469 }
12470
12471 if (section->start == NULL)
12472 return 0;
12473
12474 if (debug_displays [debug].relocate)
12475 apply_relocations ((FILE *) file, sec, section->start, section->size,
12476 & section->reloc_info, & section->num_relocs);
12477 else
12478 {
12479 section->reloc_info = NULL;
12480 section->num_relocs = 0;
12481 }
12482
12483 return 1;
12484 }
12485
12486 /* If this is not NULL, load_debug_section will only look for sections
12487 within the list of sections given here. */
12488 unsigned int *section_subset = NULL;
12489
12490 int
12491 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12492 {
12493 struct dwarf_section * section = &debug_displays [debug].section;
12494 Elf_Internal_Shdr * sec;
12495
12496 /* Locate the debug section. */
12497 sec = find_section_in_set (section->uncompressed_name, section_subset);
12498 if (sec != NULL)
12499 section->name = section->uncompressed_name;
12500 else
12501 {
12502 sec = find_section_in_set (section->compressed_name, section_subset);
12503 if (sec != NULL)
12504 section->name = section->compressed_name;
12505 }
12506 if (sec == NULL)
12507 return 0;
12508
12509 /* If we're loading from a subset of sections, and we've loaded
12510 a section matching this name before, it's likely that it's a
12511 different one. */
12512 if (section_subset != NULL)
12513 free_debug_section (debug);
12514
12515 return load_specific_debug_section (debug, sec, (FILE *) file);
12516 }
12517
12518 void
12519 free_debug_section (enum dwarf_section_display_enum debug)
12520 {
12521 struct dwarf_section * section = &debug_displays [debug].section;
12522
12523 if (section->start == NULL)
12524 return;
12525
12526 free ((char *) section->start);
12527 section->start = NULL;
12528 section->address = 0;
12529 section->size = 0;
12530 }
12531
12532 static int
12533 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12534 {
12535 char * name = SECTION_NAME (section);
12536 const char * print_name = printable_section_name (section);
12537 bfd_size_type length;
12538 int result = 1;
12539 int i;
12540
12541 length = section->sh_size;
12542 if (length == 0)
12543 {
12544 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12545 return 0;
12546 }
12547 if (section->sh_type == SHT_NOBITS)
12548 {
12549 /* There is no point in dumping the contents of a debugging section
12550 which has the NOBITS type - the bits in the file will be random.
12551 This can happen when a file containing a .eh_frame section is
12552 stripped with the --only-keep-debug command line option. */
12553 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12554 print_name);
12555 return 0;
12556 }
12557
12558 if (const_strneq (name, ".gnu.linkonce.wi."))
12559 name = ".debug_info";
12560
12561 /* See if we know how to display the contents of this section. */
12562 for (i = 0; i < max; i++)
12563 if (streq (debug_displays[i].section.uncompressed_name, name)
12564 || (i == line && const_strneq (name, ".debug_line."))
12565 || streq (debug_displays[i].section.compressed_name, name))
12566 {
12567 struct dwarf_section * sec = &debug_displays [i].section;
12568 int secondary = (section != find_section (name));
12569
12570 if (secondary)
12571 free_debug_section ((enum dwarf_section_display_enum) i);
12572
12573 if (i == line && const_strneq (name, ".debug_line."))
12574 sec->name = name;
12575 else if (streq (sec->uncompressed_name, name))
12576 sec->name = sec->uncompressed_name;
12577 else
12578 sec->name = sec->compressed_name;
12579 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12580 section, file))
12581 {
12582 /* If this debug section is part of a CU/TU set in a .dwp file,
12583 restrict load_debug_section to the sections in that set. */
12584 section_subset = find_cu_tu_set (file, shndx);
12585
12586 result &= debug_displays[i].display (sec, file);
12587
12588 section_subset = NULL;
12589
12590 if (secondary || (i != info && i != abbrev))
12591 free_debug_section ((enum dwarf_section_display_enum) i);
12592 }
12593
12594 break;
12595 }
12596
12597 if (i == max)
12598 {
12599 printf (_("Unrecognized debug section: %s\n"), print_name);
12600 result = 0;
12601 }
12602
12603 return result;
12604 }
12605
12606 /* Set DUMP_SECTS for all sections where dumps were requested
12607 based on section name. */
12608
12609 static void
12610 initialise_dumps_byname (void)
12611 {
12612 struct dump_list_entry * cur;
12613
12614 for (cur = dump_sects_byname; cur; cur = cur->next)
12615 {
12616 unsigned int i;
12617 int any;
12618
12619 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12620 if (streq (SECTION_NAME (section_headers + i), cur->name))
12621 {
12622 request_dump_bynumber (i, cur->type);
12623 any = 1;
12624 }
12625
12626 if (!any)
12627 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12628 cur->name);
12629 }
12630 }
12631
12632 static void
12633 process_section_contents (FILE * file)
12634 {
12635 Elf_Internal_Shdr * section;
12636 unsigned int i;
12637
12638 if (! do_dump)
12639 return;
12640
12641 initialise_dumps_byname ();
12642
12643 for (i = 0, section = section_headers;
12644 i < elf_header.e_shnum && i < num_dump_sects;
12645 i++, section++)
12646 {
12647 #ifdef SUPPORT_DISASSEMBLY
12648 if (dump_sects[i] & DISASS_DUMP)
12649 disassemble_section (section, file);
12650 #endif
12651 if (dump_sects[i] & HEX_DUMP)
12652 dump_section_as_bytes (section, file, FALSE);
12653
12654 if (dump_sects[i] & RELOC_DUMP)
12655 dump_section_as_bytes (section, file, TRUE);
12656
12657 if (dump_sects[i] & STRING_DUMP)
12658 dump_section_as_strings (section, file);
12659
12660 if (dump_sects[i] & DEBUG_DUMP)
12661 display_debug_section (i, section, file);
12662 }
12663
12664 /* Check to see if the user requested a
12665 dump of a section that does not exist. */
12666 while (i++ < num_dump_sects)
12667 if (dump_sects[i])
12668 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12669 }
12670
12671 static void
12672 process_mips_fpe_exception (int mask)
12673 {
12674 if (mask)
12675 {
12676 int first = 1;
12677 if (mask & OEX_FPU_INEX)
12678 fputs ("INEX", stdout), first = 0;
12679 if (mask & OEX_FPU_UFLO)
12680 printf ("%sUFLO", first ? "" : "|"), first = 0;
12681 if (mask & OEX_FPU_OFLO)
12682 printf ("%sOFLO", first ? "" : "|"), first = 0;
12683 if (mask & OEX_FPU_DIV0)
12684 printf ("%sDIV0", first ? "" : "|"), first = 0;
12685 if (mask & OEX_FPU_INVAL)
12686 printf ("%sINVAL", first ? "" : "|");
12687 }
12688 else
12689 fputs ("0", stdout);
12690 }
12691
12692 /* Display's the value of TAG at location P. If TAG is
12693 greater than 0 it is assumed to be an unknown tag, and
12694 a message is printed to this effect. Otherwise it is
12695 assumed that a message has already been printed.
12696
12697 If the bottom bit of TAG is set it assumed to have a
12698 string value, otherwise it is assumed to have an integer
12699 value.
12700
12701 Returns an updated P pointing to the first unread byte
12702 beyond the end of TAG's value.
12703
12704 Reads at or beyond END will not be made. */
12705
12706 static unsigned char *
12707 display_tag_value (int tag,
12708 unsigned char * p,
12709 const unsigned char * const end)
12710 {
12711 unsigned long val;
12712
12713 if (tag > 0)
12714 printf (" Tag_unknown_%d: ", tag);
12715
12716 if (p >= end)
12717 {
12718 warn (_("<corrupt tag>\n"));
12719 }
12720 else if (tag & 1)
12721 {
12722 /* PR 17531 file: 027-19978-0.004. */
12723 size_t maxlen = (end - p) - 1;
12724
12725 putchar ('"');
12726 if (maxlen > 0)
12727 {
12728 print_symbol ((int) maxlen, (const char *) p);
12729 p += strnlen ((char *) p, maxlen) + 1;
12730 }
12731 else
12732 {
12733 printf (_("<corrupt string tag>"));
12734 p = (unsigned char *) end;
12735 }
12736 printf ("\"\n");
12737 }
12738 else
12739 {
12740 unsigned int len;
12741
12742 val = read_uleb128 (p, &len, end);
12743 p += len;
12744 printf ("%ld (0x%lx)\n", val, val);
12745 }
12746
12747 assert (p <= end);
12748 return p;
12749 }
12750
12751 /* ARM EABI attributes section. */
12752 typedef struct
12753 {
12754 unsigned int tag;
12755 const char * name;
12756 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
12757 unsigned int type;
12758 const char ** table;
12759 } arm_attr_public_tag;
12760
12761 static const char * arm_attr_tag_CPU_arch[] =
12762 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12763 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12764 "v8-M.mainline"};
12765 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12766 static const char * arm_attr_tag_THUMB_ISA_use[] =
12767 {"No", "Thumb-1", "Thumb-2", "Yes"};
12768 static const char * arm_attr_tag_FP_arch[] =
12769 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12770 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12771 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12772 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12773 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12774 "NEON for ARMv8.1"};
12775 static const char * arm_attr_tag_PCS_config[] =
12776 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12777 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12778 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12779 {"V6", "SB", "TLS", "Unused"};
12780 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12781 {"Absolute", "PC-relative", "SB-relative", "None"};
12782 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12783 {"Absolute", "PC-relative", "None"};
12784 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12785 {"None", "direct", "GOT-indirect"};
12786 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12787 {"None", "??? 1", "2", "??? 3", "4"};
12788 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12789 static const char * arm_attr_tag_ABI_FP_denormal[] =
12790 {"Unused", "Needed", "Sign only"};
12791 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12792 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12793 static const char * arm_attr_tag_ABI_FP_number_model[] =
12794 {"Unused", "Finite", "RTABI", "IEEE 754"};
12795 static const char * arm_attr_tag_ABI_enum_size[] =
12796 {"Unused", "small", "int", "forced to int"};
12797 static const char * arm_attr_tag_ABI_HardFP_use[] =
12798 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12799 static const char * arm_attr_tag_ABI_VFP_args[] =
12800 {"AAPCS", "VFP registers", "custom", "compatible"};
12801 static const char * arm_attr_tag_ABI_WMMX_args[] =
12802 {"AAPCS", "WMMX registers", "custom"};
12803 static const char * arm_attr_tag_ABI_optimization_goals[] =
12804 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12805 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12806 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12807 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12808 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12809 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12810 static const char * arm_attr_tag_FP_HP_extension[] =
12811 {"Not Allowed", "Allowed"};
12812 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12813 {"None", "IEEE 754", "Alternative Format"};
12814 static const char * arm_attr_tag_MPextension_use[] =
12815 {"Not Allowed", "Allowed"};
12816 static const char * arm_attr_tag_DIV_use[] =
12817 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12818 "Allowed in v7-A with integer division extension"};
12819 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12820 static const char * arm_attr_tag_Virtualization_use[] =
12821 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12822 "TrustZone and Virtualization Extensions"};
12823 static const char * arm_attr_tag_MPextension_use_legacy[] =
12824 {"Not Allowed", "Allowed"};
12825
12826 #define LOOKUP(id, name) \
12827 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12828 static arm_attr_public_tag arm_attr_public_tags[] =
12829 {
12830 {4, "CPU_raw_name", 1, NULL},
12831 {5, "CPU_name", 1, NULL},
12832 LOOKUP(6, CPU_arch),
12833 {7, "CPU_arch_profile", 0, NULL},
12834 LOOKUP(8, ARM_ISA_use),
12835 LOOKUP(9, THUMB_ISA_use),
12836 LOOKUP(10, FP_arch),
12837 LOOKUP(11, WMMX_arch),
12838 LOOKUP(12, Advanced_SIMD_arch),
12839 LOOKUP(13, PCS_config),
12840 LOOKUP(14, ABI_PCS_R9_use),
12841 LOOKUP(15, ABI_PCS_RW_data),
12842 LOOKUP(16, ABI_PCS_RO_data),
12843 LOOKUP(17, ABI_PCS_GOT_use),
12844 LOOKUP(18, ABI_PCS_wchar_t),
12845 LOOKUP(19, ABI_FP_rounding),
12846 LOOKUP(20, ABI_FP_denormal),
12847 LOOKUP(21, ABI_FP_exceptions),
12848 LOOKUP(22, ABI_FP_user_exceptions),
12849 LOOKUP(23, ABI_FP_number_model),
12850 {24, "ABI_align_needed", 0, NULL},
12851 {25, "ABI_align_preserved", 0, NULL},
12852 LOOKUP(26, ABI_enum_size),
12853 LOOKUP(27, ABI_HardFP_use),
12854 LOOKUP(28, ABI_VFP_args),
12855 LOOKUP(29, ABI_WMMX_args),
12856 LOOKUP(30, ABI_optimization_goals),
12857 LOOKUP(31, ABI_FP_optimization_goals),
12858 {32, "compatibility", 0, NULL},
12859 LOOKUP(34, CPU_unaligned_access),
12860 LOOKUP(36, FP_HP_extension),
12861 LOOKUP(38, ABI_FP_16bit_format),
12862 LOOKUP(42, MPextension_use),
12863 LOOKUP(44, DIV_use),
12864 {64, "nodefaults", 0, NULL},
12865 {65, "also_compatible_with", 0, NULL},
12866 LOOKUP(66, T2EE_use),
12867 {67, "conformance", 1, NULL},
12868 LOOKUP(68, Virtualization_use),
12869 LOOKUP(70, MPextension_use_legacy)
12870 };
12871 #undef LOOKUP
12872
12873 static unsigned char *
12874 display_arm_attribute (unsigned char * p,
12875 const unsigned char * const end)
12876 {
12877 unsigned int tag;
12878 unsigned int len;
12879 unsigned int val;
12880 arm_attr_public_tag * attr;
12881 unsigned i;
12882 unsigned int type;
12883
12884 tag = read_uleb128 (p, &len, end);
12885 p += len;
12886 attr = NULL;
12887 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12888 {
12889 if (arm_attr_public_tags[i].tag == tag)
12890 {
12891 attr = &arm_attr_public_tags[i];
12892 break;
12893 }
12894 }
12895
12896 if (attr)
12897 {
12898 printf (" Tag_%s: ", attr->name);
12899 switch (attr->type)
12900 {
12901 case 0:
12902 switch (tag)
12903 {
12904 case 7: /* Tag_CPU_arch_profile. */
12905 val = read_uleb128 (p, &len, end);
12906 p += len;
12907 switch (val)
12908 {
12909 case 0: printf (_("None\n")); break;
12910 case 'A': printf (_("Application\n")); break;
12911 case 'R': printf (_("Realtime\n")); break;
12912 case 'M': printf (_("Microcontroller\n")); break;
12913 case 'S': printf (_("Application or Realtime\n")); break;
12914 default: printf ("??? (%d)\n", val); break;
12915 }
12916 break;
12917
12918 case 24: /* Tag_align_needed. */
12919 val = read_uleb128 (p, &len, end);
12920 p += len;
12921 switch (val)
12922 {
12923 case 0: printf (_("None\n")); break;
12924 case 1: printf (_("8-byte\n")); break;
12925 case 2: printf (_("4-byte\n")); break;
12926 case 3: printf ("??? 3\n"); break;
12927 default:
12928 if (val <= 12)
12929 printf (_("8-byte and up to %d-byte extended\n"),
12930 1 << val);
12931 else
12932 printf ("??? (%d)\n", val);
12933 break;
12934 }
12935 break;
12936
12937 case 25: /* Tag_align_preserved. */
12938 val = read_uleb128 (p, &len, end);
12939 p += len;
12940 switch (val)
12941 {
12942 case 0: printf (_("None\n")); break;
12943 case 1: printf (_("8-byte, except leaf SP\n")); break;
12944 case 2: printf (_("8-byte\n")); break;
12945 case 3: printf ("??? 3\n"); break;
12946 default:
12947 if (val <= 12)
12948 printf (_("8-byte and up to %d-byte extended\n"),
12949 1 << val);
12950 else
12951 printf ("??? (%d)\n", val);
12952 break;
12953 }
12954 break;
12955
12956 case 32: /* Tag_compatibility. */
12957 {
12958 val = read_uleb128 (p, &len, end);
12959 p += len;
12960 printf (_("flag = %d, vendor = "), val);
12961 if (p < end - 1)
12962 {
12963 size_t maxlen = (end - p) - 1;
12964
12965 print_symbol ((int) maxlen, (const char *) p);
12966 p += strnlen ((char *) p, maxlen) + 1;
12967 }
12968 else
12969 {
12970 printf (_("<corrupt>"));
12971 p = (unsigned char *) end;
12972 }
12973 putchar ('\n');
12974 }
12975 break;
12976
12977 case 64: /* Tag_nodefaults. */
12978 /* PR 17531: file: 001-505008-0.01. */
12979 if (p < end)
12980 p++;
12981 printf (_("True\n"));
12982 break;
12983
12984 case 65: /* Tag_also_compatible_with. */
12985 val = read_uleb128 (p, &len, end);
12986 p += len;
12987 if (val == 6 /* Tag_CPU_arch. */)
12988 {
12989 val = read_uleb128 (p, &len, end);
12990 p += len;
12991 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12992 printf ("??? (%d)\n", val);
12993 else
12994 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12995 }
12996 else
12997 printf ("???\n");
12998 while (p < end && *(p++) != '\0' /* NUL terminator. */)
12999 ;
13000 break;
13001
13002 default:
13003 printf (_("<unknown: %d>\n"), tag);
13004 break;
13005 }
13006 return p;
13007
13008 case 1:
13009 return display_tag_value (-1, p, end);
13010 case 2:
13011 return display_tag_value (0, p, end);
13012
13013 default:
13014 assert (attr->type & 0x80);
13015 val = read_uleb128 (p, &len, end);
13016 p += len;
13017 type = attr->type & 0x7f;
13018 if (val >= type)
13019 printf ("??? (%d)\n", val);
13020 else
13021 printf ("%s\n", attr->table[val]);
13022 return p;
13023 }
13024 }
13025
13026 return display_tag_value (tag, p, end);
13027 }
13028
13029 static unsigned char *
13030 display_gnu_attribute (unsigned char * p,
13031 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13032 const unsigned char * const end)
13033 {
13034 int tag;
13035 unsigned int len;
13036 int val;
13037
13038 tag = read_uleb128 (p, &len, end);
13039 p += len;
13040
13041 /* Tag_compatibility is the only generic GNU attribute defined at
13042 present. */
13043 if (tag == 32)
13044 {
13045 val = read_uleb128 (p, &len, end);
13046 p += len;
13047
13048 printf (_("flag = %d, vendor = "), val);
13049 if (p == end)
13050 {
13051 printf (_("<corrupt>\n"));
13052 warn (_("corrupt vendor attribute\n"));
13053 }
13054 else
13055 {
13056 if (p < end - 1)
13057 {
13058 size_t maxlen = (end - p) - 1;
13059
13060 print_symbol ((int) maxlen, (const char *) p);
13061 p += strnlen ((char *) p, maxlen) + 1;
13062 }
13063 else
13064 {
13065 printf (_("<corrupt>"));
13066 p = (unsigned char *) end;
13067 }
13068 putchar ('\n');
13069 }
13070 return p;
13071 }
13072
13073 if ((tag & 2) == 0 && display_proc_gnu_attribute)
13074 return display_proc_gnu_attribute (p, tag, end);
13075
13076 return display_tag_value (tag, p, end);
13077 }
13078
13079 static unsigned char *
13080 display_power_gnu_attribute (unsigned char * p,
13081 int tag,
13082 const unsigned char * const end)
13083 {
13084 unsigned int len;
13085 int val;
13086
13087 if (tag == Tag_GNU_Power_ABI_FP)
13088 {
13089 val = read_uleb128 (p, &len, end);
13090 p += len;
13091 printf (" Tag_GNU_Power_ABI_FP: ");
13092
13093 switch (val)
13094 {
13095 case 0:
13096 printf (_("Hard or soft float\n"));
13097 break;
13098 case 1:
13099 printf (_("Hard float\n"));
13100 break;
13101 case 2:
13102 printf (_("Soft float\n"));
13103 break;
13104 case 3:
13105 printf (_("Single-precision hard float\n"));
13106 break;
13107 default:
13108 printf ("??? (%d)\n", val);
13109 break;
13110 }
13111 return p;
13112 }
13113
13114 if (tag == Tag_GNU_Power_ABI_Vector)
13115 {
13116 val = read_uleb128 (p, &len, end);
13117 p += len;
13118 printf (" Tag_GNU_Power_ABI_Vector: ");
13119 switch (val)
13120 {
13121 case 0:
13122 printf (_("Any\n"));
13123 break;
13124 case 1:
13125 printf (_("Generic\n"));
13126 break;
13127 case 2:
13128 printf ("AltiVec\n");
13129 break;
13130 case 3:
13131 printf ("SPE\n");
13132 break;
13133 default:
13134 printf ("??? (%d)\n", val);
13135 break;
13136 }
13137 return p;
13138 }
13139
13140 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13141 {
13142 if (p == end)
13143 {
13144 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13145 return p;
13146 }
13147
13148 val = read_uleb128 (p, &len, end);
13149 p += len;
13150 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13151 switch (val)
13152 {
13153 case 0:
13154 printf (_("Any\n"));
13155 break;
13156 case 1:
13157 printf ("r3/r4\n");
13158 break;
13159 case 2:
13160 printf (_("Memory\n"));
13161 break;
13162 default:
13163 printf ("??? (%d)\n", val);
13164 break;
13165 }
13166 return p;
13167 }
13168
13169 return display_tag_value (tag & 1, p, end);
13170 }
13171
13172 static unsigned char *
13173 display_s390_gnu_attribute (unsigned char * p,
13174 int tag,
13175 const unsigned char * const end)
13176 {
13177 unsigned int len;
13178 int val;
13179
13180 if (tag == Tag_GNU_S390_ABI_Vector)
13181 {
13182 val = read_uleb128 (p, &len, end);
13183 p += len;
13184 printf (" Tag_GNU_S390_ABI_Vector: ");
13185
13186 switch (val)
13187 {
13188 case 0:
13189 printf (_("any\n"));
13190 break;
13191 case 1:
13192 printf (_("software\n"));
13193 break;
13194 case 2:
13195 printf (_("hardware\n"));
13196 break;
13197 default:
13198 printf ("??? (%d)\n", val);
13199 break;
13200 }
13201 return p;
13202 }
13203
13204 return display_tag_value (tag & 1, p, end);
13205 }
13206
13207 static void
13208 display_sparc_hwcaps (int mask)
13209 {
13210 if (mask)
13211 {
13212 int first = 1;
13213
13214 if (mask & ELF_SPARC_HWCAP_MUL32)
13215 fputs ("mul32", stdout), first = 0;
13216 if (mask & ELF_SPARC_HWCAP_DIV32)
13217 printf ("%sdiv32", first ? "" : "|"), first = 0;
13218 if (mask & ELF_SPARC_HWCAP_FSMULD)
13219 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13220 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13221 printf ("%sv8plus", first ? "" : "|"), first = 0;
13222 if (mask & ELF_SPARC_HWCAP_POPC)
13223 printf ("%spopc", first ? "" : "|"), first = 0;
13224 if (mask & ELF_SPARC_HWCAP_VIS)
13225 printf ("%svis", first ? "" : "|"), first = 0;
13226 if (mask & ELF_SPARC_HWCAP_VIS2)
13227 printf ("%svis2", first ? "" : "|"), first = 0;
13228 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13229 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13230 if (mask & ELF_SPARC_HWCAP_FMAF)
13231 printf ("%sfmaf", first ? "" : "|"), first = 0;
13232 if (mask & ELF_SPARC_HWCAP_VIS3)
13233 printf ("%svis3", first ? "" : "|"), first = 0;
13234 if (mask & ELF_SPARC_HWCAP_HPC)
13235 printf ("%shpc", first ? "" : "|"), first = 0;
13236 if (mask & ELF_SPARC_HWCAP_RANDOM)
13237 printf ("%srandom", first ? "" : "|"), first = 0;
13238 if (mask & ELF_SPARC_HWCAP_TRANS)
13239 printf ("%strans", first ? "" : "|"), first = 0;
13240 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13241 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13242 if (mask & ELF_SPARC_HWCAP_IMA)
13243 printf ("%sima", first ? "" : "|"), first = 0;
13244 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13245 printf ("%scspare", first ? "" : "|"), first = 0;
13246 }
13247 else
13248 fputc ('0', stdout);
13249 fputc ('\n', stdout);
13250 }
13251
13252 static void
13253 display_sparc_hwcaps2 (int mask)
13254 {
13255 if (mask)
13256 {
13257 int first = 1;
13258
13259 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13260 fputs ("fjathplus", stdout), first = 0;
13261 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13262 printf ("%svis3b", first ? "" : "|"), first = 0;
13263 if (mask & ELF_SPARC_HWCAP2_ADP)
13264 printf ("%sadp", first ? "" : "|"), first = 0;
13265 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13266 printf ("%ssparc5", first ? "" : "|"), first = 0;
13267 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13268 printf ("%smwait", first ? "" : "|"), first = 0;
13269 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13270 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13271 if (mask & ELF_SPARC_HWCAP2_XMONT)
13272 printf ("%sxmont2", first ? "" : "|"), first = 0;
13273 if (mask & ELF_SPARC_HWCAP2_NSEC)
13274 printf ("%snsec", first ? "" : "|"), first = 0;
13275 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13276 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13277 if (mask & ELF_SPARC_HWCAP2_FJDES)
13278 printf ("%sfjdes", first ? "" : "|"), first = 0;
13279 if (mask & ELF_SPARC_HWCAP2_FJAES)
13280 printf ("%sfjaes", first ? "" : "|"), first = 0;
13281 }
13282 else
13283 fputc ('0', stdout);
13284 fputc ('\n', stdout);
13285 }
13286
13287 static unsigned char *
13288 display_sparc_gnu_attribute (unsigned char * p,
13289 int tag,
13290 const unsigned char * const end)
13291 {
13292 unsigned int len;
13293 int val;
13294
13295 if (tag == Tag_GNU_Sparc_HWCAPS)
13296 {
13297 val = read_uleb128 (p, &len, end);
13298 p += len;
13299 printf (" Tag_GNU_Sparc_HWCAPS: ");
13300 display_sparc_hwcaps (val);
13301 return p;
13302 }
13303 if (tag == Tag_GNU_Sparc_HWCAPS2)
13304 {
13305 val = read_uleb128 (p, &len, end);
13306 p += len;
13307 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13308 display_sparc_hwcaps2 (val);
13309 return p;
13310 }
13311
13312 return display_tag_value (tag, p, end);
13313 }
13314
13315 static void
13316 print_mips_fp_abi_value (int val)
13317 {
13318 switch (val)
13319 {
13320 case Val_GNU_MIPS_ABI_FP_ANY:
13321 printf (_("Hard or soft float\n"));
13322 break;
13323 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13324 printf (_("Hard float (double precision)\n"));
13325 break;
13326 case Val_GNU_MIPS_ABI_FP_SINGLE:
13327 printf (_("Hard float (single precision)\n"));
13328 break;
13329 case Val_GNU_MIPS_ABI_FP_SOFT:
13330 printf (_("Soft float\n"));
13331 break;
13332 case Val_GNU_MIPS_ABI_FP_OLD_64:
13333 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13334 break;
13335 case Val_GNU_MIPS_ABI_FP_XX:
13336 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13337 break;
13338 case Val_GNU_MIPS_ABI_FP_64:
13339 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13340 break;
13341 case Val_GNU_MIPS_ABI_FP_64A:
13342 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13343 break;
13344 case Val_GNU_MIPS_ABI_FP_NAN2008:
13345 printf (_("NaN 2008 compatibility\n"));
13346 break;
13347 default:
13348 printf ("??? (%d)\n", val);
13349 break;
13350 }
13351 }
13352
13353 static unsigned char *
13354 display_mips_gnu_attribute (unsigned char * p,
13355 int tag,
13356 const unsigned char * const end)
13357 {
13358 if (tag == Tag_GNU_MIPS_ABI_FP)
13359 {
13360 unsigned int len;
13361 int val;
13362
13363 val = read_uleb128 (p, &len, end);
13364 p += len;
13365 printf (" Tag_GNU_MIPS_ABI_FP: ");
13366
13367 print_mips_fp_abi_value (val);
13368
13369 return p;
13370 }
13371
13372 if (tag == Tag_GNU_MIPS_ABI_MSA)
13373 {
13374 unsigned int len;
13375 int val;
13376
13377 val = read_uleb128 (p, &len, end);
13378 p += len;
13379 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13380
13381 switch (val)
13382 {
13383 case Val_GNU_MIPS_ABI_MSA_ANY:
13384 printf (_("Any MSA or not\n"));
13385 break;
13386 case Val_GNU_MIPS_ABI_MSA_128:
13387 printf (_("128-bit MSA\n"));
13388 break;
13389 default:
13390 printf ("??? (%d)\n", val);
13391 break;
13392 }
13393 return p;
13394 }
13395
13396 return display_tag_value (tag & 1, p, end);
13397 }
13398
13399 static unsigned char *
13400 display_tic6x_attribute (unsigned char * p,
13401 const unsigned char * const end)
13402 {
13403 int tag;
13404 unsigned int len;
13405 int val;
13406
13407 tag = read_uleb128 (p, &len, end);
13408 p += len;
13409
13410 switch (tag)
13411 {
13412 case Tag_ISA:
13413 val = read_uleb128 (p, &len, end);
13414 p += len;
13415 printf (" Tag_ISA: ");
13416
13417 switch (val)
13418 {
13419 case C6XABI_Tag_ISA_none:
13420 printf (_("None\n"));
13421 break;
13422 case C6XABI_Tag_ISA_C62X:
13423 printf ("C62x\n");
13424 break;
13425 case C6XABI_Tag_ISA_C67X:
13426 printf ("C67x\n");
13427 break;
13428 case C6XABI_Tag_ISA_C67XP:
13429 printf ("C67x+\n");
13430 break;
13431 case C6XABI_Tag_ISA_C64X:
13432 printf ("C64x\n");
13433 break;
13434 case C6XABI_Tag_ISA_C64XP:
13435 printf ("C64x+\n");
13436 break;
13437 case C6XABI_Tag_ISA_C674X:
13438 printf ("C674x\n");
13439 break;
13440 default:
13441 printf ("??? (%d)\n", val);
13442 break;
13443 }
13444 return p;
13445
13446 case Tag_ABI_wchar_t:
13447 val = read_uleb128 (p, &len, end);
13448 p += len;
13449 printf (" Tag_ABI_wchar_t: ");
13450 switch (val)
13451 {
13452 case 0:
13453 printf (_("Not used\n"));
13454 break;
13455 case 1:
13456 printf (_("2 bytes\n"));
13457 break;
13458 case 2:
13459 printf (_("4 bytes\n"));
13460 break;
13461 default:
13462 printf ("??? (%d)\n", val);
13463 break;
13464 }
13465 return p;
13466
13467 case Tag_ABI_stack_align_needed:
13468 val = read_uleb128 (p, &len, end);
13469 p += len;
13470 printf (" Tag_ABI_stack_align_needed: ");
13471 switch (val)
13472 {
13473 case 0:
13474 printf (_("8-byte\n"));
13475 break;
13476 case 1:
13477 printf (_("16-byte\n"));
13478 break;
13479 default:
13480 printf ("??? (%d)\n", val);
13481 break;
13482 }
13483 return p;
13484
13485 case Tag_ABI_stack_align_preserved:
13486 val = read_uleb128 (p, &len, end);
13487 p += len;
13488 printf (" Tag_ABI_stack_align_preserved: ");
13489 switch (val)
13490 {
13491 case 0:
13492 printf (_("8-byte\n"));
13493 break;
13494 case 1:
13495 printf (_("16-byte\n"));
13496 break;
13497 default:
13498 printf ("??? (%d)\n", val);
13499 break;
13500 }
13501 return p;
13502
13503 case Tag_ABI_DSBT:
13504 val = read_uleb128 (p, &len, end);
13505 p += len;
13506 printf (" Tag_ABI_DSBT: ");
13507 switch (val)
13508 {
13509 case 0:
13510 printf (_("DSBT addressing not used\n"));
13511 break;
13512 case 1:
13513 printf (_("DSBT addressing used\n"));
13514 break;
13515 default:
13516 printf ("??? (%d)\n", val);
13517 break;
13518 }
13519 return p;
13520
13521 case Tag_ABI_PID:
13522 val = read_uleb128 (p, &len, end);
13523 p += len;
13524 printf (" Tag_ABI_PID: ");
13525 switch (val)
13526 {
13527 case 0:
13528 printf (_("Data addressing position-dependent\n"));
13529 break;
13530 case 1:
13531 printf (_("Data addressing position-independent, GOT near DP\n"));
13532 break;
13533 case 2:
13534 printf (_("Data addressing position-independent, GOT far from DP\n"));
13535 break;
13536 default:
13537 printf ("??? (%d)\n", val);
13538 break;
13539 }
13540 return p;
13541
13542 case Tag_ABI_PIC:
13543 val = read_uleb128 (p, &len, end);
13544 p += len;
13545 printf (" Tag_ABI_PIC: ");
13546 switch (val)
13547 {
13548 case 0:
13549 printf (_("Code addressing position-dependent\n"));
13550 break;
13551 case 1:
13552 printf (_("Code addressing position-independent\n"));
13553 break;
13554 default:
13555 printf ("??? (%d)\n", val);
13556 break;
13557 }
13558 return p;
13559
13560 case Tag_ABI_array_object_alignment:
13561 val = read_uleb128 (p, &len, end);
13562 p += len;
13563 printf (" Tag_ABI_array_object_alignment: ");
13564 switch (val)
13565 {
13566 case 0:
13567 printf (_("8-byte\n"));
13568 break;
13569 case 1:
13570 printf (_("4-byte\n"));
13571 break;
13572 case 2:
13573 printf (_("16-byte\n"));
13574 break;
13575 default:
13576 printf ("??? (%d)\n", val);
13577 break;
13578 }
13579 return p;
13580
13581 case Tag_ABI_array_object_align_expected:
13582 val = read_uleb128 (p, &len, end);
13583 p += len;
13584 printf (" Tag_ABI_array_object_align_expected: ");
13585 switch (val)
13586 {
13587 case 0:
13588 printf (_("8-byte\n"));
13589 break;
13590 case 1:
13591 printf (_("4-byte\n"));
13592 break;
13593 case 2:
13594 printf (_("16-byte\n"));
13595 break;
13596 default:
13597 printf ("??? (%d)\n", val);
13598 break;
13599 }
13600 return p;
13601
13602 case Tag_ABI_compatibility:
13603 {
13604 val = read_uleb128 (p, &len, end);
13605 p += len;
13606 printf (" Tag_ABI_compatibility: ");
13607 printf (_("flag = %d, vendor = "), val);
13608 if (p < end - 1)
13609 {
13610 size_t maxlen = (end - p) - 1;
13611
13612 print_symbol ((int) maxlen, (const char *) p);
13613 p += strnlen ((char *) p, maxlen) + 1;
13614 }
13615 else
13616 {
13617 printf (_("<corrupt>"));
13618 p = (unsigned char *) end;
13619 }
13620 putchar ('\n');
13621 return p;
13622 }
13623
13624 case Tag_ABI_conformance:
13625 {
13626 printf (" Tag_ABI_conformance: \"");
13627 if (p < end - 1)
13628 {
13629 size_t maxlen = (end - p) - 1;
13630
13631 print_symbol ((int) maxlen, (const char *) p);
13632 p += strnlen ((char *) p, maxlen) + 1;
13633 }
13634 else
13635 {
13636 printf (_("<corrupt>"));
13637 p = (unsigned char *) end;
13638 }
13639 printf ("\"\n");
13640 return p;
13641 }
13642 }
13643
13644 return display_tag_value (tag, p, end);
13645 }
13646
13647 static void
13648 display_raw_attribute (unsigned char * p, unsigned char * end)
13649 {
13650 unsigned long addr = 0;
13651 size_t bytes = end - p;
13652
13653 assert (end > p);
13654 while (bytes)
13655 {
13656 int j;
13657 int k;
13658 int lbytes = (bytes > 16 ? 16 : bytes);
13659
13660 printf (" 0x%8.8lx ", addr);
13661
13662 for (j = 0; j < 16; j++)
13663 {
13664 if (j < lbytes)
13665 printf ("%2.2x", p[j]);
13666 else
13667 printf (" ");
13668
13669 if ((j & 3) == 3)
13670 printf (" ");
13671 }
13672
13673 for (j = 0; j < lbytes; j++)
13674 {
13675 k = p[j];
13676 if (k >= ' ' && k < 0x7f)
13677 printf ("%c", k);
13678 else
13679 printf (".");
13680 }
13681
13682 putchar ('\n');
13683
13684 p += lbytes;
13685 bytes -= lbytes;
13686 addr += lbytes;
13687 }
13688
13689 putchar ('\n');
13690 }
13691
13692 static unsigned char *
13693 display_msp430x_attribute (unsigned char * p,
13694 const unsigned char * const end)
13695 {
13696 unsigned int len;
13697 int val;
13698 int tag;
13699
13700 tag = read_uleb128 (p, & len, end);
13701 p += len;
13702
13703 switch (tag)
13704 {
13705 case OFBA_MSPABI_Tag_ISA:
13706 val = read_uleb128 (p, &len, end);
13707 p += len;
13708 printf (" Tag_ISA: ");
13709 switch (val)
13710 {
13711 case 0: printf (_("None\n")); break;
13712 case 1: printf (_("MSP430\n")); break;
13713 case 2: printf (_("MSP430X\n")); break;
13714 default: printf ("??? (%d)\n", val); break;
13715 }
13716 break;
13717
13718 case OFBA_MSPABI_Tag_Code_Model:
13719 val = read_uleb128 (p, &len, end);
13720 p += len;
13721 printf (" Tag_Code_Model: ");
13722 switch (val)
13723 {
13724 case 0: printf (_("None\n")); break;
13725 case 1: printf (_("Small\n")); break;
13726 case 2: printf (_("Large\n")); break;
13727 default: printf ("??? (%d)\n", val); break;
13728 }
13729 break;
13730
13731 case OFBA_MSPABI_Tag_Data_Model:
13732 val = read_uleb128 (p, &len, end);
13733 p += len;
13734 printf (" Tag_Data_Model: ");
13735 switch (val)
13736 {
13737 case 0: printf (_("None\n")); break;
13738 case 1: printf (_("Small\n")); break;
13739 case 2: printf (_("Large\n")); break;
13740 case 3: printf (_("Restricted Large\n")); break;
13741 default: printf ("??? (%d)\n", val); break;
13742 }
13743 break;
13744
13745 default:
13746 printf (_(" <unknown tag %d>: "), tag);
13747
13748 if (tag & 1)
13749 {
13750 putchar ('"');
13751 if (p < end - 1)
13752 {
13753 size_t maxlen = (end - p) - 1;
13754
13755 print_symbol ((int) maxlen, (const char *) p);
13756 p += strnlen ((char *) p, maxlen) + 1;
13757 }
13758 else
13759 {
13760 printf (_("<corrupt>"));
13761 p = (unsigned char *) end;
13762 }
13763 printf ("\"\n");
13764 }
13765 else
13766 {
13767 val = read_uleb128 (p, &len, end);
13768 p += len;
13769 printf ("%d (0x%x)\n", val, val);
13770 }
13771 break;
13772 }
13773
13774 assert (p <= end);
13775 return p;
13776 }
13777
13778 static int
13779 process_attributes (FILE * file,
13780 const char * public_name,
13781 unsigned int proc_type,
13782 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13783 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13784 {
13785 Elf_Internal_Shdr * sect;
13786 unsigned i;
13787
13788 /* Find the section header so that we get the size. */
13789 for (i = 0, sect = section_headers;
13790 i < elf_header.e_shnum;
13791 i++, sect++)
13792 {
13793 unsigned char * contents;
13794 unsigned char * p;
13795
13796 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13797 continue;
13798
13799 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13800 sect->sh_size, _("attributes"));
13801 if (contents == NULL)
13802 continue;
13803
13804 p = contents;
13805 if (*p == 'A')
13806 {
13807 bfd_vma section_len;
13808
13809 section_len = sect->sh_size - 1;
13810 p++;
13811
13812 while (section_len > 0)
13813 {
13814 bfd_vma attr_len;
13815 unsigned int namelen;
13816 bfd_boolean public_section;
13817 bfd_boolean gnu_section;
13818
13819 if (section_len <= 4)
13820 {
13821 error (_("Tag section ends prematurely\n"));
13822 break;
13823 }
13824 attr_len = byte_get (p, 4);
13825 p += 4;
13826
13827 if (attr_len > section_len)
13828 {
13829 error (_("Bad attribute length (%u > %u)\n"),
13830 (unsigned) attr_len, (unsigned) section_len);
13831 attr_len = section_len;
13832 }
13833 /* PR 17531: file: 001-101425-0.004 */
13834 else if (attr_len < 5)
13835 {
13836 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13837 break;
13838 }
13839
13840 section_len -= attr_len;
13841 attr_len -= 4;
13842
13843 namelen = strnlen ((char *) p, attr_len) + 1;
13844 if (namelen == 0 || namelen >= attr_len)
13845 {
13846 error (_("Corrupt attribute section name\n"));
13847 break;
13848 }
13849
13850 printf (_("Attribute Section: "));
13851 print_symbol (INT_MAX, (const char *) p);
13852 putchar ('\n');
13853
13854 if (public_name && streq ((char *) p, public_name))
13855 public_section = TRUE;
13856 else
13857 public_section = FALSE;
13858
13859 if (streq ((char *) p, "gnu"))
13860 gnu_section = TRUE;
13861 else
13862 gnu_section = FALSE;
13863
13864 p += namelen;
13865 attr_len -= namelen;
13866
13867 while (attr_len > 0 && p < contents + sect->sh_size)
13868 {
13869 int tag;
13870 int val;
13871 bfd_vma size;
13872 unsigned char * end;
13873
13874 /* PR binutils/17531: Safe handling of corrupt files. */
13875 if (attr_len < 6)
13876 {
13877 error (_("Unused bytes at end of section\n"));
13878 section_len = 0;
13879 break;
13880 }
13881
13882 tag = *(p++);
13883 size = byte_get (p, 4);
13884 if (size > attr_len)
13885 {
13886 error (_("Bad subsection length (%u > %u)\n"),
13887 (unsigned) size, (unsigned) attr_len);
13888 size = attr_len;
13889 }
13890 /* PR binutils/17531: Safe handling of corrupt files. */
13891 if (size < 6)
13892 {
13893 error (_("Bad subsection length (%u < 6)\n"),
13894 (unsigned) size);
13895 section_len = 0;
13896 break;
13897 }
13898
13899 attr_len -= size;
13900 end = p + size - 1;
13901 assert (end <= contents + sect->sh_size);
13902 p += 4;
13903
13904 switch (tag)
13905 {
13906 case 1:
13907 printf (_("File Attributes\n"));
13908 break;
13909 case 2:
13910 printf (_("Section Attributes:"));
13911 goto do_numlist;
13912 case 3:
13913 printf (_("Symbol Attributes:"));
13914 do_numlist:
13915 for (;;)
13916 {
13917 unsigned int j;
13918
13919 val = read_uleb128 (p, &j, end);
13920 p += j;
13921 if (val == 0)
13922 break;
13923 printf (" %d", val);
13924 }
13925 printf ("\n");
13926 break;
13927 default:
13928 printf (_("Unknown tag: %d\n"), tag);
13929 public_section = FALSE;
13930 break;
13931 }
13932
13933 if (public_section && display_pub_attribute != NULL)
13934 {
13935 while (p < end)
13936 p = display_pub_attribute (p, end);
13937 assert (p <= end);
13938 }
13939 else if (gnu_section && display_proc_gnu_attribute != NULL)
13940 {
13941 while (p < end)
13942 p = display_gnu_attribute (p,
13943 display_proc_gnu_attribute,
13944 end);
13945 assert (p <= end);
13946 }
13947 else if (p < end)
13948 {
13949 printf (_(" Unknown attribute:\n"));
13950 display_raw_attribute (p, end);
13951 p = end;
13952 }
13953 else
13954 attr_len = 0;
13955 }
13956 }
13957 }
13958 else
13959 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13960
13961 free (contents);
13962 }
13963 return 1;
13964 }
13965
13966 static int
13967 process_arm_specific (FILE * file)
13968 {
13969 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13970 display_arm_attribute, NULL);
13971 }
13972
13973 static int
13974 process_power_specific (FILE * file)
13975 {
13976 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13977 display_power_gnu_attribute);
13978 }
13979
13980 static int
13981 process_s390_specific (FILE * file)
13982 {
13983 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13984 display_s390_gnu_attribute);
13985 }
13986
13987 static int
13988 process_sparc_specific (FILE * file)
13989 {
13990 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13991 display_sparc_gnu_attribute);
13992 }
13993
13994 static int
13995 process_tic6x_specific (FILE * file)
13996 {
13997 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13998 display_tic6x_attribute, NULL);
13999 }
14000
14001 static int
14002 process_msp430x_specific (FILE * file)
14003 {
14004 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14005 display_msp430x_attribute, NULL);
14006 }
14007
14008 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14009 Print the Address, Access and Initial fields of an entry at VMA ADDR
14010 and return the VMA of the next entry, or -1 if there was a problem.
14011 Does not read from DATA_END or beyond. */
14012
14013 static bfd_vma
14014 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14015 unsigned char * data_end)
14016 {
14017 printf (" ");
14018 print_vma (addr, LONG_HEX);
14019 printf (" ");
14020 if (addr < pltgot + 0xfff0)
14021 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14022 else
14023 printf ("%10s", "");
14024 printf (" ");
14025 if (data == NULL)
14026 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14027 else
14028 {
14029 bfd_vma entry;
14030 unsigned char * from = data + addr - pltgot;
14031
14032 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14033 {
14034 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14035 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14036 return (bfd_vma) -1;
14037 }
14038 else
14039 {
14040 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14041 print_vma (entry, LONG_HEX);
14042 }
14043 }
14044 return addr + (is_32bit_elf ? 4 : 8);
14045 }
14046
14047 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14048 PLTGOT. Print the Address and Initial fields of an entry at VMA
14049 ADDR and return the VMA of the next entry. */
14050
14051 static bfd_vma
14052 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14053 {
14054 printf (" ");
14055 print_vma (addr, LONG_HEX);
14056 printf (" ");
14057 if (data == NULL)
14058 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14059 else
14060 {
14061 bfd_vma entry;
14062
14063 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14064 print_vma (entry, LONG_HEX);
14065 }
14066 return addr + (is_32bit_elf ? 4 : 8);
14067 }
14068
14069 static void
14070 print_mips_ases (unsigned int mask)
14071 {
14072 if (mask & AFL_ASE_DSP)
14073 fputs ("\n\tDSP ASE", stdout);
14074 if (mask & AFL_ASE_DSPR2)
14075 fputs ("\n\tDSP R2 ASE", stdout);
14076 if (mask & AFL_ASE_EVA)
14077 fputs ("\n\tEnhanced VA Scheme", stdout);
14078 if (mask & AFL_ASE_MCU)
14079 fputs ("\n\tMCU (MicroController) ASE", stdout);
14080 if (mask & AFL_ASE_MDMX)
14081 fputs ("\n\tMDMX ASE", stdout);
14082 if (mask & AFL_ASE_MIPS3D)
14083 fputs ("\n\tMIPS-3D ASE", stdout);
14084 if (mask & AFL_ASE_MT)
14085 fputs ("\n\tMT ASE", stdout);
14086 if (mask & AFL_ASE_SMARTMIPS)
14087 fputs ("\n\tSmartMIPS ASE", stdout);
14088 if (mask & AFL_ASE_VIRT)
14089 fputs ("\n\tVZ ASE", stdout);
14090 if (mask & AFL_ASE_MSA)
14091 fputs ("\n\tMSA ASE", stdout);
14092 if (mask & AFL_ASE_MIPS16)
14093 fputs ("\n\tMIPS16 ASE", stdout);
14094 if (mask & AFL_ASE_MICROMIPS)
14095 fputs ("\n\tMICROMIPS ASE", stdout);
14096 if (mask & AFL_ASE_XPA)
14097 fputs ("\n\tXPA ASE", stdout);
14098 if (mask == 0)
14099 fprintf (stdout, "\n\t%s", _("None"));
14100 else if ((mask & ~AFL_ASE_MASK) != 0)
14101 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14102 }
14103
14104 static void
14105 print_mips_isa_ext (unsigned int isa_ext)
14106 {
14107 switch (isa_ext)
14108 {
14109 case 0:
14110 fputs (_("None"), stdout);
14111 break;
14112 case AFL_EXT_XLR:
14113 fputs ("RMI XLR", stdout);
14114 break;
14115 case AFL_EXT_OCTEON3:
14116 fputs ("Cavium Networks Octeon3", stdout);
14117 break;
14118 case AFL_EXT_OCTEON2:
14119 fputs ("Cavium Networks Octeon2", stdout);
14120 break;
14121 case AFL_EXT_OCTEONP:
14122 fputs ("Cavium Networks OcteonP", stdout);
14123 break;
14124 case AFL_EXT_LOONGSON_3A:
14125 fputs ("Loongson 3A", stdout);
14126 break;
14127 case AFL_EXT_OCTEON:
14128 fputs ("Cavium Networks Octeon", stdout);
14129 break;
14130 case AFL_EXT_5900:
14131 fputs ("Toshiba R5900", stdout);
14132 break;
14133 case AFL_EXT_4650:
14134 fputs ("MIPS R4650", stdout);
14135 break;
14136 case AFL_EXT_4010:
14137 fputs ("LSI R4010", stdout);
14138 break;
14139 case AFL_EXT_4100:
14140 fputs ("NEC VR4100", stdout);
14141 break;
14142 case AFL_EXT_3900:
14143 fputs ("Toshiba R3900", stdout);
14144 break;
14145 case AFL_EXT_10000:
14146 fputs ("MIPS R10000", stdout);
14147 break;
14148 case AFL_EXT_SB1:
14149 fputs ("Broadcom SB-1", stdout);
14150 break;
14151 case AFL_EXT_4111:
14152 fputs ("NEC VR4111/VR4181", stdout);
14153 break;
14154 case AFL_EXT_4120:
14155 fputs ("NEC VR4120", stdout);
14156 break;
14157 case AFL_EXT_5400:
14158 fputs ("NEC VR5400", stdout);
14159 break;
14160 case AFL_EXT_5500:
14161 fputs ("NEC VR5500", stdout);
14162 break;
14163 case AFL_EXT_LOONGSON_2E:
14164 fputs ("ST Microelectronics Loongson 2E", stdout);
14165 break;
14166 case AFL_EXT_LOONGSON_2F:
14167 fputs ("ST Microelectronics Loongson 2F", stdout);
14168 break;
14169 default:
14170 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14171 }
14172 }
14173
14174 static int
14175 get_mips_reg_size (int reg_size)
14176 {
14177 return (reg_size == AFL_REG_NONE) ? 0
14178 : (reg_size == AFL_REG_32) ? 32
14179 : (reg_size == AFL_REG_64) ? 64
14180 : (reg_size == AFL_REG_128) ? 128
14181 : -1;
14182 }
14183
14184 static int
14185 process_mips_specific (FILE * file)
14186 {
14187 Elf_Internal_Dyn * entry;
14188 Elf_Internal_Shdr *sect = NULL;
14189 size_t liblist_offset = 0;
14190 size_t liblistno = 0;
14191 size_t conflictsno = 0;
14192 size_t options_offset = 0;
14193 size_t conflicts_offset = 0;
14194 size_t pltrelsz = 0;
14195 size_t pltrel = 0;
14196 bfd_vma pltgot = 0;
14197 bfd_vma mips_pltgot = 0;
14198 bfd_vma jmprel = 0;
14199 bfd_vma local_gotno = 0;
14200 bfd_vma gotsym = 0;
14201 bfd_vma symtabno = 0;
14202
14203 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14204 display_mips_gnu_attribute);
14205
14206 sect = find_section (".MIPS.abiflags");
14207
14208 if (sect != NULL)
14209 {
14210 Elf_External_ABIFlags_v0 *abiflags_ext;
14211 Elf_Internal_ABIFlags_v0 abiflags_in;
14212
14213 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14214 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14215 else
14216 {
14217 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14218 sect->sh_size, _("MIPS ABI Flags section"));
14219 if (abiflags_ext)
14220 {
14221 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14222 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14223 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14224 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14225 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14226 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14227 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14228 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14229 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14230 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14231 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14232
14233 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14234 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14235 if (abiflags_in.isa_rev > 1)
14236 printf ("r%d", abiflags_in.isa_rev);
14237 printf ("\nGPR size: %d",
14238 get_mips_reg_size (abiflags_in.gpr_size));
14239 printf ("\nCPR1 size: %d",
14240 get_mips_reg_size (abiflags_in.cpr1_size));
14241 printf ("\nCPR2 size: %d",
14242 get_mips_reg_size (abiflags_in.cpr2_size));
14243 fputs ("\nFP ABI: ", stdout);
14244 print_mips_fp_abi_value (abiflags_in.fp_abi);
14245 fputs ("ISA Extension: ", stdout);
14246 print_mips_isa_ext (abiflags_in.isa_ext);
14247 fputs ("\nASEs:", stdout);
14248 print_mips_ases (abiflags_in.ases);
14249 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14250 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14251 fputc ('\n', stdout);
14252 free (abiflags_ext);
14253 }
14254 }
14255 }
14256
14257 /* We have a lot of special sections. Thanks SGI! */
14258 if (dynamic_section == NULL)
14259 /* No information available. */
14260 return 0;
14261
14262 for (entry = dynamic_section;
14263 /* PR 17531 file: 012-50589-0.004. */
14264 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14265 ++entry)
14266 switch (entry->d_tag)
14267 {
14268 case DT_MIPS_LIBLIST:
14269 liblist_offset
14270 = offset_from_vma (file, entry->d_un.d_val,
14271 liblistno * sizeof (Elf32_External_Lib));
14272 break;
14273 case DT_MIPS_LIBLISTNO:
14274 liblistno = entry->d_un.d_val;
14275 break;
14276 case DT_MIPS_OPTIONS:
14277 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14278 break;
14279 case DT_MIPS_CONFLICT:
14280 conflicts_offset
14281 = offset_from_vma (file, entry->d_un.d_val,
14282 conflictsno * sizeof (Elf32_External_Conflict));
14283 break;
14284 case DT_MIPS_CONFLICTNO:
14285 conflictsno = entry->d_un.d_val;
14286 break;
14287 case DT_PLTGOT:
14288 pltgot = entry->d_un.d_ptr;
14289 break;
14290 case DT_MIPS_LOCAL_GOTNO:
14291 local_gotno = entry->d_un.d_val;
14292 break;
14293 case DT_MIPS_GOTSYM:
14294 gotsym = entry->d_un.d_val;
14295 break;
14296 case DT_MIPS_SYMTABNO:
14297 symtabno = entry->d_un.d_val;
14298 break;
14299 case DT_MIPS_PLTGOT:
14300 mips_pltgot = entry->d_un.d_ptr;
14301 break;
14302 case DT_PLTREL:
14303 pltrel = entry->d_un.d_val;
14304 break;
14305 case DT_PLTRELSZ:
14306 pltrelsz = entry->d_un.d_val;
14307 break;
14308 case DT_JMPREL:
14309 jmprel = entry->d_un.d_ptr;
14310 break;
14311 default:
14312 break;
14313 }
14314
14315 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14316 {
14317 Elf32_External_Lib * elib;
14318 size_t cnt;
14319
14320 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14321 liblistno,
14322 sizeof (Elf32_External_Lib),
14323 _("liblist section data"));
14324 if (elib)
14325 {
14326 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14327 (unsigned long) liblistno);
14328 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14329 stdout);
14330
14331 for (cnt = 0; cnt < liblistno; ++cnt)
14332 {
14333 Elf32_Lib liblist;
14334 time_t atime;
14335 char timebuf[20];
14336 struct tm * tmp;
14337
14338 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14339 atime = BYTE_GET (elib[cnt].l_time_stamp);
14340 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14341 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14342 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14343
14344 tmp = gmtime (&atime);
14345 snprintf (timebuf, sizeof (timebuf),
14346 "%04u-%02u-%02uT%02u:%02u:%02u",
14347 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14348 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14349
14350 printf ("%3lu: ", (unsigned long) cnt);
14351 if (VALID_DYNAMIC_NAME (liblist.l_name))
14352 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14353 else
14354 printf (_("<corrupt: %9ld>"), liblist.l_name);
14355 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14356 liblist.l_version);
14357
14358 if (liblist.l_flags == 0)
14359 puts (_(" NONE"));
14360 else
14361 {
14362 static const struct
14363 {
14364 const char * name;
14365 int bit;
14366 }
14367 l_flags_vals[] =
14368 {
14369 { " EXACT_MATCH", LL_EXACT_MATCH },
14370 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14371 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14372 { " EXPORTS", LL_EXPORTS },
14373 { " DELAY_LOAD", LL_DELAY_LOAD },
14374 { " DELTA", LL_DELTA }
14375 };
14376 int flags = liblist.l_flags;
14377 size_t fcnt;
14378
14379 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14380 if ((flags & l_flags_vals[fcnt].bit) != 0)
14381 {
14382 fputs (l_flags_vals[fcnt].name, stdout);
14383 flags ^= l_flags_vals[fcnt].bit;
14384 }
14385 if (flags != 0)
14386 printf (" %#x", (unsigned int) flags);
14387
14388 puts ("");
14389 }
14390 }
14391
14392 free (elib);
14393 }
14394 }
14395
14396 if (options_offset != 0)
14397 {
14398 Elf_External_Options * eopt;
14399 Elf_Internal_Options * iopt;
14400 Elf_Internal_Options * option;
14401 size_t offset;
14402 int cnt;
14403 sect = section_headers;
14404
14405 /* Find the section header so that we get the size. */
14406 sect = find_section_by_type (SHT_MIPS_OPTIONS);
14407 /* PR 17533 file: 012-277276-0.004. */
14408 if (sect == NULL)
14409 {
14410 error (_("No MIPS_OPTIONS header found\n"));
14411 return 0;
14412 }
14413
14414 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14415 sect->sh_size, _("options"));
14416 if (eopt)
14417 {
14418 iopt = (Elf_Internal_Options *)
14419 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14420 if (iopt == NULL)
14421 {
14422 error (_("Out of memory allocatinf space for MIPS options\n"));
14423 return 0;
14424 }
14425
14426 offset = cnt = 0;
14427 option = iopt;
14428
14429 while (offset <= sect->sh_size - sizeof (* eopt))
14430 {
14431 Elf_External_Options * eoption;
14432
14433 eoption = (Elf_External_Options *) ((char *) eopt + offset);
14434
14435 option->kind = BYTE_GET (eoption->kind);
14436 option->size = BYTE_GET (eoption->size);
14437 option->section = BYTE_GET (eoption->section);
14438 option->info = BYTE_GET (eoption->info);
14439
14440 /* PR 17531: file: ffa0fa3b. */
14441 if (option->size < sizeof (* eopt)
14442 || offset + option->size > sect->sh_size)
14443 {
14444 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14445 return 0;
14446 }
14447 offset += option->size;
14448
14449 ++option;
14450 ++cnt;
14451 }
14452
14453 printf (_("\nSection '%s' contains %d entries:\n"),
14454 printable_section_name (sect), cnt);
14455
14456 option = iopt;
14457 offset = 0;
14458
14459 while (cnt-- > 0)
14460 {
14461 size_t len;
14462
14463 switch (option->kind)
14464 {
14465 case ODK_NULL:
14466 /* This shouldn't happen. */
14467 printf (" NULL %d %lx", option->section, option->info);
14468 break;
14469 case ODK_REGINFO:
14470 printf (" REGINFO ");
14471 if (elf_header.e_machine == EM_MIPS)
14472 {
14473 /* 32bit form. */
14474 Elf32_External_RegInfo * ereg;
14475 Elf32_RegInfo reginfo;
14476
14477 ereg = (Elf32_External_RegInfo *) (option + 1);
14478 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14479 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14480 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14481 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14482 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14483 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14484
14485 printf ("GPR %08lx GP 0x%lx\n",
14486 reginfo.ri_gprmask,
14487 (unsigned long) reginfo.ri_gp_value);
14488 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14489 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14490 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14491 }
14492 else
14493 {
14494 /* 64 bit form. */
14495 Elf64_External_RegInfo * ereg;
14496 Elf64_Internal_RegInfo reginfo;
14497
14498 ereg = (Elf64_External_RegInfo *) (option + 1);
14499 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14500 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14501 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14502 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14503 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14504 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14505
14506 printf ("GPR %08lx GP 0x",
14507 reginfo.ri_gprmask);
14508 printf_vma (reginfo.ri_gp_value);
14509 printf ("\n");
14510
14511 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14512 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14513 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14514 }
14515 ++option;
14516 continue;
14517 case ODK_EXCEPTIONS:
14518 fputs (" EXCEPTIONS fpe_min(", stdout);
14519 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14520 fputs (") fpe_max(", stdout);
14521 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14522 fputs (")", stdout);
14523
14524 if (option->info & OEX_PAGE0)
14525 fputs (" PAGE0", stdout);
14526 if (option->info & OEX_SMM)
14527 fputs (" SMM", stdout);
14528 if (option->info & OEX_FPDBUG)
14529 fputs (" FPDBUG", stdout);
14530 if (option->info & OEX_DISMISS)
14531 fputs (" DISMISS", stdout);
14532 break;
14533 case ODK_PAD:
14534 fputs (" PAD ", stdout);
14535 if (option->info & OPAD_PREFIX)
14536 fputs (" PREFIX", stdout);
14537 if (option->info & OPAD_POSTFIX)
14538 fputs (" POSTFIX", stdout);
14539 if (option->info & OPAD_SYMBOL)
14540 fputs (" SYMBOL", stdout);
14541 break;
14542 case ODK_HWPATCH:
14543 fputs (" HWPATCH ", stdout);
14544 if (option->info & OHW_R4KEOP)
14545 fputs (" R4KEOP", stdout);
14546 if (option->info & OHW_R8KPFETCH)
14547 fputs (" R8KPFETCH", stdout);
14548 if (option->info & OHW_R5KEOP)
14549 fputs (" R5KEOP", stdout);
14550 if (option->info & OHW_R5KCVTL)
14551 fputs (" R5KCVTL", stdout);
14552 break;
14553 case ODK_FILL:
14554 fputs (" FILL ", stdout);
14555 /* XXX Print content of info word? */
14556 break;
14557 case ODK_TAGS:
14558 fputs (" TAGS ", stdout);
14559 /* XXX Print content of info word? */
14560 break;
14561 case ODK_HWAND:
14562 fputs (" HWAND ", stdout);
14563 if (option->info & OHWA0_R4KEOP_CHECKED)
14564 fputs (" R4KEOP_CHECKED", stdout);
14565 if (option->info & OHWA0_R4KEOP_CLEAN)
14566 fputs (" R4KEOP_CLEAN", stdout);
14567 break;
14568 case ODK_HWOR:
14569 fputs (" HWOR ", stdout);
14570 if (option->info & OHWA0_R4KEOP_CHECKED)
14571 fputs (" R4KEOP_CHECKED", stdout);
14572 if (option->info & OHWA0_R4KEOP_CLEAN)
14573 fputs (" R4KEOP_CLEAN", stdout);
14574 break;
14575 case ODK_GP_GROUP:
14576 printf (" GP_GROUP %#06lx self-contained %#06lx",
14577 option->info & OGP_GROUP,
14578 (option->info & OGP_SELF) >> 16);
14579 break;
14580 case ODK_IDENT:
14581 printf (" IDENT %#06lx self-contained %#06lx",
14582 option->info & OGP_GROUP,
14583 (option->info & OGP_SELF) >> 16);
14584 break;
14585 default:
14586 /* This shouldn't happen. */
14587 printf (" %3d ??? %d %lx",
14588 option->kind, option->section, option->info);
14589 break;
14590 }
14591
14592 len = sizeof (* eopt);
14593 while (len < option->size)
14594 {
14595 unsigned char datum = * ((unsigned char *) eopt + offset + len);
14596
14597 if (ISPRINT (datum))
14598 printf ("%c", datum);
14599 else
14600 printf ("\\%03o", datum);
14601 len ++;
14602 }
14603 fputs ("\n", stdout);
14604
14605 offset += option->size;
14606 ++option;
14607 }
14608
14609 free (eopt);
14610 }
14611 }
14612
14613 if (conflicts_offset != 0 && conflictsno != 0)
14614 {
14615 Elf32_Conflict * iconf;
14616 size_t cnt;
14617
14618 if (dynamic_symbols == NULL)
14619 {
14620 error (_("conflict list found without a dynamic symbol table\n"));
14621 return 0;
14622 }
14623
14624 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14625 if (iconf == NULL)
14626 {
14627 error (_("Out of memory allocating space for dynamic conflicts\n"));
14628 return 0;
14629 }
14630
14631 if (is_32bit_elf)
14632 {
14633 Elf32_External_Conflict * econf32;
14634
14635 econf32 = (Elf32_External_Conflict *)
14636 get_data (NULL, file, conflicts_offset, conflictsno,
14637 sizeof (* econf32), _("conflict"));
14638 if (!econf32)
14639 return 0;
14640
14641 for (cnt = 0; cnt < conflictsno; ++cnt)
14642 iconf[cnt] = BYTE_GET (econf32[cnt]);
14643
14644 free (econf32);
14645 }
14646 else
14647 {
14648 Elf64_External_Conflict * econf64;
14649
14650 econf64 = (Elf64_External_Conflict *)
14651 get_data (NULL, file, conflicts_offset, conflictsno,
14652 sizeof (* econf64), _("conflict"));
14653 if (!econf64)
14654 return 0;
14655
14656 for (cnt = 0; cnt < conflictsno; ++cnt)
14657 iconf[cnt] = BYTE_GET (econf64[cnt]);
14658
14659 free (econf64);
14660 }
14661
14662 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14663 (unsigned long) conflictsno);
14664 puts (_(" Num: Index Value Name"));
14665
14666 for (cnt = 0; cnt < conflictsno; ++cnt)
14667 {
14668 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14669
14670 if (iconf[cnt] >= num_dynamic_syms)
14671 printf (_("<corrupt symbol index>"));
14672 else
14673 {
14674 Elf_Internal_Sym * psym;
14675
14676 psym = & dynamic_symbols[iconf[cnt]];
14677 print_vma (psym->st_value, FULL_HEX);
14678 putchar (' ');
14679 if (VALID_DYNAMIC_NAME (psym->st_name))
14680 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14681 else
14682 printf (_("<corrupt: %14ld>"), psym->st_name);
14683 }
14684 putchar ('\n');
14685 }
14686
14687 free (iconf);
14688 }
14689
14690 if (pltgot != 0 && local_gotno != 0)
14691 {
14692 bfd_vma ent, local_end, global_end;
14693 size_t i, offset;
14694 unsigned char * data;
14695 unsigned char * data_end;
14696 int addr_size;
14697
14698 ent = pltgot;
14699 addr_size = (is_32bit_elf ? 4 : 8);
14700 local_end = pltgot + local_gotno * addr_size;
14701
14702 /* PR binutils/17533 file: 012-111227-0.004 */
14703 if (symtabno < gotsym)
14704 {
14705 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14706 (unsigned long) gotsym, (unsigned long) symtabno);
14707 return 0;
14708 }
14709
14710 global_end = local_end + (symtabno - gotsym) * addr_size;
14711 /* PR 17531: file: 54c91a34. */
14712 if (global_end < local_end)
14713 {
14714 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14715 return 0;
14716 }
14717
14718 offset = offset_from_vma (file, pltgot, global_end - pltgot);
14719 data = (unsigned char *) get_data (NULL, file, offset,
14720 global_end - pltgot, 1,
14721 _("Global Offset Table data"));
14722 if (data == NULL)
14723 return 0;
14724 data_end = data + (global_end - pltgot);
14725
14726 printf (_("\nPrimary GOT:\n"));
14727 printf (_(" Canonical gp value: "));
14728 print_vma (pltgot + 0x7ff0, LONG_HEX);
14729 printf ("\n\n");
14730
14731 printf (_(" Reserved entries:\n"));
14732 printf (_(" %*s %10s %*s Purpose\n"),
14733 addr_size * 2, _("Address"), _("Access"),
14734 addr_size * 2, _("Initial"));
14735 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14736 printf (_(" Lazy resolver\n"));
14737 if (ent == (bfd_vma) -1)
14738 goto got_print_fail;
14739 if (data
14740 && (byte_get (data + ent - pltgot, addr_size)
14741 >> (addr_size * 8 - 1)) != 0)
14742 {
14743 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14744 printf (_(" Module pointer (GNU extension)\n"));
14745 if (ent == (bfd_vma) -1)
14746 goto got_print_fail;
14747 }
14748 printf ("\n");
14749
14750 if (ent < local_end)
14751 {
14752 printf (_(" Local entries:\n"));
14753 printf (" %*s %10s %*s\n",
14754 addr_size * 2, _("Address"), _("Access"),
14755 addr_size * 2, _("Initial"));
14756 while (ent < local_end)
14757 {
14758 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14759 printf ("\n");
14760 if (ent == (bfd_vma) -1)
14761 goto got_print_fail;
14762 }
14763 printf ("\n");
14764 }
14765
14766 if (gotsym < symtabno)
14767 {
14768 int sym_width;
14769
14770 printf (_(" Global entries:\n"));
14771 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
14772 addr_size * 2, _("Address"),
14773 _("Access"),
14774 addr_size * 2, _("Initial"),
14775 addr_size * 2, _("Sym.Val."),
14776 _("Type"),
14777 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14778 _("Ndx"), _("Name"));
14779
14780 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14781
14782 for (i = gotsym; i < symtabno; i++)
14783 {
14784 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14785 printf (" ");
14786
14787 if (dynamic_symbols == NULL)
14788 printf (_("<no dynamic symbols>"));
14789 else if (i < num_dynamic_syms)
14790 {
14791 Elf_Internal_Sym * psym = dynamic_symbols + i;
14792
14793 print_vma (psym->st_value, LONG_HEX);
14794 printf (" %-7s %3s ",
14795 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14796 get_symbol_index_type (psym->st_shndx));
14797
14798 if (VALID_DYNAMIC_NAME (psym->st_name))
14799 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14800 else
14801 printf (_("<corrupt: %14ld>"), psym->st_name);
14802 }
14803 else
14804 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14805 (unsigned long) i);
14806
14807 printf ("\n");
14808 if (ent == (bfd_vma) -1)
14809 break;
14810 }
14811 printf ("\n");
14812 }
14813
14814 got_print_fail:
14815 if (data)
14816 free (data);
14817 }
14818
14819 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14820 {
14821 bfd_vma ent, end;
14822 size_t offset, rel_offset;
14823 unsigned long count, i;
14824 unsigned char * data;
14825 int addr_size, sym_width;
14826 Elf_Internal_Rela * rels;
14827
14828 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14829 if (pltrel == DT_RELA)
14830 {
14831 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14832 return 0;
14833 }
14834 else
14835 {
14836 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14837 return 0;
14838 }
14839
14840 ent = mips_pltgot;
14841 addr_size = (is_32bit_elf ? 4 : 8);
14842 end = mips_pltgot + (2 + count) * addr_size;
14843
14844 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14845 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14846 1, _("Procedure Linkage Table data"));
14847 if (data == NULL)
14848 return 0;
14849
14850 printf ("\nPLT GOT:\n\n");
14851 printf (_(" Reserved entries:\n"));
14852 printf (_(" %*s %*s Purpose\n"),
14853 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14854 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14855 printf (_(" PLT lazy resolver\n"));
14856 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14857 printf (_(" Module pointer\n"));
14858 printf ("\n");
14859
14860 printf (_(" Entries:\n"));
14861 printf (" %*s %*s %*s %-7s %3s %s\n",
14862 addr_size * 2, _("Address"),
14863 addr_size * 2, _("Initial"),
14864 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14865 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14866 for (i = 0; i < count; i++)
14867 {
14868 unsigned long idx = get_reloc_symindex (rels[i].r_info);
14869
14870 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14871 printf (" ");
14872
14873 if (idx >= num_dynamic_syms)
14874 printf (_("<corrupt symbol index: %lu>"), idx);
14875 else
14876 {
14877 Elf_Internal_Sym * psym = dynamic_symbols + idx;
14878
14879 print_vma (psym->st_value, LONG_HEX);
14880 printf (" %-7s %3s ",
14881 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14882 get_symbol_index_type (psym->st_shndx));
14883 if (VALID_DYNAMIC_NAME (psym->st_name))
14884 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14885 else
14886 printf (_("<corrupt: %14ld>"), psym->st_name);
14887 }
14888 printf ("\n");
14889 }
14890 printf ("\n");
14891
14892 if (data)
14893 free (data);
14894 free (rels);
14895 }
14896
14897 return 1;
14898 }
14899
14900 static int
14901 process_nds32_specific (FILE * file)
14902 {
14903 Elf_Internal_Shdr *sect = NULL;
14904
14905 sect = find_section (".nds32_e_flags");
14906 if (sect != NULL)
14907 {
14908 unsigned int *flag;
14909
14910 printf ("\nNDS32 elf flags section:\n");
14911 flag = get_data (NULL, file, sect->sh_offset, 1,
14912 sect->sh_size, _("NDS32 elf flags section"));
14913
14914 switch ((*flag) & 0x3)
14915 {
14916 case 0:
14917 printf ("(VEC_SIZE):\tNo entry.\n");
14918 break;
14919 case 1:
14920 printf ("(VEC_SIZE):\t4 bytes\n");
14921 break;
14922 case 2:
14923 printf ("(VEC_SIZE):\t16 bytes\n");
14924 break;
14925 case 3:
14926 printf ("(VEC_SIZE):\treserved\n");
14927 break;
14928 }
14929 }
14930
14931 return TRUE;
14932 }
14933
14934 static int
14935 process_gnu_liblist (FILE * file)
14936 {
14937 Elf_Internal_Shdr * section;
14938 Elf_Internal_Shdr * string_sec;
14939 Elf32_External_Lib * elib;
14940 char * strtab;
14941 size_t strtab_size;
14942 size_t cnt;
14943 unsigned i;
14944
14945 if (! do_arch)
14946 return 0;
14947
14948 for (i = 0, section = section_headers;
14949 i < elf_header.e_shnum;
14950 i++, section++)
14951 {
14952 switch (section->sh_type)
14953 {
14954 case SHT_GNU_LIBLIST:
14955 if (section->sh_link >= elf_header.e_shnum)
14956 break;
14957
14958 elib = (Elf32_External_Lib *)
14959 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14960 _("liblist section data"));
14961
14962 if (elib == NULL)
14963 break;
14964 string_sec = section_headers + section->sh_link;
14965
14966 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14967 string_sec->sh_size,
14968 _("liblist string table"));
14969 if (strtab == NULL
14970 || section->sh_entsize != sizeof (Elf32_External_Lib))
14971 {
14972 free (elib);
14973 free (strtab);
14974 break;
14975 }
14976 strtab_size = string_sec->sh_size;
14977
14978 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14979 printable_section_name (section),
14980 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14981
14982 puts (_(" Library Time Stamp Checksum Version Flags"));
14983
14984 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14985 ++cnt)
14986 {
14987 Elf32_Lib liblist;
14988 time_t atime;
14989 char timebuf[20];
14990 struct tm * tmp;
14991
14992 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14993 atime = BYTE_GET (elib[cnt].l_time_stamp);
14994 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14995 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14996 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14997
14998 tmp = gmtime (&atime);
14999 snprintf (timebuf, sizeof (timebuf),
15000 "%04u-%02u-%02uT%02u:%02u:%02u",
15001 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15002 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15003
15004 printf ("%3lu: ", (unsigned long) cnt);
15005 if (do_wide)
15006 printf ("%-20s", liblist.l_name < strtab_size
15007 ? strtab + liblist.l_name : _("<corrupt>"));
15008 else
15009 printf ("%-20.20s", liblist.l_name < strtab_size
15010 ? strtab + liblist.l_name : _("<corrupt>"));
15011 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15012 liblist.l_version, liblist.l_flags);
15013 }
15014
15015 free (elib);
15016 free (strtab);
15017 }
15018 }
15019
15020 return 1;
15021 }
15022
15023 static const char *
15024 get_note_type (unsigned e_type)
15025 {
15026 static char buff[64];
15027
15028 if (elf_header.e_type == ET_CORE)
15029 switch (e_type)
15030 {
15031 case NT_AUXV:
15032 return _("NT_AUXV (auxiliary vector)");
15033 case NT_PRSTATUS:
15034 return _("NT_PRSTATUS (prstatus structure)");
15035 case NT_FPREGSET:
15036 return _("NT_FPREGSET (floating point registers)");
15037 case NT_PRPSINFO:
15038 return _("NT_PRPSINFO (prpsinfo structure)");
15039 case NT_TASKSTRUCT:
15040 return _("NT_TASKSTRUCT (task structure)");
15041 case NT_PRXFPREG:
15042 return _("NT_PRXFPREG (user_xfpregs structure)");
15043 case NT_PPC_VMX:
15044 return _("NT_PPC_VMX (ppc Altivec registers)");
15045 case NT_PPC_VSX:
15046 return _("NT_PPC_VSX (ppc VSX registers)");
15047 case NT_386_TLS:
15048 return _("NT_386_TLS (x86 TLS information)");
15049 case NT_386_IOPERM:
15050 return _("NT_386_IOPERM (x86 I/O permissions)");
15051 case NT_X86_XSTATE:
15052 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15053 case NT_S390_HIGH_GPRS:
15054 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15055 case NT_S390_TIMER:
15056 return _("NT_S390_TIMER (s390 timer register)");
15057 case NT_S390_TODCMP:
15058 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15059 case NT_S390_TODPREG:
15060 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15061 case NT_S390_CTRS:
15062 return _("NT_S390_CTRS (s390 control registers)");
15063 case NT_S390_PREFIX:
15064 return _("NT_S390_PREFIX (s390 prefix register)");
15065 case NT_S390_LAST_BREAK:
15066 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15067 case NT_S390_SYSTEM_CALL:
15068 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15069 case NT_S390_TDB:
15070 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15071 case NT_S390_VXRS_LOW:
15072 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15073 case NT_S390_VXRS_HIGH:
15074 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15075 case NT_ARM_VFP:
15076 return _("NT_ARM_VFP (arm VFP registers)");
15077 case NT_ARM_TLS:
15078 return _("NT_ARM_TLS (AArch TLS registers)");
15079 case NT_ARM_HW_BREAK:
15080 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15081 case NT_ARM_HW_WATCH:
15082 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15083 case NT_PSTATUS:
15084 return _("NT_PSTATUS (pstatus structure)");
15085 case NT_FPREGS:
15086 return _("NT_FPREGS (floating point registers)");
15087 case NT_PSINFO:
15088 return _("NT_PSINFO (psinfo structure)");
15089 case NT_LWPSTATUS:
15090 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15091 case NT_LWPSINFO:
15092 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15093 case NT_WIN32PSTATUS:
15094 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15095 case NT_SIGINFO:
15096 return _("NT_SIGINFO (siginfo_t data)");
15097 case NT_FILE:
15098 return _("NT_FILE (mapped files)");
15099 default:
15100 break;
15101 }
15102 else
15103 switch (e_type)
15104 {
15105 case NT_VERSION:
15106 return _("NT_VERSION (version)");
15107 case NT_ARCH:
15108 return _("NT_ARCH (architecture)");
15109 default:
15110 break;
15111 }
15112
15113 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15114 return buff;
15115 }
15116
15117 static int
15118 print_core_note (Elf_Internal_Note *pnote)
15119 {
15120 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15121 bfd_vma count, page_size;
15122 unsigned char *descdata, *filenames, *descend;
15123
15124 if (pnote->type != NT_FILE)
15125 return 1;
15126
15127 #ifndef BFD64
15128 if (!is_32bit_elf)
15129 {
15130 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15131 /* Still "successful". */
15132 return 1;
15133 }
15134 #endif
15135
15136 if (pnote->descsz < 2 * addr_size)
15137 {
15138 printf (_(" Malformed note - too short for header\n"));
15139 return 0;
15140 }
15141
15142 descdata = (unsigned char *) pnote->descdata;
15143 descend = descdata + pnote->descsz;
15144
15145 if (descdata[pnote->descsz - 1] != '\0')
15146 {
15147 printf (_(" Malformed note - does not end with \\0\n"));
15148 return 0;
15149 }
15150
15151 count = byte_get (descdata, addr_size);
15152 descdata += addr_size;
15153
15154 page_size = byte_get (descdata, addr_size);
15155 descdata += addr_size;
15156
15157 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15158 {
15159 printf (_(" Malformed note - too short for supplied file count\n"));
15160 return 0;
15161 }
15162
15163 printf (_(" Page size: "));
15164 print_vma (page_size, DEC);
15165 printf ("\n");
15166
15167 printf (_(" %*s%*s%*s\n"),
15168 (int) (2 + 2 * addr_size), _("Start"),
15169 (int) (4 + 2 * addr_size), _("End"),
15170 (int) (4 + 2 * addr_size), _("Page Offset"));
15171 filenames = descdata + count * 3 * addr_size;
15172 while (count-- > 0)
15173 {
15174 bfd_vma start, end, file_ofs;
15175
15176 if (filenames == descend)
15177 {
15178 printf (_(" Malformed note - filenames end too early\n"));
15179 return 0;
15180 }
15181
15182 start = byte_get (descdata, addr_size);
15183 descdata += addr_size;
15184 end = byte_get (descdata, addr_size);
15185 descdata += addr_size;
15186 file_ofs = byte_get (descdata, addr_size);
15187 descdata += addr_size;
15188
15189 printf (" ");
15190 print_vma (start, FULL_HEX);
15191 printf (" ");
15192 print_vma (end, FULL_HEX);
15193 printf (" ");
15194 print_vma (file_ofs, FULL_HEX);
15195 printf ("\n %s\n", filenames);
15196
15197 filenames += 1 + strlen ((char *) filenames);
15198 }
15199
15200 return 1;
15201 }
15202
15203 static const char *
15204 get_gnu_elf_note_type (unsigned e_type)
15205 {
15206 static char buff[64];
15207
15208 switch (e_type)
15209 {
15210 case NT_GNU_ABI_TAG:
15211 return _("NT_GNU_ABI_TAG (ABI version tag)");
15212 case NT_GNU_HWCAP:
15213 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15214 case NT_GNU_BUILD_ID:
15215 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15216 case NT_GNU_GOLD_VERSION:
15217 return _("NT_GNU_GOLD_VERSION (gold version)");
15218 default:
15219 break;
15220 }
15221
15222 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15223 return buff;
15224 }
15225
15226 static int
15227 print_gnu_note (Elf_Internal_Note *pnote)
15228 {
15229 switch (pnote->type)
15230 {
15231 case NT_GNU_BUILD_ID:
15232 {
15233 unsigned long i;
15234
15235 printf (_(" Build ID: "));
15236 for (i = 0; i < pnote->descsz; ++i)
15237 printf ("%02x", pnote->descdata[i] & 0xff);
15238 printf ("\n");
15239 }
15240 break;
15241
15242 case NT_GNU_ABI_TAG:
15243 {
15244 unsigned long os, major, minor, subminor;
15245 const char *osname;
15246
15247 /* PR 17531: file: 030-599401-0.004. */
15248 if (pnote->descsz < 16)
15249 {
15250 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15251 break;
15252 }
15253
15254 os = byte_get ((unsigned char *) pnote->descdata, 4);
15255 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15256 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15257 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15258
15259 switch (os)
15260 {
15261 case GNU_ABI_TAG_LINUX:
15262 osname = "Linux";
15263 break;
15264 case GNU_ABI_TAG_HURD:
15265 osname = "Hurd";
15266 break;
15267 case GNU_ABI_TAG_SOLARIS:
15268 osname = "Solaris";
15269 break;
15270 case GNU_ABI_TAG_FREEBSD:
15271 osname = "FreeBSD";
15272 break;
15273 case GNU_ABI_TAG_NETBSD:
15274 osname = "NetBSD";
15275 break;
15276 case GNU_ABI_TAG_SYLLABLE:
15277 osname = "Syllable";
15278 break;
15279 case GNU_ABI_TAG_NACL:
15280 osname = "NaCl";
15281 break;
15282 default:
15283 osname = "Unknown";
15284 break;
15285 }
15286
15287 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15288 major, minor, subminor);
15289 }
15290 break;
15291
15292 case NT_GNU_GOLD_VERSION:
15293 {
15294 unsigned long i;
15295
15296 printf (_(" Version: "));
15297 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15298 printf ("%c", pnote->descdata[i]);
15299 printf ("\n");
15300 }
15301 break;
15302 }
15303
15304 return 1;
15305 }
15306
15307 static const char *
15308 get_v850_elf_note_type (enum v850_notes n_type)
15309 {
15310 static char buff[64];
15311
15312 switch (n_type)
15313 {
15314 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15315 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15316 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15317 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15318 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15319 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15320 default:
15321 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15322 return buff;
15323 }
15324 }
15325
15326 static int
15327 print_v850_note (Elf_Internal_Note * pnote)
15328 {
15329 unsigned int val;
15330
15331 if (pnote->descsz != 4)
15332 return 0;
15333 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15334
15335 if (val == 0)
15336 {
15337 printf (_("not set\n"));
15338 return 1;
15339 }
15340
15341 switch (pnote->type)
15342 {
15343 case V850_NOTE_ALIGNMENT:
15344 switch (val)
15345 {
15346 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15347 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15348 }
15349 break;
15350
15351 case V850_NOTE_DATA_SIZE:
15352 switch (val)
15353 {
15354 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15355 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15356 }
15357 break;
15358
15359 case V850_NOTE_FPU_INFO:
15360 switch (val)
15361 {
15362 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15363 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15364 }
15365 break;
15366
15367 case V850_NOTE_MMU_INFO:
15368 case V850_NOTE_CACHE_INFO:
15369 case V850_NOTE_SIMD_INFO:
15370 if (val == EF_RH850_SIMD)
15371 {
15372 printf (_("yes\n"));
15373 return 1;
15374 }
15375 break;
15376
15377 default:
15378 /* An 'unknown note type' message will already have been displayed. */
15379 break;
15380 }
15381
15382 printf (_("unknown value: %x\n"), val);
15383 return 0;
15384 }
15385
15386 static int
15387 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15388 {
15389 unsigned int version;
15390
15391 switch (pnote->type)
15392 {
15393 case NT_NETBSD_IDENT:
15394 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15395 if ((version / 10000) % 100)
15396 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15397 version, version / 100000000, (version / 1000000) % 100,
15398 (version / 10000) % 100 > 26 ? "Z" : "",
15399 'A' + (version / 10000) % 26);
15400 else
15401 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15402 version, version / 100000000, (version / 1000000) % 100,
15403 (version / 100) % 100);
15404 return 1;
15405
15406 case NT_NETBSD_MARCH:
15407 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15408 pnote->descdata);
15409 return 1;
15410
15411 default:
15412 break;
15413 }
15414
15415 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15416 pnote->type);
15417 return 1;
15418 }
15419
15420 static const char *
15421 get_freebsd_elfcore_note_type (unsigned e_type)
15422 {
15423 switch (e_type)
15424 {
15425 case NT_FREEBSD_THRMISC:
15426 return _("NT_THRMISC (thrmisc structure)");
15427 case NT_FREEBSD_PROCSTAT_PROC:
15428 return _("NT_PROCSTAT_PROC (proc data)");
15429 case NT_FREEBSD_PROCSTAT_FILES:
15430 return _("NT_PROCSTAT_FILES (files data)");
15431 case NT_FREEBSD_PROCSTAT_VMMAP:
15432 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15433 case NT_FREEBSD_PROCSTAT_GROUPS:
15434 return _("NT_PROCSTAT_GROUPS (groups data)");
15435 case NT_FREEBSD_PROCSTAT_UMASK:
15436 return _("NT_PROCSTAT_UMASK (umask data)");
15437 case NT_FREEBSD_PROCSTAT_RLIMIT:
15438 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15439 case NT_FREEBSD_PROCSTAT_OSREL:
15440 return _("NT_PROCSTAT_OSREL (osreldate data)");
15441 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15442 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15443 case NT_FREEBSD_PROCSTAT_AUXV:
15444 return _("NT_PROCSTAT_AUXV (auxv data)");
15445 }
15446 return get_note_type (e_type);
15447 }
15448
15449 static const char *
15450 get_netbsd_elfcore_note_type (unsigned e_type)
15451 {
15452 static char buff[64];
15453
15454 if (e_type == NT_NETBSDCORE_PROCINFO)
15455 {
15456 /* NetBSD core "procinfo" structure. */
15457 return _("NetBSD procinfo structure");
15458 }
15459
15460 /* As of Jan 2002 there are no other machine-independent notes
15461 defined for NetBSD core files. If the note type is less
15462 than the start of the machine-dependent note types, we don't
15463 understand it. */
15464
15465 if (e_type < NT_NETBSDCORE_FIRSTMACH)
15466 {
15467 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15468 return buff;
15469 }
15470
15471 switch (elf_header.e_machine)
15472 {
15473 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15474 and PT_GETFPREGS == mach+2. */
15475
15476 case EM_OLD_ALPHA:
15477 case EM_ALPHA:
15478 case EM_SPARC:
15479 case EM_SPARC32PLUS:
15480 case EM_SPARCV9:
15481 switch (e_type)
15482 {
15483 case NT_NETBSDCORE_FIRSTMACH + 0:
15484 return _("PT_GETREGS (reg structure)");
15485 case NT_NETBSDCORE_FIRSTMACH + 2:
15486 return _("PT_GETFPREGS (fpreg structure)");
15487 default:
15488 break;
15489 }
15490 break;
15491
15492 /* On all other arch's, PT_GETREGS == mach+1 and
15493 PT_GETFPREGS == mach+3. */
15494 default:
15495 switch (e_type)
15496 {
15497 case NT_NETBSDCORE_FIRSTMACH + 1:
15498 return _("PT_GETREGS (reg structure)");
15499 case NT_NETBSDCORE_FIRSTMACH + 3:
15500 return _("PT_GETFPREGS (fpreg structure)");
15501 default:
15502 break;
15503 }
15504 }
15505
15506 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15507 e_type - NT_NETBSDCORE_FIRSTMACH);
15508 return buff;
15509 }
15510
15511 static const char *
15512 get_stapsdt_note_type (unsigned e_type)
15513 {
15514 static char buff[64];
15515
15516 switch (e_type)
15517 {
15518 case NT_STAPSDT:
15519 return _("NT_STAPSDT (SystemTap probe descriptors)");
15520
15521 default:
15522 break;
15523 }
15524
15525 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15526 return buff;
15527 }
15528
15529 static int
15530 print_stapsdt_note (Elf_Internal_Note *pnote)
15531 {
15532 int addr_size = is_32bit_elf ? 4 : 8;
15533 char *data = pnote->descdata;
15534 char *data_end = pnote->descdata + pnote->descsz;
15535 bfd_vma pc, base_addr, semaphore;
15536 char *provider, *probe, *arg_fmt;
15537
15538 pc = byte_get ((unsigned char *) data, addr_size);
15539 data += addr_size;
15540 base_addr = byte_get ((unsigned char *) data, addr_size);
15541 data += addr_size;
15542 semaphore = byte_get ((unsigned char *) data, addr_size);
15543 data += addr_size;
15544
15545 provider = data;
15546 data += strlen (data) + 1;
15547 probe = data;
15548 data += strlen (data) + 1;
15549 arg_fmt = data;
15550 data += strlen (data) + 1;
15551
15552 printf (_(" Provider: %s\n"), provider);
15553 printf (_(" Name: %s\n"), probe);
15554 printf (_(" Location: "));
15555 print_vma (pc, FULL_HEX);
15556 printf (_(", Base: "));
15557 print_vma (base_addr, FULL_HEX);
15558 printf (_(", Semaphore: "));
15559 print_vma (semaphore, FULL_HEX);
15560 printf ("\n");
15561 printf (_(" Arguments: %s\n"), arg_fmt);
15562
15563 return data == data_end;
15564 }
15565
15566 static const char *
15567 get_ia64_vms_note_type (unsigned e_type)
15568 {
15569 static char buff[64];
15570
15571 switch (e_type)
15572 {
15573 case NT_VMS_MHD:
15574 return _("NT_VMS_MHD (module header)");
15575 case NT_VMS_LNM:
15576 return _("NT_VMS_LNM (language name)");
15577 case NT_VMS_SRC:
15578 return _("NT_VMS_SRC (source files)");
15579 case NT_VMS_TITLE:
15580 return "NT_VMS_TITLE";
15581 case NT_VMS_EIDC:
15582 return _("NT_VMS_EIDC (consistency check)");
15583 case NT_VMS_FPMODE:
15584 return _("NT_VMS_FPMODE (FP mode)");
15585 case NT_VMS_LINKTIME:
15586 return "NT_VMS_LINKTIME";
15587 case NT_VMS_IMGNAM:
15588 return _("NT_VMS_IMGNAM (image name)");
15589 case NT_VMS_IMGID:
15590 return _("NT_VMS_IMGID (image id)");
15591 case NT_VMS_LINKID:
15592 return _("NT_VMS_LINKID (link id)");
15593 case NT_VMS_IMGBID:
15594 return _("NT_VMS_IMGBID (build id)");
15595 case NT_VMS_GSTNAM:
15596 return _("NT_VMS_GSTNAM (sym table name)");
15597 case NT_VMS_ORIG_DYN:
15598 return "NT_VMS_ORIG_DYN";
15599 case NT_VMS_PATCHTIME:
15600 return "NT_VMS_PATCHTIME";
15601 default:
15602 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15603 return buff;
15604 }
15605 }
15606
15607 static int
15608 print_ia64_vms_note (Elf_Internal_Note * pnote)
15609 {
15610 switch (pnote->type)
15611 {
15612 case NT_VMS_MHD:
15613 if (pnote->descsz > 36)
15614 {
15615 size_t l = strlen (pnote->descdata + 34);
15616 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15617 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15618 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15619 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15620 }
15621 else
15622 printf (_(" Invalid size\n"));
15623 break;
15624 case NT_VMS_LNM:
15625 printf (_(" Language: %s\n"), pnote->descdata);
15626 break;
15627 #ifdef BFD64
15628 case NT_VMS_FPMODE:
15629 printf (_(" Floating Point mode: "));
15630 printf ("0x%016" BFD_VMA_FMT "x\n",
15631 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15632 break;
15633 case NT_VMS_LINKTIME:
15634 printf (_(" Link time: "));
15635 print_vms_time
15636 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15637 printf ("\n");
15638 break;
15639 case NT_VMS_PATCHTIME:
15640 printf (_(" Patch time: "));
15641 print_vms_time
15642 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15643 printf ("\n");
15644 break;
15645 case NT_VMS_ORIG_DYN:
15646 printf (_(" Major id: %u, minor id: %u\n"),
15647 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15648 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15649 printf (_(" Last modified : "));
15650 print_vms_time
15651 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15652 printf (_("\n Link flags : "));
15653 printf ("0x%016" BFD_VMA_FMT "x\n",
15654 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15655 printf (_(" Header flags: 0x%08x\n"),
15656 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15657 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15658 break;
15659 #endif
15660 case NT_VMS_IMGNAM:
15661 printf (_(" Image name: %s\n"), pnote->descdata);
15662 break;
15663 case NT_VMS_GSTNAM:
15664 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15665 break;
15666 case NT_VMS_IMGID:
15667 printf (_(" Image id: %s\n"), pnote->descdata);
15668 break;
15669 case NT_VMS_LINKID:
15670 printf (_(" Linker id: %s\n"), pnote->descdata);
15671 break;
15672 default:
15673 break;
15674 }
15675 return 1;
15676 }
15677
15678 /* Note that by the ELF standard, the name field is already null byte
15679 terminated, and namesz includes the terminating null byte.
15680 I.E. the value of namesz for the name "FSF" is 4.
15681
15682 If the value of namesz is zero, there is no name present. */
15683 static int
15684 process_note (Elf_Internal_Note * pnote)
15685 {
15686 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15687 const char * nt;
15688
15689 if (pnote->namesz == 0)
15690 /* If there is no note name, then use the default set of
15691 note type strings. */
15692 nt = get_note_type (pnote->type);
15693
15694 else if (const_strneq (pnote->namedata, "GNU"))
15695 /* GNU-specific object file notes. */
15696 nt = get_gnu_elf_note_type (pnote->type);
15697
15698 else if (const_strneq (pnote->namedata, "FreeBSD"))
15699 /* FreeBSD-specific core file notes. */
15700 nt = get_freebsd_elfcore_note_type (pnote->type);
15701
15702 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15703 /* NetBSD-specific core file notes. */
15704 nt = get_netbsd_elfcore_note_type (pnote->type);
15705
15706 else if (const_strneq (pnote->namedata, "NetBSD"))
15707 /* NetBSD-specific core file notes. */
15708 return process_netbsd_elf_note (pnote);
15709
15710 else if (strneq (pnote->namedata, "SPU/", 4))
15711 {
15712 /* SPU-specific core file notes. */
15713 nt = pnote->namedata + 4;
15714 name = "SPU";
15715 }
15716
15717 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15718 /* VMS/ia64-specific file notes. */
15719 nt = get_ia64_vms_note_type (pnote->type);
15720
15721 else if (const_strneq (pnote->namedata, "stapsdt"))
15722 nt = get_stapsdt_note_type (pnote->type);
15723
15724 else
15725 /* Don't recognize this note name; just use the default set of
15726 note type strings. */
15727 nt = get_note_type (pnote->type);
15728
15729 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15730
15731 if (const_strneq (pnote->namedata, "IPF/VMS"))
15732 return print_ia64_vms_note (pnote);
15733 else if (const_strneq (pnote->namedata, "GNU"))
15734 return print_gnu_note (pnote);
15735 else if (const_strneq (pnote->namedata, "stapsdt"))
15736 return print_stapsdt_note (pnote);
15737 else if (const_strneq (pnote->namedata, "CORE"))
15738 return print_core_note (pnote);
15739 else
15740 return 1;
15741 }
15742
15743
15744 static int
15745 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15746 {
15747 Elf_External_Note * pnotes;
15748 Elf_External_Note * external;
15749 char * end;
15750 int res = 1;
15751
15752 if (length <= 0)
15753 return 0;
15754
15755 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15756 _("notes"));
15757 if (pnotes == NULL)
15758 return 0;
15759
15760 external = pnotes;
15761
15762 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15763 (unsigned long) offset, (unsigned long) length);
15764 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15765
15766 end = (char *) pnotes + length;
15767 while ((char *) external < end)
15768 {
15769 Elf_Internal_Note inote;
15770 size_t min_notesz;
15771 char *next;
15772 char * temp = NULL;
15773 size_t data_remaining = end - (char *) external;
15774
15775 if (!is_ia64_vms ())
15776 {
15777 /* PR binutils/15191
15778 Make sure that there is enough data to read. */
15779 min_notesz = offsetof (Elf_External_Note, name);
15780 if (data_remaining < min_notesz)
15781 {
15782 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15783 (int) data_remaining);
15784 break;
15785 }
15786 inote.type = BYTE_GET (external->type);
15787 inote.namesz = BYTE_GET (external->namesz);
15788 inote.namedata = external->name;
15789 inote.descsz = BYTE_GET (external->descsz);
15790 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15791 /* PR 17531: file: 3443835e. */
15792 if (inote.descdata < (char *) pnotes || inote.descdata > end)
15793 {
15794 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15795 inote.descdata = inote.namedata;
15796 inote.namesz = 0;
15797 }
15798
15799 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15800 next = inote.descdata + align_power (inote.descsz, 2);
15801 }
15802 else
15803 {
15804 Elf64_External_VMS_Note *vms_external;
15805
15806 /* PR binutils/15191
15807 Make sure that there is enough data to read. */
15808 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15809 if (data_remaining < min_notesz)
15810 {
15811 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15812 (int) data_remaining);
15813 break;
15814 }
15815
15816 vms_external = (Elf64_External_VMS_Note *) external;
15817 inote.type = BYTE_GET (vms_external->type);
15818 inote.namesz = BYTE_GET (vms_external->namesz);
15819 inote.namedata = vms_external->name;
15820 inote.descsz = BYTE_GET (vms_external->descsz);
15821 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15822 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15823 next = inote.descdata + align_power (inote.descsz, 3);
15824 }
15825
15826 if (inote.descdata < (char *) external + min_notesz
15827 || next < (char *) external + min_notesz
15828 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15829 || inote.namedata + inote.namesz < inote.namedata
15830 || inote.descdata + inote.descsz < inote.descdata
15831 || data_remaining < (size_t)(next - (char *) external))
15832 {
15833 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15834 (unsigned long) ((char *) external - (char *) pnotes));
15835 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15836 inote.type, inote.namesz, inote.descsz);
15837 break;
15838 }
15839
15840 external = (Elf_External_Note *) next;
15841
15842 /* Verify that name is null terminated. It appears that at least
15843 one version of Linux (RedHat 6.0) generates corefiles that don't
15844 comply with the ELF spec by failing to include the null byte in
15845 namesz. */
15846 if (inote.namedata[inote.namesz - 1] != '\0')
15847 {
15848 temp = (char *) malloc (inote.namesz + 1);
15849 if (temp == NULL)
15850 {
15851 error (_("Out of memory allocating space for inote name\n"));
15852 res = 0;
15853 break;
15854 }
15855
15856 strncpy (temp, inote.namedata, inote.namesz);
15857 temp[inote.namesz] = 0;
15858
15859 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15860 inote.namedata = temp;
15861 }
15862
15863 res &= process_note (& inote);
15864
15865 if (temp != NULL)
15866 {
15867 free (temp);
15868 temp = NULL;
15869 }
15870 }
15871
15872 free (pnotes);
15873
15874 return res;
15875 }
15876
15877 static int
15878 process_corefile_note_segments (FILE * file)
15879 {
15880 Elf_Internal_Phdr * segment;
15881 unsigned int i;
15882 int res = 1;
15883
15884 if (! get_program_headers (file))
15885 return 0;
15886
15887 for (i = 0, segment = program_headers;
15888 i < elf_header.e_phnum;
15889 i++, segment++)
15890 {
15891 if (segment->p_type == PT_NOTE)
15892 res &= process_corefile_note_segment (file,
15893 (bfd_vma) segment->p_offset,
15894 (bfd_vma) segment->p_filesz);
15895 }
15896
15897 return res;
15898 }
15899
15900 static int
15901 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15902 {
15903 Elf_External_Note * pnotes;
15904 Elf_External_Note * external;
15905 char * end;
15906 int res = 1;
15907
15908 if (length <= 0)
15909 return 0;
15910
15911 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15912 _("v850 notes"));
15913 if (pnotes == NULL)
15914 return 0;
15915
15916 external = pnotes;
15917 end = (char*) pnotes + length;
15918
15919 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15920 (unsigned long) offset, (unsigned long) length);
15921
15922 while ((char *) external + sizeof (Elf_External_Note) < end)
15923 {
15924 Elf_External_Note * next;
15925 Elf_Internal_Note inote;
15926
15927 inote.type = BYTE_GET (external->type);
15928 inote.namesz = BYTE_GET (external->namesz);
15929 inote.namedata = external->name;
15930 inote.descsz = BYTE_GET (external->descsz);
15931 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15932 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15933
15934 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
15935 {
15936 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15937 inote.descdata = inote.namedata;
15938 inote.namesz = 0;
15939 }
15940
15941 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15942
15943 if ( ((char *) next > end)
15944 || ((char *) next < (char *) pnotes))
15945 {
15946 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15947 (unsigned long) ((char *) external - (char *) pnotes));
15948 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15949 inote.type, inote.namesz, inote.descsz);
15950 break;
15951 }
15952
15953 external = next;
15954
15955 /* Prevent out-of-bounds indexing. */
15956 if ( inote.namedata + inote.namesz > end
15957 || inote.namedata + inote.namesz < inote.namedata)
15958 {
15959 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15960 (unsigned long) ((char *) external - (char *) pnotes));
15961 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15962 inote.type, inote.namesz, inote.descsz);
15963 break;
15964 }
15965
15966 printf (" %s: ", get_v850_elf_note_type (inote.type));
15967
15968 if (! print_v850_note (& inote))
15969 {
15970 res = 0;
15971 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15972 inote.namesz, inote.descsz);
15973 }
15974 }
15975
15976 free (pnotes);
15977
15978 return res;
15979 }
15980
15981 static int
15982 process_note_sections (FILE * file)
15983 {
15984 Elf_Internal_Shdr * section;
15985 unsigned long i;
15986 int n = 0;
15987 int res = 1;
15988
15989 for (i = 0, section = section_headers;
15990 i < elf_header.e_shnum && section != NULL;
15991 i++, section++)
15992 {
15993 if (section->sh_type == SHT_NOTE)
15994 {
15995 res &= process_corefile_note_segment (file,
15996 (bfd_vma) section->sh_offset,
15997 (bfd_vma) section->sh_size);
15998 n++;
15999 }
16000
16001 if (( elf_header.e_machine == EM_V800
16002 || elf_header.e_machine == EM_V850
16003 || elf_header.e_machine == EM_CYGNUS_V850)
16004 && section->sh_type == SHT_RENESAS_INFO)
16005 {
16006 res &= process_v850_notes (file,
16007 (bfd_vma) section->sh_offset,
16008 (bfd_vma) section->sh_size);
16009 n++;
16010 }
16011 }
16012
16013 if (n == 0)
16014 /* Try processing NOTE segments instead. */
16015 return process_corefile_note_segments (file);
16016
16017 return res;
16018 }
16019
16020 static int
16021 process_notes (FILE * file)
16022 {
16023 /* If we have not been asked to display the notes then do nothing. */
16024 if (! do_notes)
16025 return 1;
16026
16027 if (elf_header.e_type != ET_CORE)
16028 return process_note_sections (file);
16029
16030 /* No program headers means no NOTE segment. */
16031 if (elf_header.e_phnum > 0)
16032 return process_corefile_note_segments (file);
16033
16034 printf (_("No note segments present in the core file.\n"));
16035 return 1;
16036 }
16037
16038 static int
16039 process_arch_specific (FILE * file)
16040 {
16041 if (! do_arch)
16042 return 1;
16043
16044 switch (elf_header.e_machine)
16045 {
16046 case EM_ARM:
16047 return process_arm_specific (file);
16048 case EM_MIPS:
16049 case EM_MIPS_RS3_LE:
16050 return process_mips_specific (file);
16051 break;
16052 case EM_NDS32:
16053 return process_nds32_specific (file);
16054 break;
16055 case EM_PPC:
16056 return process_power_specific (file);
16057 break;
16058 case EM_S390:
16059 case EM_S390_OLD:
16060 return process_s390_specific (file);
16061 break;
16062 case EM_SPARC:
16063 case EM_SPARC32PLUS:
16064 case EM_SPARCV9:
16065 return process_sparc_specific (file);
16066 break;
16067 case EM_TI_C6000:
16068 return process_tic6x_specific (file);
16069 break;
16070 case EM_MSP430:
16071 return process_msp430x_specific (file);
16072 default:
16073 break;
16074 }
16075 return 1;
16076 }
16077
16078 static int
16079 get_file_header (FILE * file)
16080 {
16081 /* Read in the identity array. */
16082 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16083 return 0;
16084
16085 /* Determine how to read the rest of the header. */
16086 switch (elf_header.e_ident[EI_DATA])
16087 {
16088 default: /* fall through */
16089 case ELFDATANONE: /* fall through */
16090 case ELFDATA2LSB:
16091 byte_get = byte_get_little_endian;
16092 byte_put = byte_put_little_endian;
16093 break;
16094 case ELFDATA2MSB:
16095 byte_get = byte_get_big_endian;
16096 byte_put = byte_put_big_endian;
16097 break;
16098 }
16099
16100 /* For now we only support 32 bit and 64 bit ELF files. */
16101 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16102
16103 /* Read in the rest of the header. */
16104 if (is_32bit_elf)
16105 {
16106 Elf32_External_Ehdr ehdr32;
16107
16108 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16109 return 0;
16110
16111 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16112 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16113 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16114 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16115 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16116 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16117 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16118 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16119 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16120 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16121 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16122 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16123 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16124 }
16125 else
16126 {
16127 Elf64_External_Ehdr ehdr64;
16128
16129 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16130 we will not be able to cope with the 64bit data found in
16131 64 ELF files. Detect this now and abort before we start
16132 overwriting things. */
16133 if (sizeof (bfd_vma) < 8)
16134 {
16135 error (_("This instance of readelf has been built without support for a\n\
16136 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16137 return 0;
16138 }
16139
16140 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16141 return 0;
16142
16143 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16144 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16145 elf_header.e_version = BYTE_GET (ehdr64.e_version);
16146 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16147 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16148 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
16149 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16150 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16151 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16152 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16153 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16154 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16155 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16156 }
16157
16158 if (elf_header.e_shoff)
16159 {
16160 /* There may be some extensions in the first section header. Don't
16161 bomb if we can't read it. */
16162 if (is_32bit_elf)
16163 get_32bit_section_headers (file, TRUE);
16164 else
16165 get_64bit_section_headers (file, TRUE);
16166 }
16167
16168 return 1;
16169 }
16170
16171 /* Process one ELF object file according to the command line options.
16172 This file may actually be stored in an archive. The file is
16173 positioned at the start of the ELF object. */
16174
16175 static int
16176 process_object (char * file_name, FILE * file)
16177 {
16178 unsigned int i;
16179
16180 if (! get_file_header (file))
16181 {
16182 error (_("%s: Failed to read file header\n"), file_name);
16183 return 1;
16184 }
16185
16186 /* Initialise per file variables. */
16187 for (i = ARRAY_SIZE (version_info); i--;)
16188 version_info[i] = 0;
16189
16190 for (i = ARRAY_SIZE (dynamic_info); i--;)
16191 dynamic_info[i] = 0;
16192 dynamic_info_DT_GNU_HASH = 0;
16193
16194 /* Process the file. */
16195 if (show_name)
16196 printf (_("\nFile: %s\n"), file_name);
16197
16198 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16199 Note we do this even if cmdline_dump_sects is empty because we
16200 must make sure that the dump_sets array is zeroed out before each
16201 object file is processed. */
16202 if (num_dump_sects > num_cmdline_dump_sects)
16203 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16204
16205 if (num_cmdline_dump_sects > 0)
16206 {
16207 if (num_dump_sects == 0)
16208 /* A sneaky way of allocating the dump_sects array. */
16209 request_dump_bynumber (num_cmdline_dump_sects, 0);
16210
16211 assert (num_dump_sects >= num_cmdline_dump_sects);
16212 memcpy (dump_sects, cmdline_dump_sects,
16213 num_cmdline_dump_sects * sizeof (* dump_sects));
16214 }
16215
16216 if (! process_file_header ())
16217 return 1;
16218
16219 if (! process_section_headers (file))
16220 {
16221 /* Without loaded section headers we cannot process lots of
16222 things. */
16223 do_unwind = do_version = do_dump = do_arch = 0;
16224
16225 if (! do_using_dynamic)
16226 do_syms = do_dyn_syms = do_reloc = 0;
16227 }
16228
16229 if (! process_section_groups (file))
16230 {
16231 /* Without loaded section groups we cannot process unwind. */
16232 do_unwind = 0;
16233 }
16234
16235 if (process_program_headers (file))
16236 process_dynamic_section (file);
16237
16238 process_relocs (file);
16239
16240 process_unwind (file);
16241
16242 process_symbol_table (file);
16243
16244 process_syminfo (file);
16245
16246 process_version_sections (file);
16247
16248 process_section_contents (file);
16249
16250 process_notes (file);
16251
16252 process_gnu_liblist (file);
16253
16254 process_arch_specific (file);
16255
16256 if (program_headers)
16257 {
16258 free (program_headers);
16259 program_headers = NULL;
16260 }
16261
16262 if (section_headers)
16263 {
16264 free (section_headers);
16265 section_headers = NULL;
16266 }
16267
16268 if (string_table)
16269 {
16270 free (string_table);
16271 string_table = NULL;
16272 string_table_length = 0;
16273 }
16274
16275 if (dynamic_strings)
16276 {
16277 free (dynamic_strings);
16278 dynamic_strings = NULL;
16279 dynamic_strings_length = 0;
16280 }
16281
16282 if (dynamic_symbols)
16283 {
16284 free (dynamic_symbols);
16285 dynamic_symbols = NULL;
16286 num_dynamic_syms = 0;
16287 }
16288
16289 if (dynamic_syminfo)
16290 {
16291 free (dynamic_syminfo);
16292 dynamic_syminfo = NULL;
16293 }
16294
16295 if (dynamic_section)
16296 {
16297 free (dynamic_section);
16298 dynamic_section = NULL;
16299 }
16300
16301 if (section_headers_groups)
16302 {
16303 free (section_headers_groups);
16304 section_headers_groups = NULL;
16305 }
16306
16307 if (section_groups)
16308 {
16309 struct group_list * g;
16310 struct group_list * next;
16311
16312 for (i = 0; i < group_count; i++)
16313 {
16314 for (g = section_groups [i].root; g != NULL; g = next)
16315 {
16316 next = g->next;
16317 free (g);
16318 }
16319 }
16320
16321 free (section_groups);
16322 section_groups = NULL;
16323 }
16324
16325 free_debug_memory ();
16326
16327 return 0;
16328 }
16329
16330 /* Process an ELF archive.
16331 On entry the file is positioned just after the ARMAG string. */
16332
16333 static int
16334 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16335 {
16336 struct archive_info arch;
16337 struct archive_info nested_arch;
16338 size_t got;
16339 int ret;
16340
16341 show_name = 1;
16342
16343 /* The ARCH structure is used to hold information about this archive. */
16344 arch.file_name = NULL;
16345 arch.file = NULL;
16346 arch.index_array = NULL;
16347 arch.sym_table = NULL;
16348 arch.longnames = NULL;
16349
16350 /* The NESTED_ARCH structure is used as a single-item cache of information
16351 about a nested archive (when members of a thin archive reside within
16352 another regular archive file). */
16353 nested_arch.file_name = NULL;
16354 nested_arch.file = NULL;
16355 nested_arch.index_array = NULL;
16356 nested_arch.sym_table = NULL;
16357 nested_arch.longnames = NULL;
16358
16359 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16360 {
16361 ret = 1;
16362 goto out;
16363 }
16364
16365 if (do_archive_index)
16366 {
16367 if (arch.sym_table == NULL)
16368 error (_("%s: unable to dump the index as none was found\n"), file_name);
16369 else
16370 {
16371 unsigned long i, l;
16372 unsigned long current_pos;
16373
16374 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16375 file_name, (unsigned long) arch.index_num, arch.sym_size);
16376 current_pos = ftell (file);
16377
16378 for (i = l = 0; i < arch.index_num; i++)
16379 {
16380 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16381 {
16382 char * member_name;
16383
16384 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16385
16386 if (member_name != NULL)
16387 {
16388 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16389
16390 if (qualified_name != NULL)
16391 {
16392 printf (_("Contents of binary %s at offset "), qualified_name);
16393 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16394 putchar ('\n');
16395 free (qualified_name);
16396 }
16397 }
16398 }
16399
16400 if (l >= arch.sym_size)
16401 {
16402 error (_("%s: end of the symbol table reached before the end of the index\n"),
16403 file_name);
16404 break;
16405 }
16406 /* PR 17531: file: 0b6630b2. */
16407 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16408 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16409 }
16410
16411 if (arch.uses_64bit_indicies)
16412 l = (l + 7) & ~ 7;
16413 else
16414 l += l & 1;
16415
16416 if (l < arch.sym_size)
16417 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16418 file_name, arch.sym_size - l);
16419
16420 if (fseek (file, current_pos, SEEK_SET) != 0)
16421 {
16422 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16423 ret = 1;
16424 goto out;
16425 }
16426 }
16427
16428 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16429 && !do_segments && !do_header && !do_dump && !do_version
16430 && !do_histogram && !do_debugging && !do_arch && !do_notes
16431 && !do_section_groups && !do_dyn_syms)
16432 {
16433 ret = 0; /* Archive index only. */
16434 goto out;
16435 }
16436 }
16437
16438 ret = 0;
16439
16440 while (1)
16441 {
16442 char * name;
16443 size_t namelen;
16444 char * qualified_name;
16445
16446 /* Read the next archive header. */
16447 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16448 {
16449 error (_("%s: failed to seek to next archive header\n"), file_name);
16450 return 1;
16451 }
16452 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16453 if (got != sizeof arch.arhdr)
16454 {
16455 if (got == 0)
16456 break;
16457 error (_("%s: failed to read archive header\n"), file_name);
16458 ret = 1;
16459 break;
16460 }
16461 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16462 {
16463 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16464 ret = 1;
16465 break;
16466 }
16467
16468 arch.next_arhdr_offset += sizeof arch.arhdr;
16469
16470 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16471 if (archive_file_size & 01)
16472 ++archive_file_size;
16473
16474 name = get_archive_member_name (&arch, &nested_arch);
16475 if (name == NULL)
16476 {
16477 error (_("%s: bad archive file name\n"), file_name);
16478 ret = 1;
16479 break;
16480 }
16481 namelen = strlen (name);
16482
16483 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16484 if (qualified_name == NULL)
16485 {
16486 error (_("%s: bad archive file name\n"), file_name);
16487 ret = 1;
16488 break;
16489 }
16490
16491 if (is_thin_archive && arch.nested_member_origin == 0)
16492 {
16493 /* This is a proxy for an external member of a thin archive. */
16494 FILE * member_file;
16495 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16496 if (member_file_name == NULL)
16497 {
16498 ret = 1;
16499 break;
16500 }
16501
16502 member_file = fopen (member_file_name, "rb");
16503 if (member_file == NULL)
16504 {
16505 error (_("Input file '%s' is not readable.\n"), member_file_name);
16506 free (member_file_name);
16507 ret = 1;
16508 break;
16509 }
16510
16511 archive_file_offset = arch.nested_member_origin;
16512
16513 ret |= process_object (qualified_name, member_file);
16514
16515 fclose (member_file);
16516 free (member_file_name);
16517 }
16518 else if (is_thin_archive)
16519 {
16520 /* PR 15140: Allow for corrupt thin archives. */
16521 if (nested_arch.file == NULL)
16522 {
16523 error (_("%s: contains corrupt thin archive: %s\n"),
16524 file_name, name);
16525 ret = 1;
16526 break;
16527 }
16528
16529 /* This is a proxy for a member of a nested archive. */
16530 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16531
16532 /* The nested archive file will have been opened and setup by
16533 get_archive_member_name. */
16534 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16535 {
16536 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16537 ret = 1;
16538 break;
16539 }
16540
16541 ret |= process_object (qualified_name, nested_arch.file);
16542 }
16543 else
16544 {
16545 archive_file_offset = arch.next_arhdr_offset;
16546 arch.next_arhdr_offset += archive_file_size;
16547
16548 ret |= process_object (qualified_name, file);
16549 }
16550
16551 if (dump_sects != NULL)
16552 {
16553 free (dump_sects);
16554 dump_sects = NULL;
16555 num_dump_sects = 0;
16556 }
16557
16558 free (qualified_name);
16559 }
16560
16561 out:
16562 if (nested_arch.file != NULL)
16563 fclose (nested_arch.file);
16564 release_archive (&nested_arch);
16565 release_archive (&arch);
16566
16567 return ret;
16568 }
16569
16570 static int
16571 process_file (char * file_name)
16572 {
16573 FILE * file;
16574 struct stat statbuf;
16575 char armag[SARMAG];
16576 int ret;
16577
16578 if (stat (file_name, &statbuf) < 0)
16579 {
16580 if (errno == ENOENT)
16581 error (_("'%s': No such file\n"), file_name);
16582 else
16583 error (_("Could not locate '%s'. System error message: %s\n"),
16584 file_name, strerror (errno));
16585 return 1;
16586 }
16587
16588 if (! S_ISREG (statbuf.st_mode))
16589 {
16590 error (_("'%s' is not an ordinary file\n"), file_name);
16591 return 1;
16592 }
16593
16594 file = fopen (file_name, "rb");
16595 if (file == NULL)
16596 {
16597 error (_("Input file '%s' is not readable.\n"), file_name);
16598 return 1;
16599 }
16600
16601 if (fread (armag, SARMAG, 1, file) != 1)
16602 {
16603 error (_("%s: Failed to read file's magic number\n"), file_name);
16604 fclose (file);
16605 return 1;
16606 }
16607
16608 current_file_size = (bfd_size_type) statbuf.st_size;
16609
16610 if (memcmp (armag, ARMAG, SARMAG) == 0)
16611 ret = process_archive (file_name, file, FALSE);
16612 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16613 ret = process_archive (file_name, file, TRUE);
16614 else
16615 {
16616 if (do_archive_index)
16617 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16618 file_name);
16619
16620 rewind (file);
16621 archive_file_size = archive_file_offset = 0;
16622 ret = process_object (file_name, file);
16623 }
16624
16625 fclose (file);
16626
16627 current_file_size = 0;
16628 return ret;
16629 }
16630
16631 #ifdef SUPPORT_DISASSEMBLY
16632 /* Needed by the i386 disassembler. For extra credit, someone could
16633 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16634 symbols. */
16635
16636 void
16637 print_address (unsigned int addr, FILE * outfile)
16638 {
16639 fprintf (outfile,"0x%8.8x", addr);
16640 }
16641
16642 /* Needed by the i386 disassembler. */
16643 void
16644 db_task_printsym (unsigned int addr)
16645 {
16646 print_address (addr, stderr);
16647 }
16648 #endif
16649
16650 int
16651 main (int argc, char ** argv)
16652 {
16653 int err;
16654
16655 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16656 setlocale (LC_MESSAGES, "");
16657 #endif
16658 #if defined (HAVE_SETLOCALE)
16659 setlocale (LC_CTYPE, "");
16660 #endif
16661 bindtextdomain (PACKAGE, LOCALEDIR);
16662 textdomain (PACKAGE);
16663
16664 expandargv (&argc, &argv);
16665
16666 parse_args (argc, argv);
16667
16668 if (num_dump_sects > 0)
16669 {
16670 /* Make a copy of the dump_sects array. */
16671 cmdline_dump_sects = (dump_type *)
16672 malloc (num_dump_sects * sizeof (* dump_sects));
16673 if (cmdline_dump_sects == NULL)
16674 error (_("Out of memory allocating dump request table.\n"));
16675 else
16676 {
16677 memcpy (cmdline_dump_sects, dump_sects,
16678 num_dump_sects * sizeof (* dump_sects));
16679 num_cmdline_dump_sects = num_dump_sects;
16680 }
16681 }
16682
16683 if (optind < (argc - 1))
16684 show_name = 1;
16685 else if (optind >= argc)
16686 {
16687 warn (_("Nothing to do.\n"));
16688 usage (stderr);
16689 }
16690
16691 err = 0;
16692 while (optind < argc)
16693 err |= process_file (argv[optind++]);
16694
16695 if (dump_sects != NULL)
16696 free (dump_sects);
16697 if (cmdline_dump_sects != NULL)
16698 free (cmdline_dump_sects);
16699
16700 return err;
16701 }