[ARC] Don't allow pc-rel relocations for J* instructions.
[deliverable/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%" BFD_VMA_FMT "x"
350 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351 nmemb, size, reason);
352 return NULL;
353 }
354
355 /* Check for size overflow. */
356 if (amt < nmemb)
357 {
358 if (reason)
359 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361 nmemb, size, reason);
362 return NULL;
363 }
364
365 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366 attempting to allocate memory when the read is bound to fail. */
367 if (amt > current_file_size
368 || offset + archive_file_offset + amt > current_file_size)
369 {
370 if (reason)
371 error (_("Reading 0x%" BFD_VMA_FMT "x"
372 " bytes extends past end of file for %s\n"),
373 amt, reason);
374 return NULL;
375 }
376
377 if (fseek (file, archive_file_offset + offset, SEEK_SET))
378 {
379 if (reason)
380 error (_("Unable to seek to 0x%lx for %s\n"),
381 archive_file_offset + offset, reason);
382 return NULL;
383 }
384
385 mvar = var;
386 if (mvar == NULL)
387 {
388 /* Check for overflow. */
389 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390 /* + 1 so that we can '\0' terminate invalid string table sections. */
391 mvar = malloc ((size_t) amt + 1);
392
393 if (mvar == NULL)
394 {
395 if (reason)
396 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397 " bytes for %s\n"),
398 amt, reason);
399 return NULL;
400 }
401
402 ((char *) mvar)[amt] = '\0';
403 }
404
405 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
406 {
407 if (reason)
408 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409 amt, reason);
410 if (mvar != var)
411 free (mvar);
412 return NULL;
413 }
414
415 return mvar;
416 }
417
418 /* Print a VMA value. */
419
420 static int
421 print_vma (bfd_vma vma, print_mode mode)
422 {
423 int nc = 0;
424
425 switch (mode)
426 {
427 case FULL_HEX:
428 nc = printf ("0x");
429 /* Drop through. */
430
431 case LONG_HEX:
432 #ifdef BFD64
433 if (is_32bit_elf)
434 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
435 #endif
436 printf_vma (vma);
437 return nc + 16;
438
439 case DEC_5:
440 if (vma <= 99999)
441 return printf ("%5" BFD_VMA_FMT "d", vma);
442 /* Drop through. */
443
444 case PREFIX_HEX:
445 nc = printf ("0x");
446 /* Drop through. */
447
448 case HEX:
449 return nc + printf ("%" BFD_VMA_FMT "x", vma);
450
451 case DEC:
452 return printf ("%" BFD_VMA_FMT "d", vma);
453
454 case UNSIGNED:
455 return printf ("%" BFD_VMA_FMT "u", vma);
456 }
457 return 0;
458 }
459
460 /* Display a symbol on stdout. Handles the display of control characters and
461 multibye characters (assuming the host environment supports them).
462
463 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
464
465 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466 padding as necessary.
467
468 Returns the number of emitted characters. */
469
470 static unsigned int
471 print_symbol (int width, const char *symbol)
472 {
473 bfd_boolean extra_padding = FALSE;
474 int num_printed = 0;
475 #ifdef HAVE_MBSTATE_T
476 mbstate_t state;
477 #endif
478 int width_remaining;
479
480 if (width < 0)
481 {
482 /* Keep the width positive. This also helps. */
483 width = - width;
484 extra_padding = TRUE;
485 }
486 assert (width != 0);
487
488 if (do_wide)
489 /* Set the remaining width to a very large value.
490 This simplifies the code below. */
491 width_remaining = INT_MAX;
492 else
493 width_remaining = width;
494
495 #ifdef HAVE_MBSTATE_T
496 /* Initialise the multibyte conversion state. */
497 memset (& state, 0, sizeof (state));
498 #endif
499
500 while (width_remaining)
501 {
502 size_t n;
503 const char c = *symbol++;
504
505 if (c == 0)
506 break;
507
508 /* Do not print control characters directly as they can affect terminal
509 settings. Such characters usually appear in the names generated
510 by the assembler for local labels. */
511 if (ISCNTRL (c))
512 {
513 if (width_remaining < 2)
514 break;
515
516 printf ("^%c", c + 0x40);
517 width_remaining -= 2;
518 num_printed += 2;
519 }
520 else if (ISPRINT (c))
521 {
522 putchar (c);
523 width_remaining --;
524 num_printed ++;
525 }
526 else
527 {
528 #ifdef HAVE_MBSTATE_T
529 wchar_t w;
530 #endif
531 /* Let printf do the hard work of displaying multibyte characters. */
532 printf ("%.1s", symbol - 1);
533 width_remaining --;
534 num_printed ++;
535
536 #ifdef HAVE_MBSTATE_T
537 /* Try to find out how many bytes made up the character that was
538 just printed. Advance the symbol pointer past the bytes that
539 were displayed. */
540 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
541 #else
542 n = 1;
543 #endif
544 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
545 symbol += (n - 1);
546 }
547 }
548
549 if (extra_padding && num_printed < width)
550 {
551 /* Fill in the remaining spaces. */
552 printf ("%-*s", width - num_printed, " ");
553 num_printed = width;
554 }
555
556 return num_printed;
557 }
558
559 /* Returns a pointer to a static buffer containing a printable version of
560 the given section's name. Like print_symbol, except that it does not try
561 to print multibyte characters, it just interprets them as hex values. */
562
563 static const char *
564 printable_section_name (const Elf_Internal_Shdr * sec)
565 {
566 #define MAX_PRINT_SEC_NAME_LEN 128
567 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568 const char * name = SECTION_NAME (sec);
569 char * buf = sec_name_buf;
570 char c;
571 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
572
573 while ((c = * name ++) != 0)
574 {
575 if (ISCNTRL (c))
576 {
577 if (remaining < 2)
578 break;
579
580 * buf ++ = '^';
581 * buf ++ = c + 0x40;
582 remaining -= 2;
583 }
584 else if (ISPRINT (c))
585 {
586 * buf ++ = c;
587 remaining -= 1;
588 }
589 else
590 {
591 static char hex[17] = "0123456789ABCDEF";
592
593 if (remaining < 4)
594 break;
595 * buf ++ = '<';
596 * buf ++ = hex[(c & 0xf0) >> 4];
597 * buf ++ = hex[c & 0x0f];
598 * buf ++ = '>';
599 remaining -= 4;
600 }
601
602 if (remaining == 0)
603 break;
604 }
605
606 * buf = 0;
607 return sec_name_buf;
608 }
609
610 static const char *
611 printable_section_name_from_index (unsigned long ndx)
612 {
613 if (ndx >= elf_header.e_shnum)
614 return _("<corrupt>");
615
616 return printable_section_name (section_headers + ndx);
617 }
618
619 /* Return a pointer to section NAME, or NULL if no such section exists. */
620
621 static Elf_Internal_Shdr *
622 find_section (const char * name)
623 {
624 unsigned int i;
625
626 for (i = 0; i < elf_header.e_shnum; i++)
627 if (streq (SECTION_NAME (section_headers + i), name))
628 return section_headers + i;
629
630 return NULL;
631 }
632
633 /* Return a pointer to a section containing ADDR, or NULL if no such
634 section exists. */
635
636 static Elf_Internal_Shdr *
637 find_section_by_address (bfd_vma addr)
638 {
639 unsigned int i;
640
641 for (i = 0; i < elf_header.e_shnum; i++)
642 {
643 Elf_Internal_Shdr *sec = section_headers + i;
644 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
645 return sec;
646 }
647
648 return NULL;
649 }
650
651 static Elf_Internal_Shdr *
652 find_section_by_type (unsigned int type)
653 {
654 unsigned int i;
655
656 for (i = 0; i < elf_header.e_shnum; i++)
657 {
658 Elf_Internal_Shdr *sec = section_headers + i;
659 if (sec->sh_type == type)
660 return sec;
661 }
662
663 return NULL;
664 }
665
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667 restricted to the list of sections given in SET. */
668
669 static Elf_Internal_Shdr *
670 find_section_in_set (const char * name, unsigned int * set)
671 {
672 unsigned int i;
673
674 if (set != NULL)
675 {
676 while ((i = *set++) > 0)
677 if (streq (SECTION_NAME (section_headers + i), name))
678 return section_headers + i;
679 }
680
681 return find_section (name);
682 }
683
684 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
685 bytes read. */
686
687 static inline unsigned long
688 read_uleb128 (unsigned char *data,
689 unsigned int *length_return,
690 const unsigned char * const end)
691 {
692 return read_leb128 (data, length_return, FALSE, end);
693 }
694
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696 This OS has so many departures from the ELF standard that we test it at
697 many places. */
698
699 static inline int
700 is_ia64_vms (void)
701 {
702 return elf_header.e_machine == EM_IA_64
703 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
704 }
705
706 /* Guess the relocation size commonly used by the specific machines. */
707
708 static int
709 guess_is_rela (unsigned int e_machine)
710 {
711 switch (e_machine)
712 {
713 /* Targets that use REL relocations. */
714 case EM_386:
715 case EM_IAMCU:
716 case EM_960:
717 case EM_ARM:
718 case EM_D10V:
719 case EM_CYGNUS_D10V:
720 case EM_DLX:
721 case EM_MIPS:
722 case EM_MIPS_RS3_LE:
723 case EM_CYGNUS_M32R:
724 case EM_SCORE:
725 case EM_XGATE:
726 return FALSE;
727
728 /* Targets that use RELA relocations. */
729 case EM_68K:
730 case EM_860:
731 case EM_AARCH64:
732 case EM_ADAPTEVA_EPIPHANY:
733 case EM_ALPHA:
734 case EM_ALTERA_NIOS2:
735 case EM_ARC:
736 case EM_ARC_COMPACT:
737 case EM_ARC_COMPACT2:
738 case EM_AVR:
739 case EM_AVR_OLD:
740 case EM_BLACKFIN:
741 case EM_CR16:
742 case EM_CRIS:
743 case EM_CRX:
744 case EM_D30V:
745 case EM_CYGNUS_D30V:
746 case EM_FR30:
747 case EM_FT32:
748 case EM_CYGNUS_FR30:
749 case EM_CYGNUS_FRV:
750 case EM_H8S:
751 case EM_H8_300:
752 case EM_H8_300H:
753 case EM_IA_64:
754 case EM_IP2K:
755 case EM_IP2K_OLD:
756 case EM_IQ2000:
757 case EM_LATTICEMICO32:
758 case EM_M32C_OLD:
759 case EM_M32C:
760 case EM_M32R:
761 case EM_MCORE:
762 case EM_CYGNUS_MEP:
763 case EM_METAG:
764 case EM_MMIX:
765 case EM_MN10200:
766 case EM_CYGNUS_MN10200:
767 case EM_MN10300:
768 case EM_CYGNUS_MN10300:
769 case EM_MOXIE:
770 case EM_MSP430:
771 case EM_MSP430_OLD:
772 case EM_MT:
773 case EM_NDS32:
774 case EM_NIOS32:
775 case EM_OR1K:
776 case EM_PPC64:
777 case EM_PPC:
778 case EM_RL78:
779 case EM_RX:
780 case EM_S390:
781 case EM_S390_OLD:
782 case EM_SH:
783 case EM_SPARC:
784 case EM_SPARC32PLUS:
785 case EM_SPARCV9:
786 case EM_SPU:
787 case EM_TI_C6000:
788 case EM_TILEGX:
789 case EM_TILEPRO:
790 case EM_V800:
791 case EM_V850:
792 case EM_CYGNUS_V850:
793 case EM_VAX:
794 case EM_VISIUM:
795 case EM_X86_64:
796 case EM_L1OM:
797 case EM_K1OM:
798 case EM_XSTORMY16:
799 case EM_XTENSA:
800 case EM_XTENSA_OLD:
801 case EM_MICROBLAZE:
802 case EM_MICROBLAZE_OLD:
803 return TRUE;
804
805 case EM_68HC05:
806 case EM_68HC08:
807 case EM_68HC11:
808 case EM_68HC16:
809 case EM_FX66:
810 case EM_ME16:
811 case EM_MMA:
812 case EM_NCPU:
813 case EM_NDR1:
814 case EM_PCP:
815 case EM_ST100:
816 case EM_ST19:
817 case EM_ST7:
818 case EM_ST9PLUS:
819 case EM_STARCORE:
820 case EM_SVX:
821 case EM_TINYJ:
822 default:
823 warn (_("Don't know about relocations on this machine architecture\n"));
824 return FALSE;
825 }
826 }
827
828 static int
829 slurp_rela_relocs (FILE * file,
830 unsigned long rel_offset,
831 unsigned long rel_size,
832 Elf_Internal_Rela ** relasp,
833 unsigned long * nrelasp)
834 {
835 Elf_Internal_Rela * relas;
836 size_t nrelas;
837 unsigned int i;
838
839 if (is_32bit_elf)
840 {
841 Elf32_External_Rela * erelas;
842
843 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
844 rel_size, _("32-bit relocation data"));
845 if (!erelas)
846 return 0;
847
848 nrelas = rel_size / sizeof (Elf32_External_Rela);
849
850 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851 sizeof (Elf_Internal_Rela));
852
853 if (relas == NULL)
854 {
855 free (erelas);
856 error (_("out of memory parsing relocs\n"));
857 return 0;
858 }
859
860 for (i = 0; i < nrelas; i++)
861 {
862 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863 relas[i].r_info = BYTE_GET (erelas[i].r_info);
864 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
865 }
866
867 free (erelas);
868 }
869 else
870 {
871 Elf64_External_Rela * erelas;
872
873 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
874 rel_size, _("64-bit relocation data"));
875 if (!erelas)
876 return 0;
877
878 nrelas = rel_size / sizeof (Elf64_External_Rela);
879
880 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881 sizeof (Elf_Internal_Rela));
882
883 if (relas == NULL)
884 {
885 free (erelas);
886 error (_("out of memory parsing relocs\n"));
887 return 0;
888 }
889
890 for (i = 0; i < nrelas; i++)
891 {
892 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893 relas[i].r_info = BYTE_GET (erelas[i].r_info);
894 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
895
896 /* The #ifdef BFD64 below is to prevent a compile time
897 warning. We know that if we do not have a 64 bit data
898 type that we will never execute this code anyway. */
899 #ifdef BFD64
900 if (elf_header.e_machine == EM_MIPS
901 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
902 {
903 /* In little-endian objects, r_info isn't really a
904 64-bit little-endian value: it has a 32-bit
905 little-endian symbol index followed by four
906 individual byte fields. Reorder INFO
907 accordingly. */
908 bfd_vma inf = relas[i].r_info;
909 inf = (((inf & 0xffffffff) << 32)
910 | ((inf >> 56) & 0xff)
911 | ((inf >> 40) & 0xff00)
912 | ((inf >> 24) & 0xff0000)
913 | ((inf >> 8) & 0xff000000));
914 relas[i].r_info = inf;
915 }
916 #endif /* BFD64 */
917 }
918
919 free (erelas);
920 }
921 *relasp = relas;
922 *nrelasp = nrelas;
923 return 1;
924 }
925
926 static int
927 slurp_rel_relocs (FILE * file,
928 unsigned long rel_offset,
929 unsigned long rel_size,
930 Elf_Internal_Rela ** relsp,
931 unsigned long * nrelsp)
932 {
933 Elf_Internal_Rela * rels;
934 size_t nrels;
935 unsigned int i;
936
937 if (is_32bit_elf)
938 {
939 Elf32_External_Rel * erels;
940
941 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
942 rel_size, _("32-bit relocation data"));
943 if (!erels)
944 return 0;
945
946 nrels = rel_size / sizeof (Elf32_External_Rel);
947
948 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
949
950 if (rels == NULL)
951 {
952 free (erels);
953 error (_("out of memory parsing relocs\n"));
954 return 0;
955 }
956
957 for (i = 0; i < nrels; i++)
958 {
959 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960 rels[i].r_info = BYTE_GET (erels[i].r_info);
961 rels[i].r_addend = 0;
962 }
963
964 free (erels);
965 }
966 else
967 {
968 Elf64_External_Rel * erels;
969
970 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
971 rel_size, _("64-bit relocation data"));
972 if (!erels)
973 return 0;
974
975 nrels = rel_size / sizeof (Elf64_External_Rel);
976
977 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
978
979 if (rels == NULL)
980 {
981 free (erels);
982 error (_("out of memory parsing relocs\n"));
983 return 0;
984 }
985
986 for (i = 0; i < nrels; i++)
987 {
988 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989 rels[i].r_info = BYTE_GET (erels[i].r_info);
990 rels[i].r_addend = 0;
991
992 /* The #ifdef BFD64 below is to prevent a compile time
993 warning. We know that if we do not have a 64 bit data
994 type that we will never execute this code anyway. */
995 #ifdef BFD64
996 if (elf_header.e_machine == EM_MIPS
997 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
998 {
999 /* In little-endian objects, r_info isn't really a
1000 64-bit little-endian value: it has a 32-bit
1001 little-endian symbol index followed by four
1002 individual byte fields. Reorder INFO
1003 accordingly. */
1004 bfd_vma inf = rels[i].r_info;
1005 inf = (((inf & 0xffffffff) << 32)
1006 | ((inf >> 56) & 0xff)
1007 | ((inf >> 40) & 0xff00)
1008 | ((inf >> 24) & 0xff0000)
1009 | ((inf >> 8) & 0xff000000));
1010 rels[i].r_info = inf;
1011 }
1012 #endif /* BFD64 */
1013 }
1014
1015 free (erels);
1016 }
1017 *relsp = rels;
1018 *nrelsp = nrels;
1019 return 1;
1020 }
1021
1022 /* Returns the reloc type extracted from the reloc info field. */
1023
1024 static unsigned int
1025 get_reloc_type (bfd_vma reloc_info)
1026 {
1027 if (is_32bit_elf)
1028 return ELF32_R_TYPE (reloc_info);
1029
1030 switch (elf_header.e_machine)
1031 {
1032 case EM_MIPS:
1033 /* Note: We assume that reloc_info has already been adjusted for us. */
1034 return ELF64_MIPS_R_TYPE (reloc_info);
1035
1036 case EM_SPARCV9:
1037 return ELF64_R_TYPE_ID (reloc_info);
1038
1039 default:
1040 return ELF64_R_TYPE (reloc_info);
1041 }
1042 }
1043
1044 /* Return the symbol index extracted from the reloc info field. */
1045
1046 static bfd_vma
1047 get_reloc_symindex (bfd_vma reloc_info)
1048 {
1049 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1050 }
1051
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1054 {
1055 return
1056 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1057 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1058 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059 /* TI compiler uses ELFOSABI_NONE. */
1060 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1061 }
1062
1063 /* Display the contents of the relocation data found at the specified
1064 offset. */
1065
1066 static void
1067 dump_relocations (FILE * file,
1068 unsigned long rel_offset,
1069 unsigned long rel_size,
1070 Elf_Internal_Sym * symtab,
1071 unsigned long nsyms,
1072 char * strtab,
1073 unsigned long strtablen,
1074 int is_rela,
1075 int is_dynsym)
1076 {
1077 unsigned int i;
1078 Elf_Internal_Rela * rels;
1079
1080 if (is_rela == UNKNOWN)
1081 is_rela = guess_is_rela (elf_header.e_machine);
1082
1083 if (is_rela)
1084 {
1085 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1086 return;
1087 }
1088 else
1089 {
1090 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1091 return;
1092 }
1093
1094 if (is_32bit_elf)
1095 {
1096 if (is_rela)
1097 {
1098 if (do_wide)
1099 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1100 else
1101 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1102 }
1103 else
1104 {
1105 if (do_wide)
1106 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1107 else
1108 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1109 }
1110 }
1111 else
1112 {
1113 if (is_rela)
1114 {
1115 if (do_wide)
1116 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1117 else
1118 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1119 }
1120 else
1121 {
1122 if (do_wide)
1123 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1124 else
1125 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1126 }
1127 }
1128
1129 for (i = 0; i < rel_size; i++)
1130 {
1131 const char * rtype;
1132 bfd_vma offset;
1133 bfd_vma inf;
1134 bfd_vma symtab_index;
1135 bfd_vma type;
1136
1137 offset = rels[i].r_offset;
1138 inf = rels[i].r_info;
1139
1140 type = get_reloc_type (inf);
1141 symtab_index = get_reloc_symindex (inf);
1142
1143 if (is_32bit_elf)
1144 {
1145 printf ("%8.8lx %8.8lx ",
1146 (unsigned long) offset & 0xffffffff,
1147 (unsigned long) inf & 0xffffffff);
1148 }
1149 else
1150 {
1151 #if BFD_HOST_64BIT_LONG
1152 printf (do_wide
1153 ? "%16.16lx %16.16lx "
1154 : "%12.12lx %12.12lx ",
1155 offset, inf);
1156 #elif BFD_HOST_64BIT_LONG_LONG
1157 #ifndef __MSVCRT__
1158 printf (do_wide
1159 ? "%16.16llx %16.16llx "
1160 : "%12.12llx %12.12llx ",
1161 offset, inf);
1162 #else
1163 printf (do_wide
1164 ? "%16.16I64x %16.16I64x "
1165 : "%12.12I64x %12.12I64x ",
1166 offset, inf);
1167 #endif
1168 #else
1169 printf (do_wide
1170 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1171 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1172 _bfd_int64_high (offset),
1173 _bfd_int64_low (offset),
1174 _bfd_int64_high (inf),
1175 _bfd_int64_low (inf));
1176 #endif
1177 }
1178
1179 switch (elf_header.e_machine)
1180 {
1181 default:
1182 rtype = NULL;
1183 break;
1184
1185 case EM_AARCH64:
1186 rtype = elf_aarch64_reloc_type (type);
1187 break;
1188
1189 case EM_M32R:
1190 case EM_CYGNUS_M32R:
1191 rtype = elf_m32r_reloc_type (type);
1192 break;
1193
1194 case EM_386:
1195 case EM_IAMCU:
1196 rtype = elf_i386_reloc_type (type);
1197 break;
1198
1199 case EM_68HC11:
1200 case EM_68HC12:
1201 rtype = elf_m68hc11_reloc_type (type);
1202 break;
1203
1204 case EM_68K:
1205 rtype = elf_m68k_reloc_type (type);
1206 break;
1207
1208 case EM_960:
1209 rtype = elf_i960_reloc_type (type);
1210 break;
1211
1212 case EM_AVR:
1213 case EM_AVR_OLD:
1214 rtype = elf_avr_reloc_type (type);
1215 break;
1216
1217 case EM_OLD_SPARCV9:
1218 case EM_SPARC32PLUS:
1219 case EM_SPARCV9:
1220 case EM_SPARC:
1221 rtype = elf_sparc_reloc_type (type);
1222 break;
1223
1224 case EM_SPU:
1225 rtype = elf_spu_reloc_type (type);
1226 break;
1227
1228 case EM_V800:
1229 rtype = v800_reloc_type (type);
1230 break;
1231 case EM_V850:
1232 case EM_CYGNUS_V850:
1233 rtype = v850_reloc_type (type);
1234 break;
1235
1236 case EM_D10V:
1237 case EM_CYGNUS_D10V:
1238 rtype = elf_d10v_reloc_type (type);
1239 break;
1240
1241 case EM_D30V:
1242 case EM_CYGNUS_D30V:
1243 rtype = elf_d30v_reloc_type (type);
1244 break;
1245
1246 case EM_DLX:
1247 rtype = elf_dlx_reloc_type (type);
1248 break;
1249
1250 case EM_SH:
1251 rtype = elf_sh_reloc_type (type);
1252 break;
1253
1254 case EM_MN10300:
1255 case EM_CYGNUS_MN10300:
1256 rtype = elf_mn10300_reloc_type (type);
1257 break;
1258
1259 case EM_MN10200:
1260 case EM_CYGNUS_MN10200:
1261 rtype = elf_mn10200_reloc_type (type);
1262 break;
1263
1264 case EM_FR30:
1265 case EM_CYGNUS_FR30:
1266 rtype = elf_fr30_reloc_type (type);
1267 break;
1268
1269 case EM_CYGNUS_FRV:
1270 rtype = elf_frv_reloc_type (type);
1271 break;
1272
1273 case EM_FT32:
1274 rtype = elf_ft32_reloc_type (type);
1275 break;
1276
1277 case EM_MCORE:
1278 rtype = elf_mcore_reloc_type (type);
1279 break;
1280
1281 case EM_MMIX:
1282 rtype = elf_mmix_reloc_type (type);
1283 break;
1284
1285 case EM_MOXIE:
1286 rtype = elf_moxie_reloc_type (type);
1287 break;
1288
1289 case EM_MSP430:
1290 if (uses_msp430x_relocs ())
1291 {
1292 rtype = elf_msp430x_reloc_type (type);
1293 break;
1294 }
1295 case EM_MSP430_OLD:
1296 rtype = elf_msp430_reloc_type (type);
1297 break;
1298
1299 case EM_NDS32:
1300 rtype = elf_nds32_reloc_type (type);
1301 break;
1302
1303 case EM_PPC:
1304 rtype = elf_ppc_reloc_type (type);
1305 break;
1306
1307 case EM_PPC64:
1308 rtype = elf_ppc64_reloc_type (type);
1309 break;
1310
1311 case EM_MIPS:
1312 case EM_MIPS_RS3_LE:
1313 rtype = elf_mips_reloc_type (type);
1314 break;
1315
1316 case EM_ALPHA:
1317 rtype = elf_alpha_reloc_type (type);
1318 break;
1319
1320 case EM_ARM:
1321 rtype = elf_arm_reloc_type (type);
1322 break;
1323
1324 case EM_ARC:
1325 case EM_ARC_COMPACT:
1326 case EM_ARC_COMPACT2:
1327 rtype = elf_arc_reloc_type (type);
1328 break;
1329
1330 case EM_PARISC:
1331 rtype = elf_hppa_reloc_type (type);
1332 break;
1333
1334 case EM_H8_300:
1335 case EM_H8_300H:
1336 case EM_H8S:
1337 rtype = elf_h8_reloc_type (type);
1338 break;
1339
1340 case EM_OR1K:
1341 rtype = elf_or1k_reloc_type (type);
1342 break;
1343
1344 case EM_PJ:
1345 case EM_PJ_OLD:
1346 rtype = elf_pj_reloc_type (type);
1347 break;
1348 case EM_IA_64:
1349 rtype = elf_ia64_reloc_type (type);
1350 break;
1351
1352 case EM_CRIS:
1353 rtype = elf_cris_reloc_type (type);
1354 break;
1355
1356 case EM_860:
1357 rtype = elf_i860_reloc_type (type);
1358 break;
1359
1360 case EM_X86_64:
1361 case EM_L1OM:
1362 case EM_K1OM:
1363 rtype = elf_x86_64_reloc_type (type);
1364 break;
1365
1366 case EM_S370:
1367 rtype = i370_reloc_type (type);
1368 break;
1369
1370 case EM_S390_OLD:
1371 case EM_S390:
1372 rtype = elf_s390_reloc_type (type);
1373 break;
1374
1375 case EM_SCORE:
1376 rtype = elf_score_reloc_type (type);
1377 break;
1378
1379 case EM_XSTORMY16:
1380 rtype = elf_xstormy16_reloc_type (type);
1381 break;
1382
1383 case EM_CRX:
1384 rtype = elf_crx_reloc_type (type);
1385 break;
1386
1387 case EM_VAX:
1388 rtype = elf_vax_reloc_type (type);
1389 break;
1390
1391 case EM_VISIUM:
1392 rtype = elf_visium_reloc_type (type);
1393 break;
1394
1395 case EM_ADAPTEVA_EPIPHANY:
1396 rtype = elf_epiphany_reloc_type (type);
1397 break;
1398
1399 case EM_IP2K:
1400 case EM_IP2K_OLD:
1401 rtype = elf_ip2k_reloc_type (type);
1402 break;
1403
1404 case EM_IQ2000:
1405 rtype = elf_iq2000_reloc_type (type);
1406 break;
1407
1408 case EM_XTENSA_OLD:
1409 case EM_XTENSA:
1410 rtype = elf_xtensa_reloc_type (type);
1411 break;
1412
1413 case EM_LATTICEMICO32:
1414 rtype = elf_lm32_reloc_type (type);
1415 break;
1416
1417 case EM_M32C_OLD:
1418 case EM_M32C:
1419 rtype = elf_m32c_reloc_type (type);
1420 break;
1421
1422 case EM_MT:
1423 rtype = elf_mt_reloc_type (type);
1424 break;
1425
1426 case EM_BLACKFIN:
1427 rtype = elf_bfin_reloc_type (type);
1428 break;
1429
1430 case EM_CYGNUS_MEP:
1431 rtype = elf_mep_reloc_type (type);
1432 break;
1433
1434 case EM_CR16:
1435 rtype = elf_cr16_reloc_type (type);
1436 break;
1437
1438 case EM_MICROBLAZE:
1439 case EM_MICROBLAZE_OLD:
1440 rtype = elf_microblaze_reloc_type (type);
1441 break;
1442
1443 case EM_RL78:
1444 rtype = elf_rl78_reloc_type (type);
1445 break;
1446
1447 case EM_RX:
1448 rtype = elf_rx_reloc_type (type);
1449 break;
1450
1451 case EM_METAG:
1452 rtype = elf_metag_reloc_type (type);
1453 break;
1454
1455 case EM_XC16X:
1456 case EM_C166:
1457 rtype = elf_xc16x_reloc_type (type);
1458 break;
1459
1460 case EM_TI_C6000:
1461 rtype = elf_tic6x_reloc_type (type);
1462 break;
1463
1464 case EM_TILEGX:
1465 rtype = elf_tilegx_reloc_type (type);
1466 break;
1467
1468 case EM_TILEPRO:
1469 rtype = elf_tilepro_reloc_type (type);
1470 break;
1471
1472 case EM_XGATE:
1473 rtype = elf_xgate_reloc_type (type);
1474 break;
1475
1476 case EM_ALTERA_NIOS2:
1477 rtype = elf_nios2_reloc_type (type);
1478 break;
1479 }
1480
1481 if (rtype == NULL)
1482 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1483 else
1484 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1485
1486 if (elf_header.e_machine == EM_ALPHA
1487 && rtype != NULL
1488 && streq (rtype, "R_ALPHA_LITUSE")
1489 && is_rela)
1490 {
1491 switch (rels[i].r_addend)
1492 {
1493 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1494 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1495 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1497 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1498 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500 default: rtype = NULL;
1501 }
1502 if (rtype)
1503 printf (" (%s)", rtype);
1504 else
1505 {
1506 putchar (' ');
1507 printf (_("<unknown addend: %lx>"),
1508 (unsigned long) rels[i].r_addend);
1509 }
1510 }
1511 else if (symtab_index)
1512 {
1513 if (symtab == NULL || symtab_index >= nsyms)
1514 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1515 else
1516 {
1517 Elf_Internal_Sym * psym;
1518 const char * version_string;
1519 enum versioned_symbol_info sym_info;
1520 unsigned short vna_other;
1521
1522 psym = symtab + symtab_index;
1523
1524 version_string
1525 = get_symbol_version_string (file, is_dynsym,
1526 strtab, strtablen,
1527 symtab_index,
1528 psym,
1529 &sym_info,
1530 &vna_other);
1531
1532 printf (" ");
1533
1534 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1535 {
1536 const char * name;
1537 unsigned int len;
1538 unsigned int width = is_32bit_elf ? 8 : 14;
1539
1540 /* Relocations against GNU_IFUNC symbols do not use the value
1541 of the symbol as the address to relocate against. Instead
1542 they invoke the function named by the symbol and use its
1543 result as the address for relocation.
1544
1545 To indicate this to the user, do not display the value of
1546 the symbol in the "Symbols's Value" field. Instead show
1547 its name followed by () as a hint that the symbol is
1548 invoked. */
1549
1550 if (strtab == NULL
1551 || psym->st_name == 0
1552 || psym->st_name >= strtablen)
1553 name = "??";
1554 else
1555 name = strtab + psym->st_name;
1556
1557 len = print_symbol (width, name);
1558 if (version_string)
1559 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1560 version_string);
1561 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1562 }
1563 else
1564 {
1565 print_vma (psym->st_value, LONG_HEX);
1566
1567 printf (is_32bit_elf ? " " : " ");
1568 }
1569
1570 if (psym->st_name == 0)
1571 {
1572 const char * sec_name = "<null>";
1573 char name_buf[40];
1574
1575 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1576 {
1577 if (psym->st_shndx < elf_header.e_shnum)
1578 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1579 else if (psym->st_shndx == SHN_ABS)
1580 sec_name = "ABS";
1581 else if (psym->st_shndx == SHN_COMMON)
1582 sec_name = "COMMON";
1583 else if ((elf_header.e_machine == EM_MIPS
1584 && psym->st_shndx == SHN_MIPS_SCOMMON)
1585 || (elf_header.e_machine == EM_TI_C6000
1586 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1587 sec_name = "SCOMMON";
1588 else if (elf_header.e_machine == EM_MIPS
1589 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590 sec_name = "SUNDEF";
1591 else if ((elf_header.e_machine == EM_X86_64
1592 || elf_header.e_machine == EM_L1OM
1593 || elf_header.e_machine == EM_K1OM)
1594 && psym->st_shndx == SHN_X86_64_LCOMMON)
1595 sec_name = "LARGE_COMMON";
1596 else if (elf_header.e_machine == EM_IA_64
1597 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599 sec_name = "ANSI_COM";
1600 else if (is_ia64_vms ()
1601 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602 sec_name = "VMS_SYMVEC";
1603 else
1604 {
1605 sprintf (name_buf, "<section 0x%x>",
1606 (unsigned int) psym->st_shndx);
1607 sec_name = name_buf;
1608 }
1609 }
1610 print_symbol (22, sec_name);
1611 }
1612 else if (strtab == NULL)
1613 printf (_("<string table index: %3ld>"), psym->st_name);
1614 else if (psym->st_name >= strtablen)
1615 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1616 else
1617 {
1618 print_symbol (22, strtab + psym->st_name);
1619 if (version_string)
1620 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1621 version_string);
1622 }
1623
1624 if (is_rela)
1625 {
1626 bfd_vma off = rels[i].r_addend;
1627
1628 if ((bfd_signed_vma) off < 0)
1629 printf (" - %" BFD_VMA_FMT "x", - off);
1630 else
1631 printf (" + %" BFD_VMA_FMT "x", off);
1632 }
1633 }
1634 }
1635 else if (is_rela)
1636 {
1637 bfd_vma off = rels[i].r_addend;
1638
1639 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1640 if ((bfd_signed_vma) off < 0)
1641 printf ("-%" BFD_VMA_FMT "x", - off);
1642 else
1643 printf ("%" BFD_VMA_FMT "x", off);
1644 }
1645
1646 if (elf_header.e_machine == EM_SPARCV9
1647 && rtype != NULL
1648 && streq (rtype, "R_SPARC_OLO10"))
1649 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1650
1651 putchar ('\n');
1652
1653 #ifdef BFD64
1654 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1655 {
1656 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1658 const char * rtype2 = elf_mips_reloc_type (type2);
1659 const char * rtype3 = elf_mips_reloc_type (type3);
1660
1661 printf (" Type2: ");
1662
1663 if (rtype2 == NULL)
1664 printf (_("unrecognized: %-7lx"),
1665 (unsigned long) type2 & 0xffffffff);
1666 else
1667 printf ("%-17.17s", rtype2);
1668
1669 printf ("\n Type3: ");
1670
1671 if (rtype3 == NULL)
1672 printf (_("unrecognized: %-7lx"),
1673 (unsigned long) type3 & 0xffffffff);
1674 else
1675 printf ("%-17.17s", rtype3);
1676
1677 putchar ('\n');
1678 }
1679 #endif /* BFD64 */
1680 }
1681
1682 free (rels);
1683 }
1684
1685 static const char *
1686 get_mips_dynamic_type (unsigned long type)
1687 {
1688 switch (type)
1689 {
1690 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696 case DT_MIPS_MSYM: return "MIPS_MSYM";
1697 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1707 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1708 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1734 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1736 default:
1737 return NULL;
1738 }
1739 }
1740
1741 static const char *
1742 get_sparc64_dynamic_type (unsigned long type)
1743 {
1744 switch (type)
1745 {
1746 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1747 default:
1748 return NULL;
1749 }
1750 }
1751
1752 static const char *
1753 get_ppc_dynamic_type (unsigned long type)
1754 {
1755 switch (type)
1756 {
1757 case DT_PPC_GOT: return "PPC_GOT";
1758 case DT_PPC_OPT: return "PPC_OPT";
1759 default:
1760 return NULL;
1761 }
1762 }
1763
1764 static const char *
1765 get_ppc64_dynamic_type (unsigned long type)
1766 {
1767 switch (type)
1768 {
1769 case DT_PPC64_GLINK: return "PPC64_GLINK";
1770 case DT_PPC64_OPD: return "PPC64_OPD";
1771 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1772 case DT_PPC64_OPT: return "PPC64_OPT";
1773 default:
1774 return NULL;
1775 }
1776 }
1777
1778 static const char *
1779 get_parisc_dynamic_type (unsigned long type)
1780 {
1781 switch (type)
1782 {
1783 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1784 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1785 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1786 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1787 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1788 case DT_HP_PREINIT: return "HP_PREINIT";
1789 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1790 case DT_HP_NEEDED: return "HP_NEEDED";
1791 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1792 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1793 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1794 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1795 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1796 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1797 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1798 case DT_HP_FILTERED: return "HP_FILTERED";
1799 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1800 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1801 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1802 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1803 case DT_PLT: return "PLT";
1804 case DT_PLT_SIZE: return "PLT_SIZE";
1805 case DT_DLT: return "DLT";
1806 case DT_DLT_SIZE: return "DLT_SIZE";
1807 default:
1808 return NULL;
1809 }
1810 }
1811
1812 static const char *
1813 get_ia64_dynamic_type (unsigned long type)
1814 {
1815 switch (type)
1816 {
1817 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1818 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1819 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1820 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1821 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1823 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1824 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1825 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1826 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1827 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1828 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1829 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1830 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1831 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1832 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1833 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1834 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1835 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1836 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1837 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1838 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1839 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1840 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1841 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1842 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1843 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1844 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1845 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1846 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1847 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1848 default:
1849 return NULL;
1850 }
1851 }
1852
1853 static const char *
1854 get_alpha_dynamic_type (unsigned long type)
1855 {
1856 switch (type)
1857 {
1858 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1859 default:
1860 return NULL;
1861 }
1862 }
1863
1864 static const char *
1865 get_score_dynamic_type (unsigned long type)
1866 {
1867 switch (type)
1868 {
1869 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1870 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1871 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1872 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1873 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1874 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1875 default:
1876 return NULL;
1877 }
1878 }
1879
1880 static const char *
1881 get_tic6x_dynamic_type (unsigned long type)
1882 {
1883 switch (type)
1884 {
1885 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1886 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1887 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1888 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1889 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1890 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1891 default:
1892 return NULL;
1893 }
1894 }
1895
1896 static const char *
1897 get_nios2_dynamic_type (unsigned long type)
1898 {
1899 switch (type)
1900 {
1901 case DT_NIOS2_GP: return "NIOS2_GP";
1902 default:
1903 return NULL;
1904 }
1905 }
1906
1907 static const char *
1908 get_dynamic_type (unsigned long type)
1909 {
1910 static char buff[64];
1911
1912 switch (type)
1913 {
1914 case DT_NULL: return "NULL";
1915 case DT_NEEDED: return "NEEDED";
1916 case DT_PLTRELSZ: return "PLTRELSZ";
1917 case DT_PLTGOT: return "PLTGOT";
1918 case DT_HASH: return "HASH";
1919 case DT_STRTAB: return "STRTAB";
1920 case DT_SYMTAB: return "SYMTAB";
1921 case DT_RELA: return "RELA";
1922 case DT_RELASZ: return "RELASZ";
1923 case DT_RELAENT: return "RELAENT";
1924 case DT_STRSZ: return "STRSZ";
1925 case DT_SYMENT: return "SYMENT";
1926 case DT_INIT: return "INIT";
1927 case DT_FINI: return "FINI";
1928 case DT_SONAME: return "SONAME";
1929 case DT_RPATH: return "RPATH";
1930 case DT_SYMBOLIC: return "SYMBOLIC";
1931 case DT_REL: return "REL";
1932 case DT_RELSZ: return "RELSZ";
1933 case DT_RELENT: return "RELENT";
1934 case DT_PLTREL: return "PLTREL";
1935 case DT_DEBUG: return "DEBUG";
1936 case DT_TEXTREL: return "TEXTREL";
1937 case DT_JMPREL: return "JMPREL";
1938 case DT_BIND_NOW: return "BIND_NOW";
1939 case DT_INIT_ARRAY: return "INIT_ARRAY";
1940 case DT_FINI_ARRAY: return "FINI_ARRAY";
1941 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1942 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1943 case DT_RUNPATH: return "RUNPATH";
1944 case DT_FLAGS: return "FLAGS";
1945
1946 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1947 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1948
1949 case DT_CHECKSUM: return "CHECKSUM";
1950 case DT_PLTPADSZ: return "PLTPADSZ";
1951 case DT_MOVEENT: return "MOVEENT";
1952 case DT_MOVESZ: return "MOVESZ";
1953 case DT_FEATURE: return "FEATURE";
1954 case DT_POSFLAG_1: return "POSFLAG_1";
1955 case DT_SYMINSZ: return "SYMINSZ";
1956 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1957
1958 case DT_ADDRRNGLO: return "ADDRRNGLO";
1959 case DT_CONFIG: return "CONFIG";
1960 case DT_DEPAUDIT: return "DEPAUDIT";
1961 case DT_AUDIT: return "AUDIT";
1962 case DT_PLTPAD: return "PLTPAD";
1963 case DT_MOVETAB: return "MOVETAB";
1964 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1965
1966 case DT_VERSYM: return "VERSYM";
1967
1968 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1969 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1970 case DT_RELACOUNT: return "RELACOUNT";
1971 case DT_RELCOUNT: return "RELCOUNT";
1972 case DT_FLAGS_1: return "FLAGS_1";
1973 case DT_VERDEF: return "VERDEF";
1974 case DT_VERDEFNUM: return "VERDEFNUM";
1975 case DT_VERNEED: return "VERNEED";
1976 case DT_VERNEEDNUM: return "VERNEEDNUM";
1977
1978 case DT_AUXILIARY: return "AUXILIARY";
1979 case DT_USED: return "USED";
1980 case DT_FILTER: return "FILTER";
1981
1982 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1983 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1984 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1985 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1986 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1987 case DT_GNU_HASH: return "GNU_HASH";
1988
1989 default:
1990 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1991 {
1992 const char * result;
1993
1994 switch (elf_header.e_machine)
1995 {
1996 case EM_MIPS:
1997 case EM_MIPS_RS3_LE:
1998 result = get_mips_dynamic_type (type);
1999 break;
2000 case EM_SPARCV9:
2001 result = get_sparc64_dynamic_type (type);
2002 break;
2003 case EM_PPC:
2004 result = get_ppc_dynamic_type (type);
2005 break;
2006 case EM_PPC64:
2007 result = get_ppc64_dynamic_type (type);
2008 break;
2009 case EM_IA_64:
2010 result = get_ia64_dynamic_type (type);
2011 break;
2012 case EM_ALPHA:
2013 result = get_alpha_dynamic_type (type);
2014 break;
2015 case EM_SCORE:
2016 result = get_score_dynamic_type (type);
2017 break;
2018 case EM_TI_C6000:
2019 result = get_tic6x_dynamic_type (type);
2020 break;
2021 case EM_ALTERA_NIOS2:
2022 result = get_nios2_dynamic_type (type);
2023 break;
2024 default:
2025 result = NULL;
2026 break;
2027 }
2028
2029 if (result != NULL)
2030 return result;
2031
2032 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2033 }
2034 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2035 || (elf_header.e_machine == EM_PARISC
2036 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2037 {
2038 const char * result;
2039
2040 switch (elf_header.e_machine)
2041 {
2042 case EM_PARISC:
2043 result = get_parisc_dynamic_type (type);
2044 break;
2045 case EM_IA_64:
2046 result = get_ia64_dynamic_type (type);
2047 break;
2048 default:
2049 result = NULL;
2050 break;
2051 }
2052
2053 if (result != NULL)
2054 return result;
2055
2056 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2057 type);
2058 }
2059 else
2060 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2061
2062 return buff;
2063 }
2064 }
2065
2066 static char *
2067 get_file_type (unsigned e_type)
2068 {
2069 static char buff[32];
2070
2071 switch (e_type)
2072 {
2073 case ET_NONE: return _("NONE (None)");
2074 case ET_REL: return _("REL (Relocatable file)");
2075 case ET_EXEC: return _("EXEC (Executable file)");
2076 case ET_DYN: return _("DYN (Shared object file)");
2077 case ET_CORE: return _("CORE (Core file)");
2078
2079 default:
2080 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2081 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2082 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2083 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2084 else
2085 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2086 return buff;
2087 }
2088 }
2089
2090 static char *
2091 get_machine_name (unsigned e_machine)
2092 {
2093 static char buff[64]; /* XXX */
2094
2095 switch (e_machine)
2096 {
2097 case EM_NONE: return _("None");
2098 case EM_AARCH64: return "AArch64";
2099 case EM_M32: return "WE32100";
2100 case EM_SPARC: return "Sparc";
2101 case EM_SPU: return "SPU";
2102 case EM_386: return "Intel 80386";
2103 case EM_68K: return "MC68000";
2104 case EM_88K: return "MC88000";
2105 case EM_IAMCU: return "Intel MCU";
2106 case EM_860: return "Intel 80860";
2107 case EM_MIPS: return "MIPS R3000";
2108 case EM_S370: return "IBM System/370";
2109 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2110 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2111 case EM_PARISC: return "HPPA";
2112 case EM_PPC_OLD: return "Power PC (old)";
2113 case EM_SPARC32PLUS: return "Sparc v8+" ;
2114 case EM_960: return "Intel 90860";
2115 case EM_PPC: return "PowerPC";
2116 case EM_PPC64: return "PowerPC64";
2117 case EM_FR20: return "Fujitsu FR20";
2118 case EM_FT32: return "FTDI FT32";
2119 case EM_RH32: return "TRW RH32";
2120 case EM_MCORE: return "MCORE";
2121 case EM_ARM: return "ARM";
2122 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2123 case EM_SH: return "Renesas / SuperH SH";
2124 case EM_SPARCV9: return "Sparc v9";
2125 case EM_TRICORE: return "Siemens Tricore";
2126 case EM_ARC: return "ARC";
2127 case EM_ARC_COMPACT: return "ARCompact";
2128 case EM_ARC_COMPACT2: return "ARCv2";
2129 case EM_H8_300: return "Renesas H8/300";
2130 case EM_H8_300H: return "Renesas H8/300H";
2131 case EM_H8S: return "Renesas H8S";
2132 case EM_H8_500: return "Renesas H8/500";
2133 case EM_IA_64: return "Intel IA-64";
2134 case EM_MIPS_X: return "Stanford MIPS-X";
2135 case EM_COLDFIRE: return "Motorola Coldfire";
2136 case EM_ALPHA: return "Alpha";
2137 case EM_CYGNUS_D10V:
2138 case EM_D10V: return "d10v";
2139 case EM_CYGNUS_D30V:
2140 case EM_D30V: return "d30v";
2141 case EM_CYGNUS_M32R:
2142 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2143 case EM_CYGNUS_V850:
2144 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2145 case EM_V850: return "Renesas V850";
2146 case EM_CYGNUS_MN10300:
2147 case EM_MN10300: return "mn10300";
2148 case EM_CYGNUS_MN10200:
2149 case EM_MN10200: return "mn10200";
2150 case EM_MOXIE: return "Moxie";
2151 case EM_CYGNUS_FR30:
2152 case EM_FR30: return "Fujitsu FR30";
2153 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2154 case EM_PJ_OLD:
2155 case EM_PJ: return "picoJava";
2156 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2157 case EM_PCP: return "Siemens PCP";
2158 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2159 case EM_NDR1: return "Denso NDR1 microprocesspr";
2160 case EM_STARCORE: return "Motorola Star*Core processor";
2161 case EM_ME16: return "Toyota ME16 processor";
2162 case EM_ST100: return "STMicroelectronics ST100 processor";
2163 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2164 case EM_PDSP: return "Sony DSP processor";
2165 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2166 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2167 case EM_FX66: return "Siemens FX66 microcontroller";
2168 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2169 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2170 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2171 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2172 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2173 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2174 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2175 case EM_SVX: return "Silicon Graphics SVx";
2176 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2177 case EM_VAX: return "Digital VAX";
2178 case EM_VISIUM: return "CDS VISIUMcore processor";
2179 case EM_AVR_OLD:
2180 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2181 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2182 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2183 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2184 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2185 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2186 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2187 case EM_PRISM: return "Vitesse Prism";
2188 case EM_X86_64: return "Advanced Micro Devices X86-64";
2189 case EM_L1OM: return "Intel L1OM";
2190 case EM_K1OM: return "Intel K1OM";
2191 case EM_S390_OLD:
2192 case EM_S390: return "IBM S/390";
2193 case EM_SCORE: return "SUNPLUS S+Core";
2194 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2195 case EM_OR1K: return "OpenRISC 1000";
2196 case EM_CRX: return "National Semiconductor CRX microprocessor";
2197 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2198 case EM_DLX: return "OpenDLX";
2199 case EM_IP2K_OLD:
2200 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2201 case EM_IQ2000: return "Vitesse IQ2000";
2202 case EM_XTENSA_OLD:
2203 case EM_XTENSA: return "Tensilica Xtensa Processor";
2204 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2205 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2206 case EM_NS32K: return "National Semiconductor 32000 series";
2207 case EM_TPC: return "Tenor Network TPC processor";
2208 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2209 case EM_MAX: return "MAX Processor";
2210 case EM_CR: return "National Semiconductor CompactRISC";
2211 case EM_F2MC16: return "Fujitsu F2MC16";
2212 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2213 case EM_LATTICEMICO32: return "Lattice Mico32";
2214 case EM_M32C_OLD:
2215 case EM_M32C: return "Renesas M32c";
2216 case EM_MT: return "Morpho Techologies MT processor";
2217 case EM_BLACKFIN: return "Analog Devices Blackfin";
2218 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2219 case EM_SEP: return "Sharp embedded microprocessor";
2220 case EM_ARCA: return "Arca RISC microprocessor";
2221 case EM_UNICORE: return "Unicore";
2222 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2223 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2224 case EM_NIOS32: return "Altera Nios";
2225 case EM_ALTERA_NIOS2: return "Altera Nios II";
2226 case EM_C166:
2227 case EM_XC16X: return "Infineon Technologies xc16x";
2228 case EM_M16C: return "Renesas M16C series microprocessors";
2229 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2230 case EM_CE: return "Freescale Communication Engine RISC core";
2231 case EM_TSK3000: return "Altium TSK3000 core";
2232 case EM_RS08: return "Freescale RS08 embedded processor";
2233 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2234 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2235 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2236 case EM_SE_C17: return "Seiko Epson C17 family";
2237 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2238 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2239 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2240 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2241 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2242 case EM_R32C: return "Renesas R32C series microprocessors";
2243 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2244 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2245 case EM_8051: return "Intel 8051 and variants";
2246 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2247 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2248 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2249 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2250 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2251 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2252 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2253 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2254 case EM_CR16:
2255 case EM_MICROBLAZE:
2256 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2257 case EM_RL78: return "Renesas RL78";
2258 case EM_RX: return "Renesas RX";
2259 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2260 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2261 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2262 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2263 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2264 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2265 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2266 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2267 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2268 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2269 case EM_CUDA: return "NVIDIA CUDA architecture";
2270 case EM_XGATE: return "Motorola XGATE embedded processor";
2271 default:
2272 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2273 return buff;
2274 }
2275 }
2276
2277 static void
2278 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2279 {
2280 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2281 other compilers don't a specific architecture type in the e_flags, and
2282 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2283 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2284 architectures.
2285
2286 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2287 but also sets a specific architecture type in the e_flags field.
2288
2289 However, when decoding the flags we don't worry if we see an
2290 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2291 ARCEM architecture type. */
2292
2293 switch (e_flags & EF_ARC_MACH_MSK)
2294 {
2295 /* We only expect these to occur for EM_ARC_COMPACT2. */
2296 case EF_ARC_CPU_ARCV2EM:
2297 strcat (buf, ", ARC EM");
2298 break;
2299 case EF_ARC_CPU_ARCV2HS:
2300 strcat (buf, ", ARC HS");
2301 break;
2302
2303 /* We only expect these to occur for EM_ARC_COMPACT. */
2304 case E_ARC_MACH_ARC600:
2305 strcat (buf, ", ARC600");
2306 break;
2307 case E_ARC_MACH_ARC601:
2308 strcat (buf, ", ARC601");
2309 break;
2310 case E_ARC_MACH_ARC700:
2311 strcat (buf, ", ARC700");
2312 break;
2313 case E_ARC_MACH_NPS400:
2314 strcat (buf, ", NPS400");
2315 break;
2316
2317 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2318 new ELF with new architecture being read by an old version of
2319 readelf, or (c) An ELF built with non-GNU compiler that does not
2320 set the architecture in the e_flags. */
2321 default:
2322 if (e_machine == EM_ARC_COMPACT)
2323 strcat (buf, ", Unknown ARCompact");
2324 else
2325 strcat (buf, ", Unknown ARC");
2326 break;
2327 }
2328
2329 switch (e_flags & EF_ARC_OSABI_MSK)
2330 {
2331 case E_ARC_OSABI_ORIG:
2332 strcat (buf, ", (ABI:legacy)");
2333 break;
2334 case E_ARC_OSABI_V2:
2335 strcat (buf, ", (ABI:v2)");
2336 break;
2337 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2338 case E_ARC_OSABI_V3:
2339 strcat (buf, ", v3 no-legacy-syscalls ABI");
2340 break;
2341 default:
2342 strcat (buf, ", unrecognised ARC OSABI flag");
2343 break;
2344 }
2345 }
2346
2347 static void
2348 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2349 {
2350 unsigned eabi;
2351 int unknown = 0;
2352
2353 eabi = EF_ARM_EABI_VERSION (e_flags);
2354 e_flags &= ~ EF_ARM_EABIMASK;
2355
2356 /* Handle "generic" ARM flags. */
2357 if (e_flags & EF_ARM_RELEXEC)
2358 {
2359 strcat (buf, ", relocatable executable");
2360 e_flags &= ~ EF_ARM_RELEXEC;
2361 }
2362
2363 /* Now handle EABI specific flags. */
2364 switch (eabi)
2365 {
2366 default:
2367 strcat (buf, ", <unrecognized EABI>");
2368 if (e_flags)
2369 unknown = 1;
2370 break;
2371
2372 case EF_ARM_EABI_VER1:
2373 strcat (buf, ", Version1 EABI");
2374 while (e_flags)
2375 {
2376 unsigned flag;
2377
2378 /* Process flags one bit at a time. */
2379 flag = e_flags & - e_flags;
2380 e_flags &= ~ flag;
2381
2382 switch (flag)
2383 {
2384 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2385 strcat (buf, ", sorted symbol tables");
2386 break;
2387
2388 default:
2389 unknown = 1;
2390 break;
2391 }
2392 }
2393 break;
2394
2395 case EF_ARM_EABI_VER2:
2396 strcat (buf, ", Version2 EABI");
2397 while (e_flags)
2398 {
2399 unsigned flag;
2400
2401 /* Process flags one bit at a time. */
2402 flag = e_flags & - e_flags;
2403 e_flags &= ~ flag;
2404
2405 switch (flag)
2406 {
2407 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2408 strcat (buf, ", sorted symbol tables");
2409 break;
2410
2411 case EF_ARM_DYNSYMSUSESEGIDX:
2412 strcat (buf, ", dynamic symbols use segment index");
2413 break;
2414
2415 case EF_ARM_MAPSYMSFIRST:
2416 strcat (buf, ", mapping symbols precede others");
2417 break;
2418
2419 default:
2420 unknown = 1;
2421 break;
2422 }
2423 }
2424 break;
2425
2426 case EF_ARM_EABI_VER3:
2427 strcat (buf, ", Version3 EABI");
2428 break;
2429
2430 case EF_ARM_EABI_VER4:
2431 strcat (buf, ", Version4 EABI");
2432 while (e_flags)
2433 {
2434 unsigned flag;
2435
2436 /* Process flags one bit at a time. */
2437 flag = e_flags & - e_flags;
2438 e_flags &= ~ flag;
2439
2440 switch (flag)
2441 {
2442 case EF_ARM_BE8:
2443 strcat (buf, ", BE8");
2444 break;
2445
2446 case EF_ARM_LE8:
2447 strcat (buf, ", LE8");
2448 break;
2449
2450 default:
2451 unknown = 1;
2452 break;
2453 }
2454 break;
2455 }
2456 break;
2457
2458 case EF_ARM_EABI_VER5:
2459 strcat (buf, ", Version5 EABI");
2460 while (e_flags)
2461 {
2462 unsigned flag;
2463
2464 /* Process flags one bit at a time. */
2465 flag = e_flags & - e_flags;
2466 e_flags &= ~ flag;
2467
2468 switch (flag)
2469 {
2470 case EF_ARM_BE8:
2471 strcat (buf, ", BE8");
2472 break;
2473
2474 case EF_ARM_LE8:
2475 strcat (buf, ", LE8");
2476 break;
2477
2478 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2479 strcat (buf, ", soft-float ABI");
2480 break;
2481
2482 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2483 strcat (buf, ", hard-float ABI");
2484 break;
2485
2486 default:
2487 unknown = 1;
2488 break;
2489 }
2490 }
2491 break;
2492
2493 case EF_ARM_EABI_UNKNOWN:
2494 strcat (buf, ", GNU EABI");
2495 while (e_flags)
2496 {
2497 unsigned flag;
2498
2499 /* Process flags one bit at a time. */
2500 flag = e_flags & - e_flags;
2501 e_flags &= ~ flag;
2502
2503 switch (flag)
2504 {
2505 case EF_ARM_INTERWORK:
2506 strcat (buf, ", interworking enabled");
2507 break;
2508
2509 case EF_ARM_APCS_26:
2510 strcat (buf, ", uses APCS/26");
2511 break;
2512
2513 case EF_ARM_APCS_FLOAT:
2514 strcat (buf, ", uses APCS/float");
2515 break;
2516
2517 case EF_ARM_PIC:
2518 strcat (buf, ", position independent");
2519 break;
2520
2521 case EF_ARM_ALIGN8:
2522 strcat (buf, ", 8 bit structure alignment");
2523 break;
2524
2525 case EF_ARM_NEW_ABI:
2526 strcat (buf, ", uses new ABI");
2527 break;
2528
2529 case EF_ARM_OLD_ABI:
2530 strcat (buf, ", uses old ABI");
2531 break;
2532
2533 case EF_ARM_SOFT_FLOAT:
2534 strcat (buf, ", software FP");
2535 break;
2536
2537 case EF_ARM_VFP_FLOAT:
2538 strcat (buf, ", VFP");
2539 break;
2540
2541 case EF_ARM_MAVERICK_FLOAT:
2542 strcat (buf, ", Maverick FP");
2543 break;
2544
2545 default:
2546 unknown = 1;
2547 break;
2548 }
2549 }
2550 }
2551
2552 if (unknown)
2553 strcat (buf,_(", <unknown>"));
2554 }
2555
2556 static void
2557 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2558 {
2559 --size; /* Leave space for null terminator. */
2560
2561 switch (e_flags & EF_AVR_MACH)
2562 {
2563 case E_AVR_MACH_AVR1:
2564 strncat (buf, ", avr:1", size);
2565 break;
2566 case E_AVR_MACH_AVR2:
2567 strncat (buf, ", avr:2", size);
2568 break;
2569 case E_AVR_MACH_AVR25:
2570 strncat (buf, ", avr:25", size);
2571 break;
2572 case E_AVR_MACH_AVR3:
2573 strncat (buf, ", avr:3", size);
2574 break;
2575 case E_AVR_MACH_AVR31:
2576 strncat (buf, ", avr:31", size);
2577 break;
2578 case E_AVR_MACH_AVR35:
2579 strncat (buf, ", avr:35", size);
2580 break;
2581 case E_AVR_MACH_AVR4:
2582 strncat (buf, ", avr:4", size);
2583 break;
2584 case E_AVR_MACH_AVR5:
2585 strncat (buf, ", avr:5", size);
2586 break;
2587 case E_AVR_MACH_AVR51:
2588 strncat (buf, ", avr:51", size);
2589 break;
2590 case E_AVR_MACH_AVR6:
2591 strncat (buf, ", avr:6", size);
2592 break;
2593 case E_AVR_MACH_AVRTINY:
2594 strncat (buf, ", avr:100", size);
2595 break;
2596 case E_AVR_MACH_XMEGA1:
2597 strncat (buf, ", avr:101", size);
2598 break;
2599 case E_AVR_MACH_XMEGA2:
2600 strncat (buf, ", avr:102", size);
2601 break;
2602 case E_AVR_MACH_XMEGA3:
2603 strncat (buf, ", avr:103", size);
2604 break;
2605 case E_AVR_MACH_XMEGA4:
2606 strncat (buf, ", avr:104", size);
2607 break;
2608 case E_AVR_MACH_XMEGA5:
2609 strncat (buf, ", avr:105", size);
2610 break;
2611 case E_AVR_MACH_XMEGA6:
2612 strncat (buf, ", avr:106", size);
2613 break;
2614 case E_AVR_MACH_XMEGA7:
2615 strncat (buf, ", avr:107", size);
2616 break;
2617 default:
2618 strncat (buf, ", avr:<unknown>", size);
2619 break;
2620 }
2621
2622 size -= strlen (buf);
2623 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2624 strncat (buf, ", link-relax", size);
2625 }
2626
2627 static void
2628 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2629 {
2630 unsigned abi;
2631 unsigned arch;
2632 unsigned config;
2633 unsigned version;
2634 int has_fpu = 0;
2635 int r = 0;
2636
2637 static const char *ABI_STRINGS[] =
2638 {
2639 "ABI v0", /* use r5 as return register; only used in N1213HC */
2640 "ABI v1", /* use r0 as return register */
2641 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2642 "ABI v2fp", /* for FPU */
2643 "AABI",
2644 "ABI2 FP+"
2645 };
2646 static const char *VER_STRINGS[] =
2647 {
2648 "Andes ELF V1.3 or older",
2649 "Andes ELF V1.3.1",
2650 "Andes ELF V1.4"
2651 };
2652 static const char *ARCH_STRINGS[] =
2653 {
2654 "",
2655 "Andes Star v1.0",
2656 "Andes Star v2.0",
2657 "Andes Star v3.0",
2658 "Andes Star v3.0m"
2659 };
2660
2661 abi = EF_NDS_ABI & e_flags;
2662 arch = EF_NDS_ARCH & e_flags;
2663 config = EF_NDS_INST & e_flags;
2664 version = EF_NDS32_ELF_VERSION & e_flags;
2665
2666 memset (buf, 0, size);
2667
2668 switch (abi)
2669 {
2670 case E_NDS_ABI_V0:
2671 case E_NDS_ABI_V1:
2672 case E_NDS_ABI_V2:
2673 case E_NDS_ABI_V2FP:
2674 case E_NDS_ABI_AABI:
2675 case E_NDS_ABI_V2FP_PLUS:
2676 /* In case there are holes in the array. */
2677 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2678 break;
2679
2680 default:
2681 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2682 break;
2683 }
2684
2685 switch (version)
2686 {
2687 case E_NDS32_ELF_VER_1_2:
2688 case E_NDS32_ELF_VER_1_3:
2689 case E_NDS32_ELF_VER_1_4:
2690 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2691 break;
2692
2693 default:
2694 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2695 break;
2696 }
2697
2698 if (E_NDS_ABI_V0 == abi)
2699 {
2700 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2701 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2702 if (arch == E_NDS_ARCH_STAR_V1_0)
2703 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2704 return;
2705 }
2706
2707 switch (arch)
2708 {
2709 case E_NDS_ARCH_STAR_V1_0:
2710 case E_NDS_ARCH_STAR_V2_0:
2711 case E_NDS_ARCH_STAR_V3_0:
2712 case E_NDS_ARCH_STAR_V3_M:
2713 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2714 break;
2715
2716 default:
2717 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2718 /* ARCH version determines how the e_flags are interpreted.
2719 If it is unknown, we cannot proceed. */
2720 return;
2721 }
2722
2723 /* Newer ABI; Now handle architecture specific flags. */
2724 if (arch == E_NDS_ARCH_STAR_V1_0)
2725 {
2726 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2727 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2728
2729 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2730 r += snprintf (buf + r, size -r, ", MAC");
2731
2732 if (config & E_NDS32_HAS_DIV_INST)
2733 r += snprintf (buf + r, size -r, ", DIV");
2734
2735 if (config & E_NDS32_HAS_16BIT_INST)
2736 r += snprintf (buf + r, size -r, ", 16b");
2737 }
2738 else
2739 {
2740 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2741 {
2742 if (version <= E_NDS32_ELF_VER_1_3)
2743 r += snprintf (buf + r, size -r, ", [B8]");
2744 else
2745 r += snprintf (buf + r, size -r, ", EX9");
2746 }
2747
2748 if (config & E_NDS32_HAS_MAC_DX_INST)
2749 r += snprintf (buf + r, size -r, ", MAC_DX");
2750
2751 if (config & E_NDS32_HAS_DIV_DX_INST)
2752 r += snprintf (buf + r, size -r, ", DIV_DX");
2753
2754 if (config & E_NDS32_HAS_16BIT_INST)
2755 {
2756 if (version <= E_NDS32_ELF_VER_1_3)
2757 r += snprintf (buf + r, size -r, ", 16b");
2758 else
2759 r += snprintf (buf + r, size -r, ", IFC");
2760 }
2761 }
2762
2763 if (config & E_NDS32_HAS_EXT_INST)
2764 r += snprintf (buf + r, size -r, ", PERF1");
2765
2766 if (config & E_NDS32_HAS_EXT2_INST)
2767 r += snprintf (buf + r, size -r, ", PERF2");
2768
2769 if (config & E_NDS32_HAS_FPU_INST)
2770 {
2771 has_fpu = 1;
2772 r += snprintf (buf + r, size -r, ", FPU_SP");
2773 }
2774
2775 if (config & E_NDS32_HAS_FPU_DP_INST)
2776 {
2777 has_fpu = 1;
2778 r += snprintf (buf + r, size -r, ", FPU_DP");
2779 }
2780
2781 if (config & E_NDS32_HAS_FPU_MAC_INST)
2782 {
2783 has_fpu = 1;
2784 r += snprintf (buf + r, size -r, ", FPU_MAC");
2785 }
2786
2787 if (has_fpu)
2788 {
2789 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2790 {
2791 case E_NDS32_FPU_REG_8SP_4DP:
2792 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2793 break;
2794 case E_NDS32_FPU_REG_16SP_8DP:
2795 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2796 break;
2797 case E_NDS32_FPU_REG_32SP_16DP:
2798 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2799 break;
2800 case E_NDS32_FPU_REG_32SP_32DP:
2801 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2802 break;
2803 }
2804 }
2805
2806 if (config & E_NDS32_HAS_AUDIO_INST)
2807 r += snprintf (buf + r, size -r, ", AUDIO");
2808
2809 if (config & E_NDS32_HAS_STRING_INST)
2810 r += snprintf (buf + r, size -r, ", STR");
2811
2812 if (config & E_NDS32_HAS_REDUCED_REGS)
2813 r += snprintf (buf + r, size -r, ", 16REG");
2814
2815 if (config & E_NDS32_HAS_VIDEO_INST)
2816 {
2817 if (version <= E_NDS32_ELF_VER_1_3)
2818 r += snprintf (buf + r, size -r, ", VIDEO");
2819 else
2820 r += snprintf (buf + r, size -r, ", SATURATION");
2821 }
2822
2823 if (config & E_NDS32_HAS_ENCRIPT_INST)
2824 r += snprintf (buf + r, size -r, ", ENCRP");
2825
2826 if (config & E_NDS32_HAS_L2C_INST)
2827 r += snprintf (buf + r, size -r, ", L2C");
2828 }
2829
2830 static char *
2831 get_machine_flags (unsigned e_flags, unsigned e_machine)
2832 {
2833 static char buf[1024];
2834
2835 buf[0] = '\0';
2836
2837 if (e_flags)
2838 {
2839 switch (e_machine)
2840 {
2841 default:
2842 break;
2843
2844 case EM_ARC_COMPACT2:
2845 case EM_ARC_COMPACT:
2846 decode_ARC_machine_flags (e_flags, e_machine, buf);
2847 break;
2848
2849 case EM_ARM:
2850 decode_ARM_machine_flags (e_flags, buf);
2851 break;
2852
2853 case EM_AVR:
2854 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2855 break;
2856
2857 case EM_BLACKFIN:
2858 if (e_flags & EF_BFIN_PIC)
2859 strcat (buf, ", PIC");
2860
2861 if (e_flags & EF_BFIN_FDPIC)
2862 strcat (buf, ", FDPIC");
2863
2864 if (e_flags & EF_BFIN_CODE_IN_L1)
2865 strcat (buf, ", code in L1");
2866
2867 if (e_flags & EF_BFIN_DATA_IN_L1)
2868 strcat (buf, ", data in L1");
2869
2870 break;
2871
2872 case EM_CYGNUS_FRV:
2873 switch (e_flags & EF_FRV_CPU_MASK)
2874 {
2875 case EF_FRV_CPU_GENERIC:
2876 break;
2877
2878 default:
2879 strcat (buf, ", fr???");
2880 break;
2881
2882 case EF_FRV_CPU_FR300:
2883 strcat (buf, ", fr300");
2884 break;
2885
2886 case EF_FRV_CPU_FR400:
2887 strcat (buf, ", fr400");
2888 break;
2889 case EF_FRV_CPU_FR405:
2890 strcat (buf, ", fr405");
2891 break;
2892
2893 case EF_FRV_CPU_FR450:
2894 strcat (buf, ", fr450");
2895 break;
2896
2897 case EF_FRV_CPU_FR500:
2898 strcat (buf, ", fr500");
2899 break;
2900 case EF_FRV_CPU_FR550:
2901 strcat (buf, ", fr550");
2902 break;
2903
2904 case EF_FRV_CPU_SIMPLE:
2905 strcat (buf, ", simple");
2906 break;
2907 case EF_FRV_CPU_TOMCAT:
2908 strcat (buf, ", tomcat");
2909 break;
2910 }
2911 break;
2912
2913 case EM_68K:
2914 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2915 strcat (buf, ", m68000");
2916 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2917 strcat (buf, ", cpu32");
2918 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2919 strcat (buf, ", fido_a");
2920 else
2921 {
2922 char const * isa = _("unknown");
2923 char const * mac = _("unknown mac");
2924 char const * additional = NULL;
2925
2926 switch (e_flags & EF_M68K_CF_ISA_MASK)
2927 {
2928 case EF_M68K_CF_ISA_A_NODIV:
2929 isa = "A";
2930 additional = ", nodiv";
2931 break;
2932 case EF_M68K_CF_ISA_A:
2933 isa = "A";
2934 break;
2935 case EF_M68K_CF_ISA_A_PLUS:
2936 isa = "A+";
2937 break;
2938 case EF_M68K_CF_ISA_B_NOUSP:
2939 isa = "B";
2940 additional = ", nousp";
2941 break;
2942 case EF_M68K_CF_ISA_B:
2943 isa = "B";
2944 break;
2945 case EF_M68K_CF_ISA_C:
2946 isa = "C";
2947 break;
2948 case EF_M68K_CF_ISA_C_NODIV:
2949 isa = "C";
2950 additional = ", nodiv";
2951 break;
2952 }
2953 strcat (buf, ", cf, isa ");
2954 strcat (buf, isa);
2955 if (additional)
2956 strcat (buf, additional);
2957 if (e_flags & EF_M68K_CF_FLOAT)
2958 strcat (buf, ", float");
2959 switch (e_flags & EF_M68K_CF_MAC_MASK)
2960 {
2961 case 0:
2962 mac = NULL;
2963 break;
2964 case EF_M68K_CF_MAC:
2965 mac = "mac";
2966 break;
2967 case EF_M68K_CF_EMAC:
2968 mac = "emac";
2969 break;
2970 case EF_M68K_CF_EMAC_B:
2971 mac = "emac_b";
2972 break;
2973 }
2974 if (mac)
2975 {
2976 strcat (buf, ", ");
2977 strcat (buf, mac);
2978 }
2979 }
2980 break;
2981
2982 case EM_CYGNUS_MEP:
2983 switch (e_flags & EF_MEP_CPU_MASK)
2984 {
2985 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
2986 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
2987 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
2988 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
2989 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
2990 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
2991 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
2992 }
2993
2994 switch (e_flags & EF_MEP_COP_MASK)
2995 {
2996 case EF_MEP_COP_NONE: break;
2997 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
2998 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
2999 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3000 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3001 default: strcat (buf, _("<unknown MeP copro type>")); break;
3002 }
3003
3004 if (e_flags & EF_MEP_LIBRARY)
3005 strcat (buf, ", Built for Library");
3006
3007 if (e_flags & EF_MEP_INDEX_MASK)
3008 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3009 e_flags & EF_MEP_INDEX_MASK);
3010
3011 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3012 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3013 e_flags & ~ EF_MEP_ALL_FLAGS);
3014 break;
3015
3016 case EM_PPC:
3017 if (e_flags & EF_PPC_EMB)
3018 strcat (buf, ", emb");
3019
3020 if (e_flags & EF_PPC_RELOCATABLE)
3021 strcat (buf, _(", relocatable"));
3022
3023 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3024 strcat (buf, _(", relocatable-lib"));
3025 break;
3026
3027 case EM_PPC64:
3028 if (e_flags & EF_PPC64_ABI)
3029 {
3030 char abi[] = ", abiv0";
3031
3032 abi[6] += e_flags & EF_PPC64_ABI;
3033 strcat (buf, abi);
3034 }
3035 break;
3036
3037 case EM_V800:
3038 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3039 strcat (buf, ", RH850 ABI");
3040
3041 if (e_flags & EF_V800_850E3)
3042 strcat (buf, ", V3 architecture");
3043
3044 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3045 strcat (buf, ", FPU not used");
3046
3047 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3048 strcat (buf, ", regmode: COMMON");
3049
3050 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3051 strcat (buf, ", r4 not used");
3052
3053 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3054 strcat (buf, ", r30 not used");
3055
3056 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3057 strcat (buf, ", r5 not used");
3058
3059 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3060 strcat (buf, ", r2 not used");
3061
3062 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3063 {
3064 switch (e_flags & - e_flags)
3065 {
3066 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3067 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3068 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3069 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3070 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3071 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3072 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3073 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3074 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3075 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3076 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3077 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3078 default: break;
3079 }
3080 }
3081 break;
3082
3083 case EM_V850:
3084 case EM_CYGNUS_V850:
3085 switch (e_flags & EF_V850_ARCH)
3086 {
3087 case E_V850E3V5_ARCH:
3088 strcat (buf, ", v850e3v5");
3089 break;
3090 case E_V850E2V3_ARCH:
3091 strcat (buf, ", v850e2v3");
3092 break;
3093 case E_V850E2_ARCH:
3094 strcat (buf, ", v850e2");
3095 break;
3096 case E_V850E1_ARCH:
3097 strcat (buf, ", v850e1");
3098 break;
3099 case E_V850E_ARCH:
3100 strcat (buf, ", v850e");
3101 break;
3102 case E_V850_ARCH:
3103 strcat (buf, ", v850");
3104 break;
3105 default:
3106 strcat (buf, _(", unknown v850 architecture variant"));
3107 break;
3108 }
3109 break;
3110
3111 case EM_M32R:
3112 case EM_CYGNUS_M32R:
3113 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3114 strcat (buf, ", m32r");
3115 break;
3116
3117 case EM_MIPS:
3118 case EM_MIPS_RS3_LE:
3119 if (e_flags & EF_MIPS_NOREORDER)
3120 strcat (buf, ", noreorder");
3121
3122 if (e_flags & EF_MIPS_PIC)
3123 strcat (buf, ", pic");
3124
3125 if (e_flags & EF_MIPS_CPIC)
3126 strcat (buf, ", cpic");
3127
3128 if (e_flags & EF_MIPS_UCODE)
3129 strcat (buf, ", ugen_reserved");
3130
3131 if (e_flags & EF_MIPS_ABI2)
3132 strcat (buf, ", abi2");
3133
3134 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3135 strcat (buf, ", odk first");
3136
3137 if (e_flags & EF_MIPS_32BITMODE)
3138 strcat (buf, ", 32bitmode");
3139
3140 if (e_flags & EF_MIPS_NAN2008)
3141 strcat (buf, ", nan2008");
3142
3143 if (e_flags & EF_MIPS_FP64)
3144 strcat (buf, ", fp64");
3145
3146 switch ((e_flags & EF_MIPS_MACH))
3147 {
3148 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3149 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3150 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3151 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3152 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3153 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3154 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3155 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3156 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3157 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3158 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3159 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3160 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3161 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3162 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3163 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3164 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3165 case 0:
3166 /* We simply ignore the field in this case to avoid confusion:
3167 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3168 extension. */
3169 break;
3170 default: strcat (buf, _(", unknown CPU")); break;
3171 }
3172
3173 switch ((e_flags & EF_MIPS_ABI))
3174 {
3175 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3176 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3177 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3178 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3179 case 0:
3180 /* We simply ignore the field in this case to avoid confusion:
3181 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3182 This means it is likely to be an o32 file, but not for
3183 sure. */
3184 break;
3185 default: strcat (buf, _(", unknown ABI")); break;
3186 }
3187
3188 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3189 strcat (buf, ", mdmx");
3190
3191 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3192 strcat (buf, ", mips16");
3193
3194 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3195 strcat (buf, ", micromips");
3196
3197 switch ((e_flags & EF_MIPS_ARCH))
3198 {
3199 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3200 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3201 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3202 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3203 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3204 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3205 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3206 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3207 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3208 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3209 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3210 default: strcat (buf, _(", unknown ISA")); break;
3211 }
3212 break;
3213
3214 case EM_NDS32:
3215 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3216 break;
3217
3218 case EM_SH:
3219 switch ((e_flags & EF_SH_MACH_MASK))
3220 {
3221 case EF_SH1: strcat (buf, ", sh1"); break;
3222 case EF_SH2: strcat (buf, ", sh2"); break;
3223 case EF_SH3: strcat (buf, ", sh3"); break;
3224 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3225 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3226 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3227 case EF_SH3E: strcat (buf, ", sh3e"); break;
3228 case EF_SH4: strcat (buf, ", sh4"); break;
3229 case EF_SH5: strcat (buf, ", sh5"); break;
3230 case EF_SH2E: strcat (buf, ", sh2e"); break;
3231 case EF_SH4A: strcat (buf, ", sh4a"); break;
3232 case EF_SH2A: strcat (buf, ", sh2a"); break;
3233 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3234 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3235 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3236 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3237 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3238 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3239 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3240 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3241 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3242 default: strcat (buf, _(", unknown ISA")); break;
3243 }
3244
3245 if (e_flags & EF_SH_PIC)
3246 strcat (buf, ", pic");
3247
3248 if (e_flags & EF_SH_FDPIC)
3249 strcat (buf, ", fdpic");
3250 break;
3251
3252 case EM_OR1K:
3253 if (e_flags & EF_OR1K_NODELAY)
3254 strcat (buf, ", no delay");
3255 break;
3256
3257 case EM_SPARCV9:
3258 if (e_flags & EF_SPARC_32PLUS)
3259 strcat (buf, ", v8+");
3260
3261 if (e_flags & EF_SPARC_SUN_US1)
3262 strcat (buf, ", ultrasparcI");
3263
3264 if (e_flags & EF_SPARC_SUN_US3)
3265 strcat (buf, ", ultrasparcIII");
3266
3267 if (e_flags & EF_SPARC_HAL_R1)
3268 strcat (buf, ", halr1");
3269
3270 if (e_flags & EF_SPARC_LEDATA)
3271 strcat (buf, ", ledata");
3272
3273 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3274 strcat (buf, ", tso");
3275
3276 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3277 strcat (buf, ", pso");
3278
3279 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3280 strcat (buf, ", rmo");
3281 break;
3282
3283 case EM_PARISC:
3284 switch (e_flags & EF_PARISC_ARCH)
3285 {
3286 case EFA_PARISC_1_0:
3287 strcpy (buf, ", PA-RISC 1.0");
3288 break;
3289 case EFA_PARISC_1_1:
3290 strcpy (buf, ", PA-RISC 1.1");
3291 break;
3292 case EFA_PARISC_2_0:
3293 strcpy (buf, ", PA-RISC 2.0");
3294 break;
3295 default:
3296 break;
3297 }
3298 if (e_flags & EF_PARISC_TRAPNIL)
3299 strcat (buf, ", trapnil");
3300 if (e_flags & EF_PARISC_EXT)
3301 strcat (buf, ", ext");
3302 if (e_flags & EF_PARISC_LSB)
3303 strcat (buf, ", lsb");
3304 if (e_flags & EF_PARISC_WIDE)
3305 strcat (buf, ", wide");
3306 if (e_flags & EF_PARISC_NO_KABP)
3307 strcat (buf, ", no kabp");
3308 if (e_flags & EF_PARISC_LAZYSWAP)
3309 strcat (buf, ", lazyswap");
3310 break;
3311
3312 case EM_PJ:
3313 case EM_PJ_OLD:
3314 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3315 strcat (buf, ", new calling convention");
3316
3317 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3318 strcat (buf, ", gnu calling convention");
3319 break;
3320
3321 case EM_IA_64:
3322 if ((e_flags & EF_IA_64_ABI64))
3323 strcat (buf, ", 64-bit");
3324 else
3325 strcat (buf, ", 32-bit");
3326 if ((e_flags & EF_IA_64_REDUCEDFP))
3327 strcat (buf, ", reduced fp model");
3328 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3329 strcat (buf, ", no function descriptors, constant gp");
3330 else if ((e_flags & EF_IA_64_CONS_GP))
3331 strcat (buf, ", constant gp");
3332 if ((e_flags & EF_IA_64_ABSOLUTE))
3333 strcat (buf, ", absolute");
3334 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3335 {
3336 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3337 strcat (buf, ", vms_linkages");
3338 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3339 {
3340 case EF_IA_64_VMS_COMCOD_SUCCESS:
3341 break;
3342 case EF_IA_64_VMS_COMCOD_WARNING:
3343 strcat (buf, ", warning");
3344 break;
3345 case EF_IA_64_VMS_COMCOD_ERROR:
3346 strcat (buf, ", error");
3347 break;
3348 case EF_IA_64_VMS_COMCOD_ABORT:
3349 strcat (buf, ", abort");
3350 break;
3351 default:
3352 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3353 e_flags & EF_IA_64_VMS_COMCOD);
3354 strcat (buf, ", <unknown>");
3355 }
3356 }
3357 break;
3358
3359 case EM_VAX:
3360 if ((e_flags & EF_VAX_NONPIC))
3361 strcat (buf, ", non-PIC");
3362 if ((e_flags & EF_VAX_DFLOAT))
3363 strcat (buf, ", D-Float");
3364 if ((e_flags & EF_VAX_GFLOAT))
3365 strcat (buf, ", G-Float");
3366 break;
3367
3368 case EM_VISIUM:
3369 if (e_flags & EF_VISIUM_ARCH_MCM)
3370 strcat (buf, ", mcm");
3371 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3372 strcat (buf, ", mcm24");
3373 if (e_flags & EF_VISIUM_ARCH_GR6)
3374 strcat (buf, ", gr6");
3375 break;
3376
3377 case EM_RL78:
3378 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3379 {
3380 case E_FLAG_RL78_ANY_CPU: break;
3381 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3382 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3383 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3384 }
3385 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3386 strcat (buf, ", 64-bit doubles");
3387 break;
3388
3389 case EM_RX:
3390 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3391 strcat (buf, ", 64-bit doubles");
3392 if (e_flags & E_FLAG_RX_DSP)
3393 strcat (buf, ", dsp");
3394 if (e_flags & E_FLAG_RX_PID)
3395 strcat (buf, ", pid");
3396 if (e_flags & E_FLAG_RX_ABI)
3397 strcat (buf, ", RX ABI");
3398 if (e_flags & E_FLAG_RX_SINSNS_SET)
3399 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3400 ? ", uses String instructions" : ", bans String instructions");
3401 if (e_flags & E_FLAG_RX_V2)
3402 strcat (buf, ", V2");
3403 break;
3404
3405 case EM_S390:
3406 if (e_flags & EF_S390_HIGH_GPRS)
3407 strcat (buf, ", highgprs");
3408 break;
3409
3410 case EM_TI_C6000:
3411 if ((e_flags & EF_C6000_REL))
3412 strcat (buf, ", relocatable module");
3413 break;
3414
3415 case EM_MSP430:
3416 strcat (buf, _(": architecture variant: "));
3417 switch (e_flags & EF_MSP430_MACH)
3418 {
3419 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3420 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3421 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3422 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3423 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3424 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3425 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3426 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3427 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3428 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3429 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3430 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3431 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3432 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3433 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3434 default:
3435 strcat (buf, _(": unknown")); break;
3436 }
3437
3438 if (e_flags & ~ EF_MSP430_MACH)
3439 strcat (buf, _(": unknown extra flag bits also present"));
3440 }
3441 }
3442
3443 return buf;
3444 }
3445
3446 static const char *
3447 get_osabi_name (unsigned int osabi)
3448 {
3449 static char buff[32];
3450
3451 switch (osabi)
3452 {
3453 case ELFOSABI_NONE: return "UNIX - System V";
3454 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3455 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3456 case ELFOSABI_GNU: return "UNIX - GNU";
3457 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3458 case ELFOSABI_AIX: return "UNIX - AIX";
3459 case ELFOSABI_IRIX: return "UNIX - IRIX";
3460 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3461 case ELFOSABI_TRU64: return "UNIX - TRU64";
3462 case ELFOSABI_MODESTO: return "Novell - Modesto";
3463 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3464 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3465 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3466 case ELFOSABI_AROS: return "AROS";
3467 case ELFOSABI_FENIXOS: return "FenixOS";
3468 default:
3469 if (osabi >= 64)
3470 switch (elf_header.e_machine)
3471 {
3472 case EM_ARM:
3473 switch (osabi)
3474 {
3475 case ELFOSABI_ARM: return "ARM";
3476 default:
3477 break;
3478 }
3479 break;
3480
3481 case EM_MSP430:
3482 case EM_MSP430_OLD:
3483 case EM_VISIUM:
3484 switch (osabi)
3485 {
3486 case ELFOSABI_STANDALONE: return _("Standalone App");
3487 default:
3488 break;
3489 }
3490 break;
3491
3492 case EM_TI_C6000:
3493 switch (osabi)
3494 {
3495 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3496 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3497 default:
3498 break;
3499 }
3500 break;
3501
3502 default:
3503 break;
3504 }
3505 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3506 return buff;
3507 }
3508 }
3509
3510 static const char *
3511 get_aarch64_segment_type (unsigned long type)
3512 {
3513 switch (type)
3514 {
3515 case PT_AARCH64_ARCHEXT:
3516 return "AARCH64_ARCHEXT";
3517 default:
3518 break;
3519 }
3520
3521 return NULL;
3522 }
3523
3524 static const char *
3525 get_arm_segment_type (unsigned long type)
3526 {
3527 switch (type)
3528 {
3529 case PT_ARM_EXIDX:
3530 return "EXIDX";
3531 default:
3532 break;
3533 }
3534
3535 return NULL;
3536 }
3537
3538 static const char *
3539 get_mips_segment_type (unsigned long type)
3540 {
3541 switch (type)
3542 {
3543 case PT_MIPS_REGINFO:
3544 return "REGINFO";
3545 case PT_MIPS_RTPROC:
3546 return "RTPROC";
3547 case PT_MIPS_OPTIONS:
3548 return "OPTIONS";
3549 case PT_MIPS_ABIFLAGS:
3550 return "ABIFLAGS";
3551 default:
3552 break;
3553 }
3554
3555 return NULL;
3556 }
3557
3558 static const char *
3559 get_parisc_segment_type (unsigned long type)
3560 {
3561 switch (type)
3562 {
3563 case PT_HP_TLS: return "HP_TLS";
3564 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3565 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3566 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3567 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3568 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3569 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3570 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3571 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3572 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3573 case PT_HP_PARALLEL: return "HP_PARALLEL";
3574 case PT_HP_FASTBIND: return "HP_FASTBIND";
3575 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3576 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3577 case PT_HP_STACK: return "HP_STACK";
3578 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3579 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3580 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3581 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3582 default:
3583 break;
3584 }
3585
3586 return NULL;
3587 }
3588
3589 static const char *
3590 get_ia64_segment_type (unsigned long type)
3591 {
3592 switch (type)
3593 {
3594 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3595 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3596 case PT_HP_TLS: return "HP_TLS";
3597 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3598 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3599 case PT_IA_64_HP_STACK: return "HP_STACK";
3600 default:
3601 break;
3602 }
3603
3604 return NULL;
3605 }
3606
3607 static const char *
3608 get_tic6x_segment_type (unsigned long type)
3609 {
3610 switch (type)
3611 {
3612 case PT_C6000_PHATTR: return "C6000_PHATTR";
3613 default:
3614 break;
3615 }
3616
3617 return NULL;
3618 }
3619
3620 static const char *
3621 get_segment_type (unsigned long p_type)
3622 {
3623 static char buff[32];
3624
3625 switch (p_type)
3626 {
3627 case PT_NULL: return "NULL";
3628 case PT_LOAD: return "LOAD";
3629 case PT_DYNAMIC: return "DYNAMIC";
3630 case PT_INTERP: return "INTERP";
3631 case PT_NOTE: return "NOTE";
3632 case PT_SHLIB: return "SHLIB";
3633 case PT_PHDR: return "PHDR";
3634 case PT_TLS: return "TLS";
3635
3636 case PT_GNU_EH_FRAME:
3637 return "GNU_EH_FRAME";
3638 case PT_GNU_STACK: return "GNU_STACK";
3639 case PT_GNU_RELRO: return "GNU_RELRO";
3640
3641 default:
3642 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3643 {
3644 const char * result;
3645
3646 switch (elf_header.e_machine)
3647 {
3648 case EM_AARCH64:
3649 result = get_aarch64_segment_type (p_type);
3650 break;
3651 case EM_ARM:
3652 result = get_arm_segment_type (p_type);
3653 break;
3654 case EM_MIPS:
3655 case EM_MIPS_RS3_LE:
3656 result = get_mips_segment_type (p_type);
3657 break;
3658 case EM_PARISC:
3659 result = get_parisc_segment_type (p_type);
3660 break;
3661 case EM_IA_64:
3662 result = get_ia64_segment_type (p_type);
3663 break;
3664 case EM_TI_C6000:
3665 result = get_tic6x_segment_type (p_type);
3666 break;
3667 default:
3668 result = NULL;
3669 break;
3670 }
3671
3672 if (result != NULL)
3673 return result;
3674
3675 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3676 }
3677 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3678 {
3679 const char * result;
3680
3681 switch (elf_header.e_machine)
3682 {
3683 case EM_PARISC:
3684 result = get_parisc_segment_type (p_type);
3685 break;
3686 case EM_IA_64:
3687 result = get_ia64_segment_type (p_type);
3688 break;
3689 default:
3690 result = NULL;
3691 break;
3692 }
3693
3694 if (result != NULL)
3695 return result;
3696
3697 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3698 }
3699 else
3700 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3701
3702 return buff;
3703 }
3704 }
3705
3706 static const char *
3707 get_mips_section_type_name (unsigned int sh_type)
3708 {
3709 switch (sh_type)
3710 {
3711 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3712 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3713 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3714 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3715 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3716 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3717 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3718 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3719 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3720 case SHT_MIPS_RELD: return "MIPS_RELD";
3721 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3722 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3723 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3724 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3725 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3726 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3727 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3728 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3729 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3730 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3731 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3732 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3733 case SHT_MIPS_LINE: return "MIPS_LINE";
3734 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3735 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3736 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3737 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3738 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3739 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3740 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3741 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3742 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3743 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3744 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3745 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3746 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3747 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3748 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3749 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3750 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3751 default:
3752 break;
3753 }
3754 return NULL;
3755 }
3756
3757 static const char *
3758 get_parisc_section_type_name (unsigned int sh_type)
3759 {
3760 switch (sh_type)
3761 {
3762 case SHT_PARISC_EXT: return "PARISC_EXT";
3763 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3764 case SHT_PARISC_DOC: return "PARISC_DOC";
3765 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3766 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3767 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3768 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3769 default:
3770 break;
3771 }
3772 return NULL;
3773 }
3774
3775 static const char *
3776 get_ia64_section_type_name (unsigned int sh_type)
3777 {
3778 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3779 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3780 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3781
3782 switch (sh_type)
3783 {
3784 case SHT_IA_64_EXT: return "IA_64_EXT";
3785 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3786 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3787 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3788 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3789 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3790 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3791 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3792 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3793 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3794 default:
3795 break;
3796 }
3797 return NULL;
3798 }
3799
3800 static const char *
3801 get_x86_64_section_type_name (unsigned int sh_type)
3802 {
3803 switch (sh_type)
3804 {
3805 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3806 default:
3807 break;
3808 }
3809 return NULL;
3810 }
3811
3812 static const char *
3813 get_aarch64_section_type_name (unsigned int sh_type)
3814 {
3815 switch (sh_type)
3816 {
3817 case SHT_AARCH64_ATTRIBUTES:
3818 return "AARCH64_ATTRIBUTES";
3819 default:
3820 break;
3821 }
3822 return NULL;
3823 }
3824
3825 static const char *
3826 get_arm_section_type_name (unsigned int sh_type)
3827 {
3828 switch (sh_type)
3829 {
3830 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3831 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3832 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3833 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3834 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3835 default:
3836 break;
3837 }
3838 return NULL;
3839 }
3840
3841 static const char *
3842 get_tic6x_section_type_name (unsigned int sh_type)
3843 {
3844 switch (sh_type)
3845 {
3846 case SHT_C6000_UNWIND:
3847 return "C6000_UNWIND";
3848 case SHT_C6000_PREEMPTMAP:
3849 return "C6000_PREEMPTMAP";
3850 case SHT_C6000_ATTRIBUTES:
3851 return "C6000_ATTRIBUTES";
3852 case SHT_TI_ICODE:
3853 return "TI_ICODE";
3854 case SHT_TI_XREF:
3855 return "TI_XREF";
3856 case SHT_TI_HANDLER:
3857 return "TI_HANDLER";
3858 case SHT_TI_INITINFO:
3859 return "TI_INITINFO";
3860 case SHT_TI_PHATTRS:
3861 return "TI_PHATTRS";
3862 default:
3863 break;
3864 }
3865 return NULL;
3866 }
3867
3868 static const char *
3869 get_msp430x_section_type_name (unsigned int sh_type)
3870 {
3871 switch (sh_type)
3872 {
3873 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3874 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3875 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3876 default: return NULL;
3877 }
3878 }
3879
3880 static const char *
3881 get_v850_section_type_name (unsigned int sh_type)
3882 {
3883 switch (sh_type)
3884 {
3885 case SHT_V850_SCOMMON: return "V850 Small Common";
3886 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3887 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3888 case SHT_RENESAS_IOP: return "RENESAS IOP";
3889 case SHT_RENESAS_INFO: return "RENESAS INFO";
3890 default: return NULL;
3891 }
3892 }
3893
3894 static const char *
3895 get_section_type_name (unsigned int sh_type)
3896 {
3897 static char buff[32];
3898 const char * result;
3899
3900 switch (sh_type)
3901 {
3902 case SHT_NULL: return "NULL";
3903 case SHT_PROGBITS: return "PROGBITS";
3904 case SHT_SYMTAB: return "SYMTAB";
3905 case SHT_STRTAB: return "STRTAB";
3906 case SHT_RELA: return "RELA";
3907 case SHT_HASH: return "HASH";
3908 case SHT_DYNAMIC: return "DYNAMIC";
3909 case SHT_NOTE: return "NOTE";
3910 case SHT_NOBITS: return "NOBITS";
3911 case SHT_REL: return "REL";
3912 case SHT_SHLIB: return "SHLIB";
3913 case SHT_DYNSYM: return "DYNSYM";
3914 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3915 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3916 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3917 case SHT_GNU_HASH: return "GNU_HASH";
3918 case SHT_GROUP: return "GROUP";
3919 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3920 case SHT_GNU_verdef: return "VERDEF";
3921 case SHT_GNU_verneed: return "VERNEED";
3922 case SHT_GNU_versym: return "VERSYM";
3923 case 0x6ffffff0: return "VERSYM";
3924 case 0x6ffffffc: return "VERDEF";
3925 case 0x7ffffffd: return "AUXILIARY";
3926 case 0x7fffffff: return "FILTER";
3927 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3928
3929 default:
3930 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3931 {
3932 switch (elf_header.e_machine)
3933 {
3934 case EM_MIPS:
3935 case EM_MIPS_RS3_LE:
3936 result = get_mips_section_type_name (sh_type);
3937 break;
3938 case EM_PARISC:
3939 result = get_parisc_section_type_name (sh_type);
3940 break;
3941 case EM_IA_64:
3942 result = get_ia64_section_type_name (sh_type);
3943 break;
3944 case EM_X86_64:
3945 case EM_L1OM:
3946 case EM_K1OM:
3947 result = get_x86_64_section_type_name (sh_type);
3948 break;
3949 case EM_AARCH64:
3950 result = get_aarch64_section_type_name (sh_type);
3951 break;
3952 case EM_ARM:
3953 result = get_arm_section_type_name (sh_type);
3954 break;
3955 case EM_TI_C6000:
3956 result = get_tic6x_section_type_name (sh_type);
3957 break;
3958 case EM_MSP430:
3959 result = get_msp430x_section_type_name (sh_type);
3960 break;
3961 case EM_V800:
3962 case EM_V850:
3963 case EM_CYGNUS_V850:
3964 result = get_v850_section_type_name (sh_type);
3965 break;
3966 default:
3967 result = NULL;
3968 break;
3969 }
3970
3971 if (result != NULL)
3972 return result;
3973
3974 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
3975 }
3976 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3977 {
3978 switch (elf_header.e_machine)
3979 {
3980 case EM_IA_64:
3981 result = get_ia64_section_type_name (sh_type);
3982 break;
3983 default:
3984 result = NULL;
3985 break;
3986 }
3987
3988 if (result != NULL)
3989 return result;
3990
3991 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
3992 }
3993 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3994 {
3995 switch (elf_header.e_machine)
3996 {
3997 case EM_V800:
3998 case EM_V850:
3999 case EM_CYGNUS_V850:
4000 result = get_v850_section_type_name (sh_type);
4001 break;
4002 default:
4003 result = NULL;
4004 break;
4005 }
4006
4007 if (result != NULL)
4008 return result;
4009
4010 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4011 }
4012 else
4013 /* This message is probably going to be displayed in a 15
4014 character wide field, so put the hex value first. */
4015 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4016
4017 return buff;
4018 }
4019 }
4020
4021 #define OPTION_DEBUG_DUMP 512
4022 #define OPTION_DYN_SYMS 513
4023 #define OPTION_DWARF_DEPTH 514
4024 #define OPTION_DWARF_START 515
4025 #define OPTION_DWARF_CHECK 516
4026
4027 static struct option options[] =
4028 {
4029 {"all", no_argument, 0, 'a'},
4030 {"file-header", no_argument, 0, 'h'},
4031 {"program-headers", no_argument, 0, 'l'},
4032 {"headers", no_argument, 0, 'e'},
4033 {"histogram", no_argument, 0, 'I'},
4034 {"segments", no_argument, 0, 'l'},
4035 {"sections", no_argument, 0, 'S'},
4036 {"section-headers", no_argument, 0, 'S'},
4037 {"section-groups", no_argument, 0, 'g'},
4038 {"section-details", no_argument, 0, 't'},
4039 {"full-section-name",no_argument, 0, 'N'},
4040 {"symbols", no_argument, 0, 's'},
4041 {"syms", no_argument, 0, 's'},
4042 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4043 {"relocs", no_argument, 0, 'r'},
4044 {"notes", no_argument, 0, 'n'},
4045 {"dynamic", no_argument, 0, 'd'},
4046 {"arch-specific", no_argument, 0, 'A'},
4047 {"version-info", no_argument, 0, 'V'},
4048 {"use-dynamic", no_argument, 0, 'D'},
4049 {"unwind", no_argument, 0, 'u'},
4050 {"archive-index", no_argument, 0, 'c'},
4051 {"hex-dump", required_argument, 0, 'x'},
4052 {"relocated-dump", required_argument, 0, 'R'},
4053 {"string-dump", required_argument, 0, 'p'},
4054 {"decompress", no_argument, 0, 'z'},
4055 #ifdef SUPPORT_DISASSEMBLY
4056 {"instruction-dump", required_argument, 0, 'i'},
4057 #endif
4058 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4059
4060 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4061 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4062 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4063
4064 {"version", no_argument, 0, 'v'},
4065 {"wide", no_argument, 0, 'W'},
4066 {"help", no_argument, 0, 'H'},
4067 {0, no_argument, 0, 0}
4068 };
4069
4070 static void
4071 usage (FILE * stream)
4072 {
4073 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4074 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4075 fprintf (stream, _(" Options are:\n\
4076 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4077 -h --file-header Display the ELF file header\n\
4078 -l --program-headers Display the program headers\n\
4079 --segments An alias for --program-headers\n\
4080 -S --section-headers Display the sections' header\n\
4081 --sections An alias for --section-headers\n\
4082 -g --section-groups Display the section groups\n\
4083 -t --section-details Display the section details\n\
4084 -e --headers Equivalent to: -h -l -S\n\
4085 -s --syms Display the symbol table\n\
4086 --symbols An alias for --syms\n\
4087 --dyn-syms Display the dynamic symbol table\n\
4088 -n --notes Display the core notes (if present)\n\
4089 -r --relocs Display the relocations (if present)\n\
4090 -u --unwind Display the unwind info (if present)\n\
4091 -d --dynamic Display the dynamic section (if present)\n\
4092 -V --version-info Display the version sections (if present)\n\
4093 -A --arch-specific Display architecture specific information (if any)\n\
4094 -c --archive-index Display the symbol/file index in an archive\n\
4095 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4096 -x --hex-dump=<number|name>\n\
4097 Dump the contents of section <number|name> as bytes\n\
4098 -p --string-dump=<number|name>\n\
4099 Dump the contents of section <number|name> as strings\n\
4100 -R --relocated-dump=<number|name>\n\
4101 Dump the contents of section <number|name> as relocated bytes\n\
4102 -z --decompress Decompress section before dumping it\n\
4103 -w[lLiaprmfFsoRt] or\n\
4104 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4105 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4106 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4107 =addr,=cu_index]\n\
4108 Display the contents of DWARF2 debug sections\n"));
4109 fprintf (stream, _("\
4110 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4111 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4112 or deeper\n"));
4113 #ifdef SUPPORT_DISASSEMBLY
4114 fprintf (stream, _("\
4115 -i --instruction-dump=<number|name>\n\
4116 Disassemble the contents of section <number|name>\n"));
4117 #endif
4118 fprintf (stream, _("\
4119 -I --histogram Display histogram of bucket list lengths\n\
4120 -W --wide Allow output width to exceed 80 characters\n\
4121 @<file> Read options from <file>\n\
4122 -H --help Display this information\n\
4123 -v --version Display the version number of readelf\n"));
4124
4125 if (REPORT_BUGS_TO[0] && stream == stdout)
4126 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4127
4128 exit (stream == stdout ? 0 : 1);
4129 }
4130
4131 /* Record the fact that the user wants the contents of section number
4132 SECTION to be displayed using the method(s) encoded as flags bits
4133 in TYPE. Note, TYPE can be zero if we are creating the array for
4134 the first time. */
4135
4136 static void
4137 request_dump_bynumber (unsigned int section, dump_type type)
4138 {
4139 if (section >= num_dump_sects)
4140 {
4141 dump_type * new_dump_sects;
4142
4143 new_dump_sects = (dump_type *) calloc (section + 1,
4144 sizeof (* dump_sects));
4145
4146 if (new_dump_sects == NULL)
4147 error (_("Out of memory allocating dump request table.\n"));
4148 else
4149 {
4150 /* Copy current flag settings. */
4151 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4152
4153 free (dump_sects);
4154
4155 dump_sects = new_dump_sects;
4156 num_dump_sects = section + 1;
4157 }
4158 }
4159
4160 if (dump_sects)
4161 dump_sects[section] |= type;
4162
4163 return;
4164 }
4165
4166 /* Request a dump by section name. */
4167
4168 static void
4169 request_dump_byname (const char * section, dump_type type)
4170 {
4171 struct dump_list_entry * new_request;
4172
4173 new_request = (struct dump_list_entry *)
4174 malloc (sizeof (struct dump_list_entry));
4175 if (!new_request)
4176 error (_("Out of memory allocating dump request table.\n"));
4177
4178 new_request->name = strdup (section);
4179 if (!new_request->name)
4180 error (_("Out of memory allocating dump request table.\n"));
4181
4182 new_request->type = type;
4183
4184 new_request->next = dump_sects_byname;
4185 dump_sects_byname = new_request;
4186 }
4187
4188 static inline void
4189 request_dump (dump_type type)
4190 {
4191 int section;
4192 char * cp;
4193
4194 do_dump++;
4195 section = strtoul (optarg, & cp, 0);
4196
4197 if (! *cp && section >= 0)
4198 request_dump_bynumber (section, type);
4199 else
4200 request_dump_byname (optarg, type);
4201 }
4202
4203
4204 static void
4205 parse_args (int argc, char ** argv)
4206 {
4207 int c;
4208
4209 if (argc < 2)
4210 usage (stderr);
4211
4212 while ((c = getopt_long
4213 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4214 {
4215 switch (c)
4216 {
4217 case 0:
4218 /* Long options. */
4219 break;
4220 case 'H':
4221 usage (stdout);
4222 break;
4223
4224 case 'a':
4225 do_syms++;
4226 do_reloc++;
4227 do_unwind++;
4228 do_dynamic++;
4229 do_header++;
4230 do_sections++;
4231 do_section_groups++;
4232 do_segments++;
4233 do_version++;
4234 do_histogram++;
4235 do_arch++;
4236 do_notes++;
4237 break;
4238 case 'g':
4239 do_section_groups++;
4240 break;
4241 case 't':
4242 case 'N':
4243 do_sections++;
4244 do_section_details++;
4245 break;
4246 case 'e':
4247 do_header++;
4248 do_sections++;
4249 do_segments++;
4250 break;
4251 case 'A':
4252 do_arch++;
4253 break;
4254 case 'D':
4255 do_using_dynamic++;
4256 break;
4257 case 'r':
4258 do_reloc++;
4259 break;
4260 case 'u':
4261 do_unwind++;
4262 break;
4263 case 'h':
4264 do_header++;
4265 break;
4266 case 'l':
4267 do_segments++;
4268 break;
4269 case 's':
4270 do_syms++;
4271 break;
4272 case 'S':
4273 do_sections++;
4274 break;
4275 case 'd':
4276 do_dynamic++;
4277 break;
4278 case 'I':
4279 do_histogram++;
4280 break;
4281 case 'n':
4282 do_notes++;
4283 break;
4284 case 'c':
4285 do_archive_index++;
4286 break;
4287 case 'x':
4288 request_dump (HEX_DUMP);
4289 break;
4290 case 'p':
4291 request_dump (STRING_DUMP);
4292 break;
4293 case 'R':
4294 request_dump (RELOC_DUMP);
4295 break;
4296 case 'z':
4297 decompress_dumps++;
4298 break;
4299 case 'w':
4300 do_dump++;
4301 if (optarg == 0)
4302 {
4303 do_debugging = 1;
4304 dwarf_select_sections_all ();
4305 }
4306 else
4307 {
4308 do_debugging = 0;
4309 dwarf_select_sections_by_letters (optarg);
4310 }
4311 break;
4312 case OPTION_DEBUG_DUMP:
4313 do_dump++;
4314 if (optarg == 0)
4315 do_debugging = 1;
4316 else
4317 {
4318 do_debugging = 0;
4319 dwarf_select_sections_by_names (optarg);
4320 }
4321 break;
4322 case OPTION_DWARF_DEPTH:
4323 {
4324 char *cp;
4325
4326 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4327 }
4328 break;
4329 case OPTION_DWARF_START:
4330 {
4331 char *cp;
4332
4333 dwarf_start_die = strtoul (optarg, & cp, 0);
4334 }
4335 break;
4336 case OPTION_DWARF_CHECK:
4337 dwarf_check = 1;
4338 break;
4339 case OPTION_DYN_SYMS:
4340 do_dyn_syms++;
4341 break;
4342 #ifdef SUPPORT_DISASSEMBLY
4343 case 'i':
4344 request_dump (DISASS_DUMP);
4345 break;
4346 #endif
4347 case 'v':
4348 print_version (program_name);
4349 break;
4350 case 'V':
4351 do_version++;
4352 break;
4353 case 'W':
4354 do_wide++;
4355 break;
4356 default:
4357 /* xgettext:c-format */
4358 error (_("Invalid option '-%c'\n"), c);
4359 /* Drop through. */
4360 case '?':
4361 usage (stderr);
4362 }
4363 }
4364
4365 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4366 && !do_segments && !do_header && !do_dump && !do_version
4367 && !do_histogram && !do_debugging && !do_arch && !do_notes
4368 && !do_section_groups && !do_archive_index
4369 && !do_dyn_syms)
4370 usage (stderr);
4371 }
4372
4373 static const char *
4374 get_elf_class (unsigned int elf_class)
4375 {
4376 static char buff[32];
4377
4378 switch (elf_class)
4379 {
4380 case ELFCLASSNONE: return _("none");
4381 case ELFCLASS32: return "ELF32";
4382 case ELFCLASS64: return "ELF64";
4383 default:
4384 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4385 return buff;
4386 }
4387 }
4388
4389 static const char *
4390 get_data_encoding (unsigned int encoding)
4391 {
4392 static char buff[32];
4393
4394 switch (encoding)
4395 {
4396 case ELFDATANONE: return _("none");
4397 case ELFDATA2LSB: return _("2's complement, little endian");
4398 case ELFDATA2MSB: return _("2's complement, big endian");
4399 default:
4400 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4401 return buff;
4402 }
4403 }
4404
4405 /* Decode the data held in 'elf_header'. */
4406
4407 static int
4408 process_file_header (void)
4409 {
4410 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4411 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4412 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4413 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4414 {
4415 error
4416 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4417 return 0;
4418 }
4419
4420 init_dwarf_regnames (elf_header.e_machine);
4421
4422 if (do_header)
4423 {
4424 int i;
4425
4426 printf (_("ELF Header:\n"));
4427 printf (_(" Magic: "));
4428 for (i = 0; i < EI_NIDENT; i++)
4429 printf ("%2.2x ", elf_header.e_ident[i]);
4430 printf ("\n");
4431 printf (_(" Class: %s\n"),
4432 get_elf_class (elf_header.e_ident[EI_CLASS]));
4433 printf (_(" Data: %s\n"),
4434 get_data_encoding (elf_header.e_ident[EI_DATA]));
4435 printf (_(" Version: %d %s\n"),
4436 elf_header.e_ident[EI_VERSION],
4437 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4438 ? "(current)"
4439 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4440 ? _("<unknown: %lx>")
4441 : "")));
4442 printf (_(" OS/ABI: %s\n"),
4443 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4444 printf (_(" ABI Version: %d\n"),
4445 elf_header.e_ident[EI_ABIVERSION]);
4446 printf (_(" Type: %s\n"),
4447 get_file_type (elf_header.e_type));
4448 printf (_(" Machine: %s\n"),
4449 get_machine_name (elf_header.e_machine));
4450 printf (_(" Version: 0x%lx\n"),
4451 (unsigned long) elf_header.e_version);
4452
4453 printf (_(" Entry point address: "));
4454 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4455 printf (_("\n Start of program headers: "));
4456 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4457 printf (_(" (bytes into file)\n Start of section headers: "));
4458 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4459 printf (_(" (bytes into file)\n"));
4460
4461 printf (_(" Flags: 0x%lx%s\n"),
4462 (unsigned long) elf_header.e_flags,
4463 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4464 printf (_(" Size of this header: %ld (bytes)\n"),
4465 (long) elf_header.e_ehsize);
4466 printf (_(" Size of program headers: %ld (bytes)\n"),
4467 (long) elf_header.e_phentsize);
4468 printf (_(" Number of program headers: %ld"),
4469 (long) elf_header.e_phnum);
4470 if (section_headers != NULL
4471 && elf_header.e_phnum == PN_XNUM
4472 && section_headers[0].sh_info != 0)
4473 printf (" (%ld)", (long) section_headers[0].sh_info);
4474 putc ('\n', stdout);
4475 printf (_(" Size of section headers: %ld (bytes)\n"),
4476 (long) elf_header.e_shentsize);
4477 printf (_(" Number of section headers: %ld"),
4478 (long) elf_header.e_shnum);
4479 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4480 printf (" (%ld)", (long) section_headers[0].sh_size);
4481 putc ('\n', stdout);
4482 printf (_(" Section header string table index: %ld"),
4483 (long) elf_header.e_shstrndx);
4484 if (section_headers != NULL
4485 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4486 printf (" (%u)", section_headers[0].sh_link);
4487 else if (elf_header.e_shstrndx != SHN_UNDEF
4488 && elf_header.e_shstrndx >= elf_header.e_shnum)
4489 printf (_(" <corrupt: out of range>"));
4490 putc ('\n', stdout);
4491 }
4492
4493 if (section_headers != NULL)
4494 {
4495 if (elf_header.e_phnum == PN_XNUM
4496 && section_headers[0].sh_info != 0)
4497 elf_header.e_phnum = section_headers[0].sh_info;
4498 if (elf_header.e_shnum == SHN_UNDEF)
4499 elf_header.e_shnum = section_headers[0].sh_size;
4500 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4501 elf_header.e_shstrndx = section_headers[0].sh_link;
4502 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4503 elf_header.e_shstrndx = SHN_UNDEF;
4504 free (section_headers);
4505 section_headers = NULL;
4506 }
4507
4508 return 1;
4509 }
4510
4511 static bfd_boolean
4512 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4513 {
4514 Elf32_External_Phdr * phdrs;
4515 Elf32_External_Phdr * external;
4516 Elf_Internal_Phdr * internal;
4517 unsigned int i;
4518 unsigned int size = elf_header.e_phentsize;
4519 unsigned int num = elf_header.e_phnum;
4520
4521 /* PR binutils/17531: Cope with unexpected section header sizes. */
4522 if (size == 0 || num == 0)
4523 return FALSE;
4524 if (size < sizeof * phdrs)
4525 {
4526 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4527 return FALSE;
4528 }
4529 if (size > sizeof * phdrs)
4530 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4531
4532 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4533 size, num, _("program headers"));
4534 if (phdrs == NULL)
4535 return FALSE;
4536
4537 for (i = 0, internal = pheaders, external = phdrs;
4538 i < elf_header.e_phnum;
4539 i++, internal++, external++)
4540 {
4541 internal->p_type = BYTE_GET (external->p_type);
4542 internal->p_offset = BYTE_GET (external->p_offset);
4543 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4544 internal->p_paddr = BYTE_GET (external->p_paddr);
4545 internal->p_filesz = BYTE_GET (external->p_filesz);
4546 internal->p_memsz = BYTE_GET (external->p_memsz);
4547 internal->p_flags = BYTE_GET (external->p_flags);
4548 internal->p_align = BYTE_GET (external->p_align);
4549 }
4550
4551 free (phdrs);
4552 return TRUE;
4553 }
4554
4555 static bfd_boolean
4556 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4557 {
4558 Elf64_External_Phdr * phdrs;
4559 Elf64_External_Phdr * external;
4560 Elf_Internal_Phdr * internal;
4561 unsigned int i;
4562 unsigned int size = elf_header.e_phentsize;
4563 unsigned int num = elf_header.e_phnum;
4564
4565 /* PR binutils/17531: Cope with unexpected section header sizes. */
4566 if (size == 0 || num == 0)
4567 return FALSE;
4568 if (size < sizeof * phdrs)
4569 {
4570 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4571 return FALSE;
4572 }
4573 if (size > sizeof * phdrs)
4574 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4575
4576 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4577 size, num, _("program headers"));
4578 if (!phdrs)
4579 return FALSE;
4580
4581 for (i = 0, internal = pheaders, external = phdrs;
4582 i < elf_header.e_phnum;
4583 i++, internal++, external++)
4584 {
4585 internal->p_type = BYTE_GET (external->p_type);
4586 internal->p_flags = BYTE_GET (external->p_flags);
4587 internal->p_offset = BYTE_GET (external->p_offset);
4588 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4589 internal->p_paddr = BYTE_GET (external->p_paddr);
4590 internal->p_filesz = BYTE_GET (external->p_filesz);
4591 internal->p_memsz = BYTE_GET (external->p_memsz);
4592 internal->p_align = BYTE_GET (external->p_align);
4593 }
4594
4595 free (phdrs);
4596 return TRUE;
4597 }
4598
4599 /* Returns 1 if the program headers were read into `program_headers'. */
4600
4601 static int
4602 get_program_headers (FILE * file)
4603 {
4604 Elf_Internal_Phdr * phdrs;
4605
4606 /* Check cache of prior read. */
4607 if (program_headers != NULL)
4608 return 1;
4609
4610 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4611 sizeof (Elf_Internal_Phdr));
4612
4613 if (phdrs == NULL)
4614 {
4615 error (_("Out of memory reading %u program headers\n"),
4616 elf_header.e_phnum);
4617 return 0;
4618 }
4619
4620 if (is_32bit_elf
4621 ? get_32bit_program_headers (file, phdrs)
4622 : get_64bit_program_headers (file, phdrs))
4623 {
4624 program_headers = phdrs;
4625 return 1;
4626 }
4627
4628 free (phdrs);
4629 return 0;
4630 }
4631
4632 /* Returns 1 if the program headers were loaded. */
4633
4634 static int
4635 process_program_headers (FILE * file)
4636 {
4637 Elf_Internal_Phdr * segment;
4638 unsigned int i;
4639
4640 if (elf_header.e_phnum == 0)
4641 {
4642 /* PR binutils/12467. */
4643 if (elf_header.e_phoff != 0)
4644 warn (_("possibly corrupt ELF header - it has a non-zero program"
4645 " header offset, but no program headers\n"));
4646 else if (do_segments)
4647 printf (_("\nThere are no program headers in this file.\n"));
4648 return 0;
4649 }
4650
4651 if (do_segments && !do_header)
4652 {
4653 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4654 printf (_("Entry point "));
4655 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4656 printf (_("\nThere are %d program headers, starting at offset "),
4657 elf_header.e_phnum);
4658 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4659 printf ("\n");
4660 }
4661
4662 if (! get_program_headers (file))
4663 return 0;
4664
4665 if (do_segments)
4666 {
4667 if (elf_header.e_phnum > 1)
4668 printf (_("\nProgram Headers:\n"));
4669 else
4670 printf (_("\nProgram Headers:\n"));
4671
4672 if (is_32bit_elf)
4673 printf
4674 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4675 else if (do_wide)
4676 printf
4677 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4678 else
4679 {
4680 printf
4681 (_(" Type Offset VirtAddr PhysAddr\n"));
4682 printf
4683 (_(" FileSiz MemSiz Flags Align\n"));
4684 }
4685 }
4686
4687 dynamic_addr = 0;
4688 dynamic_size = 0;
4689
4690 for (i = 0, segment = program_headers;
4691 i < elf_header.e_phnum;
4692 i++, segment++)
4693 {
4694 if (do_segments)
4695 {
4696 printf (" %-14.14s ", get_segment_type (segment->p_type));
4697
4698 if (is_32bit_elf)
4699 {
4700 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4701 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4702 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4703 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4704 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4705 printf ("%c%c%c ",
4706 (segment->p_flags & PF_R ? 'R' : ' '),
4707 (segment->p_flags & PF_W ? 'W' : ' '),
4708 (segment->p_flags & PF_X ? 'E' : ' '));
4709 printf ("%#lx", (unsigned long) segment->p_align);
4710 }
4711 else if (do_wide)
4712 {
4713 if ((unsigned long) segment->p_offset == segment->p_offset)
4714 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4715 else
4716 {
4717 print_vma (segment->p_offset, FULL_HEX);
4718 putchar (' ');
4719 }
4720
4721 print_vma (segment->p_vaddr, FULL_HEX);
4722 putchar (' ');
4723 print_vma (segment->p_paddr, FULL_HEX);
4724 putchar (' ');
4725
4726 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4727 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4728 else
4729 {
4730 print_vma (segment->p_filesz, FULL_HEX);
4731 putchar (' ');
4732 }
4733
4734 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4735 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4736 else
4737 {
4738 print_vma (segment->p_memsz, FULL_HEX);
4739 }
4740
4741 printf (" %c%c%c ",
4742 (segment->p_flags & PF_R ? 'R' : ' '),
4743 (segment->p_flags & PF_W ? 'W' : ' '),
4744 (segment->p_flags & PF_X ? 'E' : ' '));
4745
4746 if ((unsigned long) segment->p_align == segment->p_align)
4747 printf ("%#lx", (unsigned long) segment->p_align);
4748 else
4749 {
4750 print_vma (segment->p_align, PREFIX_HEX);
4751 }
4752 }
4753 else
4754 {
4755 print_vma (segment->p_offset, FULL_HEX);
4756 putchar (' ');
4757 print_vma (segment->p_vaddr, FULL_HEX);
4758 putchar (' ');
4759 print_vma (segment->p_paddr, FULL_HEX);
4760 printf ("\n ");
4761 print_vma (segment->p_filesz, FULL_HEX);
4762 putchar (' ');
4763 print_vma (segment->p_memsz, FULL_HEX);
4764 printf (" %c%c%c ",
4765 (segment->p_flags & PF_R ? 'R' : ' '),
4766 (segment->p_flags & PF_W ? 'W' : ' '),
4767 (segment->p_flags & PF_X ? 'E' : ' '));
4768 print_vma (segment->p_align, HEX);
4769 }
4770 }
4771
4772 if (do_segments)
4773 putc ('\n', stdout);
4774
4775 switch (segment->p_type)
4776 {
4777 case PT_DYNAMIC:
4778 if (dynamic_addr)
4779 error (_("more than one dynamic segment\n"));
4780
4781 /* By default, assume that the .dynamic section is the first
4782 section in the DYNAMIC segment. */
4783 dynamic_addr = segment->p_offset;
4784 dynamic_size = segment->p_filesz;
4785 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4786 if (dynamic_addr + dynamic_size >= current_file_size)
4787 {
4788 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4789 dynamic_addr = dynamic_size = 0;
4790 }
4791
4792 /* Try to locate the .dynamic section. If there is
4793 a section header table, we can easily locate it. */
4794 if (section_headers != NULL)
4795 {
4796 Elf_Internal_Shdr * sec;
4797
4798 sec = find_section (".dynamic");
4799 if (sec == NULL || sec->sh_size == 0)
4800 {
4801 /* A corresponding .dynamic section is expected, but on
4802 IA-64/OpenVMS it is OK for it to be missing. */
4803 if (!is_ia64_vms ())
4804 error (_("no .dynamic section in the dynamic segment\n"));
4805 break;
4806 }
4807
4808 if (sec->sh_type == SHT_NOBITS)
4809 {
4810 dynamic_size = 0;
4811 break;
4812 }
4813
4814 dynamic_addr = sec->sh_offset;
4815 dynamic_size = sec->sh_size;
4816
4817 if (dynamic_addr < segment->p_offset
4818 || dynamic_addr > segment->p_offset + segment->p_filesz)
4819 warn (_("the .dynamic section is not contained"
4820 " within the dynamic segment\n"));
4821 else if (dynamic_addr > segment->p_offset)
4822 warn (_("the .dynamic section is not the first section"
4823 " in the dynamic segment.\n"));
4824 }
4825 break;
4826
4827 case PT_INTERP:
4828 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4829 SEEK_SET))
4830 error (_("Unable to find program interpreter name\n"));
4831 else
4832 {
4833 char fmt [32];
4834 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4835
4836 if (ret >= (int) sizeof (fmt) || ret < 0)
4837 error (_("Internal error: failed to create format string to display program interpreter\n"));
4838
4839 program_interpreter[0] = 0;
4840 if (fscanf (file, fmt, program_interpreter) <= 0)
4841 error (_("Unable to read program interpreter name\n"));
4842
4843 if (do_segments)
4844 printf (_(" [Requesting program interpreter: %s]\n"),
4845 program_interpreter);
4846 }
4847 break;
4848 }
4849 }
4850
4851 if (do_segments && section_headers != NULL && string_table != NULL)
4852 {
4853 printf (_("\n Section to Segment mapping:\n"));
4854 printf (_(" Segment Sections...\n"));
4855
4856 for (i = 0; i < elf_header.e_phnum; i++)
4857 {
4858 unsigned int j;
4859 Elf_Internal_Shdr * section;
4860
4861 segment = program_headers + i;
4862 section = section_headers + 1;
4863
4864 printf (" %2.2d ", i);
4865
4866 for (j = 1; j < elf_header.e_shnum; j++, section++)
4867 {
4868 if (!ELF_TBSS_SPECIAL (section, segment)
4869 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4870 printf ("%s ", printable_section_name (section));
4871 }
4872
4873 putc ('\n',stdout);
4874 }
4875 }
4876
4877 return 1;
4878 }
4879
4880
4881 /* Find the file offset corresponding to VMA by using the program headers. */
4882
4883 static long
4884 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4885 {
4886 Elf_Internal_Phdr * seg;
4887
4888 if (! get_program_headers (file))
4889 {
4890 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4891 return (long) vma;
4892 }
4893
4894 for (seg = program_headers;
4895 seg < program_headers + elf_header.e_phnum;
4896 ++seg)
4897 {
4898 if (seg->p_type != PT_LOAD)
4899 continue;
4900
4901 if (vma >= (seg->p_vaddr & -seg->p_align)
4902 && vma + size <= seg->p_vaddr + seg->p_filesz)
4903 return vma - seg->p_vaddr + seg->p_offset;
4904 }
4905
4906 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4907 (unsigned long) vma);
4908 return (long) vma;
4909 }
4910
4911
4912 /* Allocate memory and load the sections headers into the global pointer
4913 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4914 generate any error messages if the load fails. */
4915
4916 static bfd_boolean
4917 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4918 {
4919 Elf32_External_Shdr * shdrs;
4920 Elf_Internal_Shdr * internal;
4921 unsigned int i;
4922 unsigned int size = elf_header.e_shentsize;
4923 unsigned int num = probe ? 1 : elf_header.e_shnum;
4924
4925 /* PR binutils/17531: Cope with unexpected section header sizes. */
4926 if (size == 0 || num == 0)
4927 return FALSE;
4928 if (size < sizeof * shdrs)
4929 {
4930 if (! probe)
4931 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4932 return FALSE;
4933 }
4934 if (!probe && size > sizeof * shdrs)
4935 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4936
4937 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4938 size, num,
4939 probe ? NULL : _("section headers"));
4940 if (shdrs == NULL)
4941 return FALSE;
4942
4943 if (section_headers != NULL)
4944 free (section_headers);
4945 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4946 sizeof (Elf_Internal_Shdr));
4947 if (section_headers == NULL)
4948 {
4949 if (!probe)
4950 error (_("Out of memory reading %u section headers\n"), num);
4951 return FALSE;
4952 }
4953
4954 for (i = 0, internal = section_headers;
4955 i < num;
4956 i++, internal++)
4957 {
4958 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4959 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4960 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4961 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4962 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4963 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4964 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4965 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4966 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4967 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4968 }
4969
4970 free (shdrs);
4971 return TRUE;
4972 }
4973
4974 static bfd_boolean
4975 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4976 {
4977 Elf64_External_Shdr * shdrs;
4978 Elf_Internal_Shdr * internal;
4979 unsigned int i;
4980 unsigned int size = elf_header.e_shentsize;
4981 unsigned int num = probe ? 1 : elf_header.e_shnum;
4982
4983 /* PR binutils/17531: Cope with unexpected section header sizes. */
4984 if (size == 0 || num == 0)
4985 return FALSE;
4986 if (size < sizeof * shdrs)
4987 {
4988 if (! probe)
4989 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4990 return FALSE;
4991 }
4992 if (! probe && size > sizeof * shdrs)
4993 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4994
4995 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4996 size, num,
4997 probe ? NULL : _("section headers"));
4998 if (shdrs == NULL)
4999 return FALSE;
5000
5001 if (section_headers != NULL)
5002 free (section_headers);
5003 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5004 sizeof (Elf_Internal_Shdr));
5005 if (section_headers == NULL)
5006 {
5007 if (! probe)
5008 error (_("Out of memory reading %u section headers\n"), num);
5009 return FALSE;
5010 }
5011
5012 for (i = 0, internal = section_headers;
5013 i < num;
5014 i++, internal++)
5015 {
5016 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5017 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5018 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5019 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5020 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5021 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5022 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5023 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5024 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5025 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5026 }
5027
5028 free (shdrs);
5029 return TRUE;
5030 }
5031
5032 static Elf_Internal_Sym *
5033 get_32bit_elf_symbols (FILE * file,
5034 Elf_Internal_Shdr * section,
5035 unsigned long * num_syms_return)
5036 {
5037 unsigned long number = 0;
5038 Elf32_External_Sym * esyms = NULL;
5039 Elf_External_Sym_Shndx * shndx = NULL;
5040 Elf_Internal_Sym * isyms = NULL;
5041 Elf_Internal_Sym * psym;
5042 unsigned int j;
5043
5044 if (section->sh_size == 0)
5045 {
5046 if (num_syms_return != NULL)
5047 * num_syms_return = 0;
5048 return NULL;
5049 }
5050
5051 /* Run some sanity checks first. */
5052 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5053 {
5054 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5055 printable_section_name (section), (unsigned long) section->sh_entsize);
5056 goto exit_point;
5057 }
5058
5059 if (section->sh_size > current_file_size)
5060 {
5061 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5062 printable_section_name (section), (unsigned long) section->sh_size);
5063 goto exit_point;
5064 }
5065
5066 number = section->sh_size / section->sh_entsize;
5067
5068 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5069 {
5070 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5071 (unsigned long) section->sh_size,
5072 printable_section_name (section),
5073 (unsigned long) section->sh_entsize);
5074 goto exit_point;
5075 }
5076
5077 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5078 section->sh_size, _("symbols"));
5079 if (esyms == NULL)
5080 goto exit_point;
5081
5082 {
5083 elf_section_list * entry;
5084
5085 shndx = NULL;
5086 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5087 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5088 {
5089 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5090 entry->hdr->sh_offset,
5091 1, entry->hdr->sh_size,
5092 _("symbol table section indicies"));
5093 if (shndx == NULL)
5094 goto exit_point;
5095 /* PR17531: file: heap-buffer-overflow */
5096 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5097 {
5098 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5099 printable_section_name (entry->hdr),
5100 (unsigned long) entry->hdr->sh_size,
5101 (unsigned long) section->sh_size);
5102 goto exit_point;
5103 }
5104 }
5105 }
5106
5107 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5108
5109 if (isyms == NULL)
5110 {
5111 error (_("Out of memory reading %lu symbols\n"),
5112 (unsigned long) number);
5113 goto exit_point;
5114 }
5115
5116 for (j = 0, psym = isyms; j < number; j++, psym++)
5117 {
5118 psym->st_name = BYTE_GET (esyms[j].st_name);
5119 psym->st_value = BYTE_GET (esyms[j].st_value);
5120 psym->st_size = BYTE_GET (esyms[j].st_size);
5121 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5122 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5123 psym->st_shndx
5124 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5125 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5126 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5127 psym->st_info = BYTE_GET (esyms[j].st_info);
5128 psym->st_other = BYTE_GET (esyms[j].st_other);
5129 }
5130
5131 exit_point:
5132 if (shndx != NULL)
5133 free (shndx);
5134 if (esyms != NULL)
5135 free (esyms);
5136
5137 if (num_syms_return != NULL)
5138 * num_syms_return = isyms == NULL ? 0 : number;
5139
5140 return isyms;
5141 }
5142
5143 static Elf_Internal_Sym *
5144 get_64bit_elf_symbols (FILE * file,
5145 Elf_Internal_Shdr * section,
5146 unsigned long * num_syms_return)
5147 {
5148 unsigned long number = 0;
5149 Elf64_External_Sym * esyms = NULL;
5150 Elf_External_Sym_Shndx * shndx = NULL;
5151 Elf_Internal_Sym * isyms = NULL;
5152 Elf_Internal_Sym * psym;
5153 unsigned int j;
5154
5155 if (section->sh_size == 0)
5156 {
5157 if (num_syms_return != NULL)
5158 * num_syms_return = 0;
5159 return NULL;
5160 }
5161
5162 /* Run some sanity checks first. */
5163 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5164 {
5165 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5166 printable_section_name (section),
5167 (unsigned long) section->sh_entsize);
5168 goto exit_point;
5169 }
5170
5171 if (section->sh_size > current_file_size)
5172 {
5173 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5174 printable_section_name (section),
5175 (unsigned long) section->sh_size);
5176 goto exit_point;
5177 }
5178
5179 number = section->sh_size / section->sh_entsize;
5180
5181 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5182 {
5183 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5184 (unsigned long) section->sh_size,
5185 printable_section_name (section),
5186 (unsigned long) section->sh_entsize);
5187 goto exit_point;
5188 }
5189
5190 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5191 section->sh_size, _("symbols"));
5192 if (!esyms)
5193 goto exit_point;
5194
5195 {
5196 elf_section_list * entry;
5197
5198 shndx = NULL;
5199 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5200 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5201 {
5202 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5203 entry->hdr->sh_offset,
5204 1, entry->hdr->sh_size,
5205 _("symbol table section indicies"));
5206 if (shndx == NULL)
5207 goto exit_point;
5208 /* PR17531: file: heap-buffer-overflow */
5209 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5210 {
5211 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5212 printable_section_name (entry->hdr),
5213 (unsigned long) entry->hdr->sh_size,
5214 (unsigned long) section->sh_size);
5215 goto exit_point;
5216 }
5217 }
5218 }
5219
5220 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5221
5222 if (isyms == NULL)
5223 {
5224 error (_("Out of memory reading %lu symbols\n"),
5225 (unsigned long) number);
5226 goto exit_point;
5227 }
5228
5229 for (j = 0, psym = isyms; j < number; j++, psym++)
5230 {
5231 psym->st_name = BYTE_GET (esyms[j].st_name);
5232 psym->st_info = BYTE_GET (esyms[j].st_info);
5233 psym->st_other = BYTE_GET (esyms[j].st_other);
5234 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5235
5236 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5237 psym->st_shndx
5238 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5239 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5240 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5241
5242 psym->st_value = BYTE_GET (esyms[j].st_value);
5243 psym->st_size = BYTE_GET (esyms[j].st_size);
5244 }
5245
5246 exit_point:
5247 if (shndx != NULL)
5248 free (shndx);
5249 if (esyms != NULL)
5250 free (esyms);
5251
5252 if (num_syms_return != NULL)
5253 * num_syms_return = isyms == NULL ? 0 : number;
5254
5255 return isyms;
5256 }
5257
5258 static const char *
5259 get_elf_section_flags (bfd_vma sh_flags)
5260 {
5261 static char buff[1024];
5262 char * p = buff;
5263 int field_size = is_32bit_elf ? 8 : 16;
5264 int sindex;
5265 int size = sizeof (buff) - (field_size + 4 + 1);
5266 bfd_vma os_flags = 0;
5267 bfd_vma proc_flags = 0;
5268 bfd_vma unknown_flags = 0;
5269 static const struct
5270 {
5271 const char * str;
5272 int len;
5273 }
5274 flags [] =
5275 {
5276 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5277 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5278 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5279 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5280 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5281 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5282 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5283 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5284 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5285 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5286 /* IA-64 specific. */
5287 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5288 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5289 /* IA-64 OpenVMS specific. */
5290 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5291 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5292 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5293 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5294 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5295 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5296 /* Generic. */
5297 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5298 /* SPARC specific. */
5299 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5300 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5301 /* ARM specific. */
5302 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5303 /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5304 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5305 };
5306
5307 if (do_section_details)
5308 {
5309 sprintf (buff, "[%*.*lx]: ",
5310 field_size, field_size, (unsigned long) sh_flags);
5311 p += field_size + 4;
5312 }
5313
5314 while (sh_flags)
5315 {
5316 bfd_vma flag;
5317
5318 flag = sh_flags & - sh_flags;
5319 sh_flags &= ~ flag;
5320
5321 if (do_section_details)
5322 {
5323 switch (flag)
5324 {
5325 case SHF_WRITE: sindex = 0; break;
5326 case SHF_ALLOC: sindex = 1; break;
5327 case SHF_EXECINSTR: sindex = 2; break;
5328 case SHF_MERGE: sindex = 3; break;
5329 case SHF_STRINGS: sindex = 4; break;
5330 case SHF_INFO_LINK: sindex = 5; break;
5331 case SHF_LINK_ORDER: sindex = 6; break;
5332 case SHF_OS_NONCONFORMING: sindex = 7; break;
5333 case SHF_GROUP: sindex = 8; break;
5334 case SHF_TLS: sindex = 9; break;
5335 case SHF_EXCLUDE: sindex = 18; break;
5336 case SHF_COMPRESSED: sindex = 20; break;
5337
5338 default:
5339 sindex = -1;
5340 switch (elf_header.e_machine)
5341 {
5342 case EM_IA_64:
5343 if (flag == SHF_IA_64_SHORT)
5344 sindex = 10;
5345 else if (flag == SHF_IA_64_NORECOV)
5346 sindex = 11;
5347 #ifdef BFD64
5348 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5349 switch (flag)
5350 {
5351 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5352 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5353 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5354 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5355 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5356 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5357 default: break;
5358 }
5359 #endif
5360 break;
5361
5362 case EM_386:
5363 case EM_IAMCU:
5364 case EM_X86_64:
5365 case EM_L1OM:
5366 case EM_K1OM:
5367 case EM_OLD_SPARCV9:
5368 case EM_SPARC32PLUS:
5369 case EM_SPARCV9:
5370 case EM_SPARC:
5371 if (flag == SHF_ORDERED)
5372 sindex = 19;
5373 break;
5374
5375 case EM_ARM:
5376 switch (flag)
5377 {
5378 case SHF_ENTRYSECT: sindex = 21; break;
5379 case SHF_ARM_NOREAD: sindex = 22; break;
5380 case SHF_COMDEF: sindex = 23; break;
5381 default: break;
5382 }
5383 break;
5384
5385 default:
5386 break;
5387 }
5388 }
5389
5390 if (sindex != -1)
5391 {
5392 if (p != buff + field_size + 4)
5393 {
5394 if (size < (10 + 2))
5395 {
5396 warn (_("Internal error: not enough buffer room for section flag info"));
5397 return _("<unknown>");
5398 }
5399 size -= 2;
5400 *p++ = ',';
5401 *p++ = ' ';
5402 }
5403
5404 size -= flags [sindex].len;
5405 p = stpcpy (p, flags [sindex].str);
5406 }
5407 else if (flag & SHF_MASKOS)
5408 os_flags |= flag;
5409 else if (flag & SHF_MASKPROC)
5410 proc_flags |= flag;
5411 else
5412 unknown_flags |= flag;
5413 }
5414 else
5415 {
5416 switch (flag)
5417 {
5418 case SHF_WRITE: *p = 'W'; break;
5419 case SHF_ALLOC: *p = 'A'; break;
5420 case SHF_EXECINSTR: *p = 'X'; break;
5421 case SHF_MERGE: *p = 'M'; break;
5422 case SHF_STRINGS: *p = 'S'; break;
5423 case SHF_INFO_LINK: *p = 'I'; break;
5424 case SHF_LINK_ORDER: *p = 'L'; break;
5425 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5426 case SHF_GROUP: *p = 'G'; break;
5427 case SHF_TLS: *p = 'T'; break;
5428 case SHF_EXCLUDE: *p = 'E'; break;
5429 case SHF_COMPRESSED: *p = 'C'; break;
5430
5431 default:
5432 if ((elf_header.e_machine == EM_X86_64
5433 || elf_header.e_machine == EM_L1OM
5434 || elf_header.e_machine == EM_K1OM)
5435 && flag == SHF_X86_64_LARGE)
5436 *p = 'l';
5437 else if (elf_header.e_machine == EM_ARM
5438 && flag == SHF_ARM_NOREAD)
5439 *p = 'y';
5440 else if (flag & SHF_MASKOS)
5441 {
5442 *p = 'o';
5443 sh_flags &= ~ SHF_MASKOS;
5444 }
5445 else if (flag & SHF_MASKPROC)
5446 {
5447 *p = 'p';
5448 sh_flags &= ~ SHF_MASKPROC;
5449 }
5450 else
5451 *p = 'x';
5452 break;
5453 }
5454 p++;
5455 }
5456 }
5457
5458 if (do_section_details)
5459 {
5460 if (os_flags)
5461 {
5462 size -= 5 + field_size;
5463 if (p != buff + field_size + 4)
5464 {
5465 if (size < (2 + 1))
5466 {
5467 warn (_("Internal error: not enough buffer room for section flag info"));
5468 return _("<unknown>");
5469 }
5470 size -= 2;
5471 *p++ = ',';
5472 *p++ = ' ';
5473 }
5474 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5475 (unsigned long) os_flags);
5476 p += 5 + field_size;
5477 }
5478 if (proc_flags)
5479 {
5480 size -= 7 + field_size;
5481 if (p != buff + field_size + 4)
5482 {
5483 if (size < (2 + 1))
5484 {
5485 warn (_("Internal error: not enough buffer room for section flag info"));
5486 return _("<unknown>");
5487 }
5488 size -= 2;
5489 *p++ = ',';
5490 *p++ = ' ';
5491 }
5492 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5493 (unsigned long) proc_flags);
5494 p += 7 + field_size;
5495 }
5496 if (unknown_flags)
5497 {
5498 size -= 10 + field_size;
5499 if (p != buff + field_size + 4)
5500 {
5501 if (size < (2 + 1))
5502 {
5503 warn (_("Internal error: not enough buffer room for section flag info"));
5504 return _("<unknown>");
5505 }
5506 size -= 2;
5507 *p++ = ',';
5508 *p++ = ' ';
5509 }
5510 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5511 (unsigned long) unknown_flags);
5512 p += 10 + field_size;
5513 }
5514 }
5515
5516 *p = '\0';
5517 return buff;
5518 }
5519
5520 static unsigned int
5521 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5522 {
5523 if (is_32bit_elf)
5524 {
5525 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5526 chdr->ch_type = BYTE_GET (echdr->ch_type);
5527 chdr->ch_size = BYTE_GET (echdr->ch_size);
5528 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5529 return sizeof (*echdr);
5530 }
5531 else
5532 {
5533 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5534 chdr->ch_type = BYTE_GET (echdr->ch_type);
5535 chdr->ch_size = BYTE_GET (echdr->ch_size);
5536 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5537 return sizeof (*echdr);
5538 }
5539 }
5540
5541 static int
5542 process_section_headers (FILE * file)
5543 {
5544 Elf_Internal_Shdr * section;
5545 unsigned int i;
5546
5547 section_headers = NULL;
5548
5549 if (elf_header.e_shnum == 0)
5550 {
5551 /* PR binutils/12467. */
5552 if (elf_header.e_shoff != 0)
5553 warn (_("possibly corrupt ELF file header - it has a non-zero"
5554 " section header offset, but no section headers\n"));
5555 else if (do_sections)
5556 printf (_("\nThere are no sections in this file.\n"));
5557
5558 return 1;
5559 }
5560
5561 if (do_sections && !do_header)
5562 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5563 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5564
5565 if (is_32bit_elf)
5566 {
5567 if (! get_32bit_section_headers (file, FALSE))
5568 return 0;
5569 }
5570 else if (! get_64bit_section_headers (file, FALSE))
5571 return 0;
5572
5573 /* Read in the string table, so that we have names to display. */
5574 if (elf_header.e_shstrndx != SHN_UNDEF
5575 && elf_header.e_shstrndx < elf_header.e_shnum)
5576 {
5577 section = section_headers + elf_header.e_shstrndx;
5578
5579 if (section->sh_size != 0)
5580 {
5581 string_table = (char *) get_data (NULL, file, section->sh_offset,
5582 1, section->sh_size,
5583 _("string table"));
5584
5585 string_table_length = string_table != NULL ? section->sh_size : 0;
5586 }
5587 }
5588
5589 /* Scan the sections for the dynamic symbol table
5590 and dynamic string table and debug sections. */
5591 dynamic_symbols = NULL;
5592 dynamic_strings = NULL;
5593 dynamic_syminfo = NULL;
5594 symtab_shndx_list = NULL;
5595
5596 eh_addr_size = is_32bit_elf ? 4 : 8;
5597 switch (elf_header.e_machine)
5598 {
5599 case EM_MIPS:
5600 case EM_MIPS_RS3_LE:
5601 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5602 FDE addresses. However, the ABI also has a semi-official ILP32
5603 variant for which the normal FDE address size rules apply.
5604
5605 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5606 section, where XX is the size of longs in bits. Unfortunately,
5607 earlier compilers provided no way of distinguishing ILP32 objects
5608 from LP64 objects, so if there's any doubt, we should assume that
5609 the official LP64 form is being used. */
5610 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5611 && find_section (".gcc_compiled_long32") == NULL)
5612 eh_addr_size = 8;
5613 break;
5614
5615 case EM_H8_300:
5616 case EM_H8_300H:
5617 switch (elf_header.e_flags & EF_H8_MACH)
5618 {
5619 case E_H8_MACH_H8300:
5620 case E_H8_MACH_H8300HN:
5621 case E_H8_MACH_H8300SN:
5622 case E_H8_MACH_H8300SXN:
5623 eh_addr_size = 2;
5624 break;
5625 case E_H8_MACH_H8300H:
5626 case E_H8_MACH_H8300S:
5627 case E_H8_MACH_H8300SX:
5628 eh_addr_size = 4;
5629 break;
5630 }
5631 break;
5632
5633 case EM_M32C_OLD:
5634 case EM_M32C:
5635 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5636 {
5637 case EF_M32C_CPU_M16C:
5638 eh_addr_size = 2;
5639 break;
5640 }
5641 break;
5642 }
5643
5644 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5645 do \
5646 { \
5647 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5648 if (section->sh_entsize != expected_entsize) \
5649 { \
5650 char buf[40]; \
5651 sprintf_vma (buf, section->sh_entsize); \
5652 /* Note: coded this way so that there is a single string for \
5653 translation. */ \
5654 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5655 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5656 (unsigned) expected_entsize); \
5657 section->sh_entsize = expected_entsize; \
5658 } \
5659 } \
5660 while (0)
5661
5662 #define CHECK_ENTSIZE(section, i, type) \
5663 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5664 sizeof (Elf64_External_##type))
5665
5666 for (i = 0, section = section_headers;
5667 i < elf_header.e_shnum;
5668 i++, section++)
5669 {
5670 char * name = SECTION_NAME (section);
5671
5672 if (section->sh_type == SHT_DYNSYM)
5673 {
5674 if (dynamic_symbols != NULL)
5675 {
5676 error (_("File contains multiple dynamic symbol tables\n"));
5677 continue;
5678 }
5679
5680 CHECK_ENTSIZE (section, i, Sym);
5681 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5682 }
5683 else if (section->sh_type == SHT_STRTAB
5684 && streq (name, ".dynstr"))
5685 {
5686 if (dynamic_strings != NULL)
5687 {
5688 error (_("File contains multiple dynamic string tables\n"));
5689 continue;
5690 }
5691
5692 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5693 1, section->sh_size,
5694 _("dynamic strings"));
5695 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5696 }
5697 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5698 {
5699 elf_section_list * entry = xmalloc (sizeof * entry);
5700 entry->hdr = section;
5701 entry->next = symtab_shndx_list;
5702 symtab_shndx_list = entry;
5703 }
5704 else if (section->sh_type == SHT_SYMTAB)
5705 CHECK_ENTSIZE (section, i, Sym);
5706 else if (section->sh_type == SHT_GROUP)
5707 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5708 else if (section->sh_type == SHT_REL)
5709 CHECK_ENTSIZE (section, i, Rel);
5710 else if (section->sh_type == SHT_RELA)
5711 CHECK_ENTSIZE (section, i, Rela);
5712 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5713 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5714 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5715 || do_debug_str || do_debug_loc || do_debug_ranges
5716 || do_debug_addr || do_debug_cu_index)
5717 && (const_strneq (name, ".debug_")
5718 || const_strneq (name, ".zdebug_")))
5719 {
5720 if (name[1] == 'z')
5721 name += sizeof (".zdebug_") - 1;
5722 else
5723 name += sizeof (".debug_") - 1;
5724
5725 if (do_debugging
5726 || (do_debug_info && const_strneq (name, "info"))
5727 || (do_debug_info && const_strneq (name, "types"))
5728 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5729 || (do_debug_lines && strcmp (name, "line") == 0)
5730 || (do_debug_lines && const_strneq (name, "line."))
5731 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5732 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5733 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5734 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5735 || (do_debug_aranges && const_strneq (name, "aranges"))
5736 || (do_debug_ranges && const_strneq (name, "ranges"))
5737 || (do_debug_frames && const_strneq (name, "frame"))
5738 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5739 || (do_debug_macinfo && const_strneq (name, "macro"))
5740 || (do_debug_str && const_strneq (name, "str"))
5741 || (do_debug_loc && const_strneq (name, "loc"))
5742 || (do_debug_addr && const_strneq (name, "addr"))
5743 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5744 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5745 )
5746 request_dump_bynumber (i, DEBUG_DUMP);
5747 }
5748 /* Linkonce section to be combined with .debug_info at link time. */
5749 else if ((do_debugging || do_debug_info)
5750 && const_strneq (name, ".gnu.linkonce.wi."))
5751 request_dump_bynumber (i, DEBUG_DUMP);
5752 else if (do_debug_frames && streq (name, ".eh_frame"))
5753 request_dump_bynumber (i, DEBUG_DUMP);
5754 else if (do_gdb_index && streq (name, ".gdb_index"))
5755 request_dump_bynumber (i, DEBUG_DUMP);
5756 /* Trace sections for Itanium VMS. */
5757 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5758 || do_trace_aranges)
5759 && const_strneq (name, ".trace_"))
5760 {
5761 name += sizeof (".trace_") - 1;
5762
5763 if (do_debugging
5764 || (do_trace_info && streq (name, "info"))
5765 || (do_trace_abbrevs && streq (name, "abbrev"))
5766 || (do_trace_aranges && streq (name, "aranges"))
5767 )
5768 request_dump_bynumber (i, DEBUG_DUMP);
5769 }
5770 }
5771
5772 if (! do_sections)
5773 return 1;
5774
5775 if (elf_header.e_shnum > 1)
5776 printf (_("\nSection Headers:\n"));
5777 else
5778 printf (_("\nSection Header:\n"));
5779
5780 if (is_32bit_elf)
5781 {
5782 if (do_section_details)
5783 {
5784 printf (_(" [Nr] Name\n"));
5785 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5786 }
5787 else
5788 printf
5789 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5790 }
5791 else if (do_wide)
5792 {
5793 if (do_section_details)
5794 {
5795 printf (_(" [Nr] Name\n"));
5796 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5797 }
5798 else
5799 printf
5800 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5801 }
5802 else
5803 {
5804 if (do_section_details)
5805 {
5806 printf (_(" [Nr] Name\n"));
5807 printf (_(" Type Address Offset Link\n"));
5808 printf (_(" Size EntSize Info Align\n"));
5809 }
5810 else
5811 {
5812 printf (_(" [Nr] Name Type Address Offset\n"));
5813 printf (_(" Size EntSize Flags Link Info Align\n"));
5814 }
5815 }
5816
5817 if (do_section_details)
5818 printf (_(" Flags\n"));
5819
5820 for (i = 0, section = section_headers;
5821 i < elf_header.e_shnum;
5822 i++, section++)
5823 {
5824 printf (" [%2u] ", i);
5825 if (do_section_details)
5826 printf ("%s\n ", printable_section_name (section));
5827 else
5828 print_symbol (-17, SECTION_NAME (section));
5829
5830 printf (do_wide ? " %-15s " : " %-15.15s ",
5831 get_section_type_name (section->sh_type));
5832
5833 if (is_32bit_elf)
5834 {
5835 const char * link_too_big = NULL;
5836
5837 print_vma (section->sh_addr, LONG_HEX);
5838
5839 printf ( " %6.6lx %6.6lx %2.2lx",
5840 (unsigned long) section->sh_offset,
5841 (unsigned long) section->sh_size,
5842 (unsigned long) section->sh_entsize);
5843
5844 if (do_section_details)
5845 fputs (" ", stdout);
5846 else
5847 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5848
5849 if (section->sh_link >= elf_header.e_shnum)
5850 {
5851 link_too_big = "";
5852 /* The sh_link value is out of range. Normally this indicates
5853 an error but it can have special values in Solaris binaries. */
5854 switch (elf_header.e_machine)
5855 {
5856 case EM_386:
5857 case EM_IAMCU:
5858 case EM_X86_64:
5859 case EM_L1OM:
5860 case EM_K1OM:
5861 case EM_OLD_SPARCV9:
5862 case EM_SPARC32PLUS:
5863 case EM_SPARCV9:
5864 case EM_SPARC:
5865 if (section->sh_link == (SHN_BEFORE & 0xffff))
5866 link_too_big = "BEFORE";
5867 else if (section->sh_link == (SHN_AFTER & 0xffff))
5868 link_too_big = "AFTER";
5869 break;
5870 default:
5871 break;
5872 }
5873 }
5874
5875 if (do_section_details)
5876 {
5877 if (link_too_big != NULL && * link_too_big)
5878 printf ("<%s> ", link_too_big);
5879 else
5880 printf ("%2u ", section->sh_link);
5881 printf ("%3u %2lu\n", section->sh_info,
5882 (unsigned long) section->sh_addralign);
5883 }
5884 else
5885 printf ("%2u %3u %2lu\n",
5886 section->sh_link,
5887 section->sh_info,
5888 (unsigned long) section->sh_addralign);
5889
5890 if (link_too_big && ! * link_too_big)
5891 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5892 i, section->sh_link);
5893 }
5894 else if (do_wide)
5895 {
5896 print_vma (section->sh_addr, LONG_HEX);
5897
5898 if ((long) section->sh_offset == section->sh_offset)
5899 printf (" %6.6lx", (unsigned long) section->sh_offset);
5900 else
5901 {
5902 putchar (' ');
5903 print_vma (section->sh_offset, LONG_HEX);
5904 }
5905
5906 if ((unsigned long) section->sh_size == section->sh_size)
5907 printf (" %6.6lx", (unsigned long) section->sh_size);
5908 else
5909 {
5910 putchar (' ');
5911 print_vma (section->sh_size, LONG_HEX);
5912 }
5913
5914 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5915 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5916 else
5917 {
5918 putchar (' ');
5919 print_vma (section->sh_entsize, LONG_HEX);
5920 }
5921
5922 if (do_section_details)
5923 fputs (" ", stdout);
5924 else
5925 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5926
5927 printf ("%2u %3u ", section->sh_link, section->sh_info);
5928
5929 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5930 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5931 else
5932 {
5933 print_vma (section->sh_addralign, DEC);
5934 putchar ('\n');
5935 }
5936 }
5937 else if (do_section_details)
5938 {
5939 printf (" %-15.15s ",
5940 get_section_type_name (section->sh_type));
5941 print_vma (section->sh_addr, LONG_HEX);
5942 if ((long) section->sh_offset == section->sh_offset)
5943 printf (" %16.16lx", (unsigned long) section->sh_offset);
5944 else
5945 {
5946 printf (" ");
5947 print_vma (section->sh_offset, LONG_HEX);
5948 }
5949 printf (" %u\n ", section->sh_link);
5950 print_vma (section->sh_size, LONG_HEX);
5951 putchar (' ');
5952 print_vma (section->sh_entsize, LONG_HEX);
5953
5954 printf (" %-16u %lu\n",
5955 section->sh_info,
5956 (unsigned long) section->sh_addralign);
5957 }
5958 else
5959 {
5960 putchar (' ');
5961 print_vma (section->sh_addr, LONG_HEX);
5962 if ((long) section->sh_offset == section->sh_offset)
5963 printf (" %8.8lx", (unsigned long) section->sh_offset);
5964 else
5965 {
5966 printf (" ");
5967 print_vma (section->sh_offset, LONG_HEX);
5968 }
5969 printf ("\n ");
5970 print_vma (section->sh_size, LONG_HEX);
5971 printf (" ");
5972 print_vma (section->sh_entsize, LONG_HEX);
5973
5974 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5975
5976 printf (" %2u %3u %lu\n",
5977 section->sh_link,
5978 section->sh_info,
5979 (unsigned long) section->sh_addralign);
5980 }
5981
5982 if (do_section_details)
5983 {
5984 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5985 if ((section->sh_flags & SHF_COMPRESSED) != 0)
5986 {
5987 /* Minimum section size is 12 bytes for 32-bit compression
5988 header + 12 bytes for compressed data header. */
5989 unsigned char buf[24];
5990 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
5991 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
5992 sizeof (buf), _("compression header")))
5993 {
5994 Elf_Internal_Chdr chdr;
5995 get_compression_header (&chdr, buf);
5996 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
5997 printf (" ZLIB, ");
5998 else
5999 printf (_(" [<unknown>: 0x%x], "),
6000 chdr.ch_type);
6001 print_vma (chdr.ch_size, LONG_HEX);
6002 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6003 }
6004 }
6005 }
6006 }
6007
6008 if (!do_section_details)
6009 {
6010 /* The ordering of the letters shown here matches the ordering of the
6011 corresponding SHF_xxx values, and hence the order in which these
6012 letters will be displayed to the user. */
6013 printf (_("Key to Flags:\n\
6014 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6015 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6016 C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
6017 if (elf_header.e_machine == EM_X86_64
6018 || elf_header.e_machine == EM_L1OM
6019 || elf_header.e_machine == EM_K1OM)
6020 printf (_("l (large), "));
6021 else if (elf_header.e_machine == EM_ARM)
6022 printf (_("y (noread), "));
6023 printf ("p (processor specific)\n");
6024 }
6025
6026 return 1;
6027 }
6028
6029 static const char *
6030 get_group_flags (unsigned int flags)
6031 {
6032 static char buff[32];
6033 switch (flags)
6034 {
6035 case 0:
6036 return "";
6037
6038 case GRP_COMDAT:
6039 return "COMDAT ";
6040
6041 default:
6042 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6043 break;
6044 }
6045 return buff;
6046 }
6047
6048 static int
6049 process_section_groups (FILE * file)
6050 {
6051 Elf_Internal_Shdr * section;
6052 unsigned int i;
6053 struct group * group;
6054 Elf_Internal_Shdr * symtab_sec;
6055 Elf_Internal_Shdr * strtab_sec;
6056 Elf_Internal_Sym * symtab;
6057 unsigned long num_syms;
6058 char * strtab;
6059 size_t strtab_size;
6060
6061 /* Don't process section groups unless needed. */
6062 if (!do_unwind && !do_section_groups)
6063 return 1;
6064
6065 if (elf_header.e_shnum == 0)
6066 {
6067 if (do_section_groups)
6068 printf (_("\nThere are no sections to group in this file.\n"));
6069
6070 return 1;
6071 }
6072
6073 if (section_headers == NULL)
6074 {
6075 error (_("Section headers are not available!\n"));
6076 /* PR 13622: This can happen with a corrupt ELF header. */
6077 return 0;
6078 }
6079
6080 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6081 sizeof (struct group *));
6082
6083 if (section_headers_groups == NULL)
6084 {
6085 error (_("Out of memory reading %u section group headers\n"),
6086 elf_header.e_shnum);
6087 return 0;
6088 }
6089
6090 /* Scan the sections for the group section. */
6091 group_count = 0;
6092 for (i = 0, section = section_headers;
6093 i < elf_header.e_shnum;
6094 i++, section++)
6095 if (section->sh_type == SHT_GROUP)
6096 group_count++;
6097
6098 if (group_count == 0)
6099 {
6100 if (do_section_groups)
6101 printf (_("\nThere are no section groups in this file.\n"));
6102
6103 return 1;
6104 }
6105
6106 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6107
6108 if (section_groups == NULL)
6109 {
6110 error (_("Out of memory reading %lu groups\n"),
6111 (unsigned long) group_count);
6112 return 0;
6113 }
6114
6115 symtab_sec = NULL;
6116 strtab_sec = NULL;
6117 symtab = NULL;
6118 num_syms = 0;
6119 strtab = NULL;
6120 strtab_size = 0;
6121 for (i = 0, section = section_headers, group = section_groups;
6122 i < elf_header.e_shnum;
6123 i++, section++)
6124 {
6125 if (section->sh_type == SHT_GROUP)
6126 {
6127 const char * name = printable_section_name (section);
6128 const char * group_name;
6129 unsigned char * start;
6130 unsigned char * indices;
6131 unsigned int entry, j, size;
6132 Elf_Internal_Shdr * sec;
6133 Elf_Internal_Sym * sym;
6134
6135 /* Get the symbol table. */
6136 if (section->sh_link >= elf_header.e_shnum
6137 || ((sec = section_headers + section->sh_link)->sh_type
6138 != SHT_SYMTAB))
6139 {
6140 error (_("Bad sh_link in group section `%s'\n"), name);
6141 continue;
6142 }
6143
6144 if (symtab_sec != sec)
6145 {
6146 symtab_sec = sec;
6147 if (symtab)
6148 free (symtab);
6149 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6150 }
6151
6152 if (symtab == NULL)
6153 {
6154 error (_("Corrupt header in group section `%s'\n"), name);
6155 continue;
6156 }
6157
6158 if (section->sh_info >= num_syms)
6159 {
6160 error (_("Bad sh_info in group section `%s'\n"), name);
6161 continue;
6162 }
6163
6164 sym = symtab + section->sh_info;
6165
6166 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6167 {
6168 if (sym->st_shndx == 0
6169 || sym->st_shndx >= elf_header.e_shnum)
6170 {
6171 error (_("Bad sh_info in group section `%s'\n"), name);
6172 continue;
6173 }
6174
6175 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6176 strtab_sec = NULL;
6177 if (strtab)
6178 free (strtab);
6179 strtab = NULL;
6180 strtab_size = 0;
6181 }
6182 else
6183 {
6184 /* Get the string table. */
6185 if (symtab_sec->sh_link >= elf_header.e_shnum)
6186 {
6187 strtab_sec = NULL;
6188 if (strtab)
6189 free (strtab);
6190 strtab = NULL;
6191 strtab_size = 0;
6192 }
6193 else if (strtab_sec
6194 != (sec = section_headers + symtab_sec->sh_link))
6195 {
6196 strtab_sec = sec;
6197 if (strtab)
6198 free (strtab);
6199
6200 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6201 1, strtab_sec->sh_size,
6202 _("string table"));
6203 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6204 }
6205 group_name = sym->st_name < strtab_size
6206 ? strtab + sym->st_name : _("<corrupt>");
6207 }
6208
6209 /* PR 17531: file: loop. */
6210 if (section->sh_entsize > section->sh_size)
6211 {
6212 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6213 printable_section_name (section),
6214 (unsigned long) section->sh_entsize,
6215 (unsigned long) section->sh_size);
6216 break;
6217 }
6218
6219 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6220 1, section->sh_size,
6221 _("section data"));
6222 if (start == NULL)
6223 continue;
6224
6225 indices = start;
6226 size = (section->sh_size / section->sh_entsize) - 1;
6227 entry = byte_get (indices, 4);
6228 indices += 4;
6229
6230 if (do_section_groups)
6231 {
6232 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6233 get_group_flags (entry), i, name, group_name, size);
6234
6235 printf (_(" [Index] Name\n"));
6236 }
6237
6238 group->group_index = i;
6239
6240 for (j = 0; j < size; j++)
6241 {
6242 struct group_list * g;
6243
6244 entry = byte_get (indices, 4);
6245 indices += 4;
6246
6247 if (entry >= elf_header.e_shnum)
6248 {
6249 static unsigned num_group_errors = 0;
6250
6251 if (num_group_errors ++ < 10)
6252 {
6253 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6254 entry, i, elf_header.e_shnum - 1);
6255 if (num_group_errors == 10)
6256 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6257 }
6258 continue;
6259 }
6260
6261 if (section_headers_groups [entry] != NULL)
6262 {
6263 if (entry)
6264 {
6265 static unsigned num_errs = 0;
6266
6267 if (num_errs ++ < 10)
6268 {
6269 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6270 entry, i,
6271 section_headers_groups [entry]->group_index);
6272 if (num_errs == 10)
6273 warn (_("Further error messages about already contained group sections suppressed\n"));
6274 }
6275 continue;
6276 }
6277 else
6278 {
6279 /* Intel C/C++ compiler may put section 0 in a
6280 section group. We just warn it the first time
6281 and ignore it afterwards. */
6282 static int warned = 0;
6283 if (!warned)
6284 {
6285 error (_("section 0 in group section [%5u]\n"),
6286 section_headers_groups [entry]->group_index);
6287 warned++;
6288 }
6289 }
6290 }
6291
6292 section_headers_groups [entry] = group;
6293
6294 if (do_section_groups)
6295 {
6296 sec = section_headers + entry;
6297 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6298 }
6299
6300 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6301 g->section_index = entry;
6302 g->next = group->root;
6303 group->root = g;
6304 }
6305
6306 if (start)
6307 free (start);
6308
6309 group++;
6310 }
6311 }
6312
6313 if (symtab)
6314 free (symtab);
6315 if (strtab)
6316 free (strtab);
6317 return 1;
6318 }
6319
6320 /* Data used to display dynamic fixups. */
6321
6322 struct ia64_vms_dynfixup
6323 {
6324 bfd_vma needed_ident; /* Library ident number. */
6325 bfd_vma needed; /* Index in the dstrtab of the library name. */
6326 bfd_vma fixup_needed; /* Index of the library. */
6327 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6328 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6329 };
6330
6331 /* Data used to display dynamic relocations. */
6332
6333 struct ia64_vms_dynimgrela
6334 {
6335 bfd_vma img_rela_cnt; /* Number of relocations. */
6336 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6337 };
6338
6339 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6340 library). */
6341
6342 static void
6343 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6344 const char *strtab, unsigned int strtab_sz)
6345 {
6346 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6347 long i;
6348 const char *lib_name;
6349
6350 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6351 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6352 _("dynamic section image fixups"));
6353 if (!imfs)
6354 return;
6355
6356 if (fixup->needed < strtab_sz)
6357 lib_name = strtab + fixup->needed;
6358 else
6359 {
6360 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6361 (unsigned long) fixup->needed);
6362 lib_name = "???";
6363 }
6364 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6365 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6366 printf
6367 (_("Seg Offset Type SymVec DataType\n"));
6368
6369 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6370 {
6371 unsigned int type;
6372 const char *rtype;
6373
6374 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6375 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6376 type = BYTE_GET (imfs [i].type);
6377 rtype = elf_ia64_reloc_type (type);
6378 if (rtype == NULL)
6379 printf (" 0x%08x ", type);
6380 else
6381 printf (" %-32s ", rtype);
6382 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6383 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6384 }
6385
6386 free (imfs);
6387 }
6388
6389 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6390
6391 static void
6392 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6393 {
6394 Elf64_External_VMS_IMAGE_RELA *imrs;
6395 long i;
6396
6397 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6398 1, imgrela->img_rela_cnt * sizeof (*imrs),
6399 _("dynamic section image relocations"));
6400 if (!imrs)
6401 return;
6402
6403 printf (_("\nImage relocs\n"));
6404 printf
6405 (_("Seg Offset Type Addend Seg Sym Off\n"));
6406
6407 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6408 {
6409 unsigned int type;
6410 const char *rtype;
6411
6412 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6413 printf ("%08" BFD_VMA_FMT "x ",
6414 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6415 type = BYTE_GET (imrs [i].type);
6416 rtype = elf_ia64_reloc_type (type);
6417 if (rtype == NULL)
6418 printf ("0x%08x ", type);
6419 else
6420 printf ("%-31s ", rtype);
6421 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6422 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6423 printf ("%08" BFD_VMA_FMT "x\n",
6424 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6425 }
6426
6427 free (imrs);
6428 }
6429
6430 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6431
6432 static int
6433 process_ia64_vms_dynamic_relocs (FILE *file)
6434 {
6435 struct ia64_vms_dynfixup fixup;
6436 struct ia64_vms_dynimgrela imgrela;
6437 Elf_Internal_Dyn *entry;
6438 int res = 0;
6439 bfd_vma strtab_off = 0;
6440 bfd_vma strtab_sz = 0;
6441 char *strtab = NULL;
6442
6443 memset (&fixup, 0, sizeof (fixup));
6444 memset (&imgrela, 0, sizeof (imgrela));
6445
6446 /* Note: the order of the entries is specified by the OpenVMS specs. */
6447 for (entry = dynamic_section;
6448 entry < dynamic_section + dynamic_nent;
6449 entry++)
6450 {
6451 switch (entry->d_tag)
6452 {
6453 case DT_IA_64_VMS_STRTAB_OFFSET:
6454 strtab_off = entry->d_un.d_val;
6455 break;
6456 case DT_STRSZ:
6457 strtab_sz = entry->d_un.d_val;
6458 if (strtab == NULL)
6459 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6460 1, strtab_sz, _("dynamic string section"));
6461 break;
6462
6463 case DT_IA_64_VMS_NEEDED_IDENT:
6464 fixup.needed_ident = entry->d_un.d_val;
6465 break;
6466 case DT_NEEDED:
6467 fixup.needed = entry->d_un.d_val;
6468 break;
6469 case DT_IA_64_VMS_FIXUP_NEEDED:
6470 fixup.fixup_needed = entry->d_un.d_val;
6471 break;
6472 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6473 fixup.fixup_rela_cnt = entry->d_un.d_val;
6474 break;
6475 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6476 fixup.fixup_rela_off = entry->d_un.d_val;
6477 res++;
6478 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6479 break;
6480
6481 case DT_IA_64_VMS_IMG_RELA_CNT:
6482 imgrela.img_rela_cnt = entry->d_un.d_val;
6483 break;
6484 case DT_IA_64_VMS_IMG_RELA_OFF:
6485 imgrela.img_rela_off = entry->d_un.d_val;
6486 res++;
6487 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6488 break;
6489
6490 default:
6491 break;
6492 }
6493 }
6494
6495 if (strtab != NULL)
6496 free (strtab);
6497
6498 return res;
6499 }
6500
6501 static struct
6502 {
6503 const char * name;
6504 int reloc;
6505 int size;
6506 int rela;
6507 } dynamic_relocations [] =
6508 {
6509 { "REL", DT_REL, DT_RELSZ, FALSE },
6510 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6511 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6512 };
6513
6514 /* Process the reloc section. */
6515
6516 static int
6517 process_relocs (FILE * file)
6518 {
6519 unsigned long rel_size;
6520 unsigned long rel_offset;
6521
6522
6523 if (!do_reloc)
6524 return 1;
6525
6526 if (do_using_dynamic)
6527 {
6528 int is_rela;
6529 const char * name;
6530 int has_dynamic_reloc;
6531 unsigned int i;
6532
6533 has_dynamic_reloc = 0;
6534
6535 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6536 {
6537 is_rela = dynamic_relocations [i].rela;
6538 name = dynamic_relocations [i].name;
6539 rel_size = dynamic_info [dynamic_relocations [i].size];
6540 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6541
6542 has_dynamic_reloc |= rel_size;
6543
6544 if (is_rela == UNKNOWN)
6545 {
6546 if (dynamic_relocations [i].reloc == DT_JMPREL)
6547 switch (dynamic_info[DT_PLTREL])
6548 {
6549 case DT_REL:
6550 is_rela = FALSE;
6551 break;
6552 case DT_RELA:
6553 is_rela = TRUE;
6554 break;
6555 }
6556 }
6557
6558 if (rel_size)
6559 {
6560 printf
6561 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6562 name, rel_offset, rel_size);
6563
6564 dump_relocations (file,
6565 offset_from_vma (file, rel_offset, rel_size),
6566 rel_size,
6567 dynamic_symbols, num_dynamic_syms,
6568 dynamic_strings, dynamic_strings_length,
6569 is_rela, 1);
6570 }
6571 }
6572
6573 if (is_ia64_vms ())
6574 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6575
6576 if (! has_dynamic_reloc)
6577 printf (_("\nThere are no dynamic relocations in this file.\n"));
6578 }
6579 else
6580 {
6581 Elf_Internal_Shdr * section;
6582 unsigned long i;
6583 int found = 0;
6584
6585 for (i = 0, section = section_headers;
6586 i < elf_header.e_shnum;
6587 i++, section++)
6588 {
6589 if ( section->sh_type != SHT_RELA
6590 && section->sh_type != SHT_REL)
6591 continue;
6592
6593 rel_offset = section->sh_offset;
6594 rel_size = section->sh_size;
6595
6596 if (rel_size)
6597 {
6598 Elf_Internal_Shdr * strsec;
6599 int is_rela;
6600
6601 printf (_("\nRelocation section "));
6602
6603 if (string_table == NULL)
6604 printf ("%d", section->sh_name);
6605 else
6606 printf ("'%s'", printable_section_name (section));
6607
6608 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6609 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6610
6611 is_rela = section->sh_type == SHT_RELA;
6612
6613 if (section->sh_link != 0
6614 && section->sh_link < elf_header.e_shnum)
6615 {
6616 Elf_Internal_Shdr * symsec;
6617 Elf_Internal_Sym * symtab;
6618 unsigned long nsyms;
6619 unsigned long strtablen = 0;
6620 char * strtab = NULL;
6621
6622 symsec = section_headers + section->sh_link;
6623 if (symsec->sh_type != SHT_SYMTAB
6624 && symsec->sh_type != SHT_DYNSYM)
6625 continue;
6626
6627 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6628
6629 if (symtab == NULL)
6630 continue;
6631
6632 if (symsec->sh_link != 0
6633 && symsec->sh_link < elf_header.e_shnum)
6634 {
6635 strsec = section_headers + symsec->sh_link;
6636
6637 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6638 1, strsec->sh_size,
6639 _("string table"));
6640 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6641 }
6642
6643 dump_relocations (file, rel_offset, rel_size,
6644 symtab, nsyms, strtab, strtablen,
6645 is_rela,
6646 symsec->sh_type == SHT_DYNSYM);
6647 if (strtab)
6648 free (strtab);
6649 free (symtab);
6650 }
6651 else
6652 dump_relocations (file, rel_offset, rel_size,
6653 NULL, 0, NULL, 0, is_rela, 0);
6654
6655 found = 1;
6656 }
6657 }
6658
6659 if (! found)
6660 printf (_("\nThere are no relocations in this file.\n"));
6661 }
6662
6663 return 1;
6664 }
6665
6666 /* An absolute address consists of a section and an offset. If the
6667 section is NULL, the offset itself is the address, otherwise, the
6668 address equals to LOAD_ADDRESS(section) + offset. */
6669
6670 struct absaddr
6671 {
6672 unsigned short section;
6673 bfd_vma offset;
6674 };
6675
6676 #define ABSADDR(a) \
6677 ((a).section \
6678 ? section_headers [(a).section].sh_addr + (a).offset \
6679 : (a).offset)
6680
6681 /* Find the nearest symbol at or below ADDR. Returns the symbol
6682 name, if found, and the offset from the symbol to ADDR. */
6683
6684 static void
6685 find_symbol_for_address (Elf_Internal_Sym * symtab,
6686 unsigned long nsyms,
6687 const char * strtab,
6688 unsigned long strtab_size,
6689 struct absaddr addr,
6690 const char ** symname,
6691 bfd_vma * offset)
6692 {
6693 bfd_vma dist = 0x100000;
6694 Elf_Internal_Sym * sym;
6695 Elf_Internal_Sym * beg;
6696 Elf_Internal_Sym * end;
6697 Elf_Internal_Sym * best = NULL;
6698
6699 REMOVE_ARCH_BITS (addr.offset);
6700 beg = symtab;
6701 end = symtab + nsyms;
6702
6703 while (beg < end)
6704 {
6705 bfd_vma value;
6706
6707 sym = beg + (end - beg) / 2;
6708
6709 value = sym->st_value;
6710 REMOVE_ARCH_BITS (value);
6711
6712 if (sym->st_name != 0
6713 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6714 && addr.offset >= value
6715 && addr.offset - value < dist)
6716 {
6717 best = sym;
6718 dist = addr.offset - value;
6719 if (!dist)
6720 break;
6721 }
6722
6723 if (addr.offset < value)
6724 end = sym;
6725 else
6726 beg = sym + 1;
6727 }
6728
6729 if (best)
6730 {
6731 *symname = (best->st_name >= strtab_size
6732 ? _("<corrupt>") : strtab + best->st_name);
6733 *offset = dist;
6734 return;
6735 }
6736
6737 *symname = NULL;
6738 *offset = addr.offset;
6739 }
6740
6741 static int
6742 symcmp (const void *p, const void *q)
6743 {
6744 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6745 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6746
6747 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6748 }
6749
6750 /* Process the unwind section. */
6751
6752 #include "unwind-ia64.h"
6753
6754 struct ia64_unw_table_entry
6755 {
6756 struct absaddr start;
6757 struct absaddr end;
6758 struct absaddr info;
6759 };
6760
6761 struct ia64_unw_aux_info
6762 {
6763 struct ia64_unw_table_entry *table; /* Unwind table. */
6764 unsigned long table_len; /* Length of unwind table. */
6765 unsigned char * info; /* Unwind info. */
6766 unsigned long info_size; /* Size of unwind info. */
6767 bfd_vma info_addr; /* Starting address of unwind info. */
6768 bfd_vma seg_base; /* Starting address of segment. */
6769 Elf_Internal_Sym * symtab; /* The symbol table. */
6770 unsigned long nsyms; /* Number of symbols. */
6771 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6772 unsigned long nfuns; /* Number of entries in funtab. */
6773 char * strtab; /* The string table. */
6774 unsigned long strtab_size; /* Size of string table. */
6775 };
6776
6777 static void
6778 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6779 {
6780 struct ia64_unw_table_entry * tp;
6781 unsigned long j, nfuns;
6782 int in_body;
6783
6784 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6785 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6786 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6787 aux->funtab[nfuns++] = aux->symtab[j];
6788 aux->nfuns = nfuns;
6789 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6790
6791 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6792 {
6793 bfd_vma stamp;
6794 bfd_vma offset;
6795 const unsigned char * dp;
6796 const unsigned char * head;
6797 const unsigned char * end;
6798 const char * procname;
6799
6800 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6801 aux->strtab_size, tp->start, &procname, &offset);
6802
6803 fputs ("\n<", stdout);
6804
6805 if (procname)
6806 {
6807 fputs (procname, stdout);
6808
6809 if (offset)
6810 printf ("+%lx", (unsigned long) offset);
6811 }
6812
6813 fputs (">: [", stdout);
6814 print_vma (tp->start.offset, PREFIX_HEX);
6815 fputc ('-', stdout);
6816 print_vma (tp->end.offset, PREFIX_HEX);
6817 printf ("], info at +0x%lx\n",
6818 (unsigned long) (tp->info.offset - aux->seg_base));
6819
6820 /* PR 17531: file: 86232b32. */
6821 if (aux->info == NULL)
6822 continue;
6823
6824 /* PR 17531: file: 0997b4d1. */
6825 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6826 {
6827 warn (_("Invalid offset %lx in table entry %ld\n"),
6828 (long) tp->info.offset, (long) (tp - aux->table));
6829 continue;
6830 }
6831
6832 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6833 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6834
6835 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6836 (unsigned) UNW_VER (stamp),
6837 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6838 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6839 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6840 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6841
6842 if (UNW_VER (stamp) != 1)
6843 {
6844 printf (_("\tUnknown version.\n"));
6845 continue;
6846 }
6847
6848 in_body = 0;
6849 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6850 /* PR 17531: file: 16ceda89. */
6851 if (end > aux->info + aux->info_size)
6852 end = aux->info + aux->info_size;
6853 for (dp = head + 8; dp < end;)
6854 dp = unw_decode (dp, in_body, & in_body, end);
6855 }
6856
6857 free (aux->funtab);
6858 }
6859
6860 static bfd_boolean
6861 slurp_ia64_unwind_table (FILE * file,
6862 struct ia64_unw_aux_info * aux,
6863 Elf_Internal_Shdr * sec)
6864 {
6865 unsigned long size, nrelas, i;
6866 Elf_Internal_Phdr * seg;
6867 struct ia64_unw_table_entry * tep;
6868 Elf_Internal_Shdr * relsec;
6869 Elf_Internal_Rela * rela;
6870 Elf_Internal_Rela * rp;
6871 unsigned char * table;
6872 unsigned char * tp;
6873 Elf_Internal_Sym * sym;
6874 const char * relname;
6875
6876 aux->table_len = 0;
6877
6878 /* First, find the starting address of the segment that includes
6879 this section: */
6880
6881 if (elf_header.e_phnum)
6882 {
6883 if (! get_program_headers (file))
6884 return FALSE;
6885
6886 for (seg = program_headers;
6887 seg < program_headers + elf_header.e_phnum;
6888 ++seg)
6889 {
6890 if (seg->p_type != PT_LOAD)
6891 continue;
6892
6893 if (sec->sh_addr >= seg->p_vaddr
6894 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6895 {
6896 aux->seg_base = seg->p_vaddr;
6897 break;
6898 }
6899 }
6900 }
6901
6902 /* Second, build the unwind table from the contents of the unwind section: */
6903 size = sec->sh_size;
6904 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6905 _("unwind table"));
6906 if (!table)
6907 return FALSE;
6908
6909 aux->table_len = size / (3 * eh_addr_size);
6910 aux->table = (struct ia64_unw_table_entry *)
6911 xcmalloc (aux->table_len, sizeof (aux->table[0]));
6912 tep = aux->table;
6913
6914 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6915 {
6916 tep->start.section = SHN_UNDEF;
6917 tep->end.section = SHN_UNDEF;
6918 tep->info.section = SHN_UNDEF;
6919 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6920 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6921 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6922 tep->start.offset += aux->seg_base;
6923 tep->end.offset += aux->seg_base;
6924 tep->info.offset += aux->seg_base;
6925 }
6926 free (table);
6927
6928 /* Third, apply any relocations to the unwind table: */
6929 for (relsec = section_headers;
6930 relsec < section_headers + elf_header.e_shnum;
6931 ++relsec)
6932 {
6933 if (relsec->sh_type != SHT_RELA
6934 || relsec->sh_info >= elf_header.e_shnum
6935 || section_headers + relsec->sh_info != sec)
6936 continue;
6937
6938 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6939 & rela, & nrelas))
6940 {
6941 free (aux->table);
6942 aux->table = NULL;
6943 aux->table_len = 0;
6944 return FALSE;
6945 }
6946
6947 for (rp = rela; rp < rela + nrelas; ++rp)
6948 {
6949 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6950 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6951
6952 /* PR 17531: file: 9fa67536. */
6953 if (relname == NULL)
6954 {
6955 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6956 continue;
6957 }
6958
6959 if (! const_strneq (relname, "R_IA64_SEGREL"))
6960 {
6961 warn (_("Skipping unexpected relocation type: %s\n"), relname);
6962 continue;
6963 }
6964
6965 i = rp->r_offset / (3 * eh_addr_size);
6966
6967 /* PR 17531: file: 5bc8d9bf. */
6968 if (i >= aux->table_len)
6969 {
6970 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6971 continue;
6972 }
6973
6974 switch (rp->r_offset / eh_addr_size % 3)
6975 {
6976 case 0:
6977 aux->table[i].start.section = sym->st_shndx;
6978 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6979 break;
6980 case 1:
6981 aux->table[i].end.section = sym->st_shndx;
6982 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6983 break;
6984 case 2:
6985 aux->table[i].info.section = sym->st_shndx;
6986 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6987 break;
6988 default:
6989 break;
6990 }
6991 }
6992
6993 free (rela);
6994 }
6995
6996 return TRUE;
6997 }
6998
6999 static void
7000 ia64_process_unwind (FILE * file)
7001 {
7002 Elf_Internal_Shdr * sec;
7003 Elf_Internal_Shdr * unwsec = NULL;
7004 Elf_Internal_Shdr * strsec;
7005 unsigned long i, unwcount = 0, unwstart = 0;
7006 struct ia64_unw_aux_info aux;
7007
7008 memset (& aux, 0, sizeof (aux));
7009
7010 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7011 {
7012 if (sec->sh_type == SHT_SYMTAB
7013 && sec->sh_link < elf_header.e_shnum)
7014 {
7015 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7016
7017 strsec = section_headers + sec->sh_link;
7018 if (aux.strtab != NULL)
7019 {
7020 error (_("Multiple auxillary string tables encountered\n"));
7021 free (aux.strtab);
7022 }
7023 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7024 1, strsec->sh_size,
7025 _("string table"));
7026 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7027 }
7028 else if (sec->sh_type == SHT_IA_64_UNWIND)
7029 unwcount++;
7030 }
7031
7032 if (!unwcount)
7033 printf (_("\nThere are no unwind sections in this file.\n"));
7034
7035 while (unwcount-- > 0)
7036 {
7037 char * suffix;
7038 size_t len, len2;
7039
7040 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7041 i < elf_header.e_shnum; ++i, ++sec)
7042 if (sec->sh_type == SHT_IA_64_UNWIND)
7043 {
7044 unwsec = sec;
7045 break;
7046 }
7047 /* We have already counted the number of SHT_IA64_UNWIND
7048 sections so the loop above should never fail. */
7049 assert (unwsec != NULL);
7050
7051 unwstart = i + 1;
7052 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7053
7054 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7055 {
7056 /* We need to find which section group it is in. */
7057 struct group_list * g;
7058
7059 if (section_headers_groups == NULL
7060 || section_headers_groups [i] == NULL)
7061 i = elf_header.e_shnum;
7062 else
7063 {
7064 g = section_headers_groups [i]->root;
7065
7066 for (; g != NULL; g = g->next)
7067 {
7068 sec = section_headers + g->section_index;
7069
7070 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7071 break;
7072 }
7073
7074 if (g == NULL)
7075 i = elf_header.e_shnum;
7076 }
7077 }
7078 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7079 {
7080 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7081 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7082 suffix = SECTION_NAME (unwsec) + len;
7083 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7084 ++i, ++sec)
7085 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7086 && streq (SECTION_NAME (sec) + len2, suffix))
7087 break;
7088 }
7089 else
7090 {
7091 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7092 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7093 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7094 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7095 suffix = "";
7096 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7097 suffix = SECTION_NAME (unwsec) + len;
7098 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7099 ++i, ++sec)
7100 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7101 && streq (SECTION_NAME (sec) + len2, suffix))
7102 break;
7103 }
7104
7105 if (i == elf_header.e_shnum)
7106 {
7107 printf (_("\nCould not find unwind info section for "));
7108
7109 if (string_table == NULL)
7110 printf ("%d", unwsec->sh_name);
7111 else
7112 printf ("'%s'", printable_section_name (unwsec));
7113 }
7114 else
7115 {
7116 aux.info_addr = sec->sh_addr;
7117 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7118 sec->sh_size,
7119 _("unwind info"));
7120 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7121
7122 printf (_("\nUnwind section "));
7123
7124 if (string_table == NULL)
7125 printf ("%d", unwsec->sh_name);
7126 else
7127 printf ("'%s'", printable_section_name (unwsec));
7128
7129 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7130 (unsigned long) unwsec->sh_offset,
7131 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7132
7133 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7134 && aux.table_len > 0)
7135 dump_ia64_unwind (& aux);
7136
7137 if (aux.table)
7138 free ((char *) aux.table);
7139 if (aux.info)
7140 free ((char *) aux.info);
7141 aux.table = NULL;
7142 aux.info = NULL;
7143 }
7144 }
7145
7146 if (aux.symtab)
7147 free (aux.symtab);
7148 if (aux.strtab)
7149 free ((char *) aux.strtab);
7150 }
7151
7152 struct hppa_unw_table_entry
7153 {
7154 struct absaddr start;
7155 struct absaddr end;
7156 unsigned int Cannot_unwind:1; /* 0 */
7157 unsigned int Millicode:1; /* 1 */
7158 unsigned int Millicode_save_sr0:1; /* 2 */
7159 unsigned int Region_description:2; /* 3..4 */
7160 unsigned int reserved1:1; /* 5 */
7161 unsigned int Entry_SR:1; /* 6 */
7162 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7163 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7164 unsigned int Args_stored:1; /* 16 */
7165 unsigned int Variable_Frame:1; /* 17 */
7166 unsigned int Separate_Package_Body:1; /* 18 */
7167 unsigned int Frame_Extension_Millicode:1; /* 19 */
7168 unsigned int Stack_Overflow_Check:1; /* 20 */
7169 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7170 unsigned int Ada_Region:1; /* 22 */
7171 unsigned int cxx_info:1; /* 23 */
7172 unsigned int cxx_try_catch:1; /* 24 */
7173 unsigned int sched_entry_seq:1; /* 25 */
7174 unsigned int reserved2:1; /* 26 */
7175 unsigned int Save_SP:1; /* 27 */
7176 unsigned int Save_RP:1; /* 28 */
7177 unsigned int Save_MRP_in_frame:1; /* 29 */
7178 unsigned int extn_ptr_defined:1; /* 30 */
7179 unsigned int Cleanup_defined:1; /* 31 */
7180
7181 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7182 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7183 unsigned int Large_frame:1; /* 2 */
7184 unsigned int Pseudo_SP_Set:1; /* 3 */
7185 unsigned int reserved4:1; /* 4 */
7186 unsigned int Total_frame_size:27; /* 5..31 */
7187 };
7188
7189 struct hppa_unw_aux_info
7190 {
7191 struct hppa_unw_table_entry * table; /* Unwind table. */
7192 unsigned long table_len; /* Length of unwind table. */
7193 bfd_vma seg_base; /* Starting address of segment. */
7194 Elf_Internal_Sym * symtab; /* The symbol table. */
7195 unsigned long nsyms; /* Number of symbols. */
7196 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7197 unsigned long nfuns; /* Number of entries in funtab. */
7198 char * strtab; /* The string table. */
7199 unsigned long strtab_size; /* Size of string table. */
7200 };
7201
7202 static void
7203 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7204 {
7205 struct hppa_unw_table_entry * tp;
7206 unsigned long j, nfuns;
7207
7208 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7209 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7210 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7211 aux->funtab[nfuns++] = aux->symtab[j];
7212 aux->nfuns = nfuns;
7213 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7214
7215 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7216 {
7217 bfd_vma offset;
7218 const char * procname;
7219
7220 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7221 aux->strtab_size, tp->start, &procname,
7222 &offset);
7223
7224 fputs ("\n<", stdout);
7225
7226 if (procname)
7227 {
7228 fputs (procname, stdout);
7229
7230 if (offset)
7231 printf ("+%lx", (unsigned long) offset);
7232 }
7233
7234 fputs (">: [", stdout);
7235 print_vma (tp->start.offset, PREFIX_HEX);
7236 fputc ('-', stdout);
7237 print_vma (tp->end.offset, PREFIX_HEX);
7238 printf ("]\n\t");
7239
7240 #define PF(_m) if (tp->_m) printf (#_m " ");
7241 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7242 PF(Cannot_unwind);
7243 PF(Millicode);
7244 PF(Millicode_save_sr0);
7245 /* PV(Region_description); */
7246 PF(Entry_SR);
7247 PV(Entry_FR);
7248 PV(Entry_GR);
7249 PF(Args_stored);
7250 PF(Variable_Frame);
7251 PF(Separate_Package_Body);
7252 PF(Frame_Extension_Millicode);
7253 PF(Stack_Overflow_Check);
7254 PF(Two_Instruction_SP_Increment);
7255 PF(Ada_Region);
7256 PF(cxx_info);
7257 PF(cxx_try_catch);
7258 PF(sched_entry_seq);
7259 PF(Save_SP);
7260 PF(Save_RP);
7261 PF(Save_MRP_in_frame);
7262 PF(extn_ptr_defined);
7263 PF(Cleanup_defined);
7264 PF(MPE_XL_interrupt_marker);
7265 PF(HP_UX_interrupt_marker);
7266 PF(Large_frame);
7267 PF(Pseudo_SP_Set);
7268 PV(Total_frame_size);
7269 #undef PF
7270 #undef PV
7271 }
7272
7273 printf ("\n");
7274
7275 free (aux->funtab);
7276 }
7277
7278 static int
7279 slurp_hppa_unwind_table (FILE * file,
7280 struct hppa_unw_aux_info * aux,
7281 Elf_Internal_Shdr * sec)
7282 {
7283 unsigned long size, unw_ent_size, nentries, nrelas, i;
7284 Elf_Internal_Phdr * seg;
7285 struct hppa_unw_table_entry * tep;
7286 Elf_Internal_Shdr * relsec;
7287 Elf_Internal_Rela * rela;
7288 Elf_Internal_Rela * rp;
7289 unsigned char * table;
7290 unsigned char * tp;
7291 Elf_Internal_Sym * sym;
7292 const char * relname;
7293
7294 /* First, find the starting address of the segment that includes
7295 this section. */
7296
7297 if (elf_header.e_phnum)
7298 {
7299 if (! get_program_headers (file))
7300 return 0;
7301
7302 for (seg = program_headers;
7303 seg < program_headers + elf_header.e_phnum;
7304 ++seg)
7305 {
7306 if (seg->p_type != PT_LOAD)
7307 continue;
7308
7309 if (sec->sh_addr >= seg->p_vaddr
7310 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7311 {
7312 aux->seg_base = seg->p_vaddr;
7313 break;
7314 }
7315 }
7316 }
7317
7318 /* Second, build the unwind table from the contents of the unwind
7319 section. */
7320 size = sec->sh_size;
7321 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7322 _("unwind table"));
7323 if (!table)
7324 return 0;
7325
7326 unw_ent_size = 16;
7327 nentries = size / unw_ent_size;
7328 size = unw_ent_size * nentries;
7329
7330 tep = aux->table = (struct hppa_unw_table_entry *)
7331 xcmalloc (nentries, sizeof (aux->table[0]));
7332
7333 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7334 {
7335 unsigned int tmp1, tmp2;
7336
7337 tep->start.section = SHN_UNDEF;
7338 tep->end.section = SHN_UNDEF;
7339
7340 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7341 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7342 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7343 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7344
7345 tep->start.offset += aux->seg_base;
7346 tep->end.offset += aux->seg_base;
7347
7348 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7349 tep->Millicode = (tmp1 >> 30) & 0x1;
7350 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7351 tep->Region_description = (tmp1 >> 27) & 0x3;
7352 tep->reserved1 = (tmp1 >> 26) & 0x1;
7353 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7354 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7355 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7356 tep->Args_stored = (tmp1 >> 15) & 0x1;
7357 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7358 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7359 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7360 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7361 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7362 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7363 tep->cxx_info = (tmp1 >> 8) & 0x1;
7364 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7365 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7366 tep->reserved2 = (tmp1 >> 5) & 0x1;
7367 tep->Save_SP = (tmp1 >> 4) & 0x1;
7368 tep->Save_RP = (tmp1 >> 3) & 0x1;
7369 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7370 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7371 tep->Cleanup_defined = tmp1 & 0x1;
7372
7373 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7374 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7375 tep->Large_frame = (tmp2 >> 29) & 0x1;
7376 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7377 tep->reserved4 = (tmp2 >> 27) & 0x1;
7378 tep->Total_frame_size = tmp2 & 0x7ffffff;
7379 }
7380 free (table);
7381
7382 /* Third, apply any relocations to the unwind table. */
7383 for (relsec = section_headers;
7384 relsec < section_headers + elf_header.e_shnum;
7385 ++relsec)
7386 {
7387 if (relsec->sh_type != SHT_RELA
7388 || relsec->sh_info >= elf_header.e_shnum
7389 || section_headers + relsec->sh_info != sec)
7390 continue;
7391
7392 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7393 & rela, & nrelas))
7394 return 0;
7395
7396 for (rp = rela; rp < rela + nrelas; ++rp)
7397 {
7398 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7399 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7400
7401 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7402 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7403 {
7404 warn (_("Skipping unexpected relocation type %s\n"), relname);
7405 continue;
7406 }
7407
7408 i = rp->r_offset / unw_ent_size;
7409
7410 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7411 {
7412 case 0:
7413 aux->table[i].start.section = sym->st_shndx;
7414 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7415 break;
7416 case 1:
7417 aux->table[i].end.section = sym->st_shndx;
7418 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7419 break;
7420 default:
7421 break;
7422 }
7423 }
7424
7425 free (rela);
7426 }
7427
7428 aux->table_len = nentries;
7429
7430 return 1;
7431 }
7432
7433 static void
7434 hppa_process_unwind (FILE * file)
7435 {
7436 struct hppa_unw_aux_info aux;
7437 Elf_Internal_Shdr * unwsec = NULL;
7438 Elf_Internal_Shdr * strsec;
7439 Elf_Internal_Shdr * sec;
7440 unsigned long i;
7441
7442 if (string_table == NULL)
7443 return;
7444
7445 memset (& aux, 0, sizeof (aux));
7446
7447 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7448 {
7449 if (sec->sh_type == SHT_SYMTAB
7450 && sec->sh_link < elf_header.e_shnum)
7451 {
7452 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7453
7454 strsec = section_headers + sec->sh_link;
7455 if (aux.strtab != NULL)
7456 {
7457 error (_("Multiple auxillary string tables encountered\n"));
7458 free (aux.strtab);
7459 }
7460 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7461 1, strsec->sh_size,
7462 _("string table"));
7463 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7464 }
7465 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7466 unwsec = sec;
7467 }
7468
7469 if (!unwsec)
7470 printf (_("\nThere are no unwind sections in this file.\n"));
7471
7472 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7473 {
7474 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7475 {
7476 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7477 printable_section_name (sec),
7478 (unsigned long) sec->sh_offset,
7479 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7480
7481 slurp_hppa_unwind_table (file, &aux, sec);
7482 if (aux.table_len > 0)
7483 dump_hppa_unwind (&aux);
7484
7485 if (aux.table)
7486 free ((char *) aux.table);
7487 aux.table = NULL;
7488 }
7489 }
7490
7491 if (aux.symtab)
7492 free (aux.symtab);
7493 if (aux.strtab)
7494 free ((char *) aux.strtab);
7495 }
7496
7497 struct arm_section
7498 {
7499 unsigned char * data; /* The unwind data. */
7500 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7501 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7502 unsigned long nrelas; /* The number of relocations. */
7503 unsigned int rel_type; /* REL or RELA ? */
7504 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7505 };
7506
7507 struct arm_unw_aux_info
7508 {
7509 FILE * file; /* The file containing the unwind sections. */
7510 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7511 unsigned long nsyms; /* Number of symbols. */
7512 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7513 unsigned long nfuns; /* Number of these symbols. */
7514 char * strtab; /* The file's string table. */
7515 unsigned long strtab_size; /* Size of string table. */
7516 };
7517
7518 static const char *
7519 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7520 bfd_vma fn, struct absaddr addr)
7521 {
7522 const char *procname;
7523 bfd_vma sym_offset;
7524
7525 if (addr.section == SHN_UNDEF)
7526 addr.offset = fn;
7527
7528 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7529 aux->strtab_size, addr, &procname,
7530 &sym_offset);
7531
7532 print_vma (fn, PREFIX_HEX);
7533
7534 if (procname)
7535 {
7536 fputs (" <", stdout);
7537 fputs (procname, stdout);
7538
7539 if (sym_offset)
7540 printf ("+0x%lx", (unsigned long) sym_offset);
7541 fputc ('>', stdout);
7542 }
7543
7544 return procname;
7545 }
7546
7547 static void
7548 arm_free_section (struct arm_section *arm_sec)
7549 {
7550 if (arm_sec->data != NULL)
7551 free (arm_sec->data);
7552
7553 if (arm_sec->rela != NULL)
7554 free (arm_sec->rela);
7555 }
7556
7557 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7558 cached section and install SEC instead.
7559 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7560 and return its valued in * WORDP, relocating if necessary.
7561 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7562 relocation's offset in ADDR.
7563 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7564 into the string table of the symbol associated with the reloc. If no
7565 reloc was applied store -1 there.
7566 5) Return TRUE upon success, FALSE otherwise. */
7567
7568 static bfd_boolean
7569 get_unwind_section_word (struct arm_unw_aux_info * aux,
7570 struct arm_section * arm_sec,
7571 Elf_Internal_Shdr * sec,
7572 bfd_vma word_offset,
7573 unsigned int * wordp,
7574 struct absaddr * addr,
7575 bfd_vma * sym_name)
7576 {
7577 Elf_Internal_Rela *rp;
7578 Elf_Internal_Sym *sym;
7579 const char * relname;
7580 unsigned int word;
7581 bfd_boolean wrapped;
7582
7583 if (sec == NULL || arm_sec == NULL)
7584 return FALSE;
7585
7586 addr->section = SHN_UNDEF;
7587 addr->offset = 0;
7588
7589 if (sym_name != NULL)
7590 *sym_name = (bfd_vma) -1;
7591
7592 /* If necessary, update the section cache. */
7593 if (sec != arm_sec->sec)
7594 {
7595 Elf_Internal_Shdr *relsec;
7596
7597 arm_free_section (arm_sec);
7598
7599 arm_sec->sec = sec;
7600 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7601 sec->sh_size, _("unwind data"));
7602 arm_sec->rela = NULL;
7603 arm_sec->nrelas = 0;
7604
7605 for (relsec = section_headers;
7606 relsec < section_headers + elf_header.e_shnum;
7607 ++relsec)
7608 {
7609 if (relsec->sh_info >= elf_header.e_shnum
7610 || section_headers + relsec->sh_info != sec
7611 /* PR 15745: Check the section type as well. */
7612 || (relsec->sh_type != SHT_REL
7613 && relsec->sh_type != SHT_RELA))
7614 continue;
7615
7616 arm_sec->rel_type = relsec->sh_type;
7617 if (relsec->sh_type == SHT_REL)
7618 {
7619 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7620 relsec->sh_size,
7621 & arm_sec->rela, & arm_sec->nrelas))
7622 return FALSE;
7623 }
7624 else /* relsec->sh_type == SHT_RELA */
7625 {
7626 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7627 relsec->sh_size,
7628 & arm_sec->rela, & arm_sec->nrelas))
7629 return FALSE;
7630 }
7631 break;
7632 }
7633
7634 arm_sec->next_rela = arm_sec->rela;
7635 }
7636
7637 /* If there is no unwind data we can do nothing. */
7638 if (arm_sec->data == NULL)
7639 return FALSE;
7640
7641 /* If the offset is invalid then fail. */
7642 if (word_offset > (sec->sh_size - 4)
7643 /* PR 18879 */
7644 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7645 || ((bfd_signed_vma) word_offset) < 0)
7646 return FALSE;
7647
7648 /* Get the word at the required offset. */
7649 word = byte_get (arm_sec->data + word_offset, 4);
7650
7651 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7652 if (arm_sec->rela == NULL)
7653 {
7654 * wordp = word;
7655 return TRUE;
7656 }
7657
7658 /* Look through the relocs to find the one that applies to the provided offset. */
7659 wrapped = FALSE;
7660 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7661 {
7662 bfd_vma prelval, offset;
7663
7664 if (rp->r_offset > word_offset && !wrapped)
7665 {
7666 rp = arm_sec->rela;
7667 wrapped = TRUE;
7668 }
7669 if (rp->r_offset > word_offset)
7670 break;
7671
7672 if (rp->r_offset & 3)
7673 {
7674 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7675 (unsigned long) rp->r_offset);
7676 continue;
7677 }
7678
7679 if (rp->r_offset < word_offset)
7680 continue;
7681
7682 /* PR 17531: file: 027-161405-0.004 */
7683 if (aux->symtab == NULL)
7684 continue;
7685
7686 if (arm_sec->rel_type == SHT_REL)
7687 {
7688 offset = word & 0x7fffffff;
7689 if (offset & 0x40000000)
7690 offset |= ~ (bfd_vma) 0x7fffffff;
7691 }
7692 else if (arm_sec->rel_type == SHT_RELA)
7693 offset = rp->r_addend;
7694 else
7695 {
7696 error (_("Unknown section relocation type %d encountered\n"),
7697 arm_sec->rel_type);
7698 break;
7699 }
7700
7701 /* PR 17531 file: 027-1241568-0.004. */
7702 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7703 {
7704 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7705 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7706 break;
7707 }
7708
7709 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7710 offset += sym->st_value;
7711 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7712
7713 /* Check that we are processing the expected reloc type. */
7714 if (elf_header.e_machine == EM_ARM)
7715 {
7716 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7717 if (relname == NULL)
7718 {
7719 warn (_("Skipping unknown ARM relocation type: %d\n"),
7720 (int) ELF32_R_TYPE (rp->r_info));
7721 continue;
7722 }
7723
7724 if (streq (relname, "R_ARM_NONE"))
7725 continue;
7726
7727 if (! streq (relname, "R_ARM_PREL31"))
7728 {
7729 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7730 continue;
7731 }
7732 }
7733 else if (elf_header.e_machine == EM_TI_C6000)
7734 {
7735 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7736 if (relname == NULL)
7737 {
7738 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7739 (int) ELF32_R_TYPE (rp->r_info));
7740 continue;
7741 }
7742
7743 if (streq (relname, "R_C6000_NONE"))
7744 continue;
7745
7746 if (! streq (relname, "R_C6000_PREL31"))
7747 {
7748 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7749 continue;
7750 }
7751
7752 prelval >>= 1;
7753 }
7754 else
7755 {
7756 /* This function currently only supports ARM and TI unwinders. */
7757 warn (_("Only TI and ARM unwinders are currently supported\n"));
7758 break;
7759 }
7760
7761 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7762 addr->section = sym->st_shndx;
7763 addr->offset = offset;
7764
7765 if (sym_name)
7766 * sym_name = sym->st_name;
7767 break;
7768 }
7769
7770 *wordp = word;
7771 arm_sec->next_rela = rp;
7772
7773 return TRUE;
7774 }
7775
7776 static const char *tic6x_unwind_regnames[16] =
7777 {
7778 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7779 "A14", "A13", "A12", "A11", "A10",
7780 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7781 };
7782
7783 static void
7784 decode_tic6x_unwind_regmask (unsigned int mask)
7785 {
7786 int i;
7787
7788 for (i = 12; mask; mask >>= 1, i--)
7789 {
7790 if (mask & 1)
7791 {
7792 fputs (tic6x_unwind_regnames[i], stdout);
7793 if (mask > 1)
7794 fputs (", ", stdout);
7795 }
7796 }
7797 }
7798
7799 #define ADVANCE \
7800 if (remaining == 0 && more_words) \
7801 { \
7802 data_offset += 4; \
7803 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7804 data_offset, & word, & addr, NULL)) \
7805 return; \
7806 remaining = 4; \
7807 more_words--; \
7808 } \
7809
7810 #define GET_OP(OP) \
7811 ADVANCE; \
7812 if (remaining) \
7813 { \
7814 remaining--; \
7815 (OP) = word >> 24; \
7816 word <<= 8; \
7817 } \
7818 else \
7819 { \
7820 printf (_("[Truncated opcode]\n")); \
7821 return; \
7822 } \
7823 printf ("0x%02x ", OP)
7824
7825 static void
7826 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7827 unsigned int word,
7828 unsigned int remaining,
7829 unsigned int more_words,
7830 bfd_vma data_offset,
7831 Elf_Internal_Shdr * data_sec,
7832 struct arm_section * data_arm_sec)
7833 {
7834 struct absaddr addr;
7835
7836 /* Decode the unwinding instructions. */
7837 while (1)
7838 {
7839 unsigned int op, op2;
7840
7841 ADVANCE;
7842 if (remaining == 0)
7843 break;
7844 remaining--;
7845 op = word >> 24;
7846 word <<= 8;
7847
7848 printf (" 0x%02x ", op);
7849
7850 if ((op & 0xc0) == 0x00)
7851 {
7852 int offset = ((op & 0x3f) << 2) + 4;
7853
7854 printf (" vsp = vsp + %d", offset);
7855 }
7856 else if ((op & 0xc0) == 0x40)
7857 {
7858 int offset = ((op & 0x3f) << 2) + 4;
7859
7860 printf (" vsp = vsp - %d", offset);
7861 }
7862 else if ((op & 0xf0) == 0x80)
7863 {
7864 GET_OP (op2);
7865 if (op == 0x80 && op2 == 0)
7866 printf (_("Refuse to unwind"));
7867 else
7868 {
7869 unsigned int mask = ((op & 0x0f) << 8) | op2;
7870 int first = 1;
7871 int i;
7872
7873 printf ("pop {");
7874 for (i = 0; i < 12; i++)
7875 if (mask & (1 << i))
7876 {
7877 if (first)
7878 first = 0;
7879 else
7880 printf (", ");
7881 printf ("r%d", 4 + i);
7882 }
7883 printf ("}");
7884 }
7885 }
7886 else if ((op & 0xf0) == 0x90)
7887 {
7888 if (op == 0x9d || op == 0x9f)
7889 printf (_(" [Reserved]"));
7890 else
7891 printf (" vsp = r%d", op & 0x0f);
7892 }
7893 else if ((op & 0xf0) == 0xa0)
7894 {
7895 int end = 4 + (op & 0x07);
7896 int first = 1;
7897 int i;
7898
7899 printf (" pop {");
7900 for (i = 4; i <= end; i++)
7901 {
7902 if (first)
7903 first = 0;
7904 else
7905 printf (", ");
7906 printf ("r%d", i);
7907 }
7908 if (op & 0x08)
7909 {
7910 if (!first)
7911 printf (", ");
7912 printf ("r14");
7913 }
7914 printf ("}");
7915 }
7916 else if (op == 0xb0)
7917 printf (_(" finish"));
7918 else if (op == 0xb1)
7919 {
7920 GET_OP (op2);
7921 if (op2 == 0 || (op2 & 0xf0) != 0)
7922 printf (_("[Spare]"));
7923 else
7924 {
7925 unsigned int mask = op2 & 0x0f;
7926 int first = 1;
7927 int i;
7928
7929 printf ("pop {");
7930 for (i = 0; i < 12; i++)
7931 if (mask & (1 << i))
7932 {
7933 if (first)
7934 first = 0;
7935 else
7936 printf (", ");
7937 printf ("r%d", i);
7938 }
7939 printf ("}");
7940 }
7941 }
7942 else if (op == 0xb2)
7943 {
7944 unsigned char buf[9];
7945 unsigned int i, len;
7946 unsigned long offset;
7947
7948 for (i = 0; i < sizeof (buf); i++)
7949 {
7950 GET_OP (buf[i]);
7951 if ((buf[i] & 0x80) == 0)
7952 break;
7953 }
7954 if (i == sizeof (buf))
7955 printf (_("corrupt change to vsp"));
7956 else
7957 {
7958 offset = read_uleb128 (buf, &len, buf + i + 1);
7959 assert (len == i + 1);
7960 offset = offset * 4 + 0x204;
7961 printf ("vsp = vsp + %ld", offset);
7962 }
7963 }
7964 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7965 {
7966 unsigned int first, last;
7967
7968 GET_OP (op2);
7969 first = op2 >> 4;
7970 last = op2 & 0x0f;
7971 if (op == 0xc8)
7972 first = first + 16;
7973 printf ("pop {D%d", first);
7974 if (last)
7975 printf ("-D%d", first + last);
7976 printf ("}");
7977 }
7978 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7979 {
7980 unsigned int count = op & 0x07;
7981
7982 printf ("pop {D8");
7983 if (count)
7984 printf ("-D%d", 8 + count);
7985 printf ("}");
7986 }
7987 else if (op >= 0xc0 && op <= 0xc5)
7988 {
7989 unsigned int count = op & 0x07;
7990
7991 printf (" pop {wR10");
7992 if (count)
7993 printf ("-wR%d", 10 + count);
7994 printf ("}");
7995 }
7996 else if (op == 0xc6)
7997 {
7998 unsigned int first, last;
7999
8000 GET_OP (op2);
8001 first = op2 >> 4;
8002 last = op2 & 0x0f;
8003 printf ("pop {wR%d", first);
8004 if (last)
8005 printf ("-wR%d", first + last);
8006 printf ("}");
8007 }
8008 else if (op == 0xc7)
8009 {
8010 GET_OP (op2);
8011 if (op2 == 0 || (op2 & 0xf0) != 0)
8012 printf (_("[Spare]"));
8013 else
8014 {
8015 unsigned int mask = op2 & 0x0f;
8016 int first = 1;
8017 int i;
8018
8019 printf ("pop {");
8020 for (i = 0; i < 4; i++)
8021 if (mask & (1 << i))
8022 {
8023 if (first)
8024 first = 0;
8025 else
8026 printf (", ");
8027 printf ("wCGR%d", i);
8028 }
8029 printf ("}");
8030 }
8031 }
8032 else
8033 printf (_(" [unsupported opcode]"));
8034 printf ("\n");
8035 }
8036 }
8037
8038 static void
8039 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8040 unsigned int word,
8041 unsigned int remaining,
8042 unsigned int more_words,
8043 bfd_vma data_offset,
8044 Elf_Internal_Shdr * data_sec,
8045 struct arm_section * data_arm_sec)
8046 {
8047 struct absaddr addr;
8048
8049 /* Decode the unwinding instructions. */
8050 while (1)
8051 {
8052 unsigned int op, op2;
8053
8054 ADVANCE;
8055 if (remaining == 0)
8056 break;
8057 remaining--;
8058 op = word >> 24;
8059 word <<= 8;
8060
8061 printf (" 0x%02x ", op);
8062
8063 if ((op & 0xc0) == 0x00)
8064 {
8065 int offset = ((op & 0x3f) << 3) + 8;
8066 printf (" sp = sp + %d", offset);
8067 }
8068 else if ((op & 0xc0) == 0x80)
8069 {
8070 GET_OP (op2);
8071 if (op == 0x80 && op2 == 0)
8072 printf (_("Refuse to unwind"));
8073 else
8074 {
8075 unsigned int mask = ((op & 0x1f) << 8) | op2;
8076 if (op & 0x20)
8077 printf ("pop compact {");
8078 else
8079 printf ("pop {");
8080
8081 decode_tic6x_unwind_regmask (mask);
8082 printf("}");
8083 }
8084 }
8085 else if ((op & 0xf0) == 0xc0)
8086 {
8087 unsigned int reg;
8088 unsigned int nregs;
8089 unsigned int i;
8090 const char *name;
8091 struct
8092 {
8093 unsigned int offset;
8094 unsigned int reg;
8095 } regpos[16];
8096
8097 /* Scan entire instruction first so that GET_OP output is not
8098 interleaved with disassembly. */
8099 nregs = 0;
8100 for (i = 0; nregs < (op & 0xf); i++)
8101 {
8102 GET_OP (op2);
8103 reg = op2 >> 4;
8104 if (reg != 0xf)
8105 {
8106 regpos[nregs].offset = i * 2;
8107 regpos[nregs].reg = reg;
8108 nregs++;
8109 }
8110
8111 reg = op2 & 0xf;
8112 if (reg != 0xf)
8113 {
8114 regpos[nregs].offset = i * 2 + 1;
8115 regpos[nregs].reg = reg;
8116 nregs++;
8117 }
8118 }
8119
8120 printf (_("pop frame {"));
8121 reg = nregs - 1;
8122 for (i = i * 2; i > 0; i--)
8123 {
8124 if (regpos[reg].offset == i - 1)
8125 {
8126 name = tic6x_unwind_regnames[regpos[reg].reg];
8127 if (reg > 0)
8128 reg--;
8129 }
8130 else
8131 name = _("[pad]");
8132
8133 fputs (name, stdout);
8134 if (i > 1)
8135 printf (", ");
8136 }
8137
8138 printf ("}");
8139 }
8140 else if (op == 0xd0)
8141 printf (" MOV FP, SP");
8142 else if (op == 0xd1)
8143 printf (" __c6xabi_pop_rts");
8144 else if (op == 0xd2)
8145 {
8146 unsigned char buf[9];
8147 unsigned int i, len;
8148 unsigned long offset;
8149
8150 for (i = 0; i < sizeof (buf); i++)
8151 {
8152 GET_OP (buf[i]);
8153 if ((buf[i] & 0x80) == 0)
8154 break;
8155 }
8156 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8157 if (i == sizeof (buf))
8158 {
8159 printf ("<corrupt sp adjust>\n");
8160 warn (_("Corrupt stack pointer adjustment detected\n"));
8161 return;
8162 }
8163
8164 offset = read_uleb128 (buf, &len, buf + i + 1);
8165 assert (len == i + 1);
8166 offset = offset * 8 + 0x408;
8167 printf (_("sp = sp + %ld"), offset);
8168 }
8169 else if ((op & 0xf0) == 0xe0)
8170 {
8171 if ((op & 0x0f) == 7)
8172 printf (" RETURN");
8173 else
8174 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8175 }
8176 else
8177 {
8178 printf (_(" [unsupported opcode]"));
8179 }
8180 putchar ('\n');
8181 }
8182 }
8183
8184 static bfd_vma
8185 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8186 {
8187 bfd_vma offset;
8188
8189 offset = word & 0x7fffffff;
8190 if (offset & 0x40000000)
8191 offset |= ~ (bfd_vma) 0x7fffffff;
8192
8193 if (elf_header.e_machine == EM_TI_C6000)
8194 offset <<= 1;
8195
8196 return offset + where;
8197 }
8198
8199 static void
8200 decode_arm_unwind (struct arm_unw_aux_info * aux,
8201 unsigned int word,
8202 unsigned int remaining,
8203 bfd_vma data_offset,
8204 Elf_Internal_Shdr * data_sec,
8205 struct arm_section * data_arm_sec)
8206 {
8207 int per_index;
8208 unsigned int more_words = 0;
8209 struct absaddr addr;
8210 bfd_vma sym_name = (bfd_vma) -1;
8211
8212 if (remaining == 0)
8213 {
8214 /* Fetch the first word.
8215 Note - when decoding an object file the address extracted
8216 here will always be 0. So we also pass in the sym_name
8217 parameter so that we can find the symbol associated with
8218 the personality routine. */
8219 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8220 & word, & addr, & sym_name))
8221 return;
8222
8223 remaining = 4;
8224 }
8225
8226 if ((word & 0x80000000) == 0)
8227 {
8228 /* Expand prel31 for personality routine. */
8229 bfd_vma fn;
8230 const char *procname;
8231
8232 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8233 printf (_(" Personality routine: "));
8234 if (fn == 0
8235 && addr.section == SHN_UNDEF && addr.offset == 0
8236 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8237 {
8238 procname = aux->strtab + sym_name;
8239 print_vma (fn, PREFIX_HEX);
8240 if (procname)
8241 {
8242 fputs (" <", stdout);
8243 fputs (procname, stdout);
8244 fputc ('>', stdout);
8245 }
8246 }
8247 else
8248 procname = arm_print_vma_and_name (aux, fn, addr);
8249 fputc ('\n', stdout);
8250
8251 /* The GCC personality routines use the standard compact
8252 encoding, starting with one byte giving the number of
8253 words. */
8254 if (procname != NULL
8255 && (const_strneq (procname, "__gcc_personality_v0")
8256 || const_strneq (procname, "__gxx_personality_v0")
8257 || const_strneq (procname, "__gcj_personality_v0")
8258 || const_strneq (procname, "__gnu_objc_personality_v0")))
8259 {
8260 remaining = 0;
8261 more_words = 1;
8262 ADVANCE;
8263 if (!remaining)
8264 {
8265 printf (_(" [Truncated data]\n"));
8266 return;
8267 }
8268 more_words = word >> 24;
8269 word <<= 8;
8270 remaining--;
8271 per_index = -1;
8272 }
8273 else
8274 return;
8275 }
8276 else
8277 {
8278 /* ARM EHABI Section 6.3:
8279
8280 An exception-handling table entry for the compact model looks like:
8281
8282 31 30-28 27-24 23-0
8283 -- ----- ----- ----
8284 1 0 index Data for personalityRoutine[index] */
8285
8286 if (elf_header.e_machine == EM_ARM
8287 && (word & 0x70000000))
8288 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8289
8290 per_index = (word >> 24) & 0x7f;
8291 printf (_(" Compact model index: %d\n"), per_index);
8292 if (per_index == 0)
8293 {
8294 more_words = 0;
8295 word <<= 8;
8296 remaining--;
8297 }
8298 else if (per_index < 3)
8299 {
8300 more_words = (word >> 16) & 0xff;
8301 word <<= 16;
8302 remaining -= 2;
8303 }
8304 }
8305
8306 switch (elf_header.e_machine)
8307 {
8308 case EM_ARM:
8309 if (per_index < 3)
8310 {
8311 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8312 data_offset, data_sec, data_arm_sec);
8313 }
8314 else
8315 {
8316 warn (_("Unknown ARM compact model index encountered\n"));
8317 printf (_(" [reserved]\n"));
8318 }
8319 break;
8320
8321 case EM_TI_C6000:
8322 if (per_index < 3)
8323 {
8324 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8325 data_offset, data_sec, data_arm_sec);
8326 }
8327 else if (per_index < 5)
8328 {
8329 if (((word >> 17) & 0x7f) == 0x7f)
8330 printf (_(" Restore stack from frame pointer\n"));
8331 else
8332 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8333 printf (_(" Registers restored: "));
8334 if (per_index == 4)
8335 printf (" (compact) ");
8336 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8337 putchar ('\n');
8338 printf (_(" Return register: %s\n"),
8339 tic6x_unwind_regnames[word & 0xf]);
8340 }
8341 else
8342 printf (_(" [reserved (%d)]\n"), per_index);
8343 break;
8344
8345 default:
8346 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8347 elf_header.e_machine);
8348 }
8349
8350 /* Decode the descriptors. Not implemented. */
8351 }
8352
8353 static void
8354 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8355 {
8356 struct arm_section exidx_arm_sec, extab_arm_sec;
8357 unsigned int i, exidx_len;
8358 unsigned long j, nfuns;
8359
8360 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8361 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8362 exidx_len = exidx_sec->sh_size / 8;
8363
8364 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8365 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8366 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8367 aux->funtab[nfuns++] = aux->symtab[j];
8368 aux->nfuns = nfuns;
8369 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8370
8371 for (i = 0; i < exidx_len; i++)
8372 {
8373 unsigned int exidx_fn, exidx_entry;
8374 struct absaddr fn_addr, entry_addr;
8375 bfd_vma fn;
8376
8377 fputc ('\n', stdout);
8378
8379 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8380 8 * i, & exidx_fn, & fn_addr, NULL)
8381 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8382 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8383 {
8384 free (aux->funtab);
8385 arm_free_section (& exidx_arm_sec);
8386 arm_free_section (& extab_arm_sec);
8387 return;
8388 }
8389
8390 /* ARM EHABI, Section 5:
8391 An index table entry consists of 2 words.
8392 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8393 if (exidx_fn & 0x80000000)
8394 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8395
8396 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8397
8398 arm_print_vma_and_name (aux, fn, fn_addr);
8399 fputs (": ", stdout);
8400
8401 if (exidx_entry == 1)
8402 {
8403 print_vma (exidx_entry, PREFIX_HEX);
8404 fputs (" [cantunwind]\n", stdout);
8405 }
8406 else if (exidx_entry & 0x80000000)
8407 {
8408 print_vma (exidx_entry, PREFIX_HEX);
8409 fputc ('\n', stdout);
8410 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8411 }
8412 else
8413 {
8414 bfd_vma table, table_offset = 0;
8415 Elf_Internal_Shdr *table_sec;
8416
8417 fputs ("@", stdout);
8418 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8419 print_vma (table, PREFIX_HEX);
8420 printf ("\n");
8421
8422 /* Locate the matching .ARM.extab. */
8423 if (entry_addr.section != SHN_UNDEF
8424 && entry_addr.section < elf_header.e_shnum)
8425 {
8426 table_sec = section_headers + entry_addr.section;
8427 table_offset = entry_addr.offset;
8428 /* PR 18879 */
8429 if (table_offset > table_sec->sh_size
8430 || ((bfd_signed_vma) table_offset) < 0)
8431 {
8432 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8433 (unsigned long) table_offset,
8434 printable_section_name (table_sec));
8435 continue;
8436 }
8437 }
8438 else
8439 {
8440 table_sec = find_section_by_address (table);
8441 if (table_sec != NULL)
8442 table_offset = table - table_sec->sh_addr;
8443 }
8444 if (table_sec == NULL)
8445 {
8446 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8447 (unsigned long) table);
8448 continue;
8449 }
8450 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8451 &extab_arm_sec);
8452 }
8453 }
8454
8455 printf ("\n");
8456
8457 free (aux->funtab);
8458 arm_free_section (&exidx_arm_sec);
8459 arm_free_section (&extab_arm_sec);
8460 }
8461
8462 /* Used for both ARM and C6X unwinding tables. */
8463
8464 static void
8465 arm_process_unwind (FILE *file)
8466 {
8467 struct arm_unw_aux_info aux;
8468 Elf_Internal_Shdr *unwsec = NULL;
8469 Elf_Internal_Shdr *strsec;
8470 Elf_Internal_Shdr *sec;
8471 unsigned long i;
8472 unsigned int sec_type;
8473
8474 switch (elf_header.e_machine)
8475 {
8476 case EM_ARM:
8477 sec_type = SHT_ARM_EXIDX;
8478 break;
8479
8480 case EM_TI_C6000:
8481 sec_type = SHT_C6000_UNWIND;
8482 break;
8483
8484 default:
8485 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8486 elf_header.e_machine);
8487 return;
8488 }
8489
8490 if (string_table == NULL)
8491 return;
8492
8493 memset (& aux, 0, sizeof (aux));
8494 aux.file = file;
8495
8496 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8497 {
8498 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8499 {
8500 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8501
8502 strsec = section_headers + sec->sh_link;
8503
8504 /* PR binutils/17531 file: 011-12666-0.004. */
8505 if (aux.strtab != NULL)
8506 {
8507 error (_("Multiple string tables found in file.\n"));
8508 free (aux.strtab);
8509 }
8510 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8511 1, strsec->sh_size, _("string table"));
8512 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8513 }
8514 else if (sec->sh_type == sec_type)
8515 unwsec = sec;
8516 }
8517
8518 if (unwsec == NULL)
8519 printf (_("\nThere are no unwind sections in this file.\n"));
8520 else
8521 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8522 {
8523 if (sec->sh_type == sec_type)
8524 {
8525 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8526 printable_section_name (sec),
8527 (unsigned long) sec->sh_offset,
8528 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8529
8530 dump_arm_unwind (&aux, sec);
8531 }
8532 }
8533
8534 if (aux.symtab)
8535 free (aux.symtab);
8536 if (aux.strtab)
8537 free ((char *) aux.strtab);
8538 }
8539
8540 static void
8541 process_unwind (FILE * file)
8542 {
8543 struct unwind_handler
8544 {
8545 int machtype;
8546 void (* handler)(FILE *);
8547 } handlers[] =
8548 {
8549 { EM_ARM, arm_process_unwind },
8550 { EM_IA_64, ia64_process_unwind },
8551 { EM_PARISC, hppa_process_unwind },
8552 { EM_TI_C6000, arm_process_unwind },
8553 { 0, 0 }
8554 };
8555 int i;
8556
8557 if (!do_unwind)
8558 return;
8559
8560 for (i = 0; handlers[i].handler != NULL; i++)
8561 if (elf_header.e_machine == handlers[i].machtype)
8562 {
8563 handlers[i].handler (file);
8564 return;
8565 }
8566
8567 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8568 get_machine_name (elf_header.e_machine));
8569 }
8570
8571 static void
8572 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8573 {
8574 switch (entry->d_tag)
8575 {
8576 case DT_MIPS_FLAGS:
8577 if (entry->d_un.d_val == 0)
8578 printf (_("NONE"));
8579 else
8580 {
8581 static const char * opts[] =
8582 {
8583 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8584 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8585 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8586 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8587 "RLD_ORDER_SAFE"
8588 };
8589 unsigned int cnt;
8590 int first = 1;
8591
8592 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8593 if (entry->d_un.d_val & (1 << cnt))
8594 {
8595 printf ("%s%s", first ? "" : " ", opts[cnt]);
8596 first = 0;
8597 }
8598 }
8599 break;
8600
8601 case DT_MIPS_IVERSION:
8602 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8603 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8604 else
8605 {
8606 char buf[40];
8607 sprintf_vma (buf, entry->d_un.d_ptr);
8608 /* Note: coded this way so that there is a single string for translation. */
8609 printf (_("<corrupt: %s>"), buf);
8610 }
8611 break;
8612
8613 case DT_MIPS_TIME_STAMP:
8614 {
8615 char timebuf[20];
8616 struct tm * tmp;
8617 time_t atime = entry->d_un.d_val;
8618
8619 tmp = gmtime (&atime);
8620 /* PR 17531: file: 6accc532. */
8621 if (tmp == NULL)
8622 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8623 else
8624 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8625 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8626 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8627 printf (_("Time Stamp: %s"), timebuf);
8628 }
8629 break;
8630
8631 case DT_MIPS_RLD_VERSION:
8632 case DT_MIPS_LOCAL_GOTNO:
8633 case DT_MIPS_CONFLICTNO:
8634 case DT_MIPS_LIBLISTNO:
8635 case DT_MIPS_SYMTABNO:
8636 case DT_MIPS_UNREFEXTNO:
8637 case DT_MIPS_HIPAGENO:
8638 case DT_MIPS_DELTA_CLASS_NO:
8639 case DT_MIPS_DELTA_INSTANCE_NO:
8640 case DT_MIPS_DELTA_RELOC_NO:
8641 case DT_MIPS_DELTA_SYM_NO:
8642 case DT_MIPS_DELTA_CLASSSYM_NO:
8643 case DT_MIPS_COMPACT_SIZE:
8644 print_vma (entry->d_un.d_ptr, DEC);
8645 break;
8646
8647 default:
8648 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8649 }
8650 putchar ('\n');
8651 }
8652
8653 static void
8654 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8655 {
8656 switch (entry->d_tag)
8657 {
8658 case DT_HP_DLD_FLAGS:
8659 {
8660 static struct
8661 {
8662 long int bit;
8663 const char * str;
8664 }
8665 flags[] =
8666 {
8667 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8668 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8669 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8670 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8671 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8672 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8673 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8674 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8675 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8676 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8677 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8678 { DT_HP_GST, "HP_GST" },
8679 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8680 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8681 { DT_HP_NODELETE, "HP_NODELETE" },
8682 { DT_HP_GROUP, "HP_GROUP" },
8683 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8684 };
8685 int first = 1;
8686 size_t cnt;
8687 bfd_vma val = entry->d_un.d_val;
8688
8689 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8690 if (val & flags[cnt].bit)
8691 {
8692 if (! first)
8693 putchar (' ');
8694 fputs (flags[cnt].str, stdout);
8695 first = 0;
8696 val ^= flags[cnt].bit;
8697 }
8698
8699 if (val != 0 || first)
8700 {
8701 if (! first)
8702 putchar (' ');
8703 print_vma (val, HEX);
8704 }
8705 }
8706 break;
8707
8708 default:
8709 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8710 break;
8711 }
8712 putchar ('\n');
8713 }
8714
8715 #ifdef BFD64
8716
8717 /* VMS vs Unix time offset and factor. */
8718
8719 #define VMS_EPOCH_OFFSET 35067168000000000LL
8720 #define VMS_GRANULARITY_FACTOR 10000000
8721
8722 /* Display a VMS time in a human readable format. */
8723
8724 static void
8725 print_vms_time (bfd_int64_t vmstime)
8726 {
8727 struct tm *tm;
8728 time_t unxtime;
8729
8730 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8731 tm = gmtime (&unxtime);
8732 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8733 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8734 tm->tm_hour, tm->tm_min, tm->tm_sec);
8735 }
8736 #endif /* BFD64 */
8737
8738 static void
8739 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8740 {
8741 switch (entry->d_tag)
8742 {
8743 case DT_IA_64_PLT_RESERVE:
8744 /* First 3 slots reserved. */
8745 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8746 printf (" -- ");
8747 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8748 break;
8749
8750 case DT_IA_64_VMS_LINKTIME:
8751 #ifdef BFD64
8752 print_vms_time (entry->d_un.d_val);
8753 #endif
8754 break;
8755
8756 case DT_IA_64_VMS_LNKFLAGS:
8757 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8758 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8759 printf (" CALL_DEBUG");
8760 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8761 printf (" NOP0BUFS");
8762 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8763 printf (" P0IMAGE");
8764 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8765 printf (" MKTHREADS");
8766 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8767 printf (" UPCALLS");
8768 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8769 printf (" IMGSTA");
8770 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8771 printf (" INITIALIZE");
8772 if (entry->d_un.d_val & VMS_LF_MAIN)
8773 printf (" MAIN");
8774 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8775 printf (" EXE_INIT");
8776 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8777 printf (" TBK_IN_IMG");
8778 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8779 printf (" DBG_IN_IMG");
8780 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8781 printf (" TBK_IN_DSF");
8782 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8783 printf (" DBG_IN_DSF");
8784 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8785 printf (" SIGNATURES");
8786 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8787 printf (" REL_SEG_OFF");
8788 break;
8789
8790 default:
8791 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8792 break;
8793 }
8794 putchar ('\n');
8795 }
8796
8797 static int
8798 get_32bit_dynamic_section (FILE * file)
8799 {
8800 Elf32_External_Dyn * edyn;
8801 Elf32_External_Dyn * ext;
8802 Elf_Internal_Dyn * entry;
8803
8804 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8805 dynamic_size, _("dynamic section"));
8806 if (!edyn)
8807 return 0;
8808
8809 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8810 might not have the luxury of section headers. Look for the DT_NULL
8811 terminator to determine the number of entries. */
8812 for (ext = edyn, dynamic_nent = 0;
8813 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8814 ext++)
8815 {
8816 dynamic_nent++;
8817 if (BYTE_GET (ext->d_tag) == DT_NULL)
8818 break;
8819 }
8820
8821 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8822 sizeof (* entry));
8823 if (dynamic_section == NULL)
8824 {
8825 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8826 (unsigned long) dynamic_nent);
8827 free (edyn);
8828 return 0;
8829 }
8830
8831 for (ext = edyn, entry = dynamic_section;
8832 entry < dynamic_section + dynamic_nent;
8833 ext++, entry++)
8834 {
8835 entry->d_tag = BYTE_GET (ext->d_tag);
8836 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8837 }
8838
8839 free (edyn);
8840
8841 return 1;
8842 }
8843
8844 static int
8845 get_64bit_dynamic_section (FILE * file)
8846 {
8847 Elf64_External_Dyn * edyn;
8848 Elf64_External_Dyn * ext;
8849 Elf_Internal_Dyn * entry;
8850
8851 /* Read in the data. */
8852 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8853 dynamic_size, _("dynamic section"));
8854 if (!edyn)
8855 return 0;
8856
8857 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8858 might not have the luxury of section headers. Look for the DT_NULL
8859 terminator to determine the number of entries. */
8860 for (ext = edyn, dynamic_nent = 0;
8861 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
8862 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8863 ext++)
8864 {
8865 dynamic_nent++;
8866 if (BYTE_GET (ext->d_tag) == DT_NULL)
8867 break;
8868 }
8869
8870 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8871 sizeof (* entry));
8872 if (dynamic_section == NULL)
8873 {
8874 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8875 (unsigned long) dynamic_nent);
8876 free (edyn);
8877 return 0;
8878 }
8879
8880 /* Convert from external to internal formats. */
8881 for (ext = edyn, entry = dynamic_section;
8882 entry < dynamic_section + dynamic_nent;
8883 ext++, entry++)
8884 {
8885 entry->d_tag = BYTE_GET (ext->d_tag);
8886 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8887 }
8888
8889 free (edyn);
8890
8891 return 1;
8892 }
8893
8894 static void
8895 print_dynamic_flags (bfd_vma flags)
8896 {
8897 int first = 1;
8898
8899 while (flags)
8900 {
8901 bfd_vma flag;
8902
8903 flag = flags & - flags;
8904 flags &= ~ flag;
8905
8906 if (first)
8907 first = 0;
8908 else
8909 putc (' ', stdout);
8910
8911 switch (flag)
8912 {
8913 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8914 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8915 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8916 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8917 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8918 default: fputs (_("unknown"), stdout); break;
8919 }
8920 }
8921 puts ("");
8922 }
8923
8924 /* Parse and display the contents of the dynamic section. */
8925
8926 static int
8927 process_dynamic_section (FILE * file)
8928 {
8929 Elf_Internal_Dyn * entry;
8930
8931 if (dynamic_size == 0)
8932 {
8933 if (do_dynamic)
8934 printf (_("\nThere is no dynamic section in this file.\n"));
8935
8936 return 1;
8937 }
8938
8939 if (is_32bit_elf)
8940 {
8941 if (! get_32bit_dynamic_section (file))
8942 return 0;
8943 }
8944 else if (! get_64bit_dynamic_section (file))
8945 return 0;
8946
8947 /* Find the appropriate symbol table. */
8948 if (dynamic_symbols == NULL)
8949 {
8950 for (entry = dynamic_section;
8951 entry < dynamic_section + dynamic_nent;
8952 ++entry)
8953 {
8954 Elf_Internal_Shdr section;
8955
8956 if (entry->d_tag != DT_SYMTAB)
8957 continue;
8958
8959 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8960
8961 /* Since we do not know how big the symbol table is,
8962 we default to reading in the entire file (!) and
8963 processing that. This is overkill, I know, but it
8964 should work. */
8965 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8966
8967 if (archive_file_offset != 0)
8968 section.sh_size = archive_file_size - section.sh_offset;
8969 else
8970 {
8971 if (fseek (file, 0, SEEK_END))
8972 error (_("Unable to seek to end of file!\n"));
8973
8974 section.sh_size = ftell (file) - section.sh_offset;
8975 }
8976
8977 if (is_32bit_elf)
8978 section.sh_entsize = sizeof (Elf32_External_Sym);
8979 else
8980 section.sh_entsize = sizeof (Elf64_External_Sym);
8981 section.sh_name = string_table_length;
8982
8983 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8984 if (num_dynamic_syms < 1)
8985 {
8986 error (_("Unable to determine the number of symbols to load\n"));
8987 continue;
8988 }
8989 }
8990 }
8991
8992 /* Similarly find a string table. */
8993 if (dynamic_strings == NULL)
8994 {
8995 for (entry = dynamic_section;
8996 entry < dynamic_section + dynamic_nent;
8997 ++entry)
8998 {
8999 unsigned long offset;
9000 long str_tab_len;
9001
9002 if (entry->d_tag != DT_STRTAB)
9003 continue;
9004
9005 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9006
9007 /* Since we do not know how big the string table is,
9008 we default to reading in the entire file (!) and
9009 processing that. This is overkill, I know, but it
9010 should work. */
9011
9012 offset = offset_from_vma (file, entry->d_un.d_val, 0);
9013
9014 if (archive_file_offset != 0)
9015 str_tab_len = archive_file_size - offset;
9016 else
9017 {
9018 if (fseek (file, 0, SEEK_END))
9019 error (_("Unable to seek to end of file\n"));
9020 str_tab_len = ftell (file) - offset;
9021 }
9022
9023 if (str_tab_len < 1)
9024 {
9025 error
9026 (_("Unable to determine the length of the dynamic string table\n"));
9027 continue;
9028 }
9029
9030 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9031 str_tab_len,
9032 _("dynamic string table"));
9033 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9034 break;
9035 }
9036 }
9037
9038 /* And find the syminfo section if available. */
9039 if (dynamic_syminfo == NULL)
9040 {
9041 unsigned long syminsz = 0;
9042
9043 for (entry = dynamic_section;
9044 entry < dynamic_section + dynamic_nent;
9045 ++entry)
9046 {
9047 if (entry->d_tag == DT_SYMINENT)
9048 {
9049 /* Note: these braces are necessary to avoid a syntax
9050 error from the SunOS4 C compiler. */
9051 /* PR binutils/17531: A corrupt file can trigger this test.
9052 So do not use an assert, instead generate an error message. */
9053 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9054 error (_("Bad value (%d) for SYMINENT entry\n"),
9055 (int) entry->d_un.d_val);
9056 }
9057 else if (entry->d_tag == DT_SYMINSZ)
9058 syminsz = entry->d_un.d_val;
9059 else if (entry->d_tag == DT_SYMINFO)
9060 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9061 syminsz);
9062 }
9063
9064 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9065 {
9066 Elf_External_Syminfo * extsyminfo;
9067 Elf_External_Syminfo * extsym;
9068 Elf_Internal_Syminfo * syminfo;
9069
9070 /* There is a syminfo section. Read the data. */
9071 extsyminfo = (Elf_External_Syminfo *)
9072 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9073 _("symbol information"));
9074 if (!extsyminfo)
9075 return 0;
9076
9077 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9078 if (dynamic_syminfo == NULL)
9079 {
9080 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9081 (unsigned long) syminsz);
9082 return 0;
9083 }
9084
9085 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9086 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9087 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9088 ++syminfo, ++extsym)
9089 {
9090 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9091 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9092 }
9093
9094 free (extsyminfo);
9095 }
9096 }
9097
9098 if (do_dynamic && dynamic_addr)
9099 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9100 dynamic_addr, (unsigned long) dynamic_nent);
9101 if (do_dynamic)
9102 printf (_(" Tag Type Name/Value\n"));
9103
9104 for (entry = dynamic_section;
9105 entry < dynamic_section + dynamic_nent;
9106 entry++)
9107 {
9108 if (do_dynamic)
9109 {
9110 const char * dtype;
9111
9112 putchar (' ');
9113 print_vma (entry->d_tag, FULL_HEX);
9114 dtype = get_dynamic_type (entry->d_tag);
9115 printf (" (%s)%*s", dtype,
9116 ((is_32bit_elf ? 27 : 19)
9117 - (int) strlen (dtype)),
9118 " ");
9119 }
9120
9121 switch (entry->d_tag)
9122 {
9123 case DT_FLAGS:
9124 if (do_dynamic)
9125 print_dynamic_flags (entry->d_un.d_val);
9126 break;
9127
9128 case DT_AUXILIARY:
9129 case DT_FILTER:
9130 case DT_CONFIG:
9131 case DT_DEPAUDIT:
9132 case DT_AUDIT:
9133 if (do_dynamic)
9134 {
9135 switch (entry->d_tag)
9136 {
9137 case DT_AUXILIARY:
9138 printf (_("Auxiliary library"));
9139 break;
9140
9141 case DT_FILTER:
9142 printf (_("Filter library"));
9143 break;
9144
9145 case DT_CONFIG:
9146 printf (_("Configuration file"));
9147 break;
9148
9149 case DT_DEPAUDIT:
9150 printf (_("Dependency audit library"));
9151 break;
9152
9153 case DT_AUDIT:
9154 printf (_("Audit library"));
9155 break;
9156 }
9157
9158 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9159 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9160 else
9161 {
9162 printf (": ");
9163 print_vma (entry->d_un.d_val, PREFIX_HEX);
9164 putchar ('\n');
9165 }
9166 }
9167 break;
9168
9169 case DT_FEATURE:
9170 if (do_dynamic)
9171 {
9172 printf (_("Flags:"));
9173
9174 if (entry->d_un.d_val == 0)
9175 printf (_(" None\n"));
9176 else
9177 {
9178 unsigned long int val = entry->d_un.d_val;
9179
9180 if (val & DTF_1_PARINIT)
9181 {
9182 printf (" PARINIT");
9183 val ^= DTF_1_PARINIT;
9184 }
9185 if (val & DTF_1_CONFEXP)
9186 {
9187 printf (" CONFEXP");
9188 val ^= DTF_1_CONFEXP;
9189 }
9190 if (val != 0)
9191 printf (" %lx", val);
9192 puts ("");
9193 }
9194 }
9195 break;
9196
9197 case DT_POSFLAG_1:
9198 if (do_dynamic)
9199 {
9200 printf (_("Flags:"));
9201
9202 if (entry->d_un.d_val == 0)
9203 printf (_(" None\n"));
9204 else
9205 {
9206 unsigned long int val = entry->d_un.d_val;
9207
9208 if (val & DF_P1_LAZYLOAD)
9209 {
9210 printf (" LAZYLOAD");
9211 val ^= DF_P1_LAZYLOAD;
9212 }
9213 if (val & DF_P1_GROUPPERM)
9214 {
9215 printf (" GROUPPERM");
9216 val ^= DF_P1_GROUPPERM;
9217 }
9218 if (val != 0)
9219 printf (" %lx", val);
9220 puts ("");
9221 }
9222 }
9223 break;
9224
9225 case DT_FLAGS_1:
9226 if (do_dynamic)
9227 {
9228 printf (_("Flags:"));
9229 if (entry->d_un.d_val == 0)
9230 printf (_(" None\n"));
9231 else
9232 {
9233 unsigned long int val = entry->d_un.d_val;
9234
9235 if (val & DF_1_NOW)
9236 {
9237 printf (" NOW");
9238 val ^= DF_1_NOW;
9239 }
9240 if (val & DF_1_GLOBAL)
9241 {
9242 printf (" GLOBAL");
9243 val ^= DF_1_GLOBAL;
9244 }
9245 if (val & DF_1_GROUP)
9246 {
9247 printf (" GROUP");
9248 val ^= DF_1_GROUP;
9249 }
9250 if (val & DF_1_NODELETE)
9251 {
9252 printf (" NODELETE");
9253 val ^= DF_1_NODELETE;
9254 }
9255 if (val & DF_1_LOADFLTR)
9256 {
9257 printf (" LOADFLTR");
9258 val ^= DF_1_LOADFLTR;
9259 }
9260 if (val & DF_1_INITFIRST)
9261 {
9262 printf (" INITFIRST");
9263 val ^= DF_1_INITFIRST;
9264 }
9265 if (val & DF_1_NOOPEN)
9266 {
9267 printf (" NOOPEN");
9268 val ^= DF_1_NOOPEN;
9269 }
9270 if (val & DF_1_ORIGIN)
9271 {
9272 printf (" ORIGIN");
9273 val ^= DF_1_ORIGIN;
9274 }
9275 if (val & DF_1_DIRECT)
9276 {
9277 printf (" DIRECT");
9278 val ^= DF_1_DIRECT;
9279 }
9280 if (val & DF_1_TRANS)
9281 {
9282 printf (" TRANS");
9283 val ^= DF_1_TRANS;
9284 }
9285 if (val & DF_1_INTERPOSE)
9286 {
9287 printf (" INTERPOSE");
9288 val ^= DF_1_INTERPOSE;
9289 }
9290 if (val & DF_1_NODEFLIB)
9291 {
9292 printf (" NODEFLIB");
9293 val ^= DF_1_NODEFLIB;
9294 }
9295 if (val & DF_1_NODUMP)
9296 {
9297 printf (" NODUMP");
9298 val ^= DF_1_NODUMP;
9299 }
9300 if (val & DF_1_CONFALT)
9301 {
9302 printf (" CONFALT");
9303 val ^= DF_1_CONFALT;
9304 }
9305 if (val & DF_1_ENDFILTEE)
9306 {
9307 printf (" ENDFILTEE");
9308 val ^= DF_1_ENDFILTEE;
9309 }
9310 if (val & DF_1_DISPRELDNE)
9311 {
9312 printf (" DISPRELDNE");
9313 val ^= DF_1_DISPRELDNE;
9314 }
9315 if (val & DF_1_DISPRELPND)
9316 {
9317 printf (" DISPRELPND");
9318 val ^= DF_1_DISPRELPND;
9319 }
9320 if (val & DF_1_NODIRECT)
9321 {
9322 printf (" NODIRECT");
9323 val ^= DF_1_NODIRECT;
9324 }
9325 if (val & DF_1_IGNMULDEF)
9326 {
9327 printf (" IGNMULDEF");
9328 val ^= DF_1_IGNMULDEF;
9329 }
9330 if (val & DF_1_NOKSYMS)
9331 {
9332 printf (" NOKSYMS");
9333 val ^= DF_1_NOKSYMS;
9334 }
9335 if (val & DF_1_NOHDR)
9336 {
9337 printf (" NOHDR");
9338 val ^= DF_1_NOHDR;
9339 }
9340 if (val & DF_1_EDITED)
9341 {
9342 printf (" EDITED");
9343 val ^= DF_1_EDITED;
9344 }
9345 if (val & DF_1_NORELOC)
9346 {
9347 printf (" NORELOC");
9348 val ^= DF_1_NORELOC;
9349 }
9350 if (val & DF_1_SYMINTPOSE)
9351 {
9352 printf (" SYMINTPOSE");
9353 val ^= DF_1_SYMINTPOSE;
9354 }
9355 if (val & DF_1_GLOBAUDIT)
9356 {
9357 printf (" GLOBAUDIT");
9358 val ^= DF_1_GLOBAUDIT;
9359 }
9360 if (val & DF_1_SINGLETON)
9361 {
9362 printf (" SINGLETON");
9363 val ^= DF_1_SINGLETON;
9364 }
9365 if (val & DF_1_STUB)
9366 {
9367 printf (" STUB");
9368 val ^= DF_1_STUB;
9369 }
9370 if (val & DF_1_PIE)
9371 {
9372 printf (" PIE");
9373 val ^= DF_1_PIE;
9374 }
9375 if (val != 0)
9376 printf (" %lx", val);
9377 puts ("");
9378 }
9379 }
9380 break;
9381
9382 case DT_PLTREL:
9383 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9384 if (do_dynamic)
9385 puts (get_dynamic_type (entry->d_un.d_val));
9386 break;
9387
9388 case DT_NULL :
9389 case DT_NEEDED :
9390 case DT_PLTGOT :
9391 case DT_HASH :
9392 case DT_STRTAB :
9393 case DT_SYMTAB :
9394 case DT_RELA :
9395 case DT_INIT :
9396 case DT_FINI :
9397 case DT_SONAME :
9398 case DT_RPATH :
9399 case DT_SYMBOLIC:
9400 case DT_REL :
9401 case DT_DEBUG :
9402 case DT_TEXTREL :
9403 case DT_JMPREL :
9404 case DT_RUNPATH :
9405 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9406
9407 if (do_dynamic)
9408 {
9409 char * name;
9410
9411 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9412 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9413 else
9414 name = NULL;
9415
9416 if (name)
9417 {
9418 switch (entry->d_tag)
9419 {
9420 case DT_NEEDED:
9421 printf (_("Shared library: [%s]"), name);
9422
9423 if (streq (name, program_interpreter))
9424 printf (_(" program interpreter"));
9425 break;
9426
9427 case DT_SONAME:
9428 printf (_("Library soname: [%s]"), name);
9429 break;
9430
9431 case DT_RPATH:
9432 printf (_("Library rpath: [%s]"), name);
9433 break;
9434
9435 case DT_RUNPATH:
9436 printf (_("Library runpath: [%s]"), name);
9437 break;
9438
9439 default:
9440 print_vma (entry->d_un.d_val, PREFIX_HEX);
9441 break;
9442 }
9443 }
9444 else
9445 print_vma (entry->d_un.d_val, PREFIX_HEX);
9446
9447 putchar ('\n');
9448 }
9449 break;
9450
9451 case DT_PLTRELSZ:
9452 case DT_RELASZ :
9453 case DT_STRSZ :
9454 case DT_RELSZ :
9455 case DT_RELAENT :
9456 case DT_SYMENT :
9457 case DT_RELENT :
9458 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9459 case DT_PLTPADSZ:
9460 case DT_MOVEENT :
9461 case DT_MOVESZ :
9462 case DT_INIT_ARRAYSZ:
9463 case DT_FINI_ARRAYSZ:
9464 case DT_GNU_CONFLICTSZ:
9465 case DT_GNU_LIBLISTSZ:
9466 if (do_dynamic)
9467 {
9468 print_vma (entry->d_un.d_val, UNSIGNED);
9469 printf (_(" (bytes)\n"));
9470 }
9471 break;
9472
9473 case DT_VERDEFNUM:
9474 case DT_VERNEEDNUM:
9475 case DT_RELACOUNT:
9476 case DT_RELCOUNT:
9477 if (do_dynamic)
9478 {
9479 print_vma (entry->d_un.d_val, UNSIGNED);
9480 putchar ('\n');
9481 }
9482 break;
9483
9484 case DT_SYMINSZ:
9485 case DT_SYMINENT:
9486 case DT_SYMINFO:
9487 case DT_USED:
9488 case DT_INIT_ARRAY:
9489 case DT_FINI_ARRAY:
9490 if (do_dynamic)
9491 {
9492 if (entry->d_tag == DT_USED
9493 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9494 {
9495 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9496
9497 if (*name)
9498 {
9499 printf (_("Not needed object: [%s]\n"), name);
9500 break;
9501 }
9502 }
9503
9504 print_vma (entry->d_un.d_val, PREFIX_HEX);
9505 putchar ('\n');
9506 }
9507 break;
9508
9509 case DT_BIND_NOW:
9510 /* The value of this entry is ignored. */
9511 if (do_dynamic)
9512 putchar ('\n');
9513 break;
9514
9515 case DT_GNU_PRELINKED:
9516 if (do_dynamic)
9517 {
9518 struct tm * tmp;
9519 time_t atime = entry->d_un.d_val;
9520
9521 tmp = gmtime (&atime);
9522 /* PR 17533 file: 041-1244816-0.004. */
9523 if (tmp == NULL)
9524 printf (_("<corrupt time val: %lx"),
9525 (unsigned long) atime);
9526 else
9527 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9528 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9529 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9530
9531 }
9532 break;
9533
9534 case DT_GNU_HASH:
9535 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9536 if (do_dynamic)
9537 {
9538 print_vma (entry->d_un.d_val, PREFIX_HEX);
9539 putchar ('\n');
9540 }
9541 break;
9542
9543 default:
9544 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9545 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9546 entry->d_un.d_val;
9547
9548 if (do_dynamic)
9549 {
9550 switch (elf_header.e_machine)
9551 {
9552 case EM_MIPS:
9553 case EM_MIPS_RS3_LE:
9554 dynamic_section_mips_val (entry);
9555 break;
9556 case EM_PARISC:
9557 dynamic_section_parisc_val (entry);
9558 break;
9559 case EM_IA_64:
9560 dynamic_section_ia64_val (entry);
9561 break;
9562 default:
9563 print_vma (entry->d_un.d_val, PREFIX_HEX);
9564 putchar ('\n');
9565 }
9566 }
9567 break;
9568 }
9569 }
9570
9571 return 1;
9572 }
9573
9574 static char *
9575 get_ver_flags (unsigned int flags)
9576 {
9577 static char buff[32];
9578
9579 buff[0] = 0;
9580
9581 if (flags == 0)
9582 return _("none");
9583
9584 if (flags & VER_FLG_BASE)
9585 strcat (buff, "BASE ");
9586
9587 if (flags & VER_FLG_WEAK)
9588 {
9589 if (flags & VER_FLG_BASE)
9590 strcat (buff, "| ");
9591
9592 strcat (buff, "WEAK ");
9593 }
9594
9595 if (flags & VER_FLG_INFO)
9596 {
9597 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9598 strcat (buff, "| ");
9599
9600 strcat (buff, "INFO ");
9601 }
9602
9603 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9604 strcat (buff, _("| <unknown>"));
9605
9606 return buff;
9607 }
9608
9609 /* Display the contents of the version sections. */
9610
9611 static int
9612 process_version_sections (FILE * file)
9613 {
9614 Elf_Internal_Shdr * section;
9615 unsigned i;
9616 int found = 0;
9617
9618 if (! do_version)
9619 return 1;
9620
9621 for (i = 0, section = section_headers;
9622 i < elf_header.e_shnum;
9623 i++, section++)
9624 {
9625 switch (section->sh_type)
9626 {
9627 case SHT_GNU_verdef:
9628 {
9629 Elf_External_Verdef * edefs;
9630 unsigned int idx;
9631 unsigned int cnt;
9632 char * endbuf;
9633
9634 found = 1;
9635
9636 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9637 printable_section_name (section),
9638 section->sh_info);
9639
9640 printf (_(" Addr: 0x"));
9641 printf_vma (section->sh_addr);
9642 printf (_(" Offset: %#08lx Link: %u (%s)"),
9643 (unsigned long) section->sh_offset, section->sh_link,
9644 printable_section_name_from_index (section->sh_link));
9645
9646 edefs = (Elf_External_Verdef *)
9647 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9648 _("version definition section"));
9649 if (!edefs)
9650 break;
9651 endbuf = (char *) edefs + section->sh_size;
9652
9653 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9654 {
9655 char * vstart;
9656 Elf_External_Verdef * edef;
9657 Elf_Internal_Verdef ent;
9658 Elf_External_Verdaux * eaux;
9659 Elf_Internal_Verdaux aux;
9660 int j;
9661 int isum;
9662
9663 /* Check for very large indicies. */
9664 if (idx > (size_t) (endbuf - (char *) edefs))
9665 break;
9666
9667 vstart = ((char *) edefs) + idx;
9668 if (vstart + sizeof (*edef) > endbuf)
9669 break;
9670
9671 edef = (Elf_External_Verdef *) vstart;
9672
9673 ent.vd_version = BYTE_GET (edef->vd_version);
9674 ent.vd_flags = BYTE_GET (edef->vd_flags);
9675 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9676 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9677 ent.vd_hash = BYTE_GET (edef->vd_hash);
9678 ent.vd_aux = BYTE_GET (edef->vd_aux);
9679 ent.vd_next = BYTE_GET (edef->vd_next);
9680
9681 printf (_(" %#06x: Rev: %d Flags: %s"),
9682 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9683
9684 printf (_(" Index: %d Cnt: %d "),
9685 ent.vd_ndx, ent.vd_cnt);
9686
9687 /* Check for overflow. */
9688 if (ent.vd_aux > (size_t) (endbuf - vstart))
9689 break;
9690
9691 vstart += ent.vd_aux;
9692
9693 eaux = (Elf_External_Verdaux *) vstart;
9694
9695 aux.vda_name = BYTE_GET (eaux->vda_name);
9696 aux.vda_next = BYTE_GET (eaux->vda_next);
9697
9698 if (VALID_DYNAMIC_NAME (aux.vda_name))
9699 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9700 else
9701 printf (_("Name index: %ld\n"), aux.vda_name);
9702
9703 isum = idx + ent.vd_aux;
9704
9705 for (j = 1; j < ent.vd_cnt; j++)
9706 {
9707 /* Check for overflow. */
9708 if (aux.vda_next > (size_t) (endbuf - vstart))
9709 break;
9710
9711 isum += aux.vda_next;
9712 vstart += aux.vda_next;
9713
9714 eaux = (Elf_External_Verdaux *) vstart;
9715 if (vstart + sizeof (*eaux) > endbuf)
9716 break;
9717
9718 aux.vda_name = BYTE_GET (eaux->vda_name);
9719 aux.vda_next = BYTE_GET (eaux->vda_next);
9720
9721 if (VALID_DYNAMIC_NAME (aux.vda_name))
9722 printf (_(" %#06x: Parent %d: %s\n"),
9723 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9724 else
9725 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9726 isum, j, aux.vda_name);
9727 }
9728
9729 if (j < ent.vd_cnt)
9730 printf (_(" Version def aux past end of section\n"));
9731
9732 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9733 if (idx + ent.vd_next <= idx)
9734 break;
9735
9736 idx += ent.vd_next;
9737 }
9738
9739 if (cnt < section->sh_info)
9740 printf (_(" Version definition past end of section\n"));
9741
9742 free (edefs);
9743 }
9744 break;
9745
9746 case SHT_GNU_verneed:
9747 {
9748 Elf_External_Verneed * eneed;
9749 unsigned int idx;
9750 unsigned int cnt;
9751 char * endbuf;
9752
9753 found = 1;
9754
9755 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9756 printable_section_name (section), section->sh_info);
9757
9758 printf (_(" Addr: 0x"));
9759 printf_vma (section->sh_addr);
9760 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9761 (unsigned long) section->sh_offset, section->sh_link,
9762 printable_section_name_from_index (section->sh_link));
9763
9764 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9765 section->sh_offset, 1,
9766 section->sh_size,
9767 _("Version Needs section"));
9768 if (!eneed)
9769 break;
9770 endbuf = (char *) eneed + section->sh_size;
9771
9772 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9773 {
9774 Elf_External_Verneed * entry;
9775 Elf_Internal_Verneed ent;
9776 int j;
9777 int isum;
9778 char * vstart;
9779
9780 if (idx > (size_t) (endbuf - (char *) eneed))
9781 break;
9782
9783 vstart = ((char *) eneed) + idx;
9784 if (vstart + sizeof (*entry) > endbuf)
9785 break;
9786
9787 entry = (Elf_External_Verneed *) vstart;
9788
9789 ent.vn_version = BYTE_GET (entry->vn_version);
9790 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9791 ent.vn_file = BYTE_GET (entry->vn_file);
9792 ent.vn_aux = BYTE_GET (entry->vn_aux);
9793 ent.vn_next = BYTE_GET (entry->vn_next);
9794
9795 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9796
9797 if (VALID_DYNAMIC_NAME (ent.vn_file))
9798 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9799 else
9800 printf (_(" File: %lx"), ent.vn_file);
9801
9802 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9803
9804 /* Check for overflow. */
9805 if (ent.vn_aux > (size_t) (endbuf - vstart))
9806 break;
9807 vstart += ent.vn_aux;
9808
9809 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9810 {
9811 Elf_External_Vernaux * eaux;
9812 Elf_Internal_Vernaux aux;
9813
9814 if (vstart + sizeof (*eaux) > endbuf)
9815 break;
9816 eaux = (Elf_External_Vernaux *) vstart;
9817
9818 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9819 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9820 aux.vna_other = BYTE_GET (eaux->vna_other);
9821 aux.vna_name = BYTE_GET (eaux->vna_name);
9822 aux.vna_next = BYTE_GET (eaux->vna_next);
9823
9824 if (VALID_DYNAMIC_NAME (aux.vna_name))
9825 printf (_(" %#06x: Name: %s"),
9826 isum, GET_DYNAMIC_NAME (aux.vna_name));
9827 else
9828 printf (_(" %#06x: Name index: %lx"),
9829 isum, aux.vna_name);
9830
9831 printf (_(" Flags: %s Version: %d\n"),
9832 get_ver_flags (aux.vna_flags), aux.vna_other);
9833
9834 /* Check for overflow. */
9835 if (aux.vna_next > (size_t) (endbuf - vstart)
9836 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9837 {
9838 warn (_("Invalid vna_next field of %lx\n"),
9839 aux.vna_next);
9840 j = ent.vn_cnt;
9841 break;
9842 }
9843 isum += aux.vna_next;
9844 vstart += aux.vna_next;
9845 }
9846
9847 if (j < ent.vn_cnt)
9848 warn (_("Missing Version Needs auxillary information\n"));
9849
9850 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9851 {
9852 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9853 cnt = section->sh_info;
9854 break;
9855 }
9856 idx += ent.vn_next;
9857 }
9858
9859 if (cnt < section->sh_info)
9860 warn (_("Missing Version Needs information\n"));
9861
9862 free (eneed);
9863 }
9864 break;
9865
9866 case SHT_GNU_versym:
9867 {
9868 Elf_Internal_Shdr * link_section;
9869 size_t total;
9870 unsigned int cnt;
9871 unsigned char * edata;
9872 unsigned short * data;
9873 char * strtab;
9874 Elf_Internal_Sym * symbols;
9875 Elf_Internal_Shdr * string_sec;
9876 unsigned long num_syms;
9877 long off;
9878
9879 if (section->sh_link >= elf_header.e_shnum)
9880 break;
9881
9882 link_section = section_headers + section->sh_link;
9883 total = section->sh_size / sizeof (Elf_External_Versym);
9884
9885 if (link_section->sh_link >= elf_header.e_shnum)
9886 break;
9887
9888 found = 1;
9889
9890 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9891 if (symbols == NULL)
9892 break;
9893
9894 string_sec = section_headers + link_section->sh_link;
9895
9896 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9897 string_sec->sh_size,
9898 _("version string table"));
9899 if (!strtab)
9900 {
9901 free (symbols);
9902 break;
9903 }
9904
9905 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9906 printable_section_name (section), (unsigned long) total);
9907
9908 printf (_(" Addr: "));
9909 printf_vma (section->sh_addr);
9910 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9911 (unsigned long) section->sh_offset, section->sh_link,
9912 printable_section_name (link_section));
9913
9914 off = offset_from_vma (file,
9915 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9916 total * sizeof (short));
9917 edata = (unsigned char *) get_data (NULL, file, off, total,
9918 sizeof (short),
9919 _("version symbol data"));
9920 if (!edata)
9921 {
9922 free (strtab);
9923 free (symbols);
9924 break;
9925 }
9926
9927 data = (short unsigned int *) cmalloc (total, sizeof (short));
9928
9929 for (cnt = total; cnt --;)
9930 data[cnt] = byte_get (edata + cnt * sizeof (short),
9931 sizeof (short));
9932
9933 free (edata);
9934
9935 for (cnt = 0; cnt < total; cnt += 4)
9936 {
9937 int j, nn;
9938 char *name;
9939 char *invalid = _("*invalid*");
9940
9941 printf (" %03x:", cnt);
9942
9943 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9944 switch (data[cnt + j])
9945 {
9946 case 0:
9947 fputs (_(" 0 (*local*) "), stdout);
9948 break;
9949
9950 case 1:
9951 fputs (_(" 1 (*global*) "), stdout);
9952 break;
9953
9954 default:
9955 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9956 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9957
9958 /* If this index value is greater than the size of the symbols
9959 array, break to avoid an out-of-bounds read. */
9960 if ((unsigned long)(cnt + j) >= num_syms)
9961 {
9962 warn (_("invalid index into symbol array\n"));
9963 break;
9964 }
9965
9966 name = NULL;
9967 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9968 {
9969 Elf_Internal_Verneed ivn;
9970 unsigned long offset;
9971
9972 offset = offset_from_vma
9973 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9974 sizeof (Elf_External_Verneed));
9975
9976 do
9977 {
9978 Elf_Internal_Vernaux ivna;
9979 Elf_External_Verneed evn;
9980 Elf_External_Vernaux evna;
9981 unsigned long a_off;
9982
9983 if (get_data (&evn, file, offset, sizeof (evn), 1,
9984 _("version need")) == NULL)
9985 break;
9986
9987 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9988 ivn.vn_next = BYTE_GET (evn.vn_next);
9989
9990 a_off = offset + ivn.vn_aux;
9991
9992 do
9993 {
9994 if (get_data (&evna, file, a_off, sizeof (evna),
9995 1, _("version need aux (2)")) == NULL)
9996 {
9997 ivna.vna_next = 0;
9998 ivna.vna_other = 0;
9999 }
10000 else
10001 {
10002 ivna.vna_next = BYTE_GET (evna.vna_next);
10003 ivna.vna_other = BYTE_GET (evna.vna_other);
10004 }
10005
10006 a_off += ivna.vna_next;
10007 }
10008 while (ivna.vna_other != data[cnt + j]
10009 && ivna.vna_next != 0);
10010
10011 if (ivna.vna_other == data[cnt + j])
10012 {
10013 ivna.vna_name = BYTE_GET (evna.vna_name);
10014
10015 if (ivna.vna_name >= string_sec->sh_size)
10016 name = invalid;
10017 else
10018 name = strtab + ivna.vna_name;
10019 break;
10020 }
10021
10022 offset += ivn.vn_next;
10023 }
10024 while (ivn.vn_next);
10025 }
10026
10027 if (data[cnt + j] != 0x8001
10028 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10029 {
10030 Elf_Internal_Verdef ivd;
10031 Elf_External_Verdef evd;
10032 unsigned long offset;
10033
10034 offset = offset_from_vma
10035 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10036 sizeof evd);
10037
10038 do
10039 {
10040 if (get_data (&evd, file, offset, sizeof (evd), 1,
10041 _("version def")) == NULL)
10042 {
10043 ivd.vd_next = 0;
10044 /* PR 17531: file: 046-1082287-0.004. */
10045 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10046 break;
10047 }
10048 else
10049 {
10050 ivd.vd_next = BYTE_GET (evd.vd_next);
10051 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10052 }
10053
10054 offset += ivd.vd_next;
10055 }
10056 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10057 && ivd.vd_next != 0);
10058
10059 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10060 {
10061 Elf_External_Verdaux evda;
10062 Elf_Internal_Verdaux ivda;
10063
10064 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10065
10066 if (get_data (&evda, file,
10067 offset - ivd.vd_next + ivd.vd_aux,
10068 sizeof (evda), 1,
10069 _("version def aux")) == NULL)
10070 break;
10071
10072 ivda.vda_name = BYTE_GET (evda.vda_name);
10073
10074 if (ivda.vda_name >= string_sec->sh_size)
10075 name = invalid;
10076 else if (name != NULL && name != invalid)
10077 name = _("*both*");
10078 else
10079 name = strtab + ivda.vda_name;
10080 }
10081 }
10082 if (name != NULL)
10083 nn += printf ("(%s%-*s",
10084 name,
10085 12 - (int) strlen (name),
10086 ")");
10087
10088 if (nn < 18)
10089 printf ("%*c", 18 - nn, ' ');
10090 }
10091
10092 putchar ('\n');
10093 }
10094
10095 free (data);
10096 free (strtab);
10097 free (symbols);
10098 }
10099 break;
10100
10101 default:
10102 break;
10103 }
10104 }
10105
10106 if (! found)
10107 printf (_("\nNo version information found in this file.\n"));
10108
10109 return 1;
10110 }
10111
10112 static const char *
10113 get_symbol_binding (unsigned int binding)
10114 {
10115 static char buff[32];
10116
10117 switch (binding)
10118 {
10119 case STB_LOCAL: return "LOCAL";
10120 case STB_GLOBAL: return "GLOBAL";
10121 case STB_WEAK: return "WEAK";
10122 default:
10123 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10124 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10125 binding);
10126 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10127 {
10128 if (binding == STB_GNU_UNIQUE
10129 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10130 /* GNU is still using the default value 0. */
10131 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10132 return "UNIQUE";
10133 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10134 }
10135 else
10136 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10137 return buff;
10138 }
10139 }
10140
10141 static const char *
10142 get_symbol_type (unsigned int type)
10143 {
10144 static char buff[32];
10145
10146 switch (type)
10147 {
10148 case STT_NOTYPE: return "NOTYPE";
10149 case STT_OBJECT: return "OBJECT";
10150 case STT_FUNC: return "FUNC";
10151 case STT_SECTION: return "SECTION";
10152 case STT_FILE: return "FILE";
10153 case STT_COMMON: return "COMMON";
10154 case STT_TLS: return "TLS";
10155 case STT_RELC: return "RELC";
10156 case STT_SRELC: return "SRELC";
10157 default:
10158 if (type >= STT_LOPROC && type <= STT_HIPROC)
10159 {
10160 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10161 return "THUMB_FUNC";
10162
10163 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10164 return "REGISTER";
10165
10166 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10167 return "PARISC_MILLI";
10168
10169 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10170 }
10171 else if (type >= STT_LOOS && type <= STT_HIOS)
10172 {
10173 if (elf_header.e_machine == EM_PARISC)
10174 {
10175 if (type == STT_HP_OPAQUE)
10176 return "HP_OPAQUE";
10177 if (type == STT_HP_STUB)
10178 return "HP_STUB";
10179 }
10180
10181 if (type == STT_GNU_IFUNC
10182 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10183 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10184 /* GNU is still using the default value 0. */
10185 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10186 return "IFUNC";
10187
10188 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10189 }
10190 else
10191 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10192 return buff;
10193 }
10194 }
10195
10196 static const char *
10197 get_symbol_visibility (unsigned int visibility)
10198 {
10199 switch (visibility)
10200 {
10201 case STV_DEFAULT: return "DEFAULT";
10202 case STV_INTERNAL: return "INTERNAL";
10203 case STV_HIDDEN: return "HIDDEN";
10204 case STV_PROTECTED: return "PROTECTED";
10205 default:
10206 error (_("Unrecognized visibility value: %u"), visibility);
10207 return _("<unknown>");
10208 }
10209 }
10210
10211 static const char *
10212 get_mips_symbol_other (unsigned int other)
10213 {
10214 switch (other)
10215 {
10216 case STO_OPTIONAL:
10217 return "OPTIONAL";
10218 case STO_MIPS_PLT:
10219 return "MIPS PLT";
10220 case STO_MIPS_PIC:
10221 return "MIPS PIC";
10222 case STO_MICROMIPS:
10223 return "MICROMIPS";
10224 case STO_MICROMIPS | STO_MIPS_PIC:
10225 return "MICROMIPS, MIPS PIC";
10226 case STO_MIPS16:
10227 return "MIPS16";
10228 default:
10229 return NULL;
10230 }
10231 }
10232
10233 static const char *
10234 get_ia64_symbol_other (unsigned int other)
10235 {
10236 if (is_ia64_vms ())
10237 {
10238 static char res[32];
10239
10240 res[0] = 0;
10241
10242 /* Function types is for images and .STB files only. */
10243 switch (elf_header.e_type)
10244 {
10245 case ET_DYN:
10246 case ET_EXEC:
10247 switch (VMS_ST_FUNC_TYPE (other))
10248 {
10249 case VMS_SFT_CODE_ADDR:
10250 strcat (res, " CA");
10251 break;
10252 case VMS_SFT_SYMV_IDX:
10253 strcat (res, " VEC");
10254 break;
10255 case VMS_SFT_FD:
10256 strcat (res, " FD");
10257 break;
10258 case VMS_SFT_RESERVE:
10259 strcat (res, " RSV");
10260 break;
10261 default:
10262 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10263 VMS_ST_FUNC_TYPE (other));
10264 strcat (res, " <unknown>");
10265 break;
10266 }
10267 break;
10268 default:
10269 break;
10270 }
10271 switch (VMS_ST_LINKAGE (other))
10272 {
10273 case VMS_STL_IGNORE:
10274 strcat (res, " IGN");
10275 break;
10276 case VMS_STL_RESERVE:
10277 strcat (res, " RSV");
10278 break;
10279 case VMS_STL_STD:
10280 strcat (res, " STD");
10281 break;
10282 case VMS_STL_LNK:
10283 strcat (res, " LNK");
10284 break;
10285 default:
10286 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10287 VMS_ST_LINKAGE (other));
10288 strcat (res, " <unknown>");
10289 break;
10290 }
10291
10292 if (res[0] != 0)
10293 return res + 1;
10294 else
10295 return res;
10296 }
10297 return NULL;
10298 }
10299
10300 static const char *
10301 get_ppc64_symbol_other (unsigned int other)
10302 {
10303 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10304 {
10305 static char buf[32];
10306 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10307 PPC64_LOCAL_ENTRY_OFFSET (other));
10308 return buf;
10309 }
10310 return NULL;
10311 }
10312
10313 static const char *
10314 get_symbol_other (unsigned int other)
10315 {
10316 const char * result = NULL;
10317 static char buff [32];
10318
10319 if (other == 0)
10320 return "";
10321
10322 switch (elf_header.e_machine)
10323 {
10324 case EM_MIPS:
10325 result = get_mips_symbol_other (other);
10326 break;
10327 case EM_IA_64:
10328 result = get_ia64_symbol_other (other);
10329 break;
10330 case EM_PPC64:
10331 result = get_ppc64_symbol_other (other);
10332 break;
10333 default:
10334 break;
10335 }
10336
10337 if (result)
10338 return result;
10339
10340 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10341 return buff;
10342 }
10343
10344 static const char *
10345 get_symbol_index_type (unsigned int type)
10346 {
10347 static char buff[32];
10348
10349 switch (type)
10350 {
10351 case SHN_UNDEF: return "UND";
10352 case SHN_ABS: return "ABS";
10353 case SHN_COMMON: return "COM";
10354 default:
10355 if (type == SHN_IA_64_ANSI_COMMON
10356 && elf_header.e_machine == EM_IA_64
10357 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10358 return "ANSI_COM";
10359 else if ((elf_header.e_machine == EM_X86_64
10360 || elf_header.e_machine == EM_L1OM
10361 || elf_header.e_machine == EM_K1OM)
10362 && type == SHN_X86_64_LCOMMON)
10363 return "LARGE_COM";
10364 else if ((type == SHN_MIPS_SCOMMON
10365 && elf_header.e_machine == EM_MIPS)
10366 || (type == SHN_TIC6X_SCOMMON
10367 && elf_header.e_machine == EM_TI_C6000))
10368 return "SCOM";
10369 else if (type == SHN_MIPS_SUNDEFINED
10370 && elf_header.e_machine == EM_MIPS)
10371 return "SUND";
10372 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10373 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10374 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10375 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10376 else if (type >= SHN_LORESERVE)
10377 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10378 else if (type >= elf_header.e_shnum)
10379 sprintf (buff, _("bad section index[%3d]"), type);
10380 else
10381 sprintf (buff, "%3d", type);
10382 break;
10383 }
10384
10385 return buff;
10386 }
10387
10388 static bfd_vma *
10389 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10390 {
10391 unsigned char * e_data;
10392 bfd_vma * i_data;
10393
10394 /* If the size_t type is smaller than the bfd_size_type, eg because
10395 you are building a 32-bit tool on a 64-bit host, then make sure
10396 that when (number) is cast to (size_t) no information is lost. */
10397 if (sizeof (size_t) < sizeof (bfd_size_type)
10398 && (bfd_size_type) ((size_t) number) != number)
10399 {
10400 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10401 " elements of size %u\n"),
10402 number, ent_size);
10403 return NULL;
10404 }
10405
10406 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10407 attempting to allocate memory when the read is bound to fail. */
10408 if (ent_size * number > current_file_size)
10409 {
10410 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10411 number);
10412 return NULL;
10413 }
10414
10415 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10416 if (e_data == NULL)
10417 {
10418 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10419 number);
10420 return NULL;
10421 }
10422
10423 if (fread (e_data, ent_size, (size_t) number, file) != number)
10424 {
10425 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10426 number * ent_size);
10427 free (e_data);
10428 return NULL;
10429 }
10430
10431 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10432 if (i_data == NULL)
10433 {
10434 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10435 " dynamic entries\n"),
10436 number);
10437 free (e_data);
10438 return NULL;
10439 }
10440
10441 while (number--)
10442 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10443
10444 free (e_data);
10445
10446 return i_data;
10447 }
10448
10449 static void
10450 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10451 {
10452 Elf_Internal_Sym * psym;
10453 int n;
10454
10455 n = print_vma (si, DEC_5);
10456 if (n < 5)
10457 fputs (&" "[n], stdout);
10458 printf (" %3lu: ", hn);
10459
10460 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10461 {
10462 printf (_("<No info available for dynamic symbol number %lu>\n"),
10463 (unsigned long) si);
10464 return;
10465 }
10466
10467 psym = dynamic_symbols + si;
10468 print_vma (psym->st_value, LONG_HEX);
10469 putchar (' ');
10470 print_vma (psym->st_size, DEC_5);
10471
10472 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10473 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10474 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10475 /* Check to see if any other bits in the st_other field are set.
10476 Note - displaying this information disrupts the layout of the
10477 table being generated, but for the moment this case is very
10478 rare. */
10479 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10480 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10481 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10482 if (VALID_DYNAMIC_NAME (psym->st_name))
10483 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10484 else
10485 printf (_(" <corrupt: %14ld>"), psym->st_name);
10486 putchar ('\n');
10487 }
10488
10489 static const char *
10490 get_symbol_version_string (FILE *file, int is_dynsym,
10491 const char *strtab,
10492 unsigned long int strtab_size,
10493 unsigned int si, Elf_Internal_Sym *psym,
10494 enum versioned_symbol_info *sym_info,
10495 unsigned short *vna_other)
10496 {
10497 unsigned char data[2];
10498 unsigned short vers_data;
10499 unsigned long offset;
10500
10501 if (!is_dynsym
10502 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10503 return NULL;
10504
10505 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10506 sizeof data + si * sizeof (vers_data));
10507
10508 if (get_data (&data, file, offset + si * sizeof (vers_data),
10509 sizeof (data), 1, _("version data")) == NULL)
10510 return NULL;
10511
10512 vers_data = byte_get (data, 2);
10513
10514 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10515 return NULL;
10516
10517 /* Usually we'd only see verdef for defined symbols, and verneed for
10518 undefined symbols. However, symbols defined by the linker in
10519 .dynbss for variables copied from a shared library in order to
10520 avoid text relocations are defined yet have verneed. We could
10521 use a heuristic to detect the special case, for example, check
10522 for verneed first on symbols defined in SHT_NOBITS sections, but
10523 it is simpler and more reliable to just look for both verdef and
10524 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10525
10526 if (psym->st_shndx != SHN_UNDEF
10527 && vers_data != 0x8001
10528 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10529 {
10530 Elf_Internal_Verdef ivd;
10531 Elf_Internal_Verdaux ivda;
10532 Elf_External_Verdaux evda;
10533 unsigned long off;
10534
10535 off = offset_from_vma (file,
10536 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10537 sizeof (Elf_External_Verdef));
10538
10539 do
10540 {
10541 Elf_External_Verdef evd;
10542
10543 if (get_data (&evd, file, off, sizeof (evd), 1,
10544 _("version def")) == NULL)
10545 {
10546 ivd.vd_ndx = 0;
10547 ivd.vd_aux = 0;
10548 ivd.vd_next = 0;
10549 }
10550 else
10551 {
10552 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10553 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10554 ivd.vd_next = BYTE_GET (evd.vd_next);
10555 }
10556
10557 off += ivd.vd_next;
10558 }
10559 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10560
10561 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10562 {
10563 off -= ivd.vd_next;
10564 off += ivd.vd_aux;
10565
10566 if (get_data (&evda, file, off, sizeof (evda), 1,
10567 _("version def aux")) != NULL)
10568 {
10569 ivda.vda_name = BYTE_GET (evda.vda_name);
10570
10571 if (psym->st_name != ivda.vda_name)
10572 {
10573 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10574 ? symbol_hidden : symbol_public);
10575 return (ivda.vda_name < strtab_size
10576 ? strtab + ivda.vda_name : _("<corrupt>"));
10577 }
10578 }
10579 }
10580 }
10581
10582 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10583 {
10584 Elf_External_Verneed evn;
10585 Elf_Internal_Verneed ivn;
10586 Elf_Internal_Vernaux ivna;
10587
10588 offset = offset_from_vma (file,
10589 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10590 sizeof evn);
10591 do
10592 {
10593 unsigned long vna_off;
10594
10595 if (get_data (&evn, file, offset, sizeof (evn), 1,
10596 _("version need")) == NULL)
10597 {
10598 ivna.vna_next = 0;
10599 ivna.vna_other = 0;
10600 ivna.vna_name = 0;
10601 break;
10602 }
10603
10604 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10605 ivn.vn_next = BYTE_GET (evn.vn_next);
10606
10607 vna_off = offset + ivn.vn_aux;
10608
10609 do
10610 {
10611 Elf_External_Vernaux evna;
10612
10613 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10614 _("version need aux (3)")) == NULL)
10615 {
10616 ivna.vna_next = 0;
10617 ivna.vna_other = 0;
10618 ivna.vna_name = 0;
10619 }
10620 else
10621 {
10622 ivna.vna_other = BYTE_GET (evna.vna_other);
10623 ivna.vna_next = BYTE_GET (evna.vna_next);
10624 ivna.vna_name = BYTE_GET (evna.vna_name);
10625 }
10626
10627 vna_off += ivna.vna_next;
10628 }
10629 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10630
10631 if (ivna.vna_other == vers_data)
10632 break;
10633
10634 offset += ivn.vn_next;
10635 }
10636 while (ivn.vn_next != 0);
10637
10638 if (ivna.vna_other == vers_data)
10639 {
10640 *sym_info = symbol_undefined;
10641 *vna_other = ivna.vna_other;
10642 return (ivna.vna_name < strtab_size
10643 ? strtab + ivna.vna_name : _("<corrupt>"));
10644 }
10645 }
10646 return NULL;
10647 }
10648
10649 /* Dump the symbol table. */
10650 static int
10651 process_symbol_table (FILE * file)
10652 {
10653 Elf_Internal_Shdr * section;
10654 bfd_size_type nbuckets = 0;
10655 bfd_size_type nchains = 0;
10656 bfd_vma * buckets = NULL;
10657 bfd_vma * chains = NULL;
10658 bfd_vma ngnubuckets = 0;
10659 bfd_vma * gnubuckets = NULL;
10660 bfd_vma * gnuchains = NULL;
10661 bfd_vma gnusymidx = 0;
10662 bfd_size_type ngnuchains = 0;
10663
10664 if (!do_syms && !do_dyn_syms && !do_histogram)
10665 return 1;
10666
10667 if (dynamic_info[DT_HASH]
10668 && (do_histogram
10669 || (do_using_dynamic
10670 && !do_dyn_syms
10671 && dynamic_strings != NULL)))
10672 {
10673 unsigned char nb[8];
10674 unsigned char nc[8];
10675 unsigned int hash_ent_size = 4;
10676
10677 if ((elf_header.e_machine == EM_ALPHA
10678 || elf_header.e_machine == EM_S390
10679 || elf_header.e_machine == EM_S390_OLD)
10680 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10681 hash_ent_size = 8;
10682
10683 if (fseek (file,
10684 (archive_file_offset
10685 + offset_from_vma (file, dynamic_info[DT_HASH],
10686 sizeof nb + sizeof nc)),
10687 SEEK_SET))
10688 {
10689 error (_("Unable to seek to start of dynamic information\n"));
10690 goto no_hash;
10691 }
10692
10693 if (fread (nb, hash_ent_size, 1, file) != 1)
10694 {
10695 error (_("Failed to read in number of buckets\n"));
10696 goto no_hash;
10697 }
10698
10699 if (fread (nc, hash_ent_size, 1, file) != 1)
10700 {
10701 error (_("Failed to read in number of chains\n"));
10702 goto no_hash;
10703 }
10704
10705 nbuckets = byte_get (nb, hash_ent_size);
10706 nchains = byte_get (nc, hash_ent_size);
10707
10708 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10709 chains = get_dynamic_data (file, nchains, hash_ent_size);
10710
10711 no_hash:
10712 if (buckets == NULL || chains == NULL)
10713 {
10714 if (do_using_dynamic)
10715 return 0;
10716 free (buckets);
10717 free (chains);
10718 buckets = NULL;
10719 chains = NULL;
10720 nbuckets = 0;
10721 nchains = 0;
10722 }
10723 }
10724
10725 if (dynamic_info_DT_GNU_HASH
10726 && (do_histogram
10727 || (do_using_dynamic
10728 && !do_dyn_syms
10729 && dynamic_strings != NULL)))
10730 {
10731 unsigned char nb[16];
10732 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10733 bfd_vma buckets_vma;
10734
10735 if (fseek (file,
10736 (archive_file_offset
10737 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10738 sizeof nb)),
10739 SEEK_SET))
10740 {
10741 error (_("Unable to seek to start of dynamic information\n"));
10742 goto no_gnu_hash;
10743 }
10744
10745 if (fread (nb, 16, 1, file) != 1)
10746 {
10747 error (_("Failed to read in number of buckets\n"));
10748 goto no_gnu_hash;
10749 }
10750
10751 ngnubuckets = byte_get (nb, 4);
10752 gnusymidx = byte_get (nb + 4, 4);
10753 bitmaskwords = byte_get (nb + 8, 4);
10754 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10755 if (is_32bit_elf)
10756 buckets_vma += bitmaskwords * 4;
10757 else
10758 buckets_vma += bitmaskwords * 8;
10759
10760 if (fseek (file,
10761 (archive_file_offset
10762 + offset_from_vma (file, buckets_vma, 4)),
10763 SEEK_SET))
10764 {
10765 error (_("Unable to seek to start of dynamic information\n"));
10766 goto no_gnu_hash;
10767 }
10768
10769 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10770
10771 if (gnubuckets == NULL)
10772 goto no_gnu_hash;
10773
10774 for (i = 0; i < ngnubuckets; i++)
10775 if (gnubuckets[i] != 0)
10776 {
10777 if (gnubuckets[i] < gnusymidx)
10778 return 0;
10779
10780 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10781 maxchain = gnubuckets[i];
10782 }
10783
10784 if (maxchain == 0xffffffff)
10785 goto no_gnu_hash;
10786
10787 maxchain -= gnusymidx;
10788
10789 if (fseek (file,
10790 (archive_file_offset
10791 + offset_from_vma (file, buckets_vma
10792 + 4 * (ngnubuckets + maxchain), 4)),
10793 SEEK_SET))
10794 {
10795 error (_("Unable to seek to start of dynamic information\n"));
10796 goto no_gnu_hash;
10797 }
10798
10799 do
10800 {
10801 if (fread (nb, 4, 1, file) != 1)
10802 {
10803 error (_("Failed to determine last chain length\n"));
10804 goto no_gnu_hash;
10805 }
10806
10807 if (maxchain + 1 == 0)
10808 goto no_gnu_hash;
10809
10810 ++maxchain;
10811 }
10812 while ((byte_get (nb, 4) & 1) == 0);
10813
10814 if (fseek (file,
10815 (archive_file_offset
10816 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10817 SEEK_SET))
10818 {
10819 error (_("Unable to seek to start of dynamic information\n"));
10820 goto no_gnu_hash;
10821 }
10822
10823 gnuchains = get_dynamic_data (file, maxchain, 4);
10824 ngnuchains = maxchain;
10825
10826 no_gnu_hash:
10827 if (gnuchains == NULL)
10828 {
10829 free (gnubuckets);
10830 gnubuckets = NULL;
10831 ngnubuckets = 0;
10832 if (do_using_dynamic)
10833 return 0;
10834 }
10835 }
10836
10837 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10838 && do_syms
10839 && do_using_dynamic
10840 && dynamic_strings != NULL
10841 && dynamic_symbols != NULL)
10842 {
10843 unsigned long hn;
10844
10845 if (dynamic_info[DT_HASH])
10846 {
10847 bfd_vma si;
10848
10849 printf (_("\nSymbol table for image:\n"));
10850 if (is_32bit_elf)
10851 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10852 else
10853 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10854
10855 for (hn = 0; hn < nbuckets; hn++)
10856 {
10857 if (! buckets[hn])
10858 continue;
10859
10860 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10861 print_dynamic_symbol (si, hn);
10862 }
10863 }
10864
10865 if (dynamic_info_DT_GNU_HASH)
10866 {
10867 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10868 if (is_32bit_elf)
10869 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10870 else
10871 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10872
10873 for (hn = 0; hn < ngnubuckets; ++hn)
10874 if (gnubuckets[hn] != 0)
10875 {
10876 bfd_vma si = gnubuckets[hn];
10877 bfd_vma off = si - gnusymidx;
10878
10879 do
10880 {
10881 print_dynamic_symbol (si, hn);
10882 si++;
10883 }
10884 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10885 }
10886 }
10887 }
10888 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10889 && section_headers != NULL)
10890 {
10891 unsigned int i;
10892
10893 for (i = 0, section = section_headers;
10894 i < elf_header.e_shnum;
10895 i++, section++)
10896 {
10897 unsigned int si;
10898 char * strtab = NULL;
10899 unsigned long int strtab_size = 0;
10900 Elf_Internal_Sym * symtab;
10901 Elf_Internal_Sym * psym;
10902 unsigned long num_syms;
10903
10904 if ((section->sh_type != SHT_SYMTAB
10905 && section->sh_type != SHT_DYNSYM)
10906 || (!do_syms
10907 && section->sh_type == SHT_SYMTAB))
10908 continue;
10909
10910 if (section->sh_entsize == 0)
10911 {
10912 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10913 printable_section_name (section));
10914 continue;
10915 }
10916
10917 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10918 printable_section_name (section),
10919 (unsigned long) (section->sh_size / section->sh_entsize));
10920
10921 if (is_32bit_elf)
10922 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10923 else
10924 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10925
10926 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10927 if (symtab == NULL)
10928 continue;
10929
10930 if (section->sh_link == elf_header.e_shstrndx)
10931 {
10932 strtab = string_table;
10933 strtab_size = string_table_length;
10934 }
10935 else if (section->sh_link < elf_header.e_shnum)
10936 {
10937 Elf_Internal_Shdr * string_sec;
10938
10939 string_sec = section_headers + section->sh_link;
10940
10941 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10942 1, string_sec->sh_size,
10943 _("string table"));
10944 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10945 }
10946
10947 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10948 {
10949 const char *version_string;
10950 enum versioned_symbol_info sym_info;
10951 unsigned short vna_other;
10952
10953 printf ("%6d: ", si);
10954 print_vma (psym->st_value, LONG_HEX);
10955 putchar (' ');
10956 print_vma (psym->st_size, DEC_5);
10957 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10958 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10959 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10960 /* Check to see if any other bits in the st_other field are set.
10961 Note - displaying this information disrupts the layout of the
10962 table being generated, but for the moment this case is very rare. */
10963 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10964 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10965 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10966 print_symbol (25, psym->st_name < strtab_size
10967 ? strtab + psym->st_name : _("<corrupt>"));
10968
10969 version_string
10970 = get_symbol_version_string (file,
10971 section->sh_type == SHT_DYNSYM,
10972 strtab, strtab_size, si,
10973 psym, &sym_info, &vna_other);
10974 if (version_string)
10975 {
10976 if (sym_info == symbol_undefined)
10977 printf ("@%s (%d)", version_string, vna_other);
10978 else
10979 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10980 version_string);
10981 }
10982
10983 putchar ('\n');
10984 }
10985
10986 free (symtab);
10987 if (strtab != string_table)
10988 free (strtab);
10989 }
10990 }
10991 else if (do_syms)
10992 printf
10993 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10994
10995 if (do_histogram && buckets != NULL)
10996 {
10997 unsigned long * lengths;
10998 unsigned long * counts;
10999 unsigned long hn;
11000 bfd_vma si;
11001 unsigned long maxlength = 0;
11002 unsigned long nzero_counts = 0;
11003 unsigned long nsyms = 0;
11004 unsigned long chained;
11005
11006 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11007 (unsigned long) nbuckets);
11008
11009 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11010 if (lengths == NULL)
11011 {
11012 error (_("Out of memory allocating space for histogram buckets\n"));
11013 return 0;
11014 }
11015
11016 printf (_(" Length Number %% of total Coverage\n"));
11017 for (hn = 0; hn < nbuckets; ++hn)
11018 {
11019 for (si = buckets[hn], chained = 0;
11020 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11021 si = chains[si], ++chained)
11022 {
11023 ++nsyms;
11024 if (maxlength < ++lengths[hn])
11025 ++maxlength;
11026 }
11027
11028 /* PR binutils/17531: A corrupt binary could contain broken
11029 histogram data. Do not go into an infinite loop trying
11030 to process it. */
11031 if (chained > nchains)
11032 {
11033 error (_("histogram chain is corrupt\n"));
11034 break;
11035 }
11036 }
11037
11038 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11039 if (counts == NULL)
11040 {
11041 free (lengths);
11042 error (_("Out of memory allocating space for histogram counts\n"));
11043 return 0;
11044 }
11045
11046 for (hn = 0; hn < nbuckets; ++hn)
11047 ++counts[lengths[hn]];
11048
11049 if (nbuckets > 0)
11050 {
11051 unsigned long i;
11052 printf (" 0 %-10lu (%5.1f%%)\n",
11053 counts[0], (counts[0] * 100.0) / nbuckets);
11054 for (i = 1; i <= maxlength; ++i)
11055 {
11056 nzero_counts += counts[i] * i;
11057 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11058 i, counts[i], (counts[i] * 100.0) / nbuckets,
11059 (nzero_counts * 100.0) / nsyms);
11060 }
11061 }
11062
11063 free (counts);
11064 free (lengths);
11065 }
11066
11067 if (buckets != NULL)
11068 {
11069 free (buckets);
11070 free (chains);
11071 }
11072
11073 if (do_histogram && gnubuckets != NULL)
11074 {
11075 unsigned long * lengths;
11076 unsigned long * counts;
11077 unsigned long hn;
11078 unsigned long maxlength = 0;
11079 unsigned long nzero_counts = 0;
11080 unsigned long nsyms = 0;
11081
11082 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11083 (unsigned long) ngnubuckets);
11084
11085 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11086 if (lengths == NULL)
11087 {
11088 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11089 return 0;
11090 }
11091
11092 printf (_(" Length Number %% of total Coverage\n"));
11093
11094 for (hn = 0; hn < ngnubuckets; ++hn)
11095 if (gnubuckets[hn] != 0)
11096 {
11097 bfd_vma off, length = 1;
11098
11099 for (off = gnubuckets[hn] - gnusymidx;
11100 /* PR 17531 file: 010-77222-0.004. */
11101 off < ngnuchains && (gnuchains[off] & 1) == 0;
11102 ++off)
11103 ++length;
11104 lengths[hn] = length;
11105 if (length > maxlength)
11106 maxlength = length;
11107 nsyms += length;
11108 }
11109
11110 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11111 if (counts == NULL)
11112 {
11113 free (lengths);
11114 error (_("Out of memory allocating space for gnu histogram counts\n"));
11115 return 0;
11116 }
11117
11118 for (hn = 0; hn < ngnubuckets; ++hn)
11119 ++counts[lengths[hn]];
11120
11121 if (ngnubuckets > 0)
11122 {
11123 unsigned long j;
11124 printf (" 0 %-10lu (%5.1f%%)\n",
11125 counts[0], (counts[0] * 100.0) / ngnubuckets);
11126 for (j = 1; j <= maxlength; ++j)
11127 {
11128 nzero_counts += counts[j] * j;
11129 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11130 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11131 (nzero_counts * 100.0) / nsyms);
11132 }
11133 }
11134
11135 free (counts);
11136 free (lengths);
11137 free (gnubuckets);
11138 free (gnuchains);
11139 }
11140
11141 return 1;
11142 }
11143
11144 static int
11145 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11146 {
11147 unsigned int i;
11148
11149 if (dynamic_syminfo == NULL
11150 || !do_dynamic)
11151 /* No syminfo, this is ok. */
11152 return 1;
11153
11154 /* There better should be a dynamic symbol section. */
11155 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11156 return 0;
11157
11158 if (dynamic_addr)
11159 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11160 dynamic_syminfo_offset, dynamic_syminfo_nent);
11161
11162 printf (_(" Num: Name BoundTo Flags\n"));
11163 for (i = 0; i < dynamic_syminfo_nent; ++i)
11164 {
11165 unsigned short int flags = dynamic_syminfo[i].si_flags;
11166
11167 printf ("%4d: ", i);
11168 if (i >= num_dynamic_syms)
11169 printf (_("<corrupt index>"));
11170 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11171 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11172 else
11173 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11174 putchar (' ');
11175
11176 switch (dynamic_syminfo[i].si_boundto)
11177 {
11178 case SYMINFO_BT_SELF:
11179 fputs ("SELF ", stdout);
11180 break;
11181 case SYMINFO_BT_PARENT:
11182 fputs ("PARENT ", stdout);
11183 break;
11184 default:
11185 if (dynamic_syminfo[i].si_boundto > 0
11186 && dynamic_syminfo[i].si_boundto < dynamic_nent
11187 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11188 {
11189 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11190 putchar (' ' );
11191 }
11192 else
11193 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11194 break;
11195 }
11196
11197 if (flags & SYMINFO_FLG_DIRECT)
11198 printf (" DIRECT");
11199 if (flags & SYMINFO_FLG_PASSTHRU)
11200 printf (" PASSTHRU");
11201 if (flags & SYMINFO_FLG_COPY)
11202 printf (" COPY");
11203 if (flags & SYMINFO_FLG_LAZYLOAD)
11204 printf (" LAZYLOAD");
11205
11206 puts ("");
11207 }
11208
11209 return 1;
11210 }
11211
11212 /* Check to see if the given reloc needs to be handled in a target specific
11213 manner. If so then process the reloc and return TRUE otherwise return
11214 FALSE. */
11215
11216 static bfd_boolean
11217 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11218 unsigned char * start,
11219 Elf_Internal_Sym * symtab)
11220 {
11221 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11222
11223 switch (elf_header.e_machine)
11224 {
11225 case EM_MSP430:
11226 case EM_MSP430_OLD:
11227 {
11228 static Elf_Internal_Sym * saved_sym = NULL;
11229
11230 switch (reloc_type)
11231 {
11232 case 10: /* R_MSP430_SYM_DIFF */
11233 if (uses_msp430x_relocs ())
11234 break;
11235 case 21: /* R_MSP430X_SYM_DIFF */
11236 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11237 return TRUE;
11238
11239 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11240 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11241 goto handle_sym_diff;
11242
11243 case 5: /* R_MSP430_16_BYTE */
11244 case 9: /* R_MSP430_8 */
11245 if (uses_msp430x_relocs ())
11246 break;
11247 goto handle_sym_diff;
11248
11249 case 2: /* R_MSP430_ABS16 */
11250 case 15: /* R_MSP430X_ABS16 */
11251 if (! uses_msp430x_relocs ())
11252 break;
11253 goto handle_sym_diff;
11254
11255 handle_sym_diff:
11256 if (saved_sym != NULL)
11257 {
11258 bfd_vma value;
11259
11260 value = reloc->r_addend
11261 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11262 - saved_sym->st_value);
11263
11264 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11265
11266 saved_sym = NULL;
11267 return TRUE;
11268 }
11269 break;
11270
11271 default:
11272 if (saved_sym != NULL)
11273 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11274 break;
11275 }
11276 break;
11277 }
11278
11279 case EM_MN10300:
11280 case EM_CYGNUS_MN10300:
11281 {
11282 static Elf_Internal_Sym * saved_sym = NULL;
11283
11284 switch (reloc_type)
11285 {
11286 case 34: /* R_MN10300_ALIGN */
11287 return TRUE;
11288 case 33: /* R_MN10300_SYM_DIFF */
11289 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11290 return TRUE;
11291 case 1: /* R_MN10300_32 */
11292 case 2: /* R_MN10300_16 */
11293 if (saved_sym != NULL)
11294 {
11295 bfd_vma value;
11296
11297 value = reloc->r_addend
11298 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11299 - saved_sym->st_value);
11300
11301 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11302
11303 saved_sym = NULL;
11304 return TRUE;
11305 }
11306 break;
11307 default:
11308 if (saved_sym != NULL)
11309 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11310 break;
11311 }
11312 break;
11313 }
11314
11315 case EM_RL78:
11316 {
11317 static bfd_vma saved_sym1 = 0;
11318 static bfd_vma saved_sym2 = 0;
11319 static bfd_vma value;
11320
11321 switch (reloc_type)
11322 {
11323 case 0x80: /* R_RL78_SYM. */
11324 saved_sym1 = saved_sym2;
11325 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11326 saved_sym2 += reloc->r_addend;
11327 return TRUE;
11328
11329 case 0x83: /* R_RL78_OPsub. */
11330 value = saved_sym1 - saved_sym2;
11331 saved_sym2 = saved_sym1 = 0;
11332 return TRUE;
11333 break;
11334
11335 case 0x41: /* R_RL78_ABS32. */
11336 byte_put (start + reloc->r_offset, value, 4);
11337 value = 0;
11338 return TRUE;
11339
11340 case 0x43: /* R_RL78_ABS16. */
11341 byte_put (start + reloc->r_offset, value, 2);
11342 value = 0;
11343 return TRUE;
11344
11345 default:
11346 break;
11347 }
11348 break;
11349 }
11350 }
11351
11352 return FALSE;
11353 }
11354
11355 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11356 DWARF debug sections. This is a target specific test. Note - we do not
11357 go through the whole including-target-headers-multiple-times route, (as
11358 we have already done with <elf/h8.h>) because this would become very
11359 messy and even then this function would have to contain target specific
11360 information (the names of the relocs instead of their numeric values).
11361 FIXME: This is not the correct way to solve this problem. The proper way
11362 is to have target specific reloc sizing and typing functions created by
11363 the reloc-macros.h header, in the same way that it already creates the
11364 reloc naming functions. */
11365
11366 static bfd_boolean
11367 is_32bit_abs_reloc (unsigned int reloc_type)
11368 {
11369 switch (elf_header.e_machine)
11370 {
11371 case EM_386:
11372 case EM_IAMCU:
11373 return reloc_type == 1; /* R_386_32. */
11374 case EM_68K:
11375 return reloc_type == 1; /* R_68K_32. */
11376 case EM_860:
11377 return reloc_type == 1; /* R_860_32. */
11378 case EM_960:
11379 return reloc_type == 2; /* R_960_32. */
11380 case EM_AARCH64:
11381 return reloc_type == 258; /* R_AARCH64_ABS32 */
11382 case EM_ALPHA:
11383 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11384 case EM_ARC:
11385 return reloc_type == 1; /* R_ARC_32. */
11386 case EM_ARC_COMPACT:
11387 case EM_ARC_COMPACT2:
11388 return reloc_type == 4; /* R_ARC_32. */
11389 case EM_ARM:
11390 return reloc_type == 2; /* R_ARM_ABS32 */
11391 case EM_AVR_OLD:
11392 case EM_AVR:
11393 return reloc_type == 1;
11394 case EM_ADAPTEVA_EPIPHANY:
11395 return reloc_type == 3;
11396 case EM_BLACKFIN:
11397 return reloc_type == 0x12; /* R_byte4_data. */
11398 case EM_CRIS:
11399 return reloc_type == 3; /* R_CRIS_32. */
11400 case EM_CR16:
11401 return reloc_type == 3; /* R_CR16_NUM32. */
11402 case EM_CRX:
11403 return reloc_type == 15; /* R_CRX_NUM32. */
11404 case EM_CYGNUS_FRV:
11405 return reloc_type == 1;
11406 case EM_CYGNUS_D10V:
11407 case EM_D10V:
11408 return reloc_type == 6; /* R_D10V_32. */
11409 case EM_CYGNUS_D30V:
11410 case EM_D30V:
11411 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11412 case EM_DLX:
11413 return reloc_type == 3; /* R_DLX_RELOC_32. */
11414 case EM_CYGNUS_FR30:
11415 case EM_FR30:
11416 return reloc_type == 3; /* R_FR30_32. */
11417 case EM_FT32:
11418 return reloc_type == 1; /* R_FT32_32. */
11419 case EM_H8S:
11420 case EM_H8_300:
11421 case EM_H8_300H:
11422 return reloc_type == 1; /* R_H8_DIR32. */
11423 case EM_IA_64:
11424 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11425 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11426 case EM_IP2K_OLD:
11427 case EM_IP2K:
11428 return reloc_type == 2; /* R_IP2K_32. */
11429 case EM_IQ2000:
11430 return reloc_type == 2; /* R_IQ2000_32. */
11431 case EM_LATTICEMICO32:
11432 return reloc_type == 3; /* R_LM32_32. */
11433 case EM_M32C_OLD:
11434 case EM_M32C:
11435 return reloc_type == 3; /* R_M32C_32. */
11436 case EM_M32R:
11437 return reloc_type == 34; /* R_M32R_32_RELA. */
11438 case EM_68HC11:
11439 case EM_68HC12:
11440 return reloc_type == 6; /* R_M68HC11_32. */
11441 case EM_MCORE:
11442 return reloc_type == 1; /* R_MCORE_ADDR32. */
11443 case EM_CYGNUS_MEP:
11444 return reloc_type == 4; /* R_MEP_32. */
11445 case EM_METAG:
11446 return reloc_type == 2; /* R_METAG_ADDR32. */
11447 case EM_MICROBLAZE:
11448 return reloc_type == 1; /* R_MICROBLAZE_32. */
11449 case EM_MIPS:
11450 return reloc_type == 2; /* R_MIPS_32. */
11451 case EM_MMIX:
11452 return reloc_type == 4; /* R_MMIX_32. */
11453 case EM_CYGNUS_MN10200:
11454 case EM_MN10200:
11455 return reloc_type == 1; /* R_MN10200_32. */
11456 case EM_CYGNUS_MN10300:
11457 case EM_MN10300:
11458 return reloc_type == 1; /* R_MN10300_32. */
11459 case EM_MOXIE:
11460 return reloc_type == 1; /* R_MOXIE_32. */
11461 case EM_MSP430_OLD:
11462 case EM_MSP430:
11463 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11464 case EM_MT:
11465 return reloc_type == 2; /* R_MT_32. */
11466 case EM_NDS32:
11467 return reloc_type == 20; /* R_NDS32_RELA. */
11468 case EM_ALTERA_NIOS2:
11469 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11470 case EM_NIOS32:
11471 return reloc_type == 1; /* R_NIOS_32. */
11472 case EM_OR1K:
11473 return reloc_type == 1; /* R_OR1K_32. */
11474 case EM_PARISC:
11475 return (reloc_type == 1 /* R_PARISC_DIR32. */
11476 || reloc_type == 41); /* R_PARISC_SECREL32. */
11477 case EM_PJ:
11478 case EM_PJ_OLD:
11479 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11480 case EM_PPC64:
11481 return reloc_type == 1; /* R_PPC64_ADDR32. */
11482 case EM_PPC:
11483 return reloc_type == 1; /* R_PPC_ADDR32. */
11484 case EM_RL78:
11485 return reloc_type == 1; /* R_RL78_DIR32. */
11486 case EM_RX:
11487 return reloc_type == 1; /* R_RX_DIR32. */
11488 case EM_S370:
11489 return reloc_type == 1; /* R_I370_ADDR31. */
11490 case EM_S390_OLD:
11491 case EM_S390:
11492 return reloc_type == 4; /* R_S390_32. */
11493 case EM_SCORE:
11494 return reloc_type == 8; /* R_SCORE_ABS32. */
11495 case EM_SH:
11496 return reloc_type == 1; /* R_SH_DIR32. */
11497 case EM_SPARC32PLUS:
11498 case EM_SPARCV9:
11499 case EM_SPARC:
11500 return reloc_type == 3 /* R_SPARC_32. */
11501 || reloc_type == 23; /* R_SPARC_UA32. */
11502 case EM_SPU:
11503 return reloc_type == 6; /* R_SPU_ADDR32 */
11504 case EM_TI_C6000:
11505 return reloc_type == 1; /* R_C6000_ABS32. */
11506 case EM_TILEGX:
11507 return reloc_type == 2; /* R_TILEGX_32. */
11508 case EM_TILEPRO:
11509 return reloc_type == 1; /* R_TILEPRO_32. */
11510 case EM_CYGNUS_V850:
11511 case EM_V850:
11512 return reloc_type == 6; /* R_V850_ABS32. */
11513 case EM_V800:
11514 return reloc_type == 0x33; /* R_V810_WORD. */
11515 case EM_VAX:
11516 return reloc_type == 1; /* R_VAX_32. */
11517 case EM_VISIUM:
11518 return reloc_type == 3; /* R_VISIUM_32. */
11519 case EM_X86_64:
11520 case EM_L1OM:
11521 case EM_K1OM:
11522 return reloc_type == 10; /* R_X86_64_32. */
11523 case EM_XC16X:
11524 case EM_C166:
11525 return reloc_type == 3; /* R_XC16C_ABS_32. */
11526 case EM_XGATE:
11527 return reloc_type == 4; /* R_XGATE_32. */
11528 case EM_XSTORMY16:
11529 return reloc_type == 1; /* R_XSTROMY16_32. */
11530 case EM_XTENSA_OLD:
11531 case EM_XTENSA:
11532 return reloc_type == 1; /* R_XTENSA_32. */
11533 default:
11534 {
11535 static unsigned int prev_warn = 0;
11536
11537 /* Avoid repeating the same warning multiple times. */
11538 if (prev_warn != elf_header.e_machine)
11539 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11540 elf_header.e_machine);
11541 prev_warn = elf_header.e_machine;
11542 return FALSE;
11543 }
11544 }
11545 }
11546
11547 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11548 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11549
11550 static bfd_boolean
11551 is_32bit_pcrel_reloc (unsigned int reloc_type)
11552 {
11553 switch (elf_header.e_machine)
11554 {
11555 case EM_386:
11556 case EM_IAMCU:
11557 return reloc_type == 2; /* R_386_PC32. */
11558 case EM_68K:
11559 return reloc_type == 4; /* R_68K_PC32. */
11560 case EM_AARCH64:
11561 return reloc_type == 261; /* R_AARCH64_PREL32 */
11562 case EM_ADAPTEVA_EPIPHANY:
11563 return reloc_type == 6;
11564 case EM_ALPHA:
11565 return reloc_type == 10; /* R_ALPHA_SREL32. */
11566 case EM_ARC_COMPACT:
11567 case EM_ARC_COMPACT2:
11568 return reloc_type == 49; /* R_ARC_32_PCREL. */
11569 case EM_ARM:
11570 return reloc_type == 3; /* R_ARM_REL32 */
11571 case EM_MICROBLAZE:
11572 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11573 case EM_OR1K:
11574 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11575 case EM_PARISC:
11576 return reloc_type == 9; /* R_PARISC_PCREL32. */
11577 case EM_PPC:
11578 return reloc_type == 26; /* R_PPC_REL32. */
11579 case EM_PPC64:
11580 return reloc_type == 26; /* R_PPC64_REL32. */
11581 case EM_S390_OLD:
11582 case EM_S390:
11583 return reloc_type == 5; /* R_390_PC32. */
11584 case EM_SH:
11585 return reloc_type == 2; /* R_SH_REL32. */
11586 case EM_SPARC32PLUS:
11587 case EM_SPARCV9:
11588 case EM_SPARC:
11589 return reloc_type == 6; /* R_SPARC_DISP32. */
11590 case EM_SPU:
11591 return reloc_type == 13; /* R_SPU_REL32. */
11592 case EM_TILEGX:
11593 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11594 case EM_TILEPRO:
11595 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11596 case EM_VISIUM:
11597 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11598 case EM_X86_64:
11599 case EM_L1OM:
11600 case EM_K1OM:
11601 return reloc_type == 2; /* R_X86_64_PC32. */
11602 case EM_XTENSA_OLD:
11603 case EM_XTENSA:
11604 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11605 default:
11606 /* Do not abort or issue an error message here. Not all targets use
11607 pc-relative 32-bit relocs in their DWARF debug information and we
11608 have already tested for target coverage in is_32bit_abs_reloc. A
11609 more helpful warning message will be generated by apply_relocations
11610 anyway, so just return. */
11611 return FALSE;
11612 }
11613 }
11614
11615 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11616 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11617
11618 static bfd_boolean
11619 is_64bit_abs_reloc (unsigned int reloc_type)
11620 {
11621 switch (elf_header.e_machine)
11622 {
11623 case EM_AARCH64:
11624 return reloc_type == 257; /* R_AARCH64_ABS64. */
11625 case EM_ALPHA:
11626 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11627 case EM_IA_64:
11628 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11629 case EM_PARISC:
11630 return reloc_type == 80; /* R_PARISC_DIR64. */
11631 case EM_PPC64:
11632 return reloc_type == 38; /* R_PPC64_ADDR64. */
11633 case EM_SPARC32PLUS:
11634 case EM_SPARCV9:
11635 case EM_SPARC:
11636 return reloc_type == 54; /* R_SPARC_UA64. */
11637 case EM_X86_64:
11638 case EM_L1OM:
11639 case EM_K1OM:
11640 return reloc_type == 1; /* R_X86_64_64. */
11641 case EM_S390_OLD:
11642 case EM_S390:
11643 return reloc_type == 22; /* R_S390_64. */
11644 case EM_TILEGX:
11645 return reloc_type == 1; /* R_TILEGX_64. */
11646 case EM_MIPS:
11647 return reloc_type == 18; /* R_MIPS_64. */
11648 default:
11649 return FALSE;
11650 }
11651 }
11652
11653 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11654 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11655
11656 static bfd_boolean
11657 is_64bit_pcrel_reloc (unsigned int reloc_type)
11658 {
11659 switch (elf_header.e_machine)
11660 {
11661 case EM_AARCH64:
11662 return reloc_type == 260; /* R_AARCH64_PREL64. */
11663 case EM_ALPHA:
11664 return reloc_type == 11; /* R_ALPHA_SREL64. */
11665 case EM_IA_64:
11666 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11667 case EM_PARISC:
11668 return reloc_type == 72; /* R_PARISC_PCREL64. */
11669 case EM_PPC64:
11670 return reloc_type == 44; /* R_PPC64_REL64. */
11671 case EM_SPARC32PLUS:
11672 case EM_SPARCV9:
11673 case EM_SPARC:
11674 return reloc_type == 46; /* R_SPARC_DISP64. */
11675 case EM_X86_64:
11676 case EM_L1OM:
11677 case EM_K1OM:
11678 return reloc_type == 24; /* R_X86_64_PC64. */
11679 case EM_S390_OLD:
11680 case EM_S390:
11681 return reloc_type == 23; /* R_S390_PC64. */
11682 case EM_TILEGX:
11683 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11684 default:
11685 return FALSE;
11686 }
11687 }
11688
11689 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11690 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11691
11692 static bfd_boolean
11693 is_24bit_abs_reloc (unsigned int reloc_type)
11694 {
11695 switch (elf_header.e_machine)
11696 {
11697 case EM_CYGNUS_MN10200:
11698 case EM_MN10200:
11699 return reloc_type == 4; /* R_MN10200_24. */
11700 default:
11701 return FALSE;
11702 }
11703 }
11704
11705 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11706 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11707
11708 static bfd_boolean
11709 is_16bit_abs_reloc (unsigned int reloc_type)
11710 {
11711 switch (elf_header.e_machine)
11712 {
11713 case EM_ARC:
11714 case EM_ARC_COMPACT:
11715 case EM_ARC_COMPACT2:
11716 return reloc_type == 2; /* R_ARC_16. */
11717 case EM_AVR_OLD:
11718 case EM_AVR:
11719 return reloc_type == 4; /* R_AVR_16. */
11720 case EM_ADAPTEVA_EPIPHANY:
11721 return reloc_type == 5;
11722 case EM_CYGNUS_D10V:
11723 case EM_D10V:
11724 return reloc_type == 3; /* R_D10V_16. */
11725 case EM_H8S:
11726 case EM_H8_300:
11727 case EM_H8_300H:
11728 return reloc_type == R_H8_DIR16;
11729 case EM_IP2K_OLD:
11730 case EM_IP2K:
11731 return reloc_type == 1; /* R_IP2K_16. */
11732 case EM_M32C_OLD:
11733 case EM_M32C:
11734 return reloc_type == 1; /* R_M32C_16 */
11735 case EM_MSP430:
11736 if (uses_msp430x_relocs ())
11737 return reloc_type == 2; /* R_MSP430_ABS16. */
11738 case EM_MSP430_OLD:
11739 return reloc_type == 5; /* R_MSP430_16_BYTE. */
11740 case EM_NDS32:
11741 return reloc_type == 19; /* R_NDS32_RELA. */
11742 case EM_ALTERA_NIOS2:
11743 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
11744 case EM_NIOS32:
11745 return reloc_type == 9; /* R_NIOS_16. */
11746 case EM_OR1K:
11747 return reloc_type == 2; /* R_OR1K_16. */
11748 case EM_TI_C6000:
11749 return reloc_type == 2; /* R_C6000_ABS16. */
11750 case EM_XC16X:
11751 case EM_C166:
11752 return reloc_type == 2; /* R_XC16C_ABS_16. */
11753 case EM_CYGNUS_MN10200:
11754 case EM_MN10200:
11755 return reloc_type == 2; /* R_MN10200_16. */
11756 case EM_CYGNUS_MN10300:
11757 case EM_MN10300:
11758 return reloc_type == 2; /* R_MN10300_16. */
11759 case EM_VISIUM:
11760 return reloc_type == 2; /* R_VISIUM_16. */
11761 case EM_XGATE:
11762 return reloc_type == 3; /* R_XGATE_16. */
11763 default:
11764 return FALSE;
11765 }
11766 }
11767
11768 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11769 relocation entries (possibly formerly used for SHT_GROUP sections). */
11770
11771 static bfd_boolean
11772 is_none_reloc (unsigned int reloc_type)
11773 {
11774 switch (elf_header.e_machine)
11775 {
11776 case EM_68K: /* R_68K_NONE. */
11777 case EM_386: /* R_386_NONE. */
11778 case EM_SPARC32PLUS:
11779 case EM_SPARCV9:
11780 case EM_SPARC: /* R_SPARC_NONE. */
11781 case EM_MIPS: /* R_MIPS_NONE. */
11782 case EM_PARISC: /* R_PARISC_NONE. */
11783 case EM_ALPHA: /* R_ALPHA_NONE. */
11784 case EM_ADAPTEVA_EPIPHANY:
11785 case EM_PPC: /* R_PPC_NONE. */
11786 case EM_PPC64: /* R_PPC64_NONE. */
11787 case EM_ARC: /* R_ARC_NONE. */
11788 case EM_ARC_COMPACT: /* R_ARC_NONE. */
11789 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
11790 case EM_ARM: /* R_ARM_NONE. */
11791 case EM_IA_64: /* R_IA64_NONE. */
11792 case EM_SH: /* R_SH_NONE. */
11793 case EM_S390_OLD:
11794 case EM_S390: /* R_390_NONE. */
11795 case EM_CRIS: /* R_CRIS_NONE. */
11796 case EM_X86_64: /* R_X86_64_NONE. */
11797 case EM_L1OM: /* R_X86_64_NONE. */
11798 case EM_K1OM: /* R_X86_64_NONE. */
11799 case EM_MN10300: /* R_MN10300_NONE. */
11800 case EM_FT32: /* R_FT32_NONE. */
11801 case EM_MOXIE: /* R_MOXIE_NONE. */
11802 case EM_M32R: /* R_M32R_NONE. */
11803 case EM_TI_C6000:/* R_C6000_NONE. */
11804 case EM_TILEGX: /* R_TILEGX_NONE. */
11805 case EM_TILEPRO: /* R_TILEPRO_NONE. */
11806 case EM_XC16X:
11807 case EM_C166: /* R_XC16X_NONE. */
11808 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11809 case EM_NIOS32: /* R_NIOS_NONE. */
11810 case EM_OR1K: /* R_OR1K_NONE. */
11811 return reloc_type == 0;
11812 case EM_AARCH64:
11813 return reloc_type == 0 || reloc_type == 256;
11814 case EM_NDS32:
11815 return (reloc_type == 0 /* R_XTENSA_NONE. */
11816 || reloc_type == 204 /* R_NDS32_DIFF8. */
11817 || reloc_type == 205 /* R_NDS32_DIFF16. */
11818 || reloc_type == 206 /* R_NDS32_DIFF32. */
11819 || reloc_type == 207 /* R_NDS32_ULEB128. */);
11820 case EM_XTENSA_OLD:
11821 case EM_XTENSA:
11822 return (reloc_type == 0 /* R_XTENSA_NONE. */
11823 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11824 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11825 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
11826 case EM_METAG:
11827 return reloc_type == 3; /* R_METAG_NONE. */
11828 }
11829 return FALSE;
11830 }
11831
11832 /* Returns TRUE if there is a relocation against
11833 section NAME at OFFSET bytes. */
11834
11835 bfd_boolean
11836 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11837 {
11838 Elf_Internal_Rela * relocs;
11839 Elf_Internal_Rela * rp;
11840
11841 if (dsec == NULL || dsec->reloc_info == NULL)
11842 return FALSE;
11843
11844 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11845
11846 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11847 if (rp->r_offset == offset)
11848 return TRUE;
11849
11850 return FALSE;
11851 }
11852
11853 /* Apply relocations to a section.
11854 Note: So far support has been added only for those relocations
11855 which can be found in debug sections.
11856 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11857 loaded relocs. It is then the caller's responsibility to free them.
11858 FIXME: Add support for more relocations ? */
11859
11860 static void
11861 apply_relocations (void * file,
11862 const Elf_Internal_Shdr * section,
11863 unsigned char * start,
11864 bfd_size_type size,
11865 void ** relocs_return,
11866 unsigned long * num_relocs_return)
11867 {
11868 Elf_Internal_Shdr * relsec;
11869 unsigned char * end = start + size;
11870
11871 if (relocs_return != NULL)
11872 {
11873 * (Elf_Internal_Rela **) relocs_return = NULL;
11874 * num_relocs_return = 0;
11875 }
11876
11877 if (elf_header.e_type != ET_REL)
11878 return;
11879
11880 /* Find the reloc section associated with the section. */
11881 for (relsec = section_headers;
11882 relsec < section_headers + elf_header.e_shnum;
11883 ++relsec)
11884 {
11885 bfd_boolean is_rela;
11886 unsigned long num_relocs;
11887 Elf_Internal_Rela * relocs;
11888 Elf_Internal_Rela * rp;
11889 Elf_Internal_Shdr * symsec;
11890 Elf_Internal_Sym * symtab;
11891 unsigned long num_syms;
11892 Elf_Internal_Sym * sym;
11893
11894 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11895 || relsec->sh_info >= elf_header.e_shnum
11896 || section_headers + relsec->sh_info != section
11897 || relsec->sh_size == 0
11898 || relsec->sh_link >= elf_header.e_shnum)
11899 continue;
11900
11901 is_rela = relsec->sh_type == SHT_RELA;
11902
11903 if (is_rela)
11904 {
11905 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11906 relsec->sh_size, & relocs, & num_relocs))
11907 return;
11908 }
11909 else
11910 {
11911 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11912 relsec->sh_size, & relocs, & num_relocs))
11913 return;
11914 }
11915
11916 /* SH uses RELA but uses in place value instead of the addend field. */
11917 if (elf_header.e_machine == EM_SH)
11918 is_rela = FALSE;
11919
11920 symsec = section_headers + relsec->sh_link;
11921 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11922
11923 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11924 {
11925 bfd_vma addend;
11926 unsigned int reloc_type;
11927 unsigned int reloc_size;
11928 unsigned char * rloc;
11929 unsigned long sym_index;
11930
11931 reloc_type = get_reloc_type (rp->r_info);
11932
11933 if (target_specific_reloc_handling (rp, start, symtab))
11934 continue;
11935 else if (is_none_reloc (reloc_type))
11936 continue;
11937 else if (is_32bit_abs_reloc (reloc_type)
11938 || is_32bit_pcrel_reloc (reloc_type))
11939 reloc_size = 4;
11940 else if (is_64bit_abs_reloc (reloc_type)
11941 || is_64bit_pcrel_reloc (reloc_type))
11942 reloc_size = 8;
11943 else if (is_24bit_abs_reloc (reloc_type))
11944 reloc_size = 3;
11945 else if (is_16bit_abs_reloc (reloc_type))
11946 reloc_size = 2;
11947 else
11948 {
11949 static unsigned int prev_reloc = 0;
11950 if (reloc_type != prev_reloc)
11951 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11952 reloc_type, printable_section_name (section));
11953 prev_reloc = reloc_type;
11954 continue;
11955 }
11956
11957 rloc = start + rp->r_offset;
11958 if ((rloc + reloc_size) > end || (rloc < start))
11959 {
11960 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11961 (unsigned long) rp->r_offset,
11962 printable_section_name (section));
11963 continue;
11964 }
11965
11966 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11967 if (sym_index >= num_syms)
11968 {
11969 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11970 sym_index, printable_section_name (section));
11971 continue;
11972 }
11973 sym = symtab + sym_index;
11974
11975 /* If the reloc has a symbol associated with it,
11976 make sure that it is of an appropriate type.
11977
11978 Relocations against symbols without type can happen.
11979 Gcc -feliminate-dwarf2-dups may generate symbols
11980 without type for debug info.
11981
11982 Icc generates relocations against function symbols
11983 instead of local labels.
11984
11985 Relocations against object symbols can happen, eg when
11986 referencing a global array. For an example of this see
11987 the _clz.o binary in libgcc.a. */
11988 if (sym != symtab
11989 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
11990 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11991 {
11992 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11993 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11994 (long int)(rp - relocs),
11995 printable_section_name (relsec));
11996 continue;
11997 }
11998
11999 addend = 0;
12000 if (is_rela)
12001 addend += rp->r_addend;
12002 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12003 partial_inplace. */
12004 if (!is_rela
12005 || (elf_header.e_machine == EM_XTENSA
12006 && reloc_type == 1)
12007 || ((elf_header.e_machine == EM_PJ
12008 || elf_header.e_machine == EM_PJ_OLD)
12009 && reloc_type == 1)
12010 || ((elf_header.e_machine == EM_D30V
12011 || elf_header.e_machine == EM_CYGNUS_D30V)
12012 && reloc_type == 12))
12013 addend += byte_get (rloc, reloc_size);
12014
12015 if (is_32bit_pcrel_reloc (reloc_type)
12016 || is_64bit_pcrel_reloc (reloc_type))
12017 {
12018 /* On HPPA, all pc-relative relocations are biased by 8. */
12019 if (elf_header.e_machine == EM_PARISC)
12020 addend -= 8;
12021 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12022 reloc_size);
12023 }
12024 else
12025 byte_put (rloc, addend + sym->st_value, reloc_size);
12026 }
12027
12028 free (symtab);
12029
12030 if (relocs_return)
12031 {
12032 * (Elf_Internal_Rela **) relocs_return = relocs;
12033 * num_relocs_return = num_relocs;
12034 }
12035 else
12036 free (relocs);
12037
12038 break;
12039 }
12040 }
12041
12042 #ifdef SUPPORT_DISASSEMBLY
12043 static int
12044 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12045 {
12046 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12047
12048 /* FIXME: XXX -- to be done --- XXX */
12049
12050 return 1;
12051 }
12052 #endif
12053
12054 /* Reads in the contents of SECTION from FILE, returning a pointer
12055 to a malloc'ed buffer or NULL if something went wrong. */
12056
12057 static char *
12058 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12059 {
12060 bfd_size_type num_bytes;
12061
12062 num_bytes = section->sh_size;
12063
12064 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12065 {
12066 printf (_("\nSection '%s' has no data to dump.\n"),
12067 printable_section_name (section));
12068 return NULL;
12069 }
12070
12071 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12072 _("section contents"));
12073 }
12074
12075 /* Uncompresses a section that was compressed using zlib, in place. */
12076
12077 static bfd_boolean
12078 uncompress_section_contents (unsigned char **buffer,
12079 dwarf_size_type uncompressed_size,
12080 dwarf_size_type *size)
12081 {
12082 dwarf_size_type compressed_size = *size;
12083 unsigned char * compressed_buffer = *buffer;
12084 unsigned char * uncompressed_buffer;
12085 z_stream strm;
12086 int rc;
12087
12088 /* It is possible the section consists of several compressed
12089 buffers concatenated together, so we uncompress in a loop. */
12090 /* PR 18313: The state field in the z_stream structure is supposed
12091 to be invisible to the user (ie us), but some compilers will
12092 still complain about it being used without initialisation. So
12093 we first zero the entire z_stream structure and then set the fields
12094 that we need. */
12095 memset (& strm, 0, sizeof strm);
12096 strm.avail_in = compressed_size;
12097 strm.next_in = (Bytef *) compressed_buffer;
12098 strm.avail_out = uncompressed_size;
12099 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12100
12101 rc = inflateInit (& strm);
12102 while (strm.avail_in > 0)
12103 {
12104 if (rc != Z_OK)
12105 goto fail;
12106 strm.next_out = ((Bytef *) uncompressed_buffer
12107 + (uncompressed_size - strm.avail_out));
12108 rc = inflate (&strm, Z_FINISH);
12109 if (rc != Z_STREAM_END)
12110 goto fail;
12111 rc = inflateReset (& strm);
12112 }
12113 rc = inflateEnd (& strm);
12114 if (rc != Z_OK
12115 || strm.avail_out != 0)
12116 goto fail;
12117
12118 *buffer = uncompressed_buffer;
12119 *size = uncompressed_size;
12120 return TRUE;
12121
12122 fail:
12123 free (uncompressed_buffer);
12124 /* Indicate decompression failure. */
12125 *buffer = NULL;
12126 return FALSE;
12127 }
12128
12129 static void
12130 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12131 {
12132 Elf_Internal_Shdr * relsec;
12133 bfd_size_type num_bytes;
12134 unsigned char * data;
12135 unsigned char * end;
12136 unsigned char * real_start;
12137 unsigned char * start;
12138 bfd_boolean some_strings_shown;
12139
12140 real_start = start = (unsigned char *) get_section_contents (section,
12141 file);
12142 if (start == NULL)
12143 return;
12144 num_bytes = section->sh_size;
12145
12146 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12147
12148 if (decompress_dumps)
12149 {
12150 dwarf_size_type new_size = num_bytes;
12151 dwarf_size_type uncompressed_size = 0;
12152
12153 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12154 {
12155 Elf_Internal_Chdr chdr;
12156 unsigned int compression_header_size
12157 = get_compression_header (& chdr, (unsigned char *) start);
12158
12159 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12160 {
12161 warn (_("section '%s' has unsupported compress type: %d\n"),
12162 printable_section_name (section), chdr.ch_type);
12163 return;
12164 }
12165 else if (chdr.ch_addralign != section->sh_addralign)
12166 {
12167 warn (_("compressed section '%s' is corrupted\n"),
12168 printable_section_name (section));
12169 return;
12170 }
12171 uncompressed_size = chdr.ch_size;
12172 start += compression_header_size;
12173 new_size -= compression_header_size;
12174 }
12175 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12176 {
12177 /* Read the zlib header. In this case, it should be "ZLIB"
12178 followed by the uncompressed section size, 8 bytes in
12179 big-endian order. */
12180 uncompressed_size = start[4]; uncompressed_size <<= 8;
12181 uncompressed_size += start[5]; uncompressed_size <<= 8;
12182 uncompressed_size += start[6]; uncompressed_size <<= 8;
12183 uncompressed_size += start[7]; uncompressed_size <<= 8;
12184 uncompressed_size += start[8]; uncompressed_size <<= 8;
12185 uncompressed_size += start[9]; uncompressed_size <<= 8;
12186 uncompressed_size += start[10]; uncompressed_size <<= 8;
12187 uncompressed_size += start[11];
12188 start += 12;
12189 new_size -= 12;
12190 }
12191
12192 if (uncompressed_size
12193 && uncompress_section_contents (& start,
12194 uncompressed_size, & new_size))
12195 num_bytes = new_size;
12196 }
12197
12198 /* If the section being dumped has relocations against it the user might
12199 be expecting these relocations to have been applied. Check for this
12200 case and issue a warning message in order to avoid confusion.
12201 FIXME: Maybe we ought to have an option that dumps a section with
12202 relocs applied ? */
12203 for (relsec = section_headers;
12204 relsec < section_headers + elf_header.e_shnum;
12205 ++relsec)
12206 {
12207 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12208 || relsec->sh_info >= elf_header.e_shnum
12209 || section_headers + relsec->sh_info != section
12210 || relsec->sh_size == 0
12211 || relsec->sh_link >= elf_header.e_shnum)
12212 continue;
12213
12214 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12215 break;
12216 }
12217
12218 data = start;
12219 end = start + num_bytes;
12220 some_strings_shown = FALSE;
12221
12222 while (data < end)
12223 {
12224 while (!ISPRINT (* data))
12225 if (++ data >= end)
12226 break;
12227
12228 if (data < end)
12229 {
12230 size_t maxlen = end - data;
12231
12232 #ifndef __MSVCRT__
12233 /* PR 11128: Use two separate invocations in order to work
12234 around bugs in the Solaris 8 implementation of printf. */
12235 printf (" [%6tx] ", data - start);
12236 #else
12237 printf (" [%6Ix] ", (size_t) (data - start));
12238 #endif
12239 if (maxlen > 0)
12240 {
12241 print_symbol ((int) maxlen, (const char *) data);
12242 putchar ('\n');
12243 data += strnlen ((const char *) data, maxlen);
12244 }
12245 else
12246 {
12247 printf (_("<corrupt>\n"));
12248 data = end;
12249 }
12250 some_strings_shown = TRUE;
12251 }
12252 }
12253
12254 if (! some_strings_shown)
12255 printf (_(" No strings found in this section."));
12256
12257 free (real_start);
12258
12259 putchar ('\n');
12260 }
12261
12262 static void
12263 dump_section_as_bytes (Elf_Internal_Shdr * section,
12264 FILE * file,
12265 bfd_boolean relocate)
12266 {
12267 Elf_Internal_Shdr * relsec;
12268 bfd_size_type bytes;
12269 bfd_size_type section_size;
12270 bfd_vma addr;
12271 unsigned char * data;
12272 unsigned char * real_start;
12273 unsigned char * start;
12274
12275 real_start = start = (unsigned char *) get_section_contents (section, file);
12276 if (start == NULL)
12277 return;
12278 section_size = section->sh_size;
12279
12280 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12281
12282 if (decompress_dumps)
12283 {
12284 dwarf_size_type new_size = section_size;
12285 dwarf_size_type uncompressed_size = 0;
12286
12287 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12288 {
12289 Elf_Internal_Chdr chdr;
12290 unsigned int compression_header_size
12291 = get_compression_header (& chdr, start);
12292
12293 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12294 {
12295 warn (_("section '%s' has unsupported compress type: %d\n"),
12296 printable_section_name (section), chdr.ch_type);
12297 return;
12298 }
12299 else if (chdr.ch_addralign != section->sh_addralign)
12300 {
12301 warn (_("compressed section '%s' is corrupted\n"),
12302 printable_section_name (section));
12303 return;
12304 }
12305 uncompressed_size = chdr.ch_size;
12306 start += compression_header_size;
12307 new_size -= compression_header_size;
12308 }
12309 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12310 {
12311 /* Read the zlib header. In this case, it should be "ZLIB"
12312 followed by the uncompressed section size, 8 bytes in
12313 big-endian order. */
12314 uncompressed_size = start[4]; uncompressed_size <<= 8;
12315 uncompressed_size += start[5]; uncompressed_size <<= 8;
12316 uncompressed_size += start[6]; uncompressed_size <<= 8;
12317 uncompressed_size += start[7]; uncompressed_size <<= 8;
12318 uncompressed_size += start[8]; uncompressed_size <<= 8;
12319 uncompressed_size += start[9]; uncompressed_size <<= 8;
12320 uncompressed_size += start[10]; uncompressed_size <<= 8;
12321 uncompressed_size += start[11];
12322 start += 12;
12323 new_size -= 12;
12324 }
12325
12326 if (uncompressed_size
12327 && uncompress_section_contents (& start, uncompressed_size,
12328 & new_size))
12329 section_size = new_size;
12330 }
12331
12332 if (relocate)
12333 {
12334 apply_relocations (file, section, start, section_size, NULL, NULL);
12335 }
12336 else
12337 {
12338 /* If the section being dumped has relocations against it the user might
12339 be expecting these relocations to have been applied. Check for this
12340 case and issue a warning message in order to avoid confusion.
12341 FIXME: Maybe we ought to have an option that dumps a section with
12342 relocs applied ? */
12343 for (relsec = section_headers;
12344 relsec < section_headers + elf_header.e_shnum;
12345 ++relsec)
12346 {
12347 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12348 || relsec->sh_info >= elf_header.e_shnum
12349 || section_headers + relsec->sh_info != section
12350 || relsec->sh_size == 0
12351 || relsec->sh_link >= elf_header.e_shnum)
12352 continue;
12353
12354 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12355 break;
12356 }
12357 }
12358
12359 addr = section->sh_addr;
12360 bytes = section_size;
12361 data = start;
12362
12363 while (bytes)
12364 {
12365 int j;
12366 int k;
12367 int lbytes;
12368
12369 lbytes = (bytes > 16 ? 16 : bytes);
12370
12371 printf (" 0x%8.8lx ", (unsigned long) addr);
12372
12373 for (j = 0; j < 16; j++)
12374 {
12375 if (j < lbytes)
12376 printf ("%2.2x", data[j]);
12377 else
12378 printf (" ");
12379
12380 if ((j & 3) == 3)
12381 printf (" ");
12382 }
12383
12384 for (j = 0; j < lbytes; j++)
12385 {
12386 k = data[j];
12387 if (k >= ' ' && k < 0x7f)
12388 printf ("%c", k);
12389 else
12390 printf (".");
12391 }
12392
12393 putchar ('\n');
12394
12395 data += lbytes;
12396 addr += lbytes;
12397 bytes -= lbytes;
12398 }
12399
12400 free (real_start);
12401
12402 putchar ('\n');
12403 }
12404
12405 static int
12406 load_specific_debug_section (enum dwarf_section_display_enum debug,
12407 const Elf_Internal_Shdr * sec, void * file)
12408 {
12409 struct dwarf_section * section = &debug_displays [debug].section;
12410 char buf [64];
12411
12412 /* If it is already loaded, do nothing. */
12413 if (section->start != NULL)
12414 return 1;
12415
12416 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12417 section->address = sec->sh_addr;
12418 section->user_data = NULL;
12419 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12420 sec->sh_offset, 1,
12421 sec->sh_size, buf);
12422 if (section->start == NULL)
12423 section->size = 0;
12424 else
12425 {
12426 unsigned char *start = section->start;
12427 dwarf_size_type size = sec->sh_size;
12428 dwarf_size_type uncompressed_size = 0;
12429
12430 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12431 {
12432 Elf_Internal_Chdr chdr;
12433 unsigned int compression_header_size
12434 = get_compression_header (&chdr, start);
12435 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12436 {
12437 warn (_("section '%s' has unsupported compress type: %d\n"),
12438 section->name, chdr.ch_type);
12439 return 0;
12440 }
12441 else if (chdr.ch_addralign != sec->sh_addralign)
12442 {
12443 warn (_("compressed section '%s' is corrupted\n"),
12444 section->name);
12445 return 0;
12446 }
12447 uncompressed_size = chdr.ch_size;
12448 start += compression_header_size;
12449 size -= compression_header_size;
12450 }
12451 else if (size > 12 && streq ((char *) start, "ZLIB"))
12452 {
12453 /* Read the zlib header. In this case, it should be "ZLIB"
12454 followed by the uncompressed section size, 8 bytes in
12455 big-endian order. */
12456 uncompressed_size = start[4]; uncompressed_size <<= 8;
12457 uncompressed_size += start[5]; uncompressed_size <<= 8;
12458 uncompressed_size += start[6]; uncompressed_size <<= 8;
12459 uncompressed_size += start[7]; uncompressed_size <<= 8;
12460 uncompressed_size += start[8]; uncompressed_size <<= 8;
12461 uncompressed_size += start[9]; uncompressed_size <<= 8;
12462 uncompressed_size += start[10]; uncompressed_size <<= 8;
12463 uncompressed_size += start[11];
12464 start += 12;
12465 size -= 12;
12466 }
12467
12468 if (uncompressed_size
12469 && uncompress_section_contents (&start, uncompressed_size,
12470 &size))
12471 {
12472 /* Free the compressed buffer, update the section buffer
12473 and the section size if uncompress is successful. */
12474 free (section->start);
12475 section->start = start;
12476 }
12477 section->size = size;
12478 }
12479
12480 if (section->start == NULL)
12481 return 0;
12482
12483 if (debug_displays [debug].relocate)
12484 apply_relocations ((FILE *) file, sec, section->start, section->size,
12485 & section->reloc_info, & section->num_relocs);
12486 else
12487 {
12488 section->reloc_info = NULL;
12489 section->num_relocs = 0;
12490 }
12491
12492 return 1;
12493 }
12494
12495 /* If this is not NULL, load_debug_section will only look for sections
12496 within the list of sections given here. */
12497 unsigned int *section_subset = NULL;
12498
12499 int
12500 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12501 {
12502 struct dwarf_section * section = &debug_displays [debug].section;
12503 Elf_Internal_Shdr * sec;
12504
12505 /* Locate the debug section. */
12506 sec = find_section_in_set (section->uncompressed_name, section_subset);
12507 if (sec != NULL)
12508 section->name = section->uncompressed_name;
12509 else
12510 {
12511 sec = find_section_in_set (section->compressed_name, section_subset);
12512 if (sec != NULL)
12513 section->name = section->compressed_name;
12514 }
12515 if (sec == NULL)
12516 return 0;
12517
12518 /* If we're loading from a subset of sections, and we've loaded
12519 a section matching this name before, it's likely that it's a
12520 different one. */
12521 if (section_subset != NULL)
12522 free_debug_section (debug);
12523
12524 return load_specific_debug_section (debug, sec, (FILE *) file);
12525 }
12526
12527 void
12528 free_debug_section (enum dwarf_section_display_enum debug)
12529 {
12530 struct dwarf_section * section = &debug_displays [debug].section;
12531
12532 if (section->start == NULL)
12533 return;
12534
12535 free ((char *) section->start);
12536 section->start = NULL;
12537 section->address = 0;
12538 section->size = 0;
12539 }
12540
12541 static int
12542 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12543 {
12544 char * name = SECTION_NAME (section);
12545 const char * print_name = printable_section_name (section);
12546 bfd_size_type length;
12547 int result = 1;
12548 int i;
12549
12550 length = section->sh_size;
12551 if (length == 0)
12552 {
12553 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12554 return 0;
12555 }
12556 if (section->sh_type == SHT_NOBITS)
12557 {
12558 /* There is no point in dumping the contents of a debugging section
12559 which has the NOBITS type - the bits in the file will be random.
12560 This can happen when a file containing a .eh_frame section is
12561 stripped with the --only-keep-debug command line option. */
12562 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12563 print_name);
12564 return 0;
12565 }
12566
12567 if (const_strneq (name, ".gnu.linkonce.wi."))
12568 name = ".debug_info";
12569
12570 /* See if we know how to display the contents of this section. */
12571 for (i = 0; i < max; i++)
12572 if (streq (debug_displays[i].section.uncompressed_name, name)
12573 || (i == line && const_strneq (name, ".debug_line."))
12574 || streq (debug_displays[i].section.compressed_name, name))
12575 {
12576 struct dwarf_section * sec = &debug_displays [i].section;
12577 int secondary = (section != find_section (name));
12578
12579 if (secondary)
12580 free_debug_section ((enum dwarf_section_display_enum) i);
12581
12582 if (i == line && const_strneq (name, ".debug_line."))
12583 sec->name = name;
12584 else if (streq (sec->uncompressed_name, name))
12585 sec->name = sec->uncompressed_name;
12586 else
12587 sec->name = sec->compressed_name;
12588 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12589 section, file))
12590 {
12591 /* If this debug section is part of a CU/TU set in a .dwp file,
12592 restrict load_debug_section to the sections in that set. */
12593 section_subset = find_cu_tu_set (file, shndx);
12594
12595 result &= debug_displays[i].display (sec, file);
12596
12597 section_subset = NULL;
12598
12599 if (secondary || (i != info && i != abbrev))
12600 free_debug_section ((enum dwarf_section_display_enum) i);
12601 }
12602
12603 break;
12604 }
12605
12606 if (i == max)
12607 {
12608 printf (_("Unrecognized debug section: %s\n"), print_name);
12609 result = 0;
12610 }
12611
12612 return result;
12613 }
12614
12615 /* Set DUMP_SECTS for all sections where dumps were requested
12616 based on section name. */
12617
12618 static void
12619 initialise_dumps_byname (void)
12620 {
12621 struct dump_list_entry * cur;
12622
12623 for (cur = dump_sects_byname; cur; cur = cur->next)
12624 {
12625 unsigned int i;
12626 int any;
12627
12628 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12629 if (streq (SECTION_NAME (section_headers + i), cur->name))
12630 {
12631 request_dump_bynumber (i, cur->type);
12632 any = 1;
12633 }
12634
12635 if (!any)
12636 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12637 cur->name);
12638 }
12639 }
12640
12641 static void
12642 process_section_contents (FILE * file)
12643 {
12644 Elf_Internal_Shdr * section;
12645 unsigned int i;
12646
12647 if (! do_dump)
12648 return;
12649
12650 initialise_dumps_byname ();
12651
12652 for (i = 0, section = section_headers;
12653 i < elf_header.e_shnum && i < num_dump_sects;
12654 i++, section++)
12655 {
12656 #ifdef SUPPORT_DISASSEMBLY
12657 if (dump_sects[i] & DISASS_DUMP)
12658 disassemble_section (section, file);
12659 #endif
12660 if (dump_sects[i] & HEX_DUMP)
12661 dump_section_as_bytes (section, file, FALSE);
12662
12663 if (dump_sects[i] & RELOC_DUMP)
12664 dump_section_as_bytes (section, file, TRUE);
12665
12666 if (dump_sects[i] & STRING_DUMP)
12667 dump_section_as_strings (section, file);
12668
12669 if (dump_sects[i] & DEBUG_DUMP)
12670 display_debug_section (i, section, file);
12671 }
12672
12673 /* Check to see if the user requested a
12674 dump of a section that does not exist. */
12675 while (i++ < num_dump_sects)
12676 if (dump_sects[i])
12677 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12678 }
12679
12680 static void
12681 process_mips_fpe_exception (int mask)
12682 {
12683 if (mask)
12684 {
12685 int first = 1;
12686 if (mask & OEX_FPU_INEX)
12687 fputs ("INEX", stdout), first = 0;
12688 if (mask & OEX_FPU_UFLO)
12689 printf ("%sUFLO", first ? "" : "|"), first = 0;
12690 if (mask & OEX_FPU_OFLO)
12691 printf ("%sOFLO", first ? "" : "|"), first = 0;
12692 if (mask & OEX_FPU_DIV0)
12693 printf ("%sDIV0", first ? "" : "|"), first = 0;
12694 if (mask & OEX_FPU_INVAL)
12695 printf ("%sINVAL", first ? "" : "|");
12696 }
12697 else
12698 fputs ("0", stdout);
12699 }
12700
12701 /* Display's the value of TAG at location P. If TAG is
12702 greater than 0 it is assumed to be an unknown tag, and
12703 a message is printed to this effect. Otherwise it is
12704 assumed that a message has already been printed.
12705
12706 If the bottom bit of TAG is set it assumed to have a
12707 string value, otherwise it is assumed to have an integer
12708 value.
12709
12710 Returns an updated P pointing to the first unread byte
12711 beyond the end of TAG's value.
12712
12713 Reads at or beyond END will not be made. */
12714
12715 static unsigned char *
12716 display_tag_value (int tag,
12717 unsigned char * p,
12718 const unsigned char * const end)
12719 {
12720 unsigned long val;
12721
12722 if (tag > 0)
12723 printf (" Tag_unknown_%d: ", tag);
12724
12725 if (p >= end)
12726 {
12727 warn (_("<corrupt tag>\n"));
12728 }
12729 else if (tag & 1)
12730 {
12731 /* PR 17531 file: 027-19978-0.004. */
12732 size_t maxlen = (end - p) - 1;
12733
12734 putchar ('"');
12735 if (maxlen > 0)
12736 {
12737 print_symbol ((int) maxlen, (const char *) p);
12738 p += strnlen ((char *) p, maxlen) + 1;
12739 }
12740 else
12741 {
12742 printf (_("<corrupt string tag>"));
12743 p = (unsigned char *) end;
12744 }
12745 printf ("\"\n");
12746 }
12747 else
12748 {
12749 unsigned int len;
12750
12751 val = read_uleb128 (p, &len, end);
12752 p += len;
12753 printf ("%ld (0x%lx)\n", val, val);
12754 }
12755
12756 assert (p <= end);
12757 return p;
12758 }
12759
12760 /* ARM EABI attributes section. */
12761 typedef struct
12762 {
12763 unsigned int tag;
12764 const char * name;
12765 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
12766 unsigned int type;
12767 const char ** table;
12768 } arm_attr_public_tag;
12769
12770 static const char * arm_attr_tag_CPU_arch[] =
12771 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12772 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12773 "v8-M.mainline"};
12774 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12775 static const char * arm_attr_tag_THUMB_ISA_use[] =
12776 {"No", "Thumb-1", "Thumb-2", "Yes"};
12777 static const char * arm_attr_tag_FP_arch[] =
12778 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12779 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12780 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12781 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12782 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12783 "NEON for ARMv8.1"};
12784 static const char * arm_attr_tag_PCS_config[] =
12785 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12786 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12787 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12788 {"V6", "SB", "TLS", "Unused"};
12789 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12790 {"Absolute", "PC-relative", "SB-relative", "None"};
12791 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12792 {"Absolute", "PC-relative", "None"};
12793 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12794 {"None", "direct", "GOT-indirect"};
12795 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12796 {"None", "??? 1", "2", "??? 3", "4"};
12797 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12798 static const char * arm_attr_tag_ABI_FP_denormal[] =
12799 {"Unused", "Needed", "Sign only"};
12800 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12801 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12802 static const char * arm_attr_tag_ABI_FP_number_model[] =
12803 {"Unused", "Finite", "RTABI", "IEEE 754"};
12804 static const char * arm_attr_tag_ABI_enum_size[] =
12805 {"Unused", "small", "int", "forced to int"};
12806 static const char * arm_attr_tag_ABI_HardFP_use[] =
12807 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12808 static const char * arm_attr_tag_ABI_VFP_args[] =
12809 {"AAPCS", "VFP registers", "custom", "compatible"};
12810 static const char * arm_attr_tag_ABI_WMMX_args[] =
12811 {"AAPCS", "WMMX registers", "custom"};
12812 static const char * arm_attr_tag_ABI_optimization_goals[] =
12813 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12814 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12815 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12816 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12817 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12818 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12819 static const char * arm_attr_tag_FP_HP_extension[] =
12820 {"Not Allowed", "Allowed"};
12821 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12822 {"None", "IEEE 754", "Alternative Format"};
12823 static const char * arm_attr_tag_MPextension_use[] =
12824 {"Not Allowed", "Allowed"};
12825 static const char * arm_attr_tag_DIV_use[] =
12826 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12827 "Allowed in v7-A with integer division extension"};
12828 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12829 static const char * arm_attr_tag_Virtualization_use[] =
12830 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12831 "TrustZone and Virtualization Extensions"};
12832 static const char * arm_attr_tag_MPextension_use_legacy[] =
12833 {"Not Allowed", "Allowed"};
12834
12835 #define LOOKUP(id, name) \
12836 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12837 static arm_attr_public_tag arm_attr_public_tags[] =
12838 {
12839 {4, "CPU_raw_name", 1, NULL},
12840 {5, "CPU_name", 1, NULL},
12841 LOOKUP(6, CPU_arch),
12842 {7, "CPU_arch_profile", 0, NULL},
12843 LOOKUP(8, ARM_ISA_use),
12844 LOOKUP(9, THUMB_ISA_use),
12845 LOOKUP(10, FP_arch),
12846 LOOKUP(11, WMMX_arch),
12847 LOOKUP(12, Advanced_SIMD_arch),
12848 LOOKUP(13, PCS_config),
12849 LOOKUP(14, ABI_PCS_R9_use),
12850 LOOKUP(15, ABI_PCS_RW_data),
12851 LOOKUP(16, ABI_PCS_RO_data),
12852 LOOKUP(17, ABI_PCS_GOT_use),
12853 LOOKUP(18, ABI_PCS_wchar_t),
12854 LOOKUP(19, ABI_FP_rounding),
12855 LOOKUP(20, ABI_FP_denormal),
12856 LOOKUP(21, ABI_FP_exceptions),
12857 LOOKUP(22, ABI_FP_user_exceptions),
12858 LOOKUP(23, ABI_FP_number_model),
12859 {24, "ABI_align_needed", 0, NULL},
12860 {25, "ABI_align_preserved", 0, NULL},
12861 LOOKUP(26, ABI_enum_size),
12862 LOOKUP(27, ABI_HardFP_use),
12863 LOOKUP(28, ABI_VFP_args),
12864 LOOKUP(29, ABI_WMMX_args),
12865 LOOKUP(30, ABI_optimization_goals),
12866 LOOKUP(31, ABI_FP_optimization_goals),
12867 {32, "compatibility", 0, NULL},
12868 LOOKUP(34, CPU_unaligned_access),
12869 LOOKUP(36, FP_HP_extension),
12870 LOOKUP(38, ABI_FP_16bit_format),
12871 LOOKUP(42, MPextension_use),
12872 LOOKUP(44, DIV_use),
12873 {64, "nodefaults", 0, NULL},
12874 {65, "also_compatible_with", 0, NULL},
12875 LOOKUP(66, T2EE_use),
12876 {67, "conformance", 1, NULL},
12877 LOOKUP(68, Virtualization_use),
12878 LOOKUP(70, MPextension_use_legacy)
12879 };
12880 #undef LOOKUP
12881
12882 static unsigned char *
12883 display_arm_attribute (unsigned char * p,
12884 const unsigned char * const end)
12885 {
12886 unsigned int tag;
12887 unsigned int len;
12888 unsigned int val;
12889 arm_attr_public_tag * attr;
12890 unsigned i;
12891 unsigned int type;
12892
12893 tag = read_uleb128 (p, &len, end);
12894 p += len;
12895 attr = NULL;
12896 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12897 {
12898 if (arm_attr_public_tags[i].tag == tag)
12899 {
12900 attr = &arm_attr_public_tags[i];
12901 break;
12902 }
12903 }
12904
12905 if (attr)
12906 {
12907 printf (" Tag_%s: ", attr->name);
12908 switch (attr->type)
12909 {
12910 case 0:
12911 switch (tag)
12912 {
12913 case 7: /* Tag_CPU_arch_profile. */
12914 val = read_uleb128 (p, &len, end);
12915 p += len;
12916 switch (val)
12917 {
12918 case 0: printf (_("None\n")); break;
12919 case 'A': printf (_("Application\n")); break;
12920 case 'R': printf (_("Realtime\n")); break;
12921 case 'M': printf (_("Microcontroller\n")); break;
12922 case 'S': printf (_("Application or Realtime\n")); break;
12923 default: printf ("??? (%d)\n", val); break;
12924 }
12925 break;
12926
12927 case 24: /* Tag_align_needed. */
12928 val = read_uleb128 (p, &len, end);
12929 p += len;
12930 switch (val)
12931 {
12932 case 0: printf (_("None\n")); break;
12933 case 1: printf (_("8-byte\n")); break;
12934 case 2: printf (_("4-byte\n")); break;
12935 case 3: printf ("??? 3\n"); break;
12936 default:
12937 if (val <= 12)
12938 printf (_("8-byte and up to %d-byte extended\n"),
12939 1 << val);
12940 else
12941 printf ("??? (%d)\n", val);
12942 break;
12943 }
12944 break;
12945
12946 case 25: /* Tag_align_preserved. */
12947 val = read_uleb128 (p, &len, end);
12948 p += len;
12949 switch (val)
12950 {
12951 case 0: printf (_("None\n")); break;
12952 case 1: printf (_("8-byte, except leaf SP\n")); break;
12953 case 2: printf (_("8-byte\n")); break;
12954 case 3: printf ("??? 3\n"); break;
12955 default:
12956 if (val <= 12)
12957 printf (_("8-byte and up to %d-byte extended\n"),
12958 1 << val);
12959 else
12960 printf ("??? (%d)\n", val);
12961 break;
12962 }
12963 break;
12964
12965 case 32: /* Tag_compatibility. */
12966 {
12967 val = read_uleb128 (p, &len, end);
12968 p += len;
12969 printf (_("flag = %d, vendor = "), val);
12970 if (p < end - 1)
12971 {
12972 size_t maxlen = (end - p) - 1;
12973
12974 print_symbol ((int) maxlen, (const char *) p);
12975 p += strnlen ((char *) p, maxlen) + 1;
12976 }
12977 else
12978 {
12979 printf (_("<corrupt>"));
12980 p = (unsigned char *) end;
12981 }
12982 putchar ('\n');
12983 }
12984 break;
12985
12986 case 64: /* Tag_nodefaults. */
12987 /* PR 17531: file: 001-505008-0.01. */
12988 if (p < end)
12989 p++;
12990 printf (_("True\n"));
12991 break;
12992
12993 case 65: /* Tag_also_compatible_with. */
12994 val = read_uleb128 (p, &len, end);
12995 p += len;
12996 if (val == 6 /* Tag_CPU_arch. */)
12997 {
12998 val = read_uleb128 (p, &len, end);
12999 p += len;
13000 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13001 printf ("??? (%d)\n", val);
13002 else
13003 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13004 }
13005 else
13006 printf ("???\n");
13007 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13008 ;
13009 break;
13010
13011 default:
13012 printf (_("<unknown: %d>\n"), tag);
13013 break;
13014 }
13015 return p;
13016
13017 case 1:
13018 return display_tag_value (-1, p, end);
13019 case 2:
13020 return display_tag_value (0, p, end);
13021
13022 default:
13023 assert (attr->type & 0x80);
13024 val = read_uleb128 (p, &len, end);
13025 p += len;
13026 type = attr->type & 0x7f;
13027 if (val >= type)
13028 printf ("??? (%d)\n", val);
13029 else
13030 printf ("%s\n", attr->table[val]);
13031 return p;
13032 }
13033 }
13034
13035 return display_tag_value (tag, p, end);
13036 }
13037
13038 static unsigned char *
13039 display_gnu_attribute (unsigned char * p,
13040 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13041 const unsigned char * const end)
13042 {
13043 int tag;
13044 unsigned int len;
13045 int val;
13046
13047 tag = read_uleb128 (p, &len, end);
13048 p += len;
13049
13050 /* Tag_compatibility is the only generic GNU attribute defined at
13051 present. */
13052 if (tag == 32)
13053 {
13054 val = read_uleb128 (p, &len, end);
13055 p += len;
13056
13057 printf (_("flag = %d, vendor = "), val);
13058 if (p == end)
13059 {
13060 printf (_("<corrupt>\n"));
13061 warn (_("corrupt vendor attribute\n"));
13062 }
13063 else
13064 {
13065 if (p < end - 1)
13066 {
13067 size_t maxlen = (end - p) - 1;
13068
13069 print_symbol ((int) maxlen, (const char *) p);
13070 p += strnlen ((char *) p, maxlen) + 1;
13071 }
13072 else
13073 {
13074 printf (_("<corrupt>"));
13075 p = (unsigned char *) end;
13076 }
13077 putchar ('\n');
13078 }
13079 return p;
13080 }
13081
13082 if ((tag & 2) == 0 && display_proc_gnu_attribute)
13083 return display_proc_gnu_attribute (p, tag, end);
13084
13085 return display_tag_value (tag, p, end);
13086 }
13087
13088 static unsigned char *
13089 display_power_gnu_attribute (unsigned char * p,
13090 int tag,
13091 const unsigned char * const end)
13092 {
13093 unsigned int len;
13094 int val;
13095
13096 if (tag == Tag_GNU_Power_ABI_FP)
13097 {
13098 val = read_uleb128 (p, &len, end);
13099 p += len;
13100 printf (" Tag_GNU_Power_ABI_FP: ");
13101
13102 switch (val)
13103 {
13104 case 0:
13105 printf (_("Hard or soft float\n"));
13106 break;
13107 case 1:
13108 printf (_("Hard float\n"));
13109 break;
13110 case 2:
13111 printf (_("Soft float\n"));
13112 break;
13113 case 3:
13114 printf (_("Single-precision hard float\n"));
13115 break;
13116 default:
13117 printf ("??? (%d)\n", val);
13118 break;
13119 }
13120 return p;
13121 }
13122
13123 if (tag == Tag_GNU_Power_ABI_Vector)
13124 {
13125 val = read_uleb128 (p, &len, end);
13126 p += len;
13127 printf (" Tag_GNU_Power_ABI_Vector: ");
13128 switch (val)
13129 {
13130 case 0:
13131 printf (_("Any\n"));
13132 break;
13133 case 1:
13134 printf (_("Generic\n"));
13135 break;
13136 case 2:
13137 printf ("AltiVec\n");
13138 break;
13139 case 3:
13140 printf ("SPE\n");
13141 break;
13142 default:
13143 printf ("??? (%d)\n", val);
13144 break;
13145 }
13146 return p;
13147 }
13148
13149 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13150 {
13151 if (p == end)
13152 {
13153 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13154 return p;
13155 }
13156
13157 val = read_uleb128 (p, &len, end);
13158 p += len;
13159 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13160 switch (val)
13161 {
13162 case 0:
13163 printf (_("Any\n"));
13164 break;
13165 case 1:
13166 printf ("r3/r4\n");
13167 break;
13168 case 2:
13169 printf (_("Memory\n"));
13170 break;
13171 default:
13172 printf ("??? (%d)\n", val);
13173 break;
13174 }
13175 return p;
13176 }
13177
13178 return display_tag_value (tag & 1, p, end);
13179 }
13180
13181 static unsigned char *
13182 display_s390_gnu_attribute (unsigned char * p,
13183 int tag,
13184 const unsigned char * const end)
13185 {
13186 unsigned int len;
13187 int val;
13188
13189 if (tag == Tag_GNU_S390_ABI_Vector)
13190 {
13191 val = read_uleb128 (p, &len, end);
13192 p += len;
13193 printf (" Tag_GNU_S390_ABI_Vector: ");
13194
13195 switch (val)
13196 {
13197 case 0:
13198 printf (_("any\n"));
13199 break;
13200 case 1:
13201 printf (_("software\n"));
13202 break;
13203 case 2:
13204 printf (_("hardware\n"));
13205 break;
13206 default:
13207 printf ("??? (%d)\n", val);
13208 break;
13209 }
13210 return p;
13211 }
13212
13213 return display_tag_value (tag & 1, p, end);
13214 }
13215
13216 static void
13217 display_sparc_hwcaps (int mask)
13218 {
13219 if (mask)
13220 {
13221 int first = 1;
13222
13223 if (mask & ELF_SPARC_HWCAP_MUL32)
13224 fputs ("mul32", stdout), first = 0;
13225 if (mask & ELF_SPARC_HWCAP_DIV32)
13226 printf ("%sdiv32", first ? "" : "|"), first = 0;
13227 if (mask & ELF_SPARC_HWCAP_FSMULD)
13228 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13229 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13230 printf ("%sv8plus", first ? "" : "|"), first = 0;
13231 if (mask & ELF_SPARC_HWCAP_POPC)
13232 printf ("%spopc", first ? "" : "|"), first = 0;
13233 if (mask & ELF_SPARC_HWCAP_VIS)
13234 printf ("%svis", first ? "" : "|"), first = 0;
13235 if (mask & ELF_SPARC_HWCAP_VIS2)
13236 printf ("%svis2", first ? "" : "|"), first = 0;
13237 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13238 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13239 if (mask & ELF_SPARC_HWCAP_FMAF)
13240 printf ("%sfmaf", first ? "" : "|"), first = 0;
13241 if (mask & ELF_SPARC_HWCAP_VIS3)
13242 printf ("%svis3", first ? "" : "|"), first = 0;
13243 if (mask & ELF_SPARC_HWCAP_HPC)
13244 printf ("%shpc", first ? "" : "|"), first = 0;
13245 if (mask & ELF_SPARC_HWCAP_RANDOM)
13246 printf ("%srandom", first ? "" : "|"), first = 0;
13247 if (mask & ELF_SPARC_HWCAP_TRANS)
13248 printf ("%strans", first ? "" : "|"), first = 0;
13249 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13250 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13251 if (mask & ELF_SPARC_HWCAP_IMA)
13252 printf ("%sima", first ? "" : "|"), first = 0;
13253 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13254 printf ("%scspare", first ? "" : "|"), first = 0;
13255 }
13256 else
13257 fputc ('0', stdout);
13258 fputc ('\n', stdout);
13259 }
13260
13261 static void
13262 display_sparc_hwcaps2 (int mask)
13263 {
13264 if (mask)
13265 {
13266 int first = 1;
13267
13268 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13269 fputs ("fjathplus", stdout), first = 0;
13270 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13271 printf ("%svis3b", first ? "" : "|"), first = 0;
13272 if (mask & ELF_SPARC_HWCAP2_ADP)
13273 printf ("%sadp", first ? "" : "|"), first = 0;
13274 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13275 printf ("%ssparc5", first ? "" : "|"), first = 0;
13276 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13277 printf ("%smwait", first ? "" : "|"), first = 0;
13278 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13279 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13280 if (mask & ELF_SPARC_HWCAP2_XMONT)
13281 printf ("%sxmont2", first ? "" : "|"), first = 0;
13282 if (mask & ELF_SPARC_HWCAP2_NSEC)
13283 printf ("%snsec", first ? "" : "|"), first = 0;
13284 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13285 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13286 if (mask & ELF_SPARC_HWCAP2_FJDES)
13287 printf ("%sfjdes", first ? "" : "|"), first = 0;
13288 if (mask & ELF_SPARC_HWCAP2_FJAES)
13289 printf ("%sfjaes", first ? "" : "|"), first = 0;
13290 }
13291 else
13292 fputc ('0', stdout);
13293 fputc ('\n', stdout);
13294 }
13295
13296 static unsigned char *
13297 display_sparc_gnu_attribute (unsigned char * p,
13298 int tag,
13299 const unsigned char * const end)
13300 {
13301 unsigned int len;
13302 int val;
13303
13304 if (tag == Tag_GNU_Sparc_HWCAPS)
13305 {
13306 val = read_uleb128 (p, &len, end);
13307 p += len;
13308 printf (" Tag_GNU_Sparc_HWCAPS: ");
13309 display_sparc_hwcaps (val);
13310 return p;
13311 }
13312 if (tag == Tag_GNU_Sparc_HWCAPS2)
13313 {
13314 val = read_uleb128 (p, &len, end);
13315 p += len;
13316 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13317 display_sparc_hwcaps2 (val);
13318 return p;
13319 }
13320
13321 return display_tag_value (tag, p, end);
13322 }
13323
13324 static void
13325 print_mips_fp_abi_value (int val)
13326 {
13327 switch (val)
13328 {
13329 case Val_GNU_MIPS_ABI_FP_ANY:
13330 printf (_("Hard or soft float\n"));
13331 break;
13332 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13333 printf (_("Hard float (double precision)\n"));
13334 break;
13335 case Val_GNU_MIPS_ABI_FP_SINGLE:
13336 printf (_("Hard float (single precision)\n"));
13337 break;
13338 case Val_GNU_MIPS_ABI_FP_SOFT:
13339 printf (_("Soft float\n"));
13340 break;
13341 case Val_GNU_MIPS_ABI_FP_OLD_64:
13342 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13343 break;
13344 case Val_GNU_MIPS_ABI_FP_XX:
13345 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13346 break;
13347 case Val_GNU_MIPS_ABI_FP_64:
13348 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13349 break;
13350 case Val_GNU_MIPS_ABI_FP_64A:
13351 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13352 break;
13353 case Val_GNU_MIPS_ABI_FP_NAN2008:
13354 printf (_("NaN 2008 compatibility\n"));
13355 break;
13356 default:
13357 printf ("??? (%d)\n", val);
13358 break;
13359 }
13360 }
13361
13362 static unsigned char *
13363 display_mips_gnu_attribute (unsigned char * p,
13364 int tag,
13365 const unsigned char * const end)
13366 {
13367 if (tag == Tag_GNU_MIPS_ABI_FP)
13368 {
13369 unsigned int len;
13370 int val;
13371
13372 val = read_uleb128 (p, &len, end);
13373 p += len;
13374 printf (" Tag_GNU_MIPS_ABI_FP: ");
13375
13376 print_mips_fp_abi_value (val);
13377
13378 return p;
13379 }
13380
13381 if (tag == Tag_GNU_MIPS_ABI_MSA)
13382 {
13383 unsigned int len;
13384 int val;
13385
13386 val = read_uleb128 (p, &len, end);
13387 p += len;
13388 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13389
13390 switch (val)
13391 {
13392 case Val_GNU_MIPS_ABI_MSA_ANY:
13393 printf (_("Any MSA or not\n"));
13394 break;
13395 case Val_GNU_MIPS_ABI_MSA_128:
13396 printf (_("128-bit MSA\n"));
13397 break;
13398 default:
13399 printf ("??? (%d)\n", val);
13400 break;
13401 }
13402 return p;
13403 }
13404
13405 return display_tag_value (tag & 1, p, end);
13406 }
13407
13408 static unsigned char *
13409 display_tic6x_attribute (unsigned char * p,
13410 const unsigned char * const end)
13411 {
13412 int tag;
13413 unsigned int len;
13414 int val;
13415
13416 tag = read_uleb128 (p, &len, end);
13417 p += len;
13418
13419 switch (tag)
13420 {
13421 case Tag_ISA:
13422 val = read_uleb128 (p, &len, end);
13423 p += len;
13424 printf (" Tag_ISA: ");
13425
13426 switch (val)
13427 {
13428 case C6XABI_Tag_ISA_none:
13429 printf (_("None\n"));
13430 break;
13431 case C6XABI_Tag_ISA_C62X:
13432 printf ("C62x\n");
13433 break;
13434 case C6XABI_Tag_ISA_C67X:
13435 printf ("C67x\n");
13436 break;
13437 case C6XABI_Tag_ISA_C67XP:
13438 printf ("C67x+\n");
13439 break;
13440 case C6XABI_Tag_ISA_C64X:
13441 printf ("C64x\n");
13442 break;
13443 case C6XABI_Tag_ISA_C64XP:
13444 printf ("C64x+\n");
13445 break;
13446 case C6XABI_Tag_ISA_C674X:
13447 printf ("C674x\n");
13448 break;
13449 default:
13450 printf ("??? (%d)\n", val);
13451 break;
13452 }
13453 return p;
13454
13455 case Tag_ABI_wchar_t:
13456 val = read_uleb128 (p, &len, end);
13457 p += len;
13458 printf (" Tag_ABI_wchar_t: ");
13459 switch (val)
13460 {
13461 case 0:
13462 printf (_("Not used\n"));
13463 break;
13464 case 1:
13465 printf (_("2 bytes\n"));
13466 break;
13467 case 2:
13468 printf (_("4 bytes\n"));
13469 break;
13470 default:
13471 printf ("??? (%d)\n", val);
13472 break;
13473 }
13474 return p;
13475
13476 case Tag_ABI_stack_align_needed:
13477 val = read_uleb128 (p, &len, end);
13478 p += len;
13479 printf (" Tag_ABI_stack_align_needed: ");
13480 switch (val)
13481 {
13482 case 0:
13483 printf (_("8-byte\n"));
13484 break;
13485 case 1:
13486 printf (_("16-byte\n"));
13487 break;
13488 default:
13489 printf ("??? (%d)\n", val);
13490 break;
13491 }
13492 return p;
13493
13494 case Tag_ABI_stack_align_preserved:
13495 val = read_uleb128 (p, &len, end);
13496 p += len;
13497 printf (" Tag_ABI_stack_align_preserved: ");
13498 switch (val)
13499 {
13500 case 0:
13501 printf (_("8-byte\n"));
13502 break;
13503 case 1:
13504 printf (_("16-byte\n"));
13505 break;
13506 default:
13507 printf ("??? (%d)\n", val);
13508 break;
13509 }
13510 return p;
13511
13512 case Tag_ABI_DSBT:
13513 val = read_uleb128 (p, &len, end);
13514 p += len;
13515 printf (" Tag_ABI_DSBT: ");
13516 switch (val)
13517 {
13518 case 0:
13519 printf (_("DSBT addressing not used\n"));
13520 break;
13521 case 1:
13522 printf (_("DSBT addressing used\n"));
13523 break;
13524 default:
13525 printf ("??? (%d)\n", val);
13526 break;
13527 }
13528 return p;
13529
13530 case Tag_ABI_PID:
13531 val = read_uleb128 (p, &len, end);
13532 p += len;
13533 printf (" Tag_ABI_PID: ");
13534 switch (val)
13535 {
13536 case 0:
13537 printf (_("Data addressing position-dependent\n"));
13538 break;
13539 case 1:
13540 printf (_("Data addressing position-independent, GOT near DP\n"));
13541 break;
13542 case 2:
13543 printf (_("Data addressing position-independent, GOT far from DP\n"));
13544 break;
13545 default:
13546 printf ("??? (%d)\n", val);
13547 break;
13548 }
13549 return p;
13550
13551 case Tag_ABI_PIC:
13552 val = read_uleb128 (p, &len, end);
13553 p += len;
13554 printf (" Tag_ABI_PIC: ");
13555 switch (val)
13556 {
13557 case 0:
13558 printf (_("Code addressing position-dependent\n"));
13559 break;
13560 case 1:
13561 printf (_("Code addressing position-independent\n"));
13562 break;
13563 default:
13564 printf ("??? (%d)\n", val);
13565 break;
13566 }
13567 return p;
13568
13569 case Tag_ABI_array_object_alignment:
13570 val = read_uleb128 (p, &len, end);
13571 p += len;
13572 printf (" Tag_ABI_array_object_alignment: ");
13573 switch (val)
13574 {
13575 case 0:
13576 printf (_("8-byte\n"));
13577 break;
13578 case 1:
13579 printf (_("4-byte\n"));
13580 break;
13581 case 2:
13582 printf (_("16-byte\n"));
13583 break;
13584 default:
13585 printf ("??? (%d)\n", val);
13586 break;
13587 }
13588 return p;
13589
13590 case Tag_ABI_array_object_align_expected:
13591 val = read_uleb128 (p, &len, end);
13592 p += len;
13593 printf (" Tag_ABI_array_object_align_expected: ");
13594 switch (val)
13595 {
13596 case 0:
13597 printf (_("8-byte\n"));
13598 break;
13599 case 1:
13600 printf (_("4-byte\n"));
13601 break;
13602 case 2:
13603 printf (_("16-byte\n"));
13604 break;
13605 default:
13606 printf ("??? (%d)\n", val);
13607 break;
13608 }
13609 return p;
13610
13611 case Tag_ABI_compatibility:
13612 {
13613 val = read_uleb128 (p, &len, end);
13614 p += len;
13615 printf (" Tag_ABI_compatibility: ");
13616 printf (_("flag = %d, vendor = "), val);
13617 if (p < end - 1)
13618 {
13619 size_t maxlen = (end - p) - 1;
13620
13621 print_symbol ((int) maxlen, (const char *) p);
13622 p += strnlen ((char *) p, maxlen) + 1;
13623 }
13624 else
13625 {
13626 printf (_("<corrupt>"));
13627 p = (unsigned char *) end;
13628 }
13629 putchar ('\n');
13630 return p;
13631 }
13632
13633 case Tag_ABI_conformance:
13634 {
13635 printf (" Tag_ABI_conformance: \"");
13636 if (p < end - 1)
13637 {
13638 size_t maxlen = (end - p) - 1;
13639
13640 print_symbol ((int) maxlen, (const char *) p);
13641 p += strnlen ((char *) p, maxlen) + 1;
13642 }
13643 else
13644 {
13645 printf (_("<corrupt>"));
13646 p = (unsigned char *) end;
13647 }
13648 printf ("\"\n");
13649 return p;
13650 }
13651 }
13652
13653 return display_tag_value (tag, p, end);
13654 }
13655
13656 static void
13657 display_raw_attribute (unsigned char * p, unsigned char * end)
13658 {
13659 unsigned long addr = 0;
13660 size_t bytes = end - p;
13661
13662 assert (end > p);
13663 while (bytes)
13664 {
13665 int j;
13666 int k;
13667 int lbytes = (bytes > 16 ? 16 : bytes);
13668
13669 printf (" 0x%8.8lx ", addr);
13670
13671 for (j = 0; j < 16; j++)
13672 {
13673 if (j < lbytes)
13674 printf ("%2.2x", p[j]);
13675 else
13676 printf (" ");
13677
13678 if ((j & 3) == 3)
13679 printf (" ");
13680 }
13681
13682 for (j = 0; j < lbytes; j++)
13683 {
13684 k = p[j];
13685 if (k >= ' ' && k < 0x7f)
13686 printf ("%c", k);
13687 else
13688 printf (".");
13689 }
13690
13691 putchar ('\n');
13692
13693 p += lbytes;
13694 bytes -= lbytes;
13695 addr += lbytes;
13696 }
13697
13698 putchar ('\n');
13699 }
13700
13701 static unsigned char *
13702 display_msp430x_attribute (unsigned char * p,
13703 const unsigned char * const end)
13704 {
13705 unsigned int len;
13706 int val;
13707 int tag;
13708
13709 tag = read_uleb128 (p, & len, end);
13710 p += len;
13711
13712 switch (tag)
13713 {
13714 case OFBA_MSPABI_Tag_ISA:
13715 val = read_uleb128 (p, &len, end);
13716 p += len;
13717 printf (" Tag_ISA: ");
13718 switch (val)
13719 {
13720 case 0: printf (_("None\n")); break;
13721 case 1: printf (_("MSP430\n")); break;
13722 case 2: printf (_("MSP430X\n")); break;
13723 default: printf ("??? (%d)\n", val); break;
13724 }
13725 break;
13726
13727 case OFBA_MSPABI_Tag_Code_Model:
13728 val = read_uleb128 (p, &len, end);
13729 p += len;
13730 printf (" Tag_Code_Model: ");
13731 switch (val)
13732 {
13733 case 0: printf (_("None\n")); break;
13734 case 1: printf (_("Small\n")); break;
13735 case 2: printf (_("Large\n")); break;
13736 default: printf ("??? (%d)\n", val); break;
13737 }
13738 break;
13739
13740 case OFBA_MSPABI_Tag_Data_Model:
13741 val = read_uleb128 (p, &len, end);
13742 p += len;
13743 printf (" Tag_Data_Model: ");
13744 switch (val)
13745 {
13746 case 0: printf (_("None\n")); break;
13747 case 1: printf (_("Small\n")); break;
13748 case 2: printf (_("Large\n")); break;
13749 case 3: printf (_("Restricted Large\n")); break;
13750 default: printf ("??? (%d)\n", val); break;
13751 }
13752 break;
13753
13754 default:
13755 printf (_(" <unknown tag %d>: "), tag);
13756
13757 if (tag & 1)
13758 {
13759 putchar ('"');
13760 if (p < end - 1)
13761 {
13762 size_t maxlen = (end - p) - 1;
13763
13764 print_symbol ((int) maxlen, (const char *) p);
13765 p += strnlen ((char *) p, maxlen) + 1;
13766 }
13767 else
13768 {
13769 printf (_("<corrupt>"));
13770 p = (unsigned char *) end;
13771 }
13772 printf ("\"\n");
13773 }
13774 else
13775 {
13776 val = read_uleb128 (p, &len, end);
13777 p += len;
13778 printf ("%d (0x%x)\n", val, val);
13779 }
13780 break;
13781 }
13782
13783 assert (p <= end);
13784 return p;
13785 }
13786
13787 static int
13788 process_attributes (FILE * file,
13789 const char * public_name,
13790 unsigned int proc_type,
13791 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13792 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13793 {
13794 Elf_Internal_Shdr * sect;
13795 unsigned i;
13796
13797 /* Find the section header so that we get the size. */
13798 for (i = 0, sect = section_headers;
13799 i < elf_header.e_shnum;
13800 i++, sect++)
13801 {
13802 unsigned char * contents;
13803 unsigned char * p;
13804
13805 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13806 continue;
13807
13808 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13809 sect->sh_size, _("attributes"));
13810 if (contents == NULL)
13811 continue;
13812
13813 p = contents;
13814 if (*p == 'A')
13815 {
13816 bfd_vma section_len;
13817
13818 section_len = sect->sh_size - 1;
13819 p++;
13820
13821 while (section_len > 0)
13822 {
13823 bfd_vma attr_len;
13824 unsigned int namelen;
13825 bfd_boolean public_section;
13826 bfd_boolean gnu_section;
13827
13828 if (section_len <= 4)
13829 {
13830 error (_("Tag section ends prematurely\n"));
13831 break;
13832 }
13833 attr_len = byte_get (p, 4);
13834 p += 4;
13835
13836 if (attr_len > section_len)
13837 {
13838 error (_("Bad attribute length (%u > %u)\n"),
13839 (unsigned) attr_len, (unsigned) section_len);
13840 attr_len = section_len;
13841 }
13842 /* PR 17531: file: 001-101425-0.004 */
13843 else if (attr_len < 5)
13844 {
13845 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13846 break;
13847 }
13848
13849 section_len -= attr_len;
13850 attr_len -= 4;
13851
13852 namelen = strnlen ((char *) p, attr_len) + 1;
13853 if (namelen == 0 || namelen >= attr_len)
13854 {
13855 error (_("Corrupt attribute section name\n"));
13856 break;
13857 }
13858
13859 printf (_("Attribute Section: "));
13860 print_symbol (INT_MAX, (const char *) p);
13861 putchar ('\n');
13862
13863 if (public_name && streq ((char *) p, public_name))
13864 public_section = TRUE;
13865 else
13866 public_section = FALSE;
13867
13868 if (streq ((char *) p, "gnu"))
13869 gnu_section = TRUE;
13870 else
13871 gnu_section = FALSE;
13872
13873 p += namelen;
13874 attr_len -= namelen;
13875
13876 while (attr_len > 0 && p < contents + sect->sh_size)
13877 {
13878 int tag;
13879 int val;
13880 bfd_vma size;
13881 unsigned char * end;
13882
13883 /* PR binutils/17531: Safe handling of corrupt files. */
13884 if (attr_len < 6)
13885 {
13886 error (_("Unused bytes at end of section\n"));
13887 section_len = 0;
13888 break;
13889 }
13890
13891 tag = *(p++);
13892 size = byte_get (p, 4);
13893 if (size > attr_len)
13894 {
13895 error (_("Bad subsection length (%u > %u)\n"),
13896 (unsigned) size, (unsigned) attr_len);
13897 size = attr_len;
13898 }
13899 /* PR binutils/17531: Safe handling of corrupt files. */
13900 if (size < 6)
13901 {
13902 error (_("Bad subsection length (%u < 6)\n"),
13903 (unsigned) size);
13904 section_len = 0;
13905 break;
13906 }
13907
13908 attr_len -= size;
13909 end = p + size - 1;
13910 assert (end <= contents + sect->sh_size);
13911 p += 4;
13912
13913 switch (tag)
13914 {
13915 case 1:
13916 printf (_("File Attributes\n"));
13917 break;
13918 case 2:
13919 printf (_("Section Attributes:"));
13920 goto do_numlist;
13921 case 3:
13922 printf (_("Symbol Attributes:"));
13923 do_numlist:
13924 for (;;)
13925 {
13926 unsigned int j;
13927
13928 val = read_uleb128 (p, &j, end);
13929 p += j;
13930 if (val == 0)
13931 break;
13932 printf (" %d", val);
13933 }
13934 printf ("\n");
13935 break;
13936 default:
13937 printf (_("Unknown tag: %d\n"), tag);
13938 public_section = FALSE;
13939 break;
13940 }
13941
13942 if (public_section && display_pub_attribute != NULL)
13943 {
13944 while (p < end)
13945 p = display_pub_attribute (p, end);
13946 assert (p <= end);
13947 }
13948 else if (gnu_section && display_proc_gnu_attribute != NULL)
13949 {
13950 while (p < end)
13951 p = display_gnu_attribute (p,
13952 display_proc_gnu_attribute,
13953 end);
13954 assert (p <= end);
13955 }
13956 else if (p < end)
13957 {
13958 printf (_(" Unknown attribute:\n"));
13959 display_raw_attribute (p, end);
13960 p = end;
13961 }
13962 else
13963 attr_len = 0;
13964 }
13965 }
13966 }
13967 else
13968 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13969
13970 free (contents);
13971 }
13972 return 1;
13973 }
13974
13975 static int
13976 process_arm_specific (FILE * file)
13977 {
13978 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13979 display_arm_attribute, NULL);
13980 }
13981
13982 static int
13983 process_power_specific (FILE * file)
13984 {
13985 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13986 display_power_gnu_attribute);
13987 }
13988
13989 static int
13990 process_s390_specific (FILE * file)
13991 {
13992 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13993 display_s390_gnu_attribute);
13994 }
13995
13996 static int
13997 process_sparc_specific (FILE * file)
13998 {
13999 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14000 display_sparc_gnu_attribute);
14001 }
14002
14003 static int
14004 process_tic6x_specific (FILE * file)
14005 {
14006 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14007 display_tic6x_attribute, NULL);
14008 }
14009
14010 static int
14011 process_msp430x_specific (FILE * file)
14012 {
14013 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14014 display_msp430x_attribute, NULL);
14015 }
14016
14017 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14018 Print the Address, Access and Initial fields of an entry at VMA ADDR
14019 and return the VMA of the next entry, or -1 if there was a problem.
14020 Does not read from DATA_END or beyond. */
14021
14022 static bfd_vma
14023 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14024 unsigned char * data_end)
14025 {
14026 printf (" ");
14027 print_vma (addr, LONG_HEX);
14028 printf (" ");
14029 if (addr < pltgot + 0xfff0)
14030 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14031 else
14032 printf ("%10s", "");
14033 printf (" ");
14034 if (data == NULL)
14035 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14036 else
14037 {
14038 bfd_vma entry;
14039 unsigned char * from = data + addr - pltgot;
14040
14041 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14042 {
14043 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14044 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14045 return (bfd_vma) -1;
14046 }
14047 else
14048 {
14049 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14050 print_vma (entry, LONG_HEX);
14051 }
14052 }
14053 return addr + (is_32bit_elf ? 4 : 8);
14054 }
14055
14056 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14057 PLTGOT. Print the Address and Initial fields of an entry at VMA
14058 ADDR and return the VMA of the next entry. */
14059
14060 static bfd_vma
14061 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14062 {
14063 printf (" ");
14064 print_vma (addr, LONG_HEX);
14065 printf (" ");
14066 if (data == NULL)
14067 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14068 else
14069 {
14070 bfd_vma entry;
14071
14072 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14073 print_vma (entry, LONG_HEX);
14074 }
14075 return addr + (is_32bit_elf ? 4 : 8);
14076 }
14077
14078 static void
14079 print_mips_ases (unsigned int mask)
14080 {
14081 if (mask & AFL_ASE_DSP)
14082 fputs ("\n\tDSP ASE", stdout);
14083 if (mask & AFL_ASE_DSPR2)
14084 fputs ("\n\tDSP R2 ASE", stdout);
14085 if (mask & AFL_ASE_EVA)
14086 fputs ("\n\tEnhanced VA Scheme", stdout);
14087 if (mask & AFL_ASE_MCU)
14088 fputs ("\n\tMCU (MicroController) ASE", stdout);
14089 if (mask & AFL_ASE_MDMX)
14090 fputs ("\n\tMDMX ASE", stdout);
14091 if (mask & AFL_ASE_MIPS3D)
14092 fputs ("\n\tMIPS-3D ASE", stdout);
14093 if (mask & AFL_ASE_MT)
14094 fputs ("\n\tMT ASE", stdout);
14095 if (mask & AFL_ASE_SMARTMIPS)
14096 fputs ("\n\tSmartMIPS ASE", stdout);
14097 if (mask & AFL_ASE_VIRT)
14098 fputs ("\n\tVZ ASE", stdout);
14099 if (mask & AFL_ASE_MSA)
14100 fputs ("\n\tMSA ASE", stdout);
14101 if (mask & AFL_ASE_MIPS16)
14102 fputs ("\n\tMIPS16 ASE", stdout);
14103 if (mask & AFL_ASE_MICROMIPS)
14104 fputs ("\n\tMICROMIPS ASE", stdout);
14105 if (mask & AFL_ASE_XPA)
14106 fputs ("\n\tXPA ASE", stdout);
14107 if (mask == 0)
14108 fprintf (stdout, "\n\t%s", _("None"));
14109 else if ((mask & ~AFL_ASE_MASK) != 0)
14110 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14111 }
14112
14113 static void
14114 print_mips_isa_ext (unsigned int isa_ext)
14115 {
14116 switch (isa_ext)
14117 {
14118 case 0:
14119 fputs (_("None"), stdout);
14120 break;
14121 case AFL_EXT_XLR:
14122 fputs ("RMI XLR", stdout);
14123 break;
14124 case AFL_EXT_OCTEON3:
14125 fputs ("Cavium Networks Octeon3", stdout);
14126 break;
14127 case AFL_EXT_OCTEON2:
14128 fputs ("Cavium Networks Octeon2", stdout);
14129 break;
14130 case AFL_EXT_OCTEONP:
14131 fputs ("Cavium Networks OcteonP", stdout);
14132 break;
14133 case AFL_EXT_LOONGSON_3A:
14134 fputs ("Loongson 3A", stdout);
14135 break;
14136 case AFL_EXT_OCTEON:
14137 fputs ("Cavium Networks Octeon", stdout);
14138 break;
14139 case AFL_EXT_5900:
14140 fputs ("Toshiba R5900", stdout);
14141 break;
14142 case AFL_EXT_4650:
14143 fputs ("MIPS R4650", stdout);
14144 break;
14145 case AFL_EXT_4010:
14146 fputs ("LSI R4010", stdout);
14147 break;
14148 case AFL_EXT_4100:
14149 fputs ("NEC VR4100", stdout);
14150 break;
14151 case AFL_EXT_3900:
14152 fputs ("Toshiba R3900", stdout);
14153 break;
14154 case AFL_EXT_10000:
14155 fputs ("MIPS R10000", stdout);
14156 break;
14157 case AFL_EXT_SB1:
14158 fputs ("Broadcom SB-1", stdout);
14159 break;
14160 case AFL_EXT_4111:
14161 fputs ("NEC VR4111/VR4181", stdout);
14162 break;
14163 case AFL_EXT_4120:
14164 fputs ("NEC VR4120", stdout);
14165 break;
14166 case AFL_EXT_5400:
14167 fputs ("NEC VR5400", stdout);
14168 break;
14169 case AFL_EXT_5500:
14170 fputs ("NEC VR5500", stdout);
14171 break;
14172 case AFL_EXT_LOONGSON_2E:
14173 fputs ("ST Microelectronics Loongson 2E", stdout);
14174 break;
14175 case AFL_EXT_LOONGSON_2F:
14176 fputs ("ST Microelectronics Loongson 2F", stdout);
14177 break;
14178 default:
14179 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14180 }
14181 }
14182
14183 static int
14184 get_mips_reg_size (int reg_size)
14185 {
14186 return (reg_size == AFL_REG_NONE) ? 0
14187 : (reg_size == AFL_REG_32) ? 32
14188 : (reg_size == AFL_REG_64) ? 64
14189 : (reg_size == AFL_REG_128) ? 128
14190 : -1;
14191 }
14192
14193 static int
14194 process_mips_specific (FILE * file)
14195 {
14196 Elf_Internal_Dyn * entry;
14197 Elf_Internal_Shdr *sect = NULL;
14198 size_t liblist_offset = 0;
14199 size_t liblistno = 0;
14200 size_t conflictsno = 0;
14201 size_t options_offset = 0;
14202 size_t conflicts_offset = 0;
14203 size_t pltrelsz = 0;
14204 size_t pltrel = 0;
14205 bfd_vma pltgot = 0;
14206 bfd_vma mips_pltgot = 0;
14207 bfd_vma jmprel = 0;
14208 bfd_vma local_gotno = 0;
14209 bfd_vma gotsym = 0;
14210 bfd_vma symtabno = 0;
14211
14212 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14213 display_mips_gnu_attribute);
14214
14215 sect = find_section (".MIPS.abiflags");
14216
14217 if (sect != NULL)
14218 {
14219 Elf_External_ABIFlags_v0 *abiflags_ext;
14220 Elf_Internal_ABIFlags_v0 abiflags_in;
14221
14222 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14223 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14224 else
14225 {
14226 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14227 sect->sh_size, _("MIPS ABI Flags section"));
14228 if (abiflags_ext)
14229 {
14230 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14231 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14232 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14233 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14234 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14235 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14236 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14237 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14238 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14239 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14240 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14241
14242 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14243 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14244 if (abiflags_in.isa_rev > 1)
14245 printf ("r%d", abiflags_in.isa_rev);
14246 printf ("\nGPR size: %d",
14247 get_mips_reg_size (abiflags_in.gpr_size));
14248 printf ("\nCPR1 size: %d",
14249 get_mips_reg_size (abiflags_in.cpr1_size));
14250 printf ("\nCPR2 size: %d",
14251 get_mips_reg_size (abiflags_in.cpr2_size));
14252 fputs ("\nFP ABI: ", stdout);
14253 print_mips_fp_abi_value (abiflags_in.fp_abi);
14254 fputs ("ISA Extension: ", stdout);
14255 print_mips_isa_ext (abiflags_in.isa_ext);
14256 fputs ("\nASEs:", stdout);
14257 print_mips_ases (abiflags_in.ases);
14258 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14259 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14260 fputc ('\n', stdout);
14261 free (abiflags_ext);
14262 }
14263 }
14264 }
14265
14266 /* We have a lot of special sections. Thanks SGI! */
14267 if (dynamic_section == NULL)
14268 /* No information available. */
14269 return 0;
14270
14271 for (entry = dynamic_section;
14272 /* PR 17531 file: 012-50589-0.004. */
14273 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14274 ++entry)
14275 switch (entry->d_tag)
14276 {
14277 case DT_MIPS_LIBLIST:
14278 liblist_offset
14279 = offset_from_vma (file, entry->d_un.d_val,
14280 liblistno * sizeof (Elf32_External_Lib));
14281 break;
14282 case DT_MIPS_LIBLISTNO:
14283 liblistno = entry->d_un.d_val;
14284 break;
14285 case DT_MIPS_OPTIONS:
14286 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14287 break;
14288 case DT_MIPS_CONFLICT:
14289 conflicts_offset
14290 = offset_from_vma (file, entry->d_un.d_val,
14291 conflictsno * sizeof (Elf32_External_Conflict));
14292 break;
14293 case DT_MIPS_CONFLICTNO:
14294 conflictsno = entry->d_un.d_val;
14295 break;
14296 case DT_PLTGOT:
14297 pltgot = entry->d_un.d_ptr;
14298 break;
14299 case DT_MIPS_LOCAL_GOTNO:
14300 local_gotno = entry->d_un.d_val;
14301 break;
14302 case DT_MIPS_GOTSYM:
14303 gotsym = entry->d_un.d_val;
14304 break;
14305 case DT_MIPS_SYMTABNO:
14306 symtabno = entry->d_un.d_val;
14307 break;
14308 case DT_MIPS_PLTGOT:
14309 mips_pltgot = entry->d_un.d_ptr;
14310 break;
14311 case DT_PLTREL:
14312 pltrel = entry->d_un.d_val;
14313 break;
14314 case DT_PLTRELSZ:
14315 pltrelsz = entry->d_un.d_val;
14316 break;
14317 case DT_JMPREL:
14318 jmprel = entry->d_un.d_ptr;
14319 break;
14320 default:
14321 break;
14322 }
14323
14324 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14325 {
14326 Elf32_External_Lib * elib;
14327 size_t cnt;
14328
14329 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14330 liblistno,
14331 sizeof (Elf32_External_Lib),
14332 _("liblist section data"));
14333 if (elib)
14334 {
14335 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14336 (unsigned long) liblistno);
14337 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14338 stdout);
14339
14340 for (cnt = 0; cnt < liblistno; ++cnt)
14341 {
14342 Elf32_Lib liblist;
14343 time_t atime;
14344 char timebuf[20];
14345 struct tm * tmp;
14346
14347 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14348 atime = BYTE_GET (elib[cnt].l_time_stamp);
14349 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14350 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14351 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14352
14353 tmp = gmtime (&atime);
14354 snprintf (timebuf, sizeof (timebuf),
14355 "%04u-%02u-%02uT%02u:%02u:%02u",
14356 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14357 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14358
14359 printf ("%3lu: ", (unsigned long) cnt);
14360 if (VALID_DYNAMIC_NAME (liblist.l_name))
14361 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14362 else
14363 printf (_("<corrupt: %9ld>"), liblist.l_name);
14364 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14365 liblist.l_version);
14366
14367 if (liblist.l_flags == 0)
14368 puts (_(" NONE"));
14369 else
14370 {
14371 static const struct
14372 {
14373 const char * name;
14374 int bit;
14375 }
14376 l_flags_vals[] =
14377 {
14378 { " EXACT_MATCH", LL_EXACT_MATCH },
14379 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14380 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14381 { " EXPORTS", LL_EXPORTS },
14382 { " DELAY_LOAD", LL_DELAY_LOAD },
14383 { " DELTA", LL_DELTA }
14384 };
14385 int flags = liblist.l_flags;
14386 size_t fcnt;
14387
14388 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14389 if ((flags & l_flags_vals[fcnt].bit) != 0)
14390 {
14391 fputs (l_flags_vals[fcnt].name, stdout);
14392 flags ^= l_flags_vals[fcnt].bit;
14393 }
14394 if (flags != 0)
14395 printf (" %#x", (unsigned int) flags);
14396
14397 puts ("");
14398 }
14399 }
14400
14401 free (elib);
14402 }
14403 }
14404
14405 if (options_offset != 0)
14406 {
14407 Elf_External_Options * eopt;
14408 Elf_Internal_Options * iopt;
14409 Elf_Internal_Options * option;
14410 size_t offset;
14411 int cnt;
14412 sect = section_headers;
14413
14414 /* Find the section header so that we get the size. */
14415 sect = find_section_by_type (SHT_MIPS_OPTIONS);
14416 /* PR 17533 file: 012-277276-0.004. */
14417 if (sect == NULL)
14418 {
14419 error (_("No MIPS_OPTIONS header found\n"));
14420 return 0;
14421 }
14422
14423 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14424 sect->sh_size, _("options"));
14425 if (eopt)
14426 {
14427 iopt = (Elf_Internal_Options *)
14428 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14429 if (iopt == NULL)
14430 {
14431 error (_("Out of memory allocatinf space for MIPS options\n"));
14432 return 0;
14433 }
14434
14435 offset = cnt = 0;
14436 option = iopt;
14437
14438 while (offset <= sect->sh_size - sizeof (* eopt))
14439 {
14440 Elf_External_Options * eoption;
14441
14442 eoption = (Elf_External_Options *) ((char *) eopt + offset);
14443
14444 option->kind = BYTE_GET (eoption->kind);
14445 option->size = BYTE_GET (eoption->size);
14446 option->section = BYTE_GET (eoption->section);
14447 option->info = BYTE_GET (eoption->info);
14448
14449 /* PR 17531: file: ffa0fa3b. */
14450 if (option->size < sizeof (* eopt)
14451 || offset + option->size > sect->sh_size)
14452 {
14453 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14454 return 0;
14455 }
14456 offset += option->size;
14457
14458 ++option;
14459 ++cnt;
14460 }
14461
14462 printf (_("\nSection '%s' contains %d entries:\n"),
14463 printable_section_name (sect), cnt);
14464
14465 option = iopt;
14466 offset = 0;
14467
14468 while (cnt-- > 0)
14469 {
14470 size_t len;
14471
14472 switch (option->kind)
14473 {
14474 case ODK_NULL:
14475 /* This shouldn't happen. */
14476 printf (" NULL %d %lx", option->section, option->info);
14477 break;
14478 case ODK_REGINFO:
14479 printf (" REGINFO ");
14480 if (elf_header.e_machine == EM_MIPS)
14481 {
14482 /* 32bit form. */
14483 Elf32_External_RegInfo * ereg;
14484 Elf32_RegInfo reginfo;
14485
14486 ereg = (Elf32_External_RegInfo *) (option + 1);
14487 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14488 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14489 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14490 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14491 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14492 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14493
14494 printf ("GPR %08lx GP 0x%lx\n",
14495 reginfo.ri_gprmask,
14496 (unsigned long) reginfo.ri_gp_value);
14497 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14498 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14499 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14500 }
14501 else
14502 {
14503 /* 64 bit form. */
14504 Elf64_External_RegInfo * ereg;
14505 Elf64_Internal_RegInfo reginfo;
14506
14507 ereg = (Elf64_External_RegInfo *) (option + 1);
14508 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14509 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14510 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14511 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14512 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14513 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14514
14515 printf ("GPR %08lx GP 0x",
14516 reginfo.ri_gprmask);
14517 printf_vma (reginfo.ri_gp_value);
14518 printf ("\n");
14519
14520 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14521 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14522 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14523 }
14524 ++option;
14525 continue;
14526 case ODK_EXCEPTIONS:
14527 fputs (" EXCEPTIONS fpe_min(", stdout);
14528 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14529 fputs (") fpe_max(", stdout);
14530 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14531 fputs (")", stdout);
14532
14533 if (option->info & OEX_PAGE0)
14534 fputs (" PAGE0", stdout);
14535 if (option->info & OEX_SMM)
14536 fputs (" SMM", stdout);
14537 if (option->info & OEX_FPDBUG)
14538 fputs (" FPDBUG", stdout);
14539 if (option->info & OEX_DISMISS)
14540 fputs (" DISMISS", stdout);
14541 break;
14542 case ODK_PAD:
14543 fputs (" PAD ", stdout);
14544 if (option->info & OPAD_PREFIX)
14545 fputs (" PREFIX", stdout);
14546 if (option->info & OPAD_POSTFIX)
14547 fputs (" POSTFIX", stdout);
14548 if (option->info & OPAD_SYMBOL)
14549 fputs (" SYMBOL", stdout);
14550 break;
14551 case ODK_HWPATCH:
14552 fputs (" HWPATCH ", stdout);
14553 if (option->info & OHW_R4KEOP)
14554 fputs (" R4KEOP", stdout);
14555 if (option->info & OHW_R8KPFETCH)
14556 fputs (" R8KPFETCH", stdout);
14557 if (option->info & OHW_R5KEOP)
14558 fputs (" R5KEOP", stdout);
14559 if (option->info & OHW_R5KCVTL)
14560 fputs (" R5KCVTL", stdout);
14561 break;
14562 case ODK_FILL:
14563 fputs (" FILL ", stdout);
14564 /* XXX Print content of info word? */
14565 break;
14566 case ODK_TAGS:
14567 fputs (" TAGS ", stdout);
14568 /* XXX Print content of info word? */
14569 break;
14570 case ODK_HWAND:
14571 fputs (" HWAND ", stdout);
14572 if (option->info & OHWA0_R4KEOP_CHECKED)
14573 fputs (" R4KEOP_CHECKED", stdout);
14574 if (option->info & OHWA0_R4KEOP_CLEAN)
14575 fputs (" R4KEOP_CLEAN", stdout);
14576 break;
14577 case ODK_HWOR:
14578 fputs (" HWOR ", stdout);
14579 if (option->info & OHWA0_R4KEOP_CHECKED)
14580 fputs (" R4KEOP_CHECKED", stdout);
14581 if (option->info & OHWA0_R4KEOP_CLEAN)
14582 fputs (" R4KEOP_CLEAN", stdout);
14583 break;
14584 case ODK_GP_GROUP:
14585 printf (" GP_GROUP %#06lx self-contained %#06lx",
14586 option->info & OGP_GROUP,
14587 (option->info & OGP_SELF) >> 16);
14588 break;
14589 case ODK_IDENT:
14590 printf (" IDENT %#06lx self-contained %#06lx",
14591 option->info & OGP_GROUP,
14592 (option->info & OGP_SELF) >> 16);
14593 break;
14594 default:
14595 /* This shouldn't happen. */
14596 printf (" %3d ??? %d %lx",
14597 option->kind, option->section, option->info);
14598 break;
14599 }
14600
14601 len = sizeof (* eopt);
14602 while (len < option->size)
14603 {
14604 unsigned char datum = * ((unsigned char *) eopt + offset + len);
14605
14606 if (ISPRINT (datum))
14607 printf ("%c", datum);
14608 else
14609 printf ("\\%03o", datum);
14610 len ++;
14611 }
14612 fputs ("\n", stdout);
14613
14614 offset += option->size;
14615 ++option;
14616 }
14617
14618 free (eopt);
14619 }
14620 }
14621
14622 if (conflicts_offset != 0 && conflictsno != 0)
14623 {
14624 Elf32_Conflict * iconf;
14625 size_t cnt;
14626
14627 if (dynamic_symbols == NULL)
14628 {
14629 error (_("conflict list found without a dynamic symbol table\n"));
14630 return 0;
14631 }
14632
14633 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14634 if (iconf == NULL)
14635 {
14636 error (_("Out of memory allocating space for dynamic conflicts\n"));
14637 return 0;
14638 }
14639
14640 if (is_32bit_elf)
14641 {
14642 Elf32_External_Conflict * econf32;
14643
14644 econf32 = (Elf32_External_Conflict *)
14645 get_data (NULL, file, conflicts_offset, conflictsno,
14646 sizeof (* econf32), _("conflict"));
14647 if (!econf32)
14648 return 0;
14649
14650 for (cnt = 0; cnt < conflictsno; ++cnt)
14651 iconf[cnt] = BYTE_GET (econf32[cnt]);
14652
14653 free (econf32);
14654 }
14655 else
14656 {
14657 Elf64_External_Conflict * econf64;
14658
14659 econf64 = (Elf64_External_Conflict *)
14660 get_data (NULL, file, conflicts_offset, conflictsno,
14661 sizeof (* econf64), _("conflict"));
14662 if (!econf64)
14663 return 0;
14664
14665 for (cnt = 0; cnt < conflictsno; ++cnt)
14666 iconf[cnt] = BYTE_GET (econf64[cnt]);
14667
14668 free (econf64);
14669 }
14670
14671 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14672 (unsigned long) conflictsno);
14673 puts (_(" Num: Index Value Name"));
14674
14675 for (cnt = 0; cnt < conflictsno; ++cnt)
14676 {
14677 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14678
14679 if (iconf[cnt] >= num_dynamic_syms)
14680 printf (_("<corrupt symbol index>"));
14681 else
14682 {
14683 Elf_Internal_Sym * psym;
14684
14685 psym = & dynamic_symbols[iconf[cnt]];
14686 print_vma (psym->st_value, FULL_HEX);
14687 putchar (' ');
14688 if (VALID_DYNAMIC_NAME (psym->st_name))
14689 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14690 else
14691 printf (_("<corrupt: %14ld>"), psym->st_name);
14692 }
14693 putchar ('\n');
14694 }
14695
14696 free (iconf);
14697 }
14698
14699 if (pltgot != 0 && local_gotno != 0)
14700 {
14701 bfd_vma ent, local_end, global_end;
14702 size_t i, offset;
14703 unsigned char * data;
14704 unsigned char * data_end;
14705 int addr_size;
14706
14707 ent = pltgot;
14708 addr_size = (is_32bit_elf ? 4 : 8);
14709 local_end = pltgot + local_gotno * addr_size;
14710
14711 /* PR binutils/17533 file: 012-111227-0.004 */
14712 if (symtabno < gotsym)
14713 {
14714 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14715 (unsigned long) gotsym, (unsigned long) symtabno);
14716 return 0;
14717 }
14718
14719 global_end = local_end + (symtabno - gotsym) * addr_size;
14720 /* PR 17531: file: 54c91a34. */
14721 if (global_end < local_end)
14722 {
14723 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14724 return 0;
14725 }
14726
14727 offset = offset_from_vma (file, pltgot, global_end - pltgot);
14728 data = (unsigned char *) get_data (NULL, file, offset,
14729 global_end - pltgot, 1,
14730 _("Global Offset Table data"));
14731 if (data == NULL)
14732 return 0;
14733 data_end = data + (global_end - pltgot);
14734
14735 printf (_("\nPrimary GOT:\n"));
14736 printf (_(" Canonical gp value: "));
14737 print_vma (pltgot + 0x7ff0, LONG_HEX);
14738 printf ("\n\n");
14739
14740 printf (_(" Reserved entries:\n"));
14741 printf (_(" %*s %10s %*s Purpose\n"),
14742 addr_size * 2, _("Address"), _("Access"),
14743 addr_size * 2, _("Initial"));
14744 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14745 printf (_(" Lazy resolver\n"));
14746 if (ent == (bfd_vma) -1)
14747 goto got_print_fail;
14748 if (data
14749 && (byte_get (data + ent - pltgot, addr_size)
14750 >> (addr_size * 8 - 1)) != 0)
14751 {
14752 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14753 printf (_(" Module pointer (GNU extension)\n"));
14754 if (ent == (bfd_vma) -1)
14755 goto got_print_fail;
14756 }
14757 printf ("\n");
14758
14759 if (ent < local_end)
14760 {
14761 printf (_(" Local entries:\n"));
14762 printf (" %*s %10s %*s\n",
14763 addr_size * 2, _("Address"), _("Access"),
14764 addr_size * 2, _("Initial"));
14765 while (ent < local_end)
14766 {
14767 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14768 printf ("\n");
14769 if (ent == (bfd_vma) -1)
14770 goto got_print_fail;
14771 }
14772 printf ("\n");
14773 }
14774
14775 if (gotsym < symtabno)
14776 {
14777 int sym_width;
14778
14779 printf (_(" Global entries:\n"));
14780 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
14781 addr_size * 2, _("Address"),
14782 _("Access"),
14783 addr_size * 2, _("Initial"),
14784 addr_size * 2, _("Sym.Val."),
14785 _("Type"),
14786 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14787 _("Ndx"), _("Name"));
14788
14789 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14790
14791 for (i = gotsym; i < symtabno; i++)
14792 {
14793 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14794 printf (" ");
14795
14796 if (dynamic_symbols == NULL)
14797 printf (_("<no dynamic symbols>"));
14798 else if (i < num_dynamic_syms)
14799 {
14800 Elf_Internal_Sym * psym = dynamic_symbols + i;
14801
14802 print_vma (psym->st_value, LONG_HEX);
14803 printf (" %-7s %3s ",
14804 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14805 get_symbol_index_type (psym->st_shndx));
14806
14807 if (VALID_DYNAMIC_NAME (psym->st_name))
14808 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14809 else
14810 printf (_("<corrupt: %14ld>"), psym->st_name);
14811 }
14812 else
14813 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14814 (unsigned long) i);
14815
14816 printf ("\n");
14817 if (ent == (bfd_vma) -1)
14818 break;
14819 }
14820 printf ("\n");
14821 }
14822
14823 got_print_fail:
14824 if (data)
14825 free (data);
14826 }
14827
14828 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14829 {
14830 bfd_vma ent, end;
14831 size_t offset, rel_offset;
14832 unsigned long count, i;
14833 unsigned char * data;
14834 int addr_size, sym_width;
14835 Elf_Internal_Rela * rels;
14836
14837 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14838 if (pltrel == DT_RELA)
14839 {
14840 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14841 return 0;
14842 }
14843 else
14844 {
14845 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14846 return 0;
14847 }
14848
14849 ent = mips_pltgot;
14850 addr_size = (is_32bit_elf ? 4 : 8);
14851 end = mips_pltgot + (2 + count) * addr_size;
14852
14853 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14854 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14855 1, _("Procedure Linkage Table data"));
14856 if (data == NULL)
14857 return 0;
14858
14859 printf ("\nPLT GOT:\n\n");
14860 printf (_(" Reserved entries:\n"));
14861 printf (_(" %*s %*s Purpose\n"),
14862 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14863 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14864 printf (_(" PLT lazy resolver\n"));
14865 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14866 printf (_(" Module pointer\n"));
14867 printf ("\n");
14868
14869 printf (_(" Entries:\n"));
14870 printf (" %*s %*s %*s %-7s %3s %s\n",
14871 addr_size * 2, _("Address"),
14872 addr_size * 2, _("Initial"),
14873 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14874 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14875 for (i = 0; i < count; i++)
14876 {
14877 unsigned long idx = get_reloc_symindex (rels[i].r_info);
14878
14879 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14880 printf (" ");
14881
14882 if (idx >= num_dynamic_syms)
14883 printf (_("<corrupt symbol index: %lu>"), idx);
14884 else
14885 {
14886 Elf_Internal_Sym * psym = dynamic_symbols + idx;
14887
14888 print_vma (psym->st_value, LONG_HEX);
14889 printf (" %-7s %3s ",
14890 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14891 get_symbol_index_type (psym->st_shndx));
14892 if (VALID_DYNAMIC_NAME (psym->st_name))
14893 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14894 else
14895 printf (_("<corrupt: %14ld>"), psym->st_name);
14896 }
14897 printf ("\n");
14898 }
14899 printf ("\n");
14900
14901 if (data)
14902 free (data);
14903 free (rels);
14904 }
14905
14906 return 1;
14907 }
14908
14909 static int
14910 process_nds32_specific (FILE * file)
14911 {
14912 Elf_Internal_Shdr *sect = NULL;
14913
14914 sect = find_section (".nds32_e_flags");
14915 if (sect != NULL)
14916 {
14917 unsigned int *flag;
14918
14919 printf ("\nNDS32 elf flags section:\n");
14920 flag = get_data (NULL, file, sect->sh_offset, 1,
14921 sect->sh_size, _("NDS32 elf flags section"));
14922
14923 switch ((*flag) & 0x3)
14924 {
14925 case 0:
14926 printf ("(VEC_SIZE):\tNo entry.\n");
14927 break;
14928 case 1:
14929 printf ("(VEC_SIZE):\t4 bytes\n");
14930 break;
14931 case 2:
14932 printf ("(VEC_SIZE):\t16 bytes\n");
14933 break;
14934 case 3:
14935 printf ("(VEC_SIZE):\treserved\n");
14936 break;
14937 }
14938 }
14939
14940 return TRUE;
14941 }
14942
14943 static int
14944 process_gnu_liblist (FILE * file)
14945 {
14946 Elf_Internal_Shdr * section;
14947 Elf_Internal_Shdr * string_sec;
14948 Elf32_External_Lib * elib;
14949 char * strtab;
14950 size_t strtab_size;
14951 size_t cnt;
14952 unsigned i;
14953
14954 if (! do_arch)
14955 return 0;
14956
14957 for (i = 0, section = section_headers;
14958 i < elf_header.e_shnum;
14959 i++, section++)
14960 {
14961 switch (section->sh_type)
14962 {
14963 case SHT_GNU_LIBLIST:
14964 if (section->sh_link >= elf_header.e_shnum)
14965 break;
14966
14967 elib = (Elf32_External_Lib *)
14968 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14969 _("liblist section data"));
14970
14971 if (elib == NULL)
14972 break;
14973 string_sec = section_headers + section->sh_link;
14974
14975 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14976 string_sec->sh_size,
14977 _("liblist string table"));
14978 if (strtab == NULL
14979 || section->sh_entsize != sizeof (Elf32_External_Lib))
14980 {
14981 free (elib);
14982 free (strtab);
14983 break;
14984 }
14985 strtab_size = string_sec->sh_size;
14986
14987 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14988 printable_section_name (section),
14989 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14990
14991 puts (_(" Library Time Stamp Checksum Version Flags"));
14992
14993 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14994 ++cnt)
14995 {
14996 Elf32_Lib liblist;
14997 time_t atime;
14998 char timebuf[20];
14999 struct tm * tmp;
15000
15001 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15002 atime = BYTE_GET (elib[cnt].l_time_stamp);
15003 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15004 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15005 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15006
15007 tmp = gmtime (&atime);
15008 snprintf (timebuf, sizeof (timebuf),
15009 "%04u-%02u-%02uT%02u:%02u:%02u",
15010 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15011 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15012
15013 printf ("%3lu: ", (unsigned long) cnt);
15014 if (do_wide)
15015 printf ("%-20s", liblist.l_name < strtab_size
15016 ? strtab + liblist.l_name : _("<corrupt>"));
15017 else
15018 printf ("%-20.20s", liblist.l_name < strtab_size
15019 ? strtab + liblist.l_name : _("<corrupt>"));
15020 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15021 liblist.l_version, liblist.l_flags);
15022 }
15023
15024 free (elib);
15025 free (strtab);
15026 }
15027 }
15028
15029 return 1;
15030 }
15031
15032 static const char *
15033 get_note_type (unsigned e_type)
15034 {
15035 static char buff[64];
15036
15037 if (elf_header.e_type == ET_CORE)
15038 switch (e_type)
15039 {
15040 case NT_AUXV:
15041 return _("NT_AUXV (auxiliary vector)");
15042 case NT_PRSTATUS:
15043 return _("NT_PRSTATUS (prstatus structure)");
15044 case NT_FPREGSET:
15045 return _("NT_FPREGSET (floating point registers)");
15046 case NT_PRPSINFO:
15047 return _("NT_PRPSINFO (prpsinfo structure)");
15048 case NT_TASKSTRUCT:
15049 return _("NT_TASKSTRUCT (task structure)");
15050 case NT_PRXFPREG:
15051 return _("NT_PRXFPREG (user_xfpregs structure)");
15052 case NT_PPC_VMX:
15053 return _("NT_PPC_VMX (ppc Altivec registers)");
15054 case NT_PPC_VSX:
15055 return _("NT_PPC_VSX (ppc VSX registers)");
15056 case NT_386_TLS:
15057 return _("NT_386_TLS (x86 TLS information)");
15058 case NT_386_IOPERM:
15059 return _("NT_386_IOPERM (x86 I/O permissions)");
15060 case NT_X86_XSTATE:
15061 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15062 case NT_S390_HIGH_GPRS:
15063 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15064 case NT_S390_TIMER:
15065 return _("NT_S390_TIMER (s390 timer register)");
15066 case NT_S390_TODCMP:
15067 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15068 case NT_S390_TODPREG:
15069 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15070 case NT_S390_CTRS:
15071 return _("NT_S390_CTRS (s390 control registers)");
15072 case NT_S390_PREFIX:
15073 return _("NT_S390_PREFIX (s390 prefix register)");
15074 case NT_S390_LAST_BREAK:
15075 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15076 case NT_S390_SYSTEM_CALL:
15077 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15078 case NT_S390_TDB:
15079 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15080 case NT_S390_VXRS_LOW:
15081 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15082 case NT_S390_VXRS_HIGH:
15083 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15084 case NT_ARM_VFP:
15085 return _("NT_ARM_VFP (arm VFP registers)");
15086 case NT_ARM_TLS:
15087 return _("NT_ARM_TLS (AArch TLS registers)");
15088 case NT_ARM_HW_BREAK:
15089 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15090 case NT_ARM_HW_WATCH:
15091 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15092 case NT_PSTATUS:
15093 return _("NT_PSTATUS (pstatus structure)");
15094 case NT_FPREGS:
15095 return _("NT_FPREGS (floating point registers)");
15096 case NT_PSINFO:
15097 return _("NT_PSINFO (psinfo structure)");
15098 case NT_LWPSTATUS:
15099 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15100 case NT_LWPSINFO:
15101 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15102 case NT_WIN32PSTATUS:
15103 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15104 case NT_SIGINFO:
15105 return _("NT_SIGINFO (siginfo_t data)");
15106 case NT_FILE:
15107 return _("NT_FILE (mapped files)");
15108 default:
15109 break;
15110 }
15111 else
15112 switch (e_type)
15113 {
15114 case NT_VERSION:
15115 return _("NT_VERSION (version)");
15116 case NT_ARCH:
15117 return _("NT_ARCH (architecture)");
15118 default:
15119 break;
15120 }
15121
15122 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15123 return buff;
15124 }
15125
15126 static int
15127 print_core_note (Elf_Internal_Note *pnote)
15128 {
15129 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15130 bfd_vma count, page_size;
15131 unsigned char *descdata, *filenames, *descend;
15132
15133 if (pnote->type != NT_FILE)
15134 return 1;
15135
15136 #ifndef BFD64
15137 if (!is_32bit_elf)
15138 {
15139 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15140 /* Still "successful". */
15141 return 1;
15142 }
15143 #endif
15144
15145 if (pnote->descsz < 2 * addr_size)
15146 {
15147 printf (_(" Malformed note - too short for header\n"));
15148 return 0;
15149 }
15150
15151 descdata = (unsigned char *) pnote->descdata;
15152 descend = descdata + pnote->descsz;
15153
15154 if (descdata[pnote->descsz - 1] != '\0')
15155 {
15156 printf (_(" Malformed note - does not end with \\0\n"));
15157 return 0;
15158 }
15159
15160 count = byte_get (descdata, addr_size);
15161 descdata += addr_size;
15162
15163 page_size = byte_get (descdata, addr_size);
15164 descdata += addr_size;
15165
15166 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15167 {
15168 printf (_(" Malformed note - too short for supplied file count\n"));
15169 return 0;
15170 }
15171
15172 printf (_(" Page size: "));
15173 print_vma (page_size, DEC);
15174 printf ("\n");
15175
15176 printf (_(" %*s%*s%*s\n"),
15177 (int) (2 + 2 * addr_size), _("Start"),
15178 (int) (4 + 2 * addr_size), _("End"),
15179 (int) (4 + 2 * addr_size), _("Page Offset"));
15180 filenames = descdata + count * 3 * addr_size;
15181 while (count-- > 0)
15182 {
15183 bfd_vma start, end, file_ofs;
15184
15185 if (filenames == descend)
15186 {
15187 printf (_(" Malformed note - filenames end too early\n"));
15188 return 0;
15189 }
15190
15191 start = byte_get (descdata, addr_size);
15192 descdata += addr_size;
15193 end = byte_get (descdata, addr_size);
15194 descdata += addr_size;
15195 file_ofs = byte_get (descdata, addr_size);
15196 descdata += addr_size;
15197
15198 printf (" ");
15199 print_vma (start, FULL_HEX);
15200 printf (" ");
15201 print_vma (end, FULL_HEX);
15202 printf (" ");
15203 print_vma (file_ofs, FULL_HEX);
15204 printf ("\n %s\n", filenames);
15205
15206 filenames += 1 + strlen ((char *) filenames);
15207 }
15208
15209 return 1;
15210 }
15211
15212 static const char *
15213 get_gnu_elf_note_type (unsigned e_type)
15214 {
15215 static char buff[64];
15216
15217 switch (e_type)
15218 {
15219 case NT_GNU_ABI_TAG:
15220 return _("NT_GNU_ABI_TAG (ABI version tag)");
15221 case NT_GNU_HWCAP:
15222 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15223 case NT_GNU_BUILD_ID:
15224 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15225 case NT_GNU_GOLD_VERSION:
15226 return _("NT_GNU_GOLD_VERSION (gold version)");
15227 default:
15228 break;
15229 }
15230
15231 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15232 return buff;
15233 }
15234
15235 static int
15236 print_gnu_note (Elf_Internal_Note *pnote)
15237 {
15238 switch (pnote->type)
15239 {
15240 case NT_GNU_BUILD_ID:
15241 {
15242 unsigned long i;
15243
15244 printf (_(" Build ID: "));
15245 for (i = 0; i < pnote->descsz; ++i)
15246 printf ("%02x", pnote->descdata[i] & 0xff);
15247 printf ("\n");
15248 }
15249 break;
15250
15251 case NT_GNU_ABI_TAG:
15252 {
15253 unsigned long os, major, minor, subminor;
15254 const char *osname;
15255
15256 /* PR 17531: file: 030-599401-0.004. */
15257 if (pnote->descsz < 16)
15258 {
15259 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15260 break;
15261 }
15262
15263 os = byte_get ((unsigned char *) pnote->descdata, 4);
15264 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15265 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15266 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15267
15268 switch (os)
15269 {
15270 case GNU_ABI_TAG_LINUX:
15271 osname = "Linux";
15272 break;
15273 case GNU_ABI_TAG_HURD:
15274 osname = "Hurd";
15275 break;
15276 case GNU_ABI_TAG_SOLARIS:
15277 osname = "Solaris";
15278 break;
15279 case GNU_ABI_TAG_FREEBSD:
15280 osname = "FreeBSD";
15281 break;
15282 case GNU_ABI_TAG_NETBSD:
15283 osname = "NetBSD";
15284 break;
15285 case GNU_ABI_TAG_SYLLABLE:
15286 osname = "Syllable";
15287 break;
15288 case GNU_ABI_TAG_NACL:
15289 osname = "NaCl";
15290 break;
15291 default:
15292 osname = "Unknown";
15293 break;
15294 }
15295
15296 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15297 major, minor, subminor);
15298 }
15299 break;
15300
15301 case NT_GNU_GOLD_VERSION:
15302 {
15303 unsigned long i;
15304
15305 printf (_(" Version: "));
15306 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15307 printf ("%c", pnote->descdata[i]);
15308 printf ("\n");
15309 }
15310 break;
15311 }
15312
15313 return 1;
15314 }
15315
15316 static const char *
15317 get_v850_elf_note_type (enum v850_notes n_type)
15318 {
15319 static char buff[64];
15320
15321 switch (n_type)
15322 {
15323 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15324 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15325 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15326 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15327 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15328 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15329 default:
15330 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15331 return buff;
15332 }
15333 }
15334
15335 static int
15336 print_v850_note (Elf_Internal_Note * pnote)
15337 {
15338 unsigned int val;
15339
15340 if (pnote->descsz != 4)
15341 return 0;
15342 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15343
15344 if (val == 0)
15345 {
15346 printf (_("not set\n"));
15347 return 1;
15348 }
15349
15350 switch (pnote->type)
15351 {
15352 case V850_NOTE_ALIGNMENT:
15353 switch (val)
15354 {
15355 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15356 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15357 }
15358 break;
15359
15360 case V850_NOTE_DATA_SIZE:
15361 switch (val)
15362 {
15363 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15364 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15365 }
15366 break;
15367
15368 case V850_NOTE_FPU_INFO:
15369 switch (val)
15370 {
15371 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15372 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15373 }
15374 break;
15375
15376 case V850_NOTE_MMU_INFO:
15377 case V850_NOTE_CACHE_INFO:
15378 case V850_NOTE_SIMD_INFO:
15379 if (val == EF_RH850_SIMD)
15380 {
15381 printf (_("yes\n"));
15382 return 1;
15383 }
15384 break;
15385
15386 default:
15387 /* An 'unknown note type' message will already have been displayed. */
15388 break;
15389 }
15390
15391 printf (_("unknown value: %x\n"), val);
15392 return 0;
15393 }
15394
15395 static int
15396 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15397 {
15398 unsigned int version;
15399
15400 switch (pnote->type)
15401 {
15402 case NT_NETBSD_IDENT:
15403 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15404 if ((version / 10000) % 100)
15405 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15406 version, version / 100000000, (version / 1000000) % 100,
15407 (version / 10000) % 100 > 26 ? "Z" : "",
15408 'A' + (version / 10000) % 26);
15409 else
15410 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15411 version, version / 100000000, (version / 1000000) % 100,
15412 (version / 100) % 100);
15413 return 1;
15414
15415 case NT_NETBSD_MARCH:
15416 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15417 pnote->descdata);
15418 return 1;
15419
15420 default:
15421 break;
15422 }
15423
15424 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15425 pnote->type);
15426 return 1;
15427 }
15428
15429 static const char *
15430 get_freebsd_elfcore_note_type (unsigned e_type)
15431 {
15432 switch (e_type)
15433 {
15434 case NT_FREEBSD_THRMISC:
15435 return _("NT_THRMISC (thrmisc structure)");
15436 case NT_FREEBSD_PROCSTAT_PROC:
15437 return _("NT_PROCSTAT_PROC (proc data)");
15438 case NT_FREEBSD_PROCSTAT_FILES:
15439 return _("NT_PROCSTAT_FILES (files data)");
15440 case NT_FREEBSD_PROCSTAT_VMMAP:
15441 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15442 case NT_FREEBSD_PROCSTAT_GROUPS:
15443 return _("NT_PROCSTAT_GROUPS (groups data)");
15444 case NT_FREEBSD_PROCSTAT_UMASK:
15445 return _("NT_PROCSTAT_UMASK (umask data)");
15446 case NT_FREEBSD_PROCSTAT_RLIMIT:
15447 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15448 case NT_FREEBSD_PROCSTAT_OSREL:
15449 return _("NT_PROCSTAT_OSREL (osreldate data)");
15450 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15451 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15452 case NT_FREEBSD_PROCSTAT_AUXV:
15453 return _("NT_PROCSTAT_AUXV (auxv data)");
15454 }
15455 return get_note_type (e_type);
15456 }
15457
15458 static const char *
15459 get_netbsd_elfcore_note_type (unsigned e_type)
15460 {
15461 static char buff[64];
15462
15463 if (e_type == NT_NETBSDCORE_PROCINFO)
15464 {
15465 /* NetBSD core "procinfo" structure. */
15466 return _("NetBSD procinfo structure");
15467 }
15468
15469 /* As of Jan 2002 there are no other machine-independent notes
15470 defined for NetBSD core files. If the note type is less
15471 than the start of the machine-dependent note types, we don't
15472 understand it. */
15473
15474 if (e_type < NT_NETBSDCORE_FIRSTMACH)
15475 {
15476 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15477 return buff;
15478 }
15479
15480 switch (elf_header.e_machine)
15481 {
15482 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15483 and PT_GETFPREGS == mach+2. */
15484
15485 case EM_OLD_ALPHA:
15486 case EM_ALPHA:
15487 case EM_SPARC:
15488 case EM_SPARC32PLUS:
15489 case EM_SPARCV9:
15490 switch (e_type)
15491 {
15492 case NT_NETBSDCORE_FIRSTMACH + 0:
15493 return _("PT_GETREGS (reg structure)");
15494 case NT_NETBSDCORE_FIRSTMACH + 2:
15495 return _("PT_GETFPREGS (fpreg structure)");
15496 default:
15497 break;
15498 }
15499 break;
15500
15501 /* On all other arch's, PT_GETREGS == mach+1 and
15502 PT_GETFPREGS == mach+3. */
15503 default:
15504 switch (e_type)
15505 {
15506 case NT_NETBSDCORE_FIRSTMACH + 1:
15507 return _("PT_GETREGS (reg structure)");
15508 case NT_NETBSDCORE_FIRSTMACH + 3:
15509 return _("PT_GETFPREGS (fpreg structure)");
15510 default:
15511 break;
15512 }
15513 }
15514
15515 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15516 e_type - NT_NETBSDCORE_FIRSTMACH);
15517 return buff;
15518 }
15519
15520 static const char *
15521 get_stapsdt_note_type (unsigned e_type)
15522 {
15523 static char buff[64];
15524
15525 switch (e_type)
15526 {
15527 case NT_STAPSDT:
15528 return _("NT_STAPSDT (SystemTap probe descriptors)");
15529
15530 default:
15531 break;
15532 }
15533
15534 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15535 return buff;
15536 }
15537
15538 static int
15539 print_stapsdt_note (Elf_Internal_Note *pnote)
15540 {
15541 int addr_size = is_32bit_elf ? 4 : 8;
15542 char *data = pnote->descdata;
15543 char *data_end = pnote->descdata + pnote->descsz;
15544 bfd_vma pc, base_addr, semaphore;
15545 char *provider, *probe, *arg_fmt;
15546
15547 pc = byte_get ((unsigned char *) data, addr_size);
15548 data += addr_size;
15549 base_addr = byte_get ((unsigned char *) data, addr_size);
15550 data += addr_size;
15551 semaphore = byte_get ((unsigned char *) data, addr_size);
15552 data += addr_size;
15553
15554 provider = data;
15555 data += strlen (data) + 1;
15556 probe = data;
15557 data += strlen (data) + 1;
15558 arg_fmt = data;
15559 data += strlen (data) + 1;
15560
15561 printf (_(" Provider: %s\n"), provider);
15562 printf (_(" Name: %s\n"), probe);
15563 printf (_(" Location: "));
15564 print_vma (pc, FULL_HEX);
15565 printf (_(", Base: "));
15566 print_vma (base_addr, FULL_HEX);
15567 printf (_(", Semaphore: "));
15568 print_vma (semaphore, FULL_HEX);
15569 printf ("\n");
15570 printf (_(" Arguments: %s\n"), arg_fmt);
15571
15572 return data == data_end;
15573 }
15574
15575 static const char *
15576 get_ia64_vms_note_type (unsigned e_type)
15577 {
15578 static char buff[64];
15579
15580 switch (e_type)
15581 {
15582 case NT_VMS_MHD:
15583 return _("NT_VMS_MHD (module header)");
15584 case NT_VMS_LNM:
15585 return _("NT_VMS_LNM (language name)");
15586 case NT_VMS_SRC:
15587 return _("NT_VMS_SRC (source files)");
15588 case NT_VMS_TITLE:
15589 return "NT_VMS_TITLE";
15590 case NT_VMS_EIDC:
15591 return _("NT_VMS_EIDC (consistency check)");
15592 case NT_VMS_FPMODE:
15593 return _("NT_VMS_FPMODE (FP mode)");
15594 case NT_VMS_LINKTIME:
15595 return "NT_VMS_LINKTIME";
15596 case NT_VMS_IMGNAM:
15597 return _("NT_VMS_IMGNAM (image name)");
15598 case NT_VMS_IMGID:
15599 return _("NT_VMS_IMGID (image id)");
15600 case NT_VMS_LINKID:
15601 return _("NT_VMS_LINKID (link id)");
15602 case NT_VMS_IMGBID:
15603 return _("NT_VMS_IMGBID (build id)");
15604 case NT_VMS_GSTNAM:
15605 return _("NT_VMS_GSTNAM (sym table name)");
15606 case NT_VMS_ORIG_DYN:
15607 return "NT_VMS_ORIG_DYN";
15608 case NT_VMS_PATCHTIME:
15609 return "NT_VMS_PATCHTIME";
15610 default:
15611 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15612 return buff;
15613 }
15614 }
15615
15616 static int
15617 print_ia64_vms_note (Elf_Internal_Note * pnote)
15618 {
15619 switch (pnote->type)
15620 {
15621 case NT_VMS_MHD:
15622 if (pnote->descsz > 36)
15623 {
15624 size_t l = strlen (pnote->descdata + 34);
15625 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15626 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15627 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15628 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15629 }
15630 else
15631 printf (_(" Invalid size\n"));
15632 break;
15633 case NT_VMS_LNM:
15634 printf (_(" Language: %s\n"), pnote->descdata);
15635 break;
15636 #ifdef BFD64
15637 case NT_VMS_FPMODE:
15638 printf (_(" Floating Point mode: "));
15639 printf ("0x%016" BFD_VMA_FMT "x\n",
15640 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15641 break;
15642 case NT_VMS_LINKTIME:
15643 printf (_(" Link time: "));
15644 print_vms_time
15645 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15646 printf ("\n");
15647 break;
15648 case NT_VMS_PATCHTIME:
15649 printf (_(" Patch time: "));
15650 print_vms_time
15651 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15652 printf ("\n");
15653 break;
15654 case NT_VMS_ORIG_DYN:
15655 printf (_(" Major id: %u, minor id: %u\n"),
15656 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15657 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15658 printf (_(" Last modified : "));
15659 print_vms_time
15660 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15661 printf (_("\n Link flags : "));
15662 printf ("0x%016" BFD_VMA_FMT "x\n",
15663 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15664 printf (_(" Header flags: 0x%08x\n"),
15665 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15666 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15667 break;
15668 #endif
15669 case NT_VMS_IMGNAM:
15670 printf (_(" Image name: %s\n"), pnote->descdata);
15671 break;
15672 case NT_VMS_GSTNAM:
15673 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15674 break;
15675 case NT_VMS_IMGID:
15676 printf (_(" Image id: %s\n"), pnote->descdata);
15677 break;
15678 case NT_VMS_LINKID:
15679 printf (_(" Linker id: %s\n"), pnote->descdata);
15680 break;
15681 default:
15682 break;
15683 }
15684 return 1;
15685 }
15686
15687 /* Note that by the ELF standard, the name field is already null byte
15688 terminated, and namesz includes the terminating null byte.
15689 I.E. the value of namesz for the name "FSF" is 4.
15690
15691 If the value of namesz is zero, there is no name present. */
15692 static int
15693 process_note (Elf_Internal_Note * pnote)
15694 {
15695 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15696 const char * nt;
15697
15698 if (pnote->namesz == 0)
15699 /* If there is no note name, then use the default set of
15700 note type strings. */
15701 nt = get_note_type (pnote->type);
15702
15703 else if (const_strneq (pnote->namedata, "GNU"))
15704 /* GNU-specific object file notes. */
15705 nt = get_gnu_elf_note_type (pnote->type);
15706
15707 else if (const_strneq (pnote->namedata, "FreeBSD"))
15708 /* FreeBSD-specific core file notes. */
15709 nt = get_freebsd_elfcore_note_type (pnote->type);
15710
15711 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15712 /* NetBSD-specific core file notes. */
15713 nt = get_netbsd_elfcore_note_type (pnote->type);
15714
15715 else if (const_strneq (pnote->namedata, "NetBSD"))
15716 /* NetBSD-specific core file notes. */
15717 return process_netbsd_elf_note (pnote);
15718
15719 else if (strneq (pnote->namedata, "SPU/", 4))
15720 {
15721 /* SPU-specific core file notes. */
15722 nt = pnote->namedata + 4;
15723 name = "SPU";
15724 }
15725
15726 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15727 /* VMS/ia64-specific file notes. */
15728 nt = get_ia64_vms_note_type (pnote->type);
15729
15730 else if (const_strneq (pnote->namedata, "stapsdt"))
15731 nt = get_stapsdt_note_type (pnote->type);
15732
15733 else
15734 /* Don't recognize this note name; just use the default set of
15735 note type strings. */
15736 nt = get_note_type (pnote->type);
15737
15738 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15739
15740 if (const_strneq (pnote->namedata, "IPF/VMS"))
15741 return print_ia64_vms_note (pnote);
15742 else if (const_strneq (pnote->namedata, "GNU"))
15743 return print_gnu_note (pnote);
15744 else if (const_strneq (pnote->namedata, "stapsdt"))
15745 return print_stapsdt_note (pnote);
15746 else if (const_strneq (pnote->namedata, "CORE"))
15747 return print_core_note (pnote);
15748 else
15749 return 1;
15750 }
15751
15752
15753 static int
15754 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15755 {
15756 Elf_External_Note * pnotes;
15757 Elf_External_Note * external;
15758 char * end;
15759 int res = 1;
15760
15761 if (length <= 0)
15762 return 0;
15763
15764 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15765 _("notes"));
15766 if (pnotes == NULL)
15767 return 0;
15768
15769 external = pnotes;
15770
15771 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15772 (unsigned long) offset, (unsigned long) length);
15773 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15774
15775 end = (char *) pnotes + length;
15776 while ((char *) external < end)
15777 {
15778 Elf_Internal_Note inote;
15779 size_t min_notesz;
15780 char *next;
15781 char * temp = NULL;
15782 size_t data_remaining = end - (char *) external;
15783
15784 if (!is_ia64_vms ())
15785 {
15786 /* PR binutils/15191
15787 Make sure that there is enough data to read. */
15788 min_notesz = offsetof (Elf_External_Note, name);
15789 if (data_remaining < min_notesz)
15790 {
15791 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15792 (int) data_remaining);
15793 break;
15794 }
15795 inote.type = BYTE_GET (external->type);
15796 inote.namesz = BYTE_GET (external->namesz);
15797 inote.namedata = external->name;
15798 inote.descsz = BYTE_GET (external->descsz);
15799 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15800 /* PR 17531: file: 3443835e. */
15801 if (inote.descdata < (char *) pnotes || inote.descdata > end)
15802 {
15803 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15804 inote.descdata = inote.namedata;
15805 inote.namesz = 0;
15806 }
15807
15808 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15809 next = inote.descdata + align_power (inote.descsz, 2);
15810 }
15811 else
15812 {
15813 Elf64_External_VMS_Note *vms_external;
15814
15815 /* PR binutils/15191
15816 Make sure that there is enough data to read. */
15817 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15818 if (data_remaining < min_notesz)
15819 {
15820 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15821 (int) data_remaining);
15822 break;
15823 }
15824
15825 vms_external = (Elf64_External_VMS_Note *) external;
15826 inote.type = BYTE_GET (vms_external->type);
15827 inote.namesz = BYTE_GET (vms_external->namesz);
15828 inote.namedata = vms_external->name;
15829 inote.descsz = BYTE_GET (vms_external->descsz);
15830 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15831 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15832 next = inote.descdata + align_power (inote.descsz, 3);
15833 }
15834
15835 if (inote.descdata < (char *) external + min_notesz
15836 || next < (char *) external + min_notesz
15837 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15838 || inote.namedata + inote.namesz < inote.namedata
15839 || inote.descdata + inote.descsz < inote.descdata
15840 || data_remaining < (size_t)(next - (char *) external))
15841 {
15842 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15843 (unsigned long) ((char *) external - (char *) pnotes));
15844 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15845 inote.type, inote.namesz, inote.descsz);
15846 break;
15847 }
15848
15849 external = (Elf_External_Note *) next;
15850
15851 /* Verify that name is null terminated. It appears that at least
15852 one version of Linux (RedHat 6.0) generates corefiles that don't
15853 comply with the ELF spec by failing to include the null byte in
15854 namesz. */
15855 if (inote.namedata[inote.namesz - 1] != '\0')
15856 {
15857 temp = (char *) malloc (inote.namesz + 1);
15858 if (temp == NULL)
15859 {
15860 error (_("Out of memory allocating space for inote name\n"));
15861 res = 0;
15862 break;
15863 }
15864
15865 strncpy (temp, inote.namedata, inote.namesz);
15866 temp[inote.namesz] = 0;
15867
15868 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15869 inote.namedata = temp;
15870 }
15871
15872 res &= process_note (& inote);
15873
15874 if (temp != NULL)
15875 {
15876 free (temp);
15877 temp = NULL;
15878 }
15879 }
15880
15881 free (pnotes);
15882
15883 return res;
15884 }
15885
15886 static int
15887 process_corefile_note_segments (FILE * file)
15888 {
15889 Elf_Internal_Phdr * segment;
15890 unsigned int i;
15891 int res = 1;
15892
15893 if (! get_program_headers (file))
15894 return 0;
15895
15896 for (i = 0, segment = program_headers;
15897 i < elf_header.e_phnum;
15898 i++, segment++)
15899 {
15900 if (segment->p_type == PT_NOTE)
15901 res &= process_corefile_note_segment (file,
15902 (bfd_vma) segment->p_offset,
15903 (bfd_vma) segment->p_filesz);
15904 }
15905
15906 return res;
15907 }
15908
15909 static int
15910 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15911 {
15912 Elf_External_Note * pnotes;
15913 Elf_External_Note * external;
15914 char * end;
15915 int res = 1;
15916
15917 if (length <= 0)
15918 return 0;
15919
15920 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15921 _("v850 notes"));
15922 if (pnotes == NULL)
15923 return 0;
15924
15925 external = pnotes;
15926 end = (char*) pnotes + length;
15927
15928 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15929 (unsigned long) offset, (unsigned long) length);
15930
15931 while ((char *) external + sizeof (Elf_External_Note) < end)
15932 {
15933 Elf_External_Note * next;
15934 Elf_Internal_Note inote;
15935
15936 inote.type = BYTE_GET (external->type);
15937 inote.namesz = BYTE_GET (external->namesz);
15938 inote.namedata = external->name;
15939 inote.descsz = BYTE_GET (external->descsz);
15940 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15941 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15942
15943 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
15944 {
15945 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15946 inote.descdata = inote.namedata;
15947 inote.namesz = 0;
15948 }
15949
15950 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15951
15952 if ( ((char *) next > end)
15953 || ((char *) next < (char *) pnotes))
15954 {
15955 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15956 (unsigned long) ((char *) external - (char *) pnotes));
15957 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15958 inote.type, inote.namesz, inote.descsz);
15959 break;
15960 }
15961
15962 external = next;
15963
15964 /* Prevent out-of-bounds indexing. */
15965 if ( inote.namedata + inote.namesz > end
15966 || inote.namedata + inote.namesz < inote.namedata)
15967 {
15968 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15969 (unsigned long) ((char *) external - (char *) pnotes));
15970 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15971 inote.type, inote.namesz, inote.descsz);
15972 break;
15973 }
15974
15975 printf (" %s: ", get_v850_elf_note_type (inote.type));
15976
15977 if (! print_v850_note (& inote))
15978 {
15979 res = 0;
15980 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15981 inote.namesz, inote.descsz);
15982 }
15983 }
15984
15985 free (pnotes);
15986
15987 return res;
15988 }
15989
15990 static int
15991 process_note_sections (FILE * file)
15992 {
15993 Elf_Internal_Shdr * section;
15994 unsigned long i;
15995 int n = 0;
15996 int res = 1;
15997
15998 for (i = 0, section = section_headers;
15999 i < elf_header.e_shnum && section != NULL;
16000 i++, section++)
16001 {
16002 if (section->sh_type == SHT_NOTE)
16003 {
16004 res &= process_corefile_note_segment (file,
16005 (bfd_vma) section->sh_offset,
16006 (bfd_vma) section->sh_size);
16007 n++;
16008 }
16009
16010 if (( elf_header.e_machine == EM_V800
16011 || elf_header.e_machine == EM_V850
16012 || elf_header.e_machine == EM_CYGNUS_V850)
16013 && section->sh_type == SHT_RENESAS_INFO)
16014 {
16015 res &= process_v850_notes (file,
16016 (bfd_vma) section->sh_offset,
16017 (bfd_vma) section->sh_size);
16018 n++;
16019 }
16020 }
16021
16022 if (n == 0)
16023 /* Try processing NOTE segments instead. */
16024 return process_corefile_note_segments (file);
16025
16026 return res;
16027 }
16028
16029 static int
16030 process_notes (FILE * file)
16031 {
16032 /* If we have not been asked to display the notes then do nothing. */
16033 if (! do_notes)
16034 return 1;
16035
16036 if (elf_header.e_type != ET_CORE)
16037 return process_note_sections (file);
16038
16039 /* No program headers means no NOTE segment. */
16040 if (elf_header.e_phnum > 0)
16041 return process_corefile_note_segments (file);
16042
16043 printf (_("No note segments present in the core file.\n"));
16044 return 1;
16045 }
16046
16047 static int
16048 process_arch_specific (FILE * file)
16049 {
16050 if (! do_arch)
16051 return 1;
16052
16053 switch (elf_header.e_machine)
16054 {
16055 case EM_ARM:
16056 return process_arm_specific (file);
16057 case EM_MIPS:
16058 case EM_MIPS_RS3_LE:
16059 return process_mips_specific (file);
16060 break;
16061 case EM_NDS32:
16062 return process_nds32_specific (file);
16063 break;
16064 case EM_PPC:
16065 return process_power_specific (file);
16066 break;
16067 case EM_S390:
16068 case EM_S390_OLD:
16069 return process_s390_specific (file);
16070 break;
16071 case EM_SPARC:
16072 case EM_SPARC32PLUS:
16073 case EM_SPARCV9:
16074 return process_sparc_specific (file);
16075 break;
16076 case EM_TI_C6000:
16077 return process_tic6x_specific (file);
16078 break;
16079 case EM_MSP430:
16080 return process_msp430x_specific (file);
16081 default:
16082 break;
16083 }
16084 return 1;
16085 }
16086
16087 static int
16088 get_file_header (FILE * file)
16089 {
16090 /* Read in the identity array. */
16091 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16092 return 0;
16093
16094 /* Determine how to read the rest of the header. */
16095 switch (elf_header.e_ident[EI_DATA])
16096 {
16097 default: /* fall through */
16098 case ELFDATANONE: /* fall through */
16099 case ELFDATA2LSB:
16100 byte_get = byte_get_little_endian;
16101 byte_put = byte_put_little_endian;
16102 break;
16103 case ELFDATA2MSB:
16104 byte_get = byte_get_big_endian;
16105 byte_put = byte_put_big_endian;
16106 break;
16107 }
16108
16109 /* For now we only support 32 bit and 64 bit ELF files. */
16110 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16111
16112 /* Read in the rest of the header. */
16113 if (is_32bit_elf)
16114 {
16115 Elf32_External_Ehdr ehdr32;
16116
16117 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16118 return 0;
16119
16120 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16121 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16122 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16123 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16124 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16125 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16126 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16127 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16128 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16129 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16130 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16131 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16132 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16133 }
16134 else
16135 {
16136 Elf64_External_Ehdr ehdr64;
16137
16138 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16139 we will not be able to cope with the 64bit data found in
16140 64 ELF files. Detect this now and abort before we start
16141 overwriting things. */
16142 if (sizeof (bfd_vma) < 8)
16143 {
16144 error (_("This instance of readelf has been built without support for a\n\
16145 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16146 return 0;
16147 }
16148
16149 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16150 return 0;
16151
16152 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16153 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16154 elf_header.e_version = BYTE_GET (ehdr64.e_version);
16155 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16156 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16157 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
16158 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16159 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16160 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16161 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16162 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16163 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16164 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16165 }
16166
16167 if (elf_header.e_shoff)
16168 {
16169 /* There may be some extensions in the first section header. Don't
16170 bomb if we can't read it. */
16171 if (is_32bit_elf)
16172 get_32bit_section_headers (file, TRUE);
16173 else
16174 get_64bit_section_headers (file, TRUE);
16175 }
16176
16177 return 1;
16178 }
16179
16180 /* Process one ELF object file according to the command line options.
16181 This file may actually be stored in an archive. The file is
16182 positioned at the start of the ELF object. */
16183
16184 static int
16185 process_object (char * file_name, FILE * file)
16186 {
16187 unsigned int i;
16188
16189 if (! get_file_header (file))
16190 {
16191 error (_("%s: Failed to read file header\n"), file_name);
16192 return 1;
16193 }
16194
16195 /* Initialise per file variables. */
16196 for (i = ARRAY_SIZE (version_info); i--;)
16197 version_info[i] = 0;
16198
16199 for (i = ARRAY_SIZE (dynamic_info); i--;)
16200 dynamic_info[i] = 0;
16201 dynamic_info_DT_GNU_HASH = 0;
16202
16203 /* Process the file. */
16204 if (show_name)
16205 printf (_("\nFile: %s\n"), file_name);
16206
16207 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16208 Note we do this even if cmdline_dump_sects is empty because we
16209 must make sure that the dump_sets array is zeroed out before each
16210 object file is processed. */
16211 if (num_dump_sects > num_cmdline_dump_sects)
16212 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16213
16214 if (num_cmdline_dump_sects > 0)
16215 {
16216 if (num_dump_sects == 0)
16217 /* A sneaky way of allocating the dump_sects array. */
16218 request_dump_bynumber (num_cmdline_dump_sects, 0);
16219
16220 assert (num_dump_sects >= num_cmdline_dump_sects);
16221 memcpy (dump_sects, cmdline_dump_sects,
16222 num_cmdline_dump_sects * sizeof (* dump_sects));
16223 }
16224
16225 if (! process_file_header ())
16226 return 1;
16227
16228 if (! process_section_headers (file))
16229 {
16230 /* Without loaded section headers we cannot process lots of
16231 things. */
16232 do_unwind = do_version = do_dump = do_arch = 0;
16233
16234 if (! do_using_dynamic)
16235 do_syms = do_dyn_syms = do_reloc = 0;
16236 }
16237
16238 if (! process_section_groups (file))
16239 {
16240 /* Without loaded section groups we cannot process unwind. */
16241 do_unwind = 0;
16242 }
16243
16244 if (process_program_headers (file))
16245 process_dynamic_section (file);
16246
16247 process_relocs (file);
16248
16249 process_unwind (file);
16250
16251 process_symbol_table (file);
16252
16253 process_syminfo (file);
16254
16255 process_version_sections (file);
16256
16257 process_section_contents (file);
16258
16259 process_notes (file);
16260
16261 process_gnu_liblist (file);
16262
16263 process_arch_specific (file);
16264
16265 if (program_headers)
16266 {
16267 free (program_headers);
16268 program_headers = NULL;
16269 }
16270
16271 if (section_headers)
16272 {
16273 free (section_headers);
16274 section_headers = NULL;
16275 }
16276
16277 if (string_table)
16278 {
16279 free (string_table);
16280 string_table = NULL;
16281 string_table_length = 0;
16282 }
16283
16284 if (dynamic_strings)
16285 {
16286 free (dynamic_strings);
16287 dynamic_strings = NULL;
16288 dynamic_strings_length = 0;
16289 }
16290
16291 if (dynamic_symbols)
16292 {
16293 free (dynamic_symbols);
16294 dynamic_symbols = NULL;
16295 num_dynamic_syms = 0;
16296 }
16297
16298 if (dynamic_syminfo)
16299 {
16300 free (dynamic_syminfo);
16301 dynamic_syminfo = NULL;
16302 }
16303
16304 if (dynamic_section)
16305 {
16306 free (dynamic_section);
16307 dynamic_section = NULL;
16308 }
16309
16310 if (section_headers_groups)
16311 {
16312 free (section_headers_groups);
16313 section_headers_groups = NULL;
16314 }
16315
16316 if (section_groups)
16317 {
16318 struct group_list * g;
16319 struct group_list * next;
16320
16321 for (i = 0; i < group_count; i++)
16322 {
16323 for (g = section_groups [i].root; g != NULL; g = next)
16324 {
16325 next = g->next;
16326 free (g);
16327 }
16328 }
16329
16330 free (section_groups);
16331 section_groups = NULL;
16332 }
16333
16334 free_debug_memory ();
16335
16336 return 0;
16337 }
16338
16339 /* Process an ELF archive.
16340 On entry the file is positioned just after the ARMAG string. */
16341
16342 static int
16343 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16344 {
16345 struct archive_info arch;
16346 struct archive_info nested_arch;
16347 size_t got;
16348 int ret;
16349
16350 show_name = 1;
16351
16352 /* The ARCH structure is used to hold information about this archive. */
16353 arch.file_name = NULL;
16354 arch.file = NULL;
16355 arch.index_array = NULL;
16356 arch.sym_table = NULL;
16357 arch.longnames = NULL;
16358
16359 /* The NESTED_ARCH structure is used as a single-item cache of information
16360 about a nested archive (when members of a thin archive reside within
16361 another regular archive file). */
16362 nested_arch.file_name = NULL;
16363 nested_arch.file = NULL;
16364 nested_arch.index_array = NULL;
16365 nested_arch.sym_table = NULL;
16366 nested_arch.longnames = NULL;
16367
16368 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16369 {
16370 ret = 1;
16371 goto out;
16372 }
16373
16374 if (do_archive_index)
16375 {
16376 if (arch.sym_table == NULL)
16377 error (_("%s: unable to dump the index as none was found\n"), file_name);
16378 else
16379 {
16380 unsigned long i, l;
16381 unsigned long current_pos;
16382
16383 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16384 file_name, (unsigned long) arch.index_num, arch.sym_size);
16385 current_pos = ftell (file);
16386
16387 for (i = l = 0; i < arch.index_num; i++)
16388 {
16389 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16390 {
16391 char * member_name;
16392
16393 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16394
16395 if (member_name != NULL)
16396 {
16397 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16398
16399 if (qualified_name != NULL)
16400 {
16401 printf (_("Contents of binary %s at offset "), qualified_name);
16402 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16403 putchar ('\n');
16404 free (qualified_name);
16405 }
16406 }
16407 }
16408
16409 if (l >= arch.sym_size)
16410 {
16411 error (_("%s: end of the symbol table reached before the end of the index\n"),
16412 file_name);
16413 break;
16414 }
16415 /* PR 17531: file: 0b6630b2. */
16416 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16417 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16418 }
16419
16420 if (arch.uses_64bit_indicies)
16421 l = (l + 7) & ~ 7;
16422 else
16423 l += l & 1;
16424
16425 if (l < arch.sym_size)
16426 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16427 file_name, arch.sym_size - l);
16428
16429 if (fseek (file, current_pos, SEEK_SET) != 0)
16430 {
16431 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16432 ret = 1;
16433 goto out;
16434 }
16435 }
16436
16437 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16438 && !do_segments && !do_header && !do_dump && !do_version
16439 && !do_histogram && !do_debugging && !do_arch && !do_notes
16440 && !do_section_groups && !do_dyn_syms)
16441 {
16442 ret = 0; /* Archive index only. */
16443 goto out;
16444 }
16445 }
16446
16447 ret = 0;
16448
16449 while (1)
16450 {
16451 char * name;
16452 size_t namelen;
16453 char * qualified_name;
16454
16455 /* Read the next archive header. */
16456 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16457 {
16458 error (_("%s: failed to seek to next archive header\n"), file_name);
16459 return 1;
16460 }
16461 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16462 if (got != sizeof arch.arhdr)
16463 {
16464 if (got == 0)
16465 break;
16466 error (_("%s: failed to read archive header\n"), file_name);
16467 ret = 1;
16468 break;
16469 }
16470 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16471 {
16472 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16473 ret = 1;
16474 break;
16475 }
16476
16477 arch.next_arhdr_offset += sizeof arch.arhdr;
16478
16479 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16480 if (archive_file_size & 01)
16481 ++archive_file_size;
16482
16483 name = get_archive_member_name (&arch, &nested_arch);
16484 if (name == NULL)
16485 {
16486 error (_("%s: bad archive file name\n"), file_name);
16487 ret = 1;
16488 break;
16489 }
16490 namelen = strlen (name);
16491
16492 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16493 if (qualified_name == NULL)
16494 {
16495 error (_("%s: bad archive file name\n"), file_name);
16496 ret = 1;
16497 break;
16498 }
16499
16500 if (is_thin_archive && arch.nested_member_origin == 0)
16501 {
16502 /* This is a proxy for an external member of a thin archive. */
16503 FILE * member_file;
16504 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16505 if (member_file_name == NULL)
16506 {
16507 ret = 1;
16508 break;
16509 }
16510
16511 member_file = fopen (member_file_name, "rb");
16512 if (member_file == NULL)
16513 {
16514 error (_("Input file '%s' is not readable.\n"), member_file_name);
16515 free (member_file_name);
16516 ret = 1;
16517 break;
16518 }
16519
16520 archive_file_offset = arch.nested_member_origin;
16521
16522 ret |= process_object (qualified_name, member_file);
16523
16524 fclose (member_file);
16525 free (member_file_name);
16526 }
16527 else if (is_thin_archive)
16528 {
16529 /* PR 15140: Allow for corrupt thin archives. */
16530 if (nested_arch.file == NULL)
16531 {
16532 error (_("%s: contains corrupt thin archive: %s\n"),
16533 file_name, name);
16534 ret = 1;
16535 break;
16536 }
16537
16538 /* This is a proxy for a member of a nested archive. */
16539 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16540
16541 /* The nested archive file will have been opened and setup by
16542 get_archive_member_name. */
16543 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16544 {
16545 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16546 ret = 1;
16547 break;
16548 }
16549
16550 ret |= process_object (qualified_name, nested_arch.file);
16551 }
16552 else
16553 {
16554 archive_file_offset = arch.next_arhdr_offset;
16555 arch.next_arhdr_offset += archive_file_size;
16556
16557 ret |= process_object (qualified_name, file);
16558 }
16559
16560 if (dump_sects != NULL)
16561 {
16562 free (dump_sects);
16563 dump_sects = NULL;
16564 num_dump_sects = 0;
16565 }
16566
16567 free (qualified_name);
16568 }
16569
16570 out:
16571 if (nested_arch.file != NULL)
16572 fclose (nested_arch.file);
16573 release_archive (&nested_arch);
16574 release_archive (&arch);
16575
16576 return ret;
16577 }
16578
16579 static int
16580 process_file (char * file_name)
16581 {
16582 FILE * file;
16583 struct stat statbuf;
16584 char armag[SARMAG];
16585 int ret;
16586
16587 if (stat (file_name, &statbuf) < 0)
16588 {
16589 if (errno == ENOENT)
16590 error (_("'%s': No such file\n"), file_name);
16591 else
16592 error (_("Could not locate '%s'. System error message: %s\n"),
16593 file_name, strerror (errno));
16594 return 1;
16595 }
16596
16597 if (! S_ISREG (statbuf.st_mode))
16598 {
16599 error (_("'%s' is not an ordinary file\n"), file_name);
16600 return 1;
16601 }
16602
16603 file = fopen (file_name, "rb");
16604 if (file == NULL)
16605 {
16606 error (_("Input file '%s' is not readable.\n"), file_name);
16607 return 1;
16608 }
16609
16610 if (fread (armag, SARMAG, 1, file) != 1)
16611 {
16612 error (_("%s: Failed to read file's magic number\n"), file_name);
16613 fclose (file);
16614 return 1;
16615 }
16616
16617 current_file_size = (bfd_size_type) statbuf.st_size;
16618
16619 if (memcmp (armag, ARMAG, SARMAG) == 0)
16620 ret = process_archive (file_name, file, FALSE);
16621 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16622 ret = process_archive (file_name, file, TRUE);
16623 else
16624 {
16625 if (do_archive_index)
16626 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16627 file_name);
16628
16629 rewind (file);
16630 archive_file_size = archive_file_offset = 0;
16631 ret = process_object (file_name, file);
16632 }
16633
16634 fclose (file);
16635
16636 current_file_size = 0;
16637 return ret;
16638 }
16639
16640 #ifdef SUPPORT_DISASSEMBLY
16641 /* Needed by the i386 disassembler. For extra credit, someone could
16642 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16643 symbols. */
16644
16645 void
16646 print_address (unsigned int addr, FILE * outfile)
16647 {
16648 fprintf (outfile,"0x%8.8x", addr);
16649 }
16650
16651 /* Needed by the i386 disassembler. */
16652 void
16653 db_task_printsym (unsigned int addr)
16654 {
16655 print_address (addr, stderr);
16656 }
16657 #endif
16658
16659 int
16660 main (int argc, char ** argv)
16661 {
16662 int err;
16663
16664 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16665 setlocale (LC_MESSAGES, "");
16666 #endif
16667 #if defined (HAVE_SETLOCALE)
16668 setlocale (LC_CTYPE, "");
16669 #endif
16670 bindtextdomain (PACKAGE, LOCALEDIR);
16671 textdomain (PACKAGE);
16672
16673 expandargv (&argc, &argv);
16674
16675 parse_args (argc, argv);
16676
16677 if (num_dump_sects > 0)
16678 {
16679 /* Make a copy of the dump_sects array. */
16680 cmdline_dump_sects = (dump_type *)
16681 malloc (num_dump_sects * sizeof (* dump_sects));
16682 if (cmdline_dump_sects == NULL)
16683 error (_("Out of memory allocating dump request table.\n"));
16684 else
16685 {
16686 memcpy (cmdline_dump_sects, dump_sects,
16687 num_dump_sects * sizeof (* dump_sects));
16688 num_cmdline_dump_sects = num_dump_sects;
16689 }
16690 }
16691
16692 if (optind < (argc - 1))
16693 show_name = 1;
16694 else if (optind >= argc)
16695 {
16696 warn (_("Nothing to do.\n"));
16697 usage (stderr);
16698 }
16699
16700 err = 0;
16701 while (optind < argc)
16702 err |= process_file (argv[optind++]);
16703
16704 if (dump_sects != NULL)
16705 free (dump_sects);
16706 if (cmdline_dump_sects != NULL)
16707 free (cmdline_dump_sects);
16708
16709 return err;
16710 }
This page took 0.873646 seconds and 4 git commands to generate.