Place .shstrtab section after .symtab and .strtab, thus restoring monotonically incre...
[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_solaris_section_type (unsigned long type)
1855 {
1856 switch (type)
1857 {
1858 case 0x6fffffee: return "SUNW_ancillary";
1859 case 0x6fffffef: return "SUNW_capchain";
1860 case 0x6ffffff0: return "SUNW_capinfo";
1861 case 0x6ffffff1: return "SUNW_symsort";
1862 case 0x6ffffff2: return "SUNW_tlssort";
1863 case 0x6ffffff3: return "SUNW_LDYNSYM";
1864 case 0x6ffffff4: return "SUNW_dof";
1865 case 0x6ffffff5: return "SUNW_cap";
1866 case 0x6ffffff6: return "SUNW_SIGNATURE";
1867 case 0x6ffffff7: return "SUNW_ANNOTATE";
1868 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1869 case 0x6ffffff9: return "SUNW_DEBUG";
1870 case 0x6ffffffa: return "SUNW_move";
1871 case 0x6ffffffb: return "SUNW_COMDAT";
1872 case 0x6ffffffc: return "SUNW_syminfo";
1873 case 0x6ffffffd: return "SUNW_verdef";
1874 case 0x6ffffffe: return "SUNW_verneed";
1875 case 0x6fffffff: return "SUNW_versym";
1876 case 0x70000000: return "SPARC_GOTDATA";
1877 default: return NULL;
1878 }
1879 }
1880
1881 static const char *
1882 get_alpha_dynamic_type (unsigned long type)
1883 {
1884 switch (type)
1885 {
1886 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1887 default:
1888 return NULL;
1889 }
1890 }
1891
1892 static const char *
1893 get_score_dynamic_type (unsigned long type)
1894 {
1895 switch (type)
1896 {
1897 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1898 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1899 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1900 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1901 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1902 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1903 default:
1904 return NULL;
1905 }
1906 }
1907
1908 static const char *
1909 get_tic6x_dynamic_type (unsigned long type)
1910 {
1911 switch (type)
1912 {
1913 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1914 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1915 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1916 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1917 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1918 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1919 default:
1920 return NULL;
1921 }
1922 }
1923
1924 static const char *
1925 get_nios2_dynamic_type (unsigned long type)
1926 {
1927 switch (type)
1928 {
1929 case DT_NIOS2_GP: return "NIOS2_GP";
1930 default:
1931 return NULL;
1932 }
1933 }
1934
1935 static const char *
1936 get_solaris_dynamic_type (unsigned long type)
1937 {
1938 switch (type)
1939 {
1940 case 0x6000000d: return "SUNW_AUXILIARY";
1941 case 0x6000000e: return "SUNW_RTLDINF";
1942 case 0x6000000f: return "SUNW_FILTER";
1943 case 0x60000010: return "SUNW_CAP";
1944 case 0x60000011: return "SUNW_SYMTAB";
1945 case 0x60000012: return "SUNW_SYMSZ";
1946 case 0x60000013: return "SUNW_SORTENT";
1947 case 0x60000014: return "SUNW_SYMSORT";
1948 case 0x60000015: return "SUNW_SYMSORTSZ";
1949 case 0x60000016: return "SUNW_TLSSORT";
1950 case 0x60000017: return "SUNW_TLSSORTSZ";
1951 case 0x60000018: return "SUNW_CAPINFO";
1952 case 0x60000019: return "SUNW_STRPAD";
1953 case 0x6000001a: return "SUNW_CAPCHAIN";
1954 case 0x6000001b: return "SUNW_LDMACH";
1955 case 0x6000001d: return "SUNW_CAPCHAINENT";
1956 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1957 case 0x60000021: return "SUNW_PARENT";
1958 case 0x60000023: return "SUNW_ASLR";
1959 case 0x60000025: return "SUNW_RELAX";
1960 case 0x60000029: return "SUNW_NXHEAP";
1961 case 0x6000002b: return "SUNW_NXSTACK";
1962
1963 case 0x70000001: return "SPARC_REGISTER";
1964 case 0x7ffffffd: return "AUXILIARY";
1965 case 0x7ffffffe: return "USED";
1966 case 0x7fffffff: return "FILTER";
1967
1968 default: return NULL;
1969 }
1970 }
1971
1972 static const char *
1973 get_dynamic_type (unsigned long type)
1974 {
1975 static char buff[64];
1976
1977 switch (type)
1978 {
1979 case DT_NULL: return "NULL";
1980 case DT_NEEDED: return "NEEDED";
1981 case DT_PLTRELSZ: return "PLTRELSZ";
1982 case DT_PLTGOT: return "PLTGOT";
1983 case DT_HASH: return "HASH";
1984 case DT_STRTAB: return "STRTAB";
1985 case DT_SYMTAB: return "SYMTAB";
1986 case DT_RELA: return "RELA";
1987 case DT_RELASZ: return "RELASZ";
1988 case DT_RELAENT: return "RELAENT";
1989 case DT_STRSZ: return "STRSZ";
1990 case DT_SYMENT: return "SYMENT";
1991 case DT_INIT: return "INIT";
1992 case DT_FINI: return "FINI";
1993 case DT_SONAME: return "SONAME";
1994 case DT_RPATH: return "RPATH";
1995 case DT_SYMBOLIC: return "SYMBOLIC";
1996 case DT_REL: return "REL";
1997 case DT_RELSZ: return "RELSZ";
1998 case DT_RELENT: return "RELENT";
1999 case DT_PLTREL: return "PLTREL";
2000 case DT_DEBUG: return "DEBUG";
2001 case DT_TEXTREL: return "TEXTREL";
2002 case DT_JMPREL: return "JMPREL";
2003 case DT_BIND_NOW: return "BIND_NOW";
2004 case DT_INIT_ARRAY: return "INIT_ARRAY";
2005 case DT_FINI_ARRAY: return "FINI_ARRAY";
2006 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2007 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2008 case DT_RUNPATH: return "RUNPATH";
2009 case DT_FLAGS: return "FLAGS";
2010
2011 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2012 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2013
2014 case DT_CHECKSUM: return "CHECKSUM";
2015 case DT_PLTPADSZ: return "PLTPADSZ";
2016 case DT_MOVEENT: return "MOVEENT";
2017 case DT_MOVESZ: return "MOVESZ";
2018 case DT_FEATURE: return "FEATURE";
2019 case DT_POSFLAG_1: return "POSFLAG_1";
2020 case DT_SYMINSZ: return "SYMINSZ";
2021 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2022
2023 case DT_ADDRRNGLO: return "ADDRRNGLO";
2024 case DT_CONFIG: return "CONFIG";
2025 case DT_DEPAUDIT: return "DEPAUDIT";
2026 case DT_AUDIT: return "AUDIT";
2027 case DT_PLTPAD: return "PLTPAD";
2028 case DT_MOVETAB: return "MOVETAB";
2029 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2030
2031 case DT_VERSYM: return "VERSYM";
2032
2033 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2034 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2035 case DT_RELACOUNT: return "RELACOUNT";
2036 case DT_RELCOUNT: return "RELCOUNT";
2037 case DT_FLAGS_1: return "FLAGS_1";
2038 case DT_VERDEF: return "VERDEF";
2039 case DT_VERDEFNUM: return "VERDEFNUM";
2040 case DT_VERNEED: return "VERNEED";
2041 case DT_VERNEEDNUM: return "VERNEEDNUM";
2042
2043 case DT_AUXILIARY: return "AUXILIARY";
2044 case DT_USED: return "USED";
2045 case DT_FILTER: return "FILTER";
2046
2047 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2048 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2049 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2050 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2051 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2052 case DT_GNU_HASH: return "GNU_HASH";
2053
2054 default:
2055 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2056 {
2057 const char * result;
2058
2059 switch (elf_header.e_machine)
2060 {
2061 case EM_MIPS:
2062 case EM_MIPS_RS3_LE:
2063 result = get_mips_dynamic_type (type);
2064 break;
2065 case EM_SPARCV9:
2066 result = get_sparc64_dynamic_type (type);
2067 break;
2068 case EM_PPC:
2069 result = get_ppc_dynamic_type (type);
2070 break;
2071 case EM_PPC64:
2072 result = get_ppc64_dynamic_type (type);
2073 break;
2074 case EM_IA_64:
2075 result = get_ia64_dynamic_type (type);
2076 break;
2077 case EM_ALPHA:
2078 result = get_alpha_dynamic_type (type);
2079 break;
2080 case EM_SCORE:
2081 result = get_score_dynamic_type (type);
2082 break;
2083 case EM_TI_C6000:
2084 result = get_tic6x_dynamic_type (type);
2085 break;
2086 case EM_ALTERA_NIOS2:
2087 result = get_nios2_dynamic_type (type);
2088 break;
2089 default:
2090 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2091 result = get_solaris_dynamic_type (type);
2092 else
2093 result = NULL;
2094 break;
2095 }
2096
2097 if (result != NULL)
2098 return result;
2099
2100 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2101 }
2102 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2103 || (elf_header.e_machine == EM_PARISC
2104 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2105 {
2106 const char * result;
2107
2108 switch (elf_header.e_machine)
2109 {
2110 case EM_PARISC:
2111 result = get_parisc_dynamic_type (type);
2112 break;
2113 case EM_IA_64:
2114 result = get_ia64_dynamic_type (type);
2115 break;
2116 default:
2117 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2118 result = get_solaris_dynamic_type (type);
2119 else
2120 result = NULL;
2121 break;
2122 }
2123
2124 if (result != NULL)
2125 return result;
2126
2127 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2128 type);
2129 }
2130 else
2131 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2132
2133 return buff;
2134 }
2135 }
2136
2137 static char *
2138 get_file_type (unsigned e_type)
2139 {
2140 static char buff[32];
2141
2142 switch (e_type)
2143 {
2144 case ET_NONE: return _("NONE (None)");
2145 case ET_REL: return _("REL (Relocatable file)");
2146 case ET_EXEC: return _("EXEC (Executable file)");
2147 case ET_DYN: return _("DYN (Shared object file)");
2148 case ET_CORE: return _("CORE (Core file)");
2149
2150 default:
2151 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2152 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2153 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2154 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2155 else
2156 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2157 return buff;
2158 }
2159 }
2160
2161 static char *
2162 get_machine_name (unsigned e_machine)
2163 {
2164 static char buff[64]; /* XXX */
2165
2166 switch (e_machine)
2167 {
2168 case EM_NONE: return _("None");
2169 case EM_AARCH64: return "AArch64";
2170 case EM_M32: return "WE32100";
2171 case EM_SPARC: return "Sparc";
2172 case EM_SPU: return "SPU";
2173 case EM_386: return "Intel 80386";
2174 case EM_68K: return "MC68000";
2175 case EM_88K: return "MC88000";
2176 case EM_IAMCU: return "Intel MCU";
2177 case EM_860: return "Intel 80860";
2178 case EM_MIPS: return "MIPS R3000";
2179 case EM_S370: return "IBM System/370";
2180 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2181 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2182 case EM_PARISC: return "HPPA";
2183 case EM_PPC_OLD: return "Power PC (old)";
2184 case EM_SPARC32PLUS: return "Sparc v8+" ;
2185 case EM_960: return "Intel 90860";
2186 case EM_PPC: return "PowerPC";
2187 case EM_PPC64: return "PowerPC64";
2188 case EM_FR20: return "Fujitsu FR20";
2189 case EM_FT32: return "FTDI FT32";
2190 case EM_RH32: return "TRW RH32";
2191 case EM_MCORE: return "MCORE";
2192 case EM_ARM: return "ARM";
2193 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2194 case EM_SH: return "Renesas / SuperH SH";
2195 case EM_SPARCV9: return "Sparc v9";
2196 case EM_TRICORE: return "Siemens Tricore";
2197 case EM_ARC: return "ARC";
2198 case EM_ARC_COMPACT: return "ARCompact";
2199 case EM_ARC_COMPACT2: return "ARCv2";
2200 case EM_H8_300: return "Renesas H8/300";
2201 case EM_H8_300H: return "Renesas H8/300H";
2202 case EM_H8S: return "Renesas H8S";
2203 case EM_H8_500: return "Renesas H8/500";
2204 case EM_IA_64: return "Intel IA-64";
2205 case EM_MIPS_X: return "Stanford MIPS-X";
2206 case EM_COLDFIRE: return "Motorola Coldfire";
2207 case EM_ALPHA: return "Alpha";
2208 case EM_CYGNUS_D10V:
2209 case EM_D10V: return "d10v";
2210 case EM_CYGNUS_D30V:
2211 case EM_D30V: return "d30v";
2212 case EM_CYGNUS_M32R:
2213 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2214 case EM_CYGNUS_V850:
2215 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2216 case EM_V850: return "Renesas V850";
2217 case EM_CYGNUS_MN10300:
2218 case EM_MN10300: return "mn10300";
2219 case EM_CYGNUS_MN10200:
2220 case EM_MN10200: return "mn10200";
2221 case EM_MOXIE: return "Moxie";
2222 case EM_CYGNUS_FR30:
2223 case EM_FR30: return "Fujitsu FR30";
2224 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2225 case EM_PJ_OLD:
2226 case EM_PJ: return "picoJava";
2227 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2228 case EM_PCP: return "Siemens PCP";
2229 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2230 case EM_NDR1: return "Denso NDR1 microprocesspr";
2231 case EM_STARCORE: return "Motorola Star*Core processor";
2232 case EM_ME16: return "Toyota ME16 processor";
2233 case EM_ST100: return "STMicroelectronics ST100 processor";
2234 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2235 case EM_PDSP: return "Sony DSP processor";
2236 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2237 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2238 case EM_FX66: return "Siemens FX66 microcontroller";
2239 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2240 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2241 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2242 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2243 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2244 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2245 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2246 case EM_SVX: return "Silicon Graphics SVx";
2247 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2248 case EM_VAX: return "Digital VAX";
2249 case EM_VISIUM: return "CDS VISIUMcore processor";
2250 case EM_AVR_OLD:
2251 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2252 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2253 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2254 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2255 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2256 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2257 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2258 case EM_PRISM: return "Vitesse Prism";
2259 case EM_X86_64: return "Advanced Micro Devices X86-64";
2260 case EM_L1OM: return "Intel L1OM";
2261 case EM_K1OM: return "Intel K1OM";
2262 case EM_S390_OLD:
2263 case EM_S390: return "IBM S/390";
2264 case EM_SCORE: return "SUNPLUS S+Core";
2265 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2266 case EM_OR1K: return "OpenRISC 1000";
2267 case EM_CRX: return "National Semiconductor CRX microprocessor";
2268 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2269 case EM_DLX: return "OpenDLX";
2270 case EM_IP2K_OLD:
2271 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2272 case EM_IQ2000: return "Vitesse IQ2000";
2273 case EM_XTENSA_OLD:
2274 case EM_XTENSA: return "Tensilica Xtensa Processor";
2275 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2276 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2277 case EM_NS32K: return "National Semiconductor 32000 series";
2278 case EM_TPC: return "Tenor Network TPC processor";
2279 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2280 case EM_MAX: return "MAX Processor";
2281 case EM_CR: return "National Semiconductor CompactRISC";
2282 case EM_F2MC16: return "Fujitsu F2MC16";
2283 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2284 case EM_LATTICEMICO32: return "Lattice Mico32";
2285 case EM_M32C_OLD:
2286 case EM_M32C: return "Renesas M32c";
2287 case EM_MT: return "Morpho Techologies MT processor";
2288 case EM_BLACKFIN: return "Analog Devices Blackfin";
2289 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2290 case EM_SEP: return "Sharp embedded microprocessor";
2291 case EM_ARCA: return "Arca RISC microprocessor";
2292 case EM_UNICORE: return "Unicore";
2293 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2294 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2295 case EM_NIOS32: return "Altera Nios";
2296 case EM_ALTERA_NIOS2: return "Altera Nios II";
2297 case EM_C166:
2298 case EM_XC16X: return "Infineon Technologies xc16x";
2299 case EM_M16C: return "Renesas M16C series microprocessors";
2300 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2301 case EM_CE: return "Freescale Communication Engine RISC core";
2302 case EM_TSK3000: return "Altium TSK3000 core";
2303 case EM_RS08: return "Freescale RS08 embedded processor";
2304 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2305 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2306 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2307 case EM_SE_C17: return "Seiko Epson C17 family";
2308 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2309 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2310 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2311 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2312 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2313 case EM_R32C: return "Renesas R32C series microprocessors";
2314 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2315 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2316 case EM_8051: return "Intel 8051 and variants";
2317 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2318 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2319 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2320 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2321 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2322 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2323 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2324 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2325 case EM_CR16:
2326 case EM_MICROBLAZE:
2327 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2328 case EM_RL78: return "Renesas RL78";
2329 case EM_RX: return "Renesas RX";
2330 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2331 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2332 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2333 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2334 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2335 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2336 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2337 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2338 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2339 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2340 case EM_CUDA: return "NVIDIA CUDA architecture";
2341 case EM_XGATE: return "Motorola XGATE embedded processor";
2342 default:
2343 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2344 return buff;
2345 }
2346 }
2347
2348 static void
2349 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2350 {
2351 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2352 other compilers don't a specific architecture type in the e_flags, and
2353 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2354 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2355 architectures.
2356
2357 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2358 but also sets a specific architecture type in the e_flags field.
2359
2360 However, when decoding the flags we don't worry if we see an
2361 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2362 ARCEM architecture type. */
2363
2364 switch (e_flags & EF_ARC_MACH_MSK)
2365 {
2366 /* We only expect these to occur for EM_ARC_COMPACT2. */
2367 case EF_ARC_CPU_ARCV2EM:
2368 strcat (buf, ", ARC EM");
2369 break;
2370 case EF_ARC_CPU_ARCV2HS:
2371 strcat (buf, ", ARC HS");
2372 break;
2373
2374 /* We only expect these to occur for EM_ARC_COMPACT. */
2375 case E_ARC_MACH_ARC600:
2376 strcat (buf, ", ARC600");
2377 break;
2378 case E_ARC_MACH_ARC601:
2379 strcat (buf, ", ARC601");
2380 break;
2381 case E_ARC_MACH_ARC700:
2382 strcat (buf, ", ARC700");
2383 break;
2384
2385 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2386 new ELF with new architecture being read by an old version of
2387 readelf, or (c) An ELF built with non-GNU compiler that does not
2388 set the architecture in the e_flags. */
2389 default:
2390 if (e_machine == EM_ARC_COMPACT)
2391 strcat (buf, ", Unknown ARCompact");
2392 else
2393 strcat (buf, ", Unknown ARC");
2394 break;
2395 }
2396
2397 switch (e_flags & EF_ARC_OSABI_MSK)
2398 {
2399 case E_ARC_OSABI_ORIG:
2400 strcat (buf, ", (ABI:legacy)");
2401 break;
2402 case E_ARC_OSABI_V2:
2403 strcat (buf, ", (ABI:v2)");
2404 break;
2405 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2406 case E_ARC_OSABI_V3:
2407 strcat (buf, ", v3 no-legacy-syscalls ABI");
2408 break;
2409 default:
2410 strcat (buf, ", unrecognised ARC OSABI flag");
2411 break;
2412 }
2413 }
2414
2415 static void
2416 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2417 {
2418 unsigned eabi;
2419 int unknown = 0;
2420
2421 eabi = EF_ARM_EABI_VERSION (e_flags);
2422 e_flags &= ~ EF_ARM_EABIMASK;
2423
2424 /* Handle "generic" ARM flags. */
2425 if (e_flags & EF_ARM_RELEXEC)
2426 {
2427 strcat (buf, ", relocatable executable");
2428 e_flags &= ~ EF_ARM_RELEXEC;
2429 }
2430
2431 /* Now handle EABI specific flags. */
2432 switch (eabi)
2433 {
2434 default:
2435 strcat (buf, ", <unrecognized EABI>");
2436 if (e_flags)
2437 unknown = 1;
2438 break;
2439
2440 case EF_ARM_EABI_VER1:
2441 strcat (buf, ", Version1 EABI");
2442 while (e_flags)
2443 {
2444 unsigned flag;
2445
2446 /* Process flags one bit at a time. */
2447 flag = e_flags & - e_flags;
2448 e_flags &= ~ flag;
2449
2450 switch (flag)
2451 {
2452 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2453 strcat (buf, ", sorted symbol tables");
2454 break;
2455
2456 default:
2457 unknown = 1;
2458 break;
2459 }
2460 }
2461 break;
2462
2463 case EF_ARM_EABI_VER2:
2464 strcat (buf, ", Version2 EABI");
2465 while (e_flags)
2466 {
2467 unsigned flag;
2468
2469 /* Process flags one bit at a time. */
2470 flag = e_flags & - e_flags;
2471 e_flags &= ~ flag;
2472
2473 switch (flag)
2474 {
2475 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2476 strcat (buf, ", sorted symbol tables");
2477 break;
2478
2479 case EF_ARM_DYNSYMSUSESEGIDX:
2480 strcat (buf, ", dynamic symbols use segment index");
2481 break;
2482
2483 case EF_ARM_MAPSYMSFIRST:
2484 strcat (buf, ", mapping symbols precede others");
2485 break;
2486
2487 default:
2488 unknown = 1;
2489 break;
2490 }
2491 }
2492 break;
2493
2494 case EF_ARM_EABI_VER3:
2495 strcat (buf, ", Version3 EABI");
2496 break;
2497
2498 case EF_ARM_EABI_VER4:
2499 strcat (buf, ", Version4 EABI");
2500 while (e_flags)
2501 {
2502 unsigned flag;
2503
2504 /* Process flags one bit at a time. */
2505 flag = e_flags & - e_flags;
2506 e_flags &= ~ flag;
2507
2508 switch (flag)
2509 {
2510 case EF_ARM_BE8:
2511 strcat (buf, ", BE8");
2512 break;
2513
2514 case EF_ARM_LE8:
2515 strcat (buf, ", LE8");
2516 break;
2517
2518 default:
2519 unknown = 1;
2520 break;
2521 }
2522 break;
2523 }
2524 break;
2525
2526 case EF_ARM_EABI_VER5:
2527 strcat (buf, ", Version5 EABI");
2528 while (e_flags)
2529 {
2530 unsigned flag;
2531
2532 /* Process flags one bit at a time. */
2533 flag = e_flags & - e_flags;
2534 e_flags &= ~ flag;
2535
2536 switch (flag)
2537 {
2538 case EF_ARM_BE8:
2539 strcat (buf, ", BE8");
2540 break;
2541
2542 case EF_ARM_LE8:
2543 strcat (buf, ", LE8");
2544 break;
2545
2546 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2547 strcat (buf, ", soft-float ABI");
2548 break;
2549
2550 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2551 strcat (buf, ", hard-float ABI");
2552 break;
2553
2554 default:
2555 unknown = 1;
2556 break;
2557 }
2558 }
2559 break;
2560
2561 case EF_ARM_EABI_UNKNOWN:
2562 strcat (buf, ", GNU EABI");
2563 while (e_flags)
2564 {
2565 unsigned flag;
2566
2567 /* Process flags one bit at a time. */
2568 flag = e_flags & - e_flags;
2569 e_flags &= ~ flag;
2570
2571 switch (flag)
2572 {
2573 case EF_ARM_INTERWORK:
2574 strcat (buf, ", interworking enabled");
2575 break;
2576
2577 case EF_ARM_APCS_26:
2578 strcat (buf, ", uses APCS/26");
2579 break;
2580
2581 case EF_ARM_APCS_FLOAT:
2582 strcat (buf, ", uses APCS/float");
2583 break;
2584
2585 case EF_ARM_PIC:
2586 strcat (buf, ", position independent");
2587 break;
2588
2589 case EF_ARM_ALIGN8:
2590 strcat (buf, ", 8 bit structure alignment");
2591 break;
2592
2593 case EF_ARM_NEW_ABI:
2594 strcat (buf, ", uses new ABI");
2595 break;
2596
2597 case EF_ARM_OLD_ABI:
2598 strcat (buf, ", uses old ABI");
2599 break;
2600
2601 case EF_ARM_SOFT_FLOAT:
2602 strcat (buf, ", software FP");
2603 break;
2604
2605 case EF_ARM_VFP_FLOAT:
2606 strcat (buf, ", VFP");
2607 break;
2608
2609 case EF_ARM_MAVERICK_FLOAT:
2610 strcat (buf, ", Maverick FP");
2611 break;
2612
2613 default:
2614 unknown = 1;
2615 break;
2616 }
2617 }
2618 }
2619
2620 if (unknown)
2621 strcat (buf,_(", <unknown>"));
2622 }
2623
2624 static void
2625 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2626 {
2627 --size; /* Leave space for null terminator. */
2628
2629 switch (e_flags & EF_AVR_MACH)
2630 {
2631 case E_AVR_MACH_AVR1:
2632 strncat (buf, ", avr:1", size);
2633 break;
2634 case E_AVR_MACH_AVR2:
2635 strncat (buf, ", avr:2", size);
2636 break;
2637 case E_AVR_MACH_AVR25:
2638 strncat (buf, ", avr:25", size);
2639 break;
2640 case E_AVR_MACH_AVR3:
2641 strncat (buf, ", avr:3", size);
2642 break;
2643 case E_AVR_MACH_AVR31:
2644 strncat (buf, ", avr:31", size);
2645 break;
2646 case E_AVR_MACH_AVR35:
2647 strncat (buf, ", avr:35", size);
2648 break;
2649 case E_AVR_MACH_AVR4:
2650 strncat (buf, ", avr:4", size);
2651 break;
2652 case E_AVR_MACH_AVR5:
2653 strncat (buf, ", avr:5", size);
2654 break;
2655 case E_AVR_MACH_AVR51:
2656 strncat (buf, ", avr:51", size);
2657 break;
2658 case E_AVR_MACH_AVR6:
2659 strncat (buf, ", avr:6", size);
2660 break;
2661 case E_AVR_MACH_AVRTINY:
2662 strncat (buf, ", avr:100", size);
2663 break;
2664 case E_AVR_MACH_XMEGA1:
2665 strncat (buf, ", avr:101", size);
2666 break;
2667 case E_AVR_MACH_XMEGA2:
2668 strncat (buf, ", avr:102", size);
2669 break;
2670 case E_AVR_MACH_XMEGA3:
2671 strncat (buf, ", avr:103", size);
2672 break;
2673 case E_AVR_MACH_XMEGA4:
2674 strncat (buf, ", avr:104", size);
2675 break;
2676 case E_AVR_MACH_XMEGA5:
2677 strncat (buf, ", avr:105", size);
2678 break;
2679 case E_AVR_MACH_XMEGA6:
2680 strncat (buf, ", avr:106", size);
2681 break;
2682 case E_AVR_MACH_XMEGA7:
2683 strncat (buf, ", avr:107", size);
2684 break;
2685 default:
2686 strncat (buf, ", avr:<unknown>", size);
2687 break;
2688 }
2689
2690 size -= strlen (buf);
2691 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2692 strncat (buf, ", link-relax", size);
2693 }
2694
2695 static void
2696 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2697 {
2698 unsigned abi;
2699 unsigned arch;
2700 unsigned config;
2701 unsigned version;
2702 int has_fpu = 0;
2703 int r = 0;
2704
2705 static const char *ABI_STRINGS[] =
2706 {
2707 "ABI v0", /* use r5 as return register; only used in N1213HC */
2708 "ABI v1", /* use r0 as return register */
2709 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2710 "ABI v2fp", /* for FPU */
2711 "AABI",
2712 "ABI2 FP+"
2713 };
2714 static const char *VER_STRINGS[] =
2715 {
2716 "Andes ELF V1.3 or older",
2717 "Andes ELF V1.3.1",
2718 "Andes ELF V1.4"
2719 };
2720 static const char *ARCH_STRINGS[] =
2721 {
2722 "",
2723 "Andes Star v1.0",
2724 "Andes Star v2.0",
2725 "Andes Star v3.0",
2726 "Andes Star v3.0m"
2727 };
2728
2729 abi = EF_NDS_ABI & e_flags;
2730 arch = EF_NDS_ARCH & e_flags;
2731 config = EF_NDS_INST & e_flags;
2732 version = EF_NDS32_ELF_VERSION & e_flags;
2733
2734 memset (buf, 0, size);
2735
2736 switch (abi)
2737 {
2738 case E_NDS_ABI_V0:
2739 case E_NDS_ABI_V1:
2740 case E_NDS_ABI_V2:
2741 case E_NDS_ABI_V2FP:
2742 case E_NDS_ABI_AABI:
2743 case E_NDS_ABI_V2FP_PLUS:
2744 /* In case there are holes in the array. */
2745 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2746 break;
2747
2748 default:
2749 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2750 break;
2751 }
2752
2753 switch (version)
2754 {
2755 case E_NDS32_ELF_VER_1_2:
2756 case E_NDS32_ELF_VER_1_3:
2757 case E_NDS32_ELF_VER_1_4:
2758 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2759 break;
2760
2761 default:
2762 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2763 break;
2764 }
2765
2766 if (E_NDS_ABI_V0 == abi)
2767 {
2768 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2769 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2770 if (arch == E_NDS_ARCH_STAR_V1_0)
2771 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2772 return;
2773 }
2774
2775 switch (arch)
2776 {
2777 case E_NDS_ARCH_STAR_V1_0:
2778 case E_NDS_ARCH_STAR_V2_0:
2779 case E_NDS_ARCH_STAR_V3_0:
2780 case E_NDS_ARCH_STAR_V3_M:
2781 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2782 break;
2783
2784 default:
2785 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2786 /* ARCH version determines how the e_flags are interpreted.
2787 If it is unknown, we cannot proceed. */
2788 return;
2789 }
2790
2791 /* Newer ABI; Now handle architecture specific flags. */
2792 if (arch == E_NDS_ARCH_STAR_V1_0)
2793 {
2794 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2795 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2796
2797 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2798 r += snprintf (buf + r, size -r, ", MAC");
2799
2800 if (config & E_NDS32_HAS_DIV_INST)
2801 r += snprintf (buf + r, size -r, ", DIV");
2802
2803 if (config & E_NDS32_HAS_16BIT_INST)
2804 r += snprintf (buf + r, size -r, ", 16b");
2805 }
2806 else
2807 {
2808 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2809 {
2810 if (version <= E_NDS32_ELF_VER_1_3)
2811 r += snprintf (buf + r, size -r, ", [B8]");
2812 else
2813 r += snprintf (buf + r, size -r, ", EX9");
2814 }
2815
2816 if (config & E_NDS32_HAS_MAC_DX_INST)
2817 r += snprintf (buf + r, size -r, ", MAC_DX");
2818
2819 if (config & E_NDS32_HAS_DIV_DX_INST)
2820 r += snprintf (buf + r, size -r, ", DIV_DX");
2821
2822 if (config & E_NDS32_HAS_16BIT_INST)
2823 {
2824 if (version <= E_NDS32_ELF_VER_1_3)
2825 r += snprintf (buf + r, size -r, ", 16b");
2826 else
2827 r += snprintf (buf + r, size -r, ", IFC");
2828 }
2829 }
2830
2831 if (config & E_NDS32_HAS_EXT_INST)
2832 r += snprintf (buf + r, size -r, ", PERF1");
2833
2834 if (config & E_NDS32_HAS_EXT2_INST)
2835 r += snprintf (buf + r, size -r, ", PERF2");
2836
2837 if (config & E_NDS32_HAS_FPU_INST)
2838 {
2839 has_fpu = 1;
2840 r += snprintf (buf + r, size -r, ", FPU_SP");
2841 }
2842
2843 if (config & E_NDS32_HAS_FPU_DP_INST)
2844 {
2845 has_fpu = 1;
2846 r += snprintf (buf + r, size -r, ", FPU_DP");
2847 }
2848
2849 if (config & E_NDS32_HAS_FPU_MAC_INST)
2850 {
2851 has_fpu = 1;
2852 r += snprintf (buf + r, size -r, ", FPU_MAC");
2853 }
2854
2855 if (has_fpu)
2856 {
2857 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2858 {
2859 case E_NDS32_FPU_REG_8SP_4DP:
2860 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2861 break;
2862 case E_NDS32_FPU_REG_16SP_8DP:
2863 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2864 break;
2865 case E_NDS32_FPU_REG_32SP_16DP:
2866 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2867 break;
2868 case E_NDS32_FPU_REG_32SP_32DP:
2869 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2870 break;
2871 }
2872 }
2873
2874 if (config & E_NDS32_HAS_AUDIO_INST)
2875 r += snprintf (buf + r, size -r, ", AUDIO");
2876
2877 if (config & E_NDS32_HAS_STRING_INST)
2878 r += snprintf (buf + r, size -r, ", STR");
2879
2880 if (config & E_NDS32_HAS_REDUCED_REGS)
2881 r += snprintf (buf + r, size -r, ", 16REG");
2882
2883 if (config & E_NDS32_HAS_VIDEO_INST)
2884 {
2885 if (version <= E_NDS32_ELF_VER_1_3)
2886 r += snprintf (buf + r, size -r, ", VIDEO");
2887 else
2888 r += snprintf (buf + r, size -r, ", SATURATION");
2889 }
2890
2891 if (config & E_NDS32_HAS_ENCRIPT_INST)
2892 r += snprintf (buf + r, size -r, ", ENCRP");
2893
2894 if (config & E_NDS32_HAS_L2C_INST)
2895 r += snprintf (buf + r, size -r, ", L2C");
2896 }
2897
2898 static char *
2899 get_machine_flags (unsigned e_flags, unsigned e_machine)
2900 {
2901 static char buf[1024];
2902
2903 buf[0] = '\0';
2904
2905 if (e_flags)
2906 {
2907 switch (e_machine)
2908 {
2909 default:
2910 break;
2911
2912 case EM_ARC_COMPACT2:
2913 case EM_ARC_COMPACT:
2914 decode_ARC_machine_flags (e_flags, e_machine, buf);
2915 break;
2916
2917 case EM_ARM:
2918 decode_ARM_machine_flags (e_flags, buf);
2919 break;
2920
2921 case EM_AVR:
2922 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2923 break;
2924
2925 case EM_BLACKFIN:
2926 if (e_flags & EF_BFIN_PIC)
2927 strcat (buf, ", PIC");
2928
2929 if (e_flags & EF_BFIN_FDPIC)
2930 strcat (buf, ", FDPIC");
2931
2932 if (e_flags & EF_BFIN_CODE_IN_L1)
2933 strcat (buf, ", code in L1");
2934
2935 if (e_flags & EF_BFIN_DATA_IN_L1)
2936 strcat (buf, ", data in L1");
2937
2938 break;
2939
2940 case EM_CYGNUS_FRV:
2941 switch (e_flags & EF_FRV_CPU_MASK)
2942 {
2943 case EF_FRV_CPU_GENERIC:
2944 break;
2945
2946 default:
2947 strcat (buf, ", fr???");
2948 break;
2949
2950 case EF_FRV_CPU_FR300:
2951 strcat (buf, ", fr300");
2952 break;
2953
2954 case EF_FRV_CPU_FR400:
2955 strcat (buf, ", fr400");
2956 break;
2957 case EF_FRV_CPU_FR405:
2958 strcat (buf, ", fr405");
2959 break;
2960
2961 case EF_FRV_CPU_FR450:
2962 strcat (buf, ", fr450");
2963 break;
2964
2965 case EF_FRV_CPU_FR500:
2966 strcat (buf, ", fr500");
2967 break;
2968 case EF_FRV_CPU_FR550:
2969 strcat (buf, ", fr550");
2970 break;
2971
2972 case EF_FRV_CPU_SIMPLE:
2973 strcat (buf, ", simple");
2974 break;
2975 case EF_FRV_CPU_TOMCAT:
2976 strcat (buf, ", tomcat");
2977 break;
2978 }
2979 break;
2980
2981 case EM_68K:
2982 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2983 strcat (buf, ", m68000");
2984 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2985 strcat (buf, ", cpu32");
2986 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2987 strcat (buf, ", fido_a");
2988 else
2989 {
2990 char const * isa = _("unknown");
2991 char const * mac = _("unknown mac");
2992 char const * additional = NULL;
2993
2994 switch (e_flags & EF_M68K_CF_ISA_MASK)
2995 {
2996 case EF_M68K_CF_ISA_A_NODIV:
2997 isa = "A";
2998 additional = ", nodiv";
2999 break;
3000 case EF_M68K_CF_ISA_A:
3001 isa = "A";
3002 break;
3003 case EF_M68K_CF_ISA_A_PLUS:
3004 isa = "A+";
3005 break;
3006 case EF_M68K_CF_ISA_B_NOUSP:
3007 isa = "B";
3008 additional = ", nousp";
3009 break;
3010 case EF_M68K_CF_ISA_B:
3011 isa = "B";
3012 break;
3013 case EF_M68K_CF_ISA_C:
3014 isa = "C";
3015 break;
3016 case EF_M68K_CF_ISA_C_NODIV:
3017 isa = "C";
3018 additional = ", nodiv";
3019 break;
3020 }
3021 strcat (buf, ", cf, isa ");
3022 strcat (buf, isa);
3023 if (additional)
3024 strcat (buf, additional);
3025 if (e_flags & EF_M68K_CF_FLOAT)
3026 strcat (buf, ", float");
3027 switch (e_flags & EF_M68K_CF_MAC_MASK)
3028 {
3029 case 0:
3030 mac = NULL;
3031 break;
3032 case EF_M68K_CF_MAC:
3033 mac = "mac";
3034 break;
3035 case EF_M68K_CF_EMAC:
3036 mac = "emac";
3037 break;
3038 case EF_M68K_CF_EMAC_B:
3039 mac = "emac_b";
3040 break;
3041 }
3042 if (mac)
3043 {
3044 strcat (buf, ", ");
3045 strcat (buf, mac);
3046 }
3047 }
3048 break;
3049
3050 case EM_CYGNUS_MEP:
3051 switch (e_flags & EF_MEP_CPU_MASK)
3052 {
3053 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3054 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3055 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3056 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3057 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3058 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3059 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3060 }
3061
3062 switch (e_flags & EF_MEP_COP_MASK)
3063 {
3064 case EF_MEP_COP_NONE: break;
3065 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3066 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3067 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3068 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3069 default: strcat (buf, _("<unknown MeP copro type>")); break;
3070 }
3071
3072 if (e_flags & EF_MEP_LIBRARY)
3073 strcat (buf, ", Built for Library");
3074
3075 if (e_flags & EF_MEP_INDEX_MASK)
3076 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3077 e_flags & EF_MEP_INDEX_MASK);
3078
3079 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3080 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3081 e_flags & ~ EF_MEP_ALL_FLAGS);
3082 break;
3083
3084 case EM_PPC:
3085 if (e_flags & EF_PPC_EMB)
3086 strcat (buf, ", emb");
3087
3088 if (e_flags & EF_PPC_RELOCATABLE)
3089 strcat (buf, _(", relocatable"));
3090
3091 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3092 strcat (buf, _(", relocatable-lib"));
3093 break;
3094
3095 case EM_PPC64:
3096 if (e_flags & EF_PPC64_ABI)
3097 {
3098 char abi[] = ", abiv0";
3099
3100 abi[6] += e_flags & EF_PPC64_ABI;
3101 strcat (buf, abi);
3102 }
3103 break;
3104
3105 case EM_V800:
3106 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3107 strcat (buf, ", RH850 ABI");
3108
3109 if (e_flags & EF_V800_850E3)
3110 strcat (buf, ", V3 architecture");
3111
3112 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3113 strcat (buf, ", FPU not used");
3114
3115 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3116 strcat (buf, ", regmode: COMMON");
3117
3118 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3119 strcat (buf, ", r4 not used");
3120
3121 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3122 strcat (buf, ", r30 not used");
3123
3124 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3125 strcat (buf, ", r5 not used");
3126
3127 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3128 strcat (buf, ", r2 not used");
3129
3130 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3131 {
3132 switch (e_flags & - e_flags)
3133 {
3134 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3135 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3136 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3137 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3138 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3139 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3140 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3141 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3142 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3143 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3144 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3145 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3146 default: break;
3147 }
3148 }
3149 break;
3150
3151 case EM_V850:
3152 case EM_CYGNUS_V850:
3153 switch (e_flags & EF_V850_ARCH)
3154 {
3155 case E_V850E3V5_ARCH:
3156 strcat (buf, ", v850e3v5");
3157 break;
3158 case E_V850E2V3_ARCH:
3159 strcat (buf, ", v850e2v3");
3160 break;
3161 case E_V850E2_ARCH:
3162 strcat (buf, ", v850e2");
3163 break;
3164 case E_V850E1_ARCH:
3165 strcat (buf, ", v850e1");
3166 break;
3167 case E_V850E_ARCH:
3168 strcat (buf, ", v850e");
3169 break;
3170 case E_V850_ARCH:
3171 strcat (buf, ", v850");
3172 break;
3173 default:
3174 strcat (buf, _(", unknown v850 architecture variant"));
3175 break;
3176 }
3177 break;
3178
3179 case EM_M32R:
3180 case EM_CYGNUS_M32R:
3181 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3182 strcat (buf, ", m32r");
3183 break;
3184
3185 case EM_MIPS:
3186 case EM_MIPS_RS3_LE:
3187 if (e_flags & EF_MIPS_NOREORDER)
3188 strcat (buf, ", noreorder");
3189
3190 if (e_flags & EF_MIPS_PIC)
3191 strcat (buf, ", pic");
3192
3193 if (e_flags & EF_MIPS_CPIC)
3194 strcat (buf, ", cpic");
3195
3196 if (e_flags & EF_MIPS_UCODE)
3197 strcat (buf, ", ugen_reserved");
3198
3199 if (e_flags & EF_MIPS_ABI2)
3200 strcat (buf, ", abi2");
3201
3202 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3203 strcat (buf, ", odk first");
3204
3205 if (e_flags & EF_MIPS_32BITMODE)
3206 strcat (buf, ", 32bitmode");
3207
3208 if (e_flags & EF_MIPS_NAN2008)
3209 strcat (buf, ", nan2008");
3210
3211 if (e_flags & EF_MIPS_FP64)
3212 strcat (buf, ", fp64");
3213
3214 switch ((e_flags & EF_MIPS_MACH))
3215 {
3216 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3217 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3218 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3219 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3220 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3221 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3222 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3223 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3224 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3225 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3226 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3227 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3228 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3229 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3230 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3231 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3232 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3233 case 0:
3234 /* We simply ignore the field in this case to avoid confusion:
3235 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3236 extension. */
3237 break;
3238 default: strcat (buf, _(", unknown CPU")); break;
3239 }
3240
3241 switch ((e_flags & EF_MIPS_ABI))
3242 {
3243 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3244 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3245 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3246 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3247 case 0:
3248 /* We simply ignore the field in this case to avoid confusion:
3249 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3250 This means it is likely to be an o32 file, but not for
3251 sure. */
3252 break;
3253 default: strcat (buf, _(", unknown ABI")); break;
3254 }
3255
3256 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3257 strcat (buf, ", mdmx");
3258
3259 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3260 strcat (buf, ", mips16");
3261
3262 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3263 strcat (buf, ", micromips");
3264
3265 switch ((e_flags & EF_MIPS_ARCH))
3266 {
3267 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3268 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3269 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3270 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3271 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3272 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3273 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3274 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3275 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3276 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3277 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3278 default: strcat (buf, _(", unknown ISA")); break;
3279 }
3280 break;
3281
3282 case EM_NDS32:
3283 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3284 break;
3285
3286 case EM_SH:
3287 switch ((e_flags & EF_SH_MACH_MASK))
3288 {
3289 case EF_SH1: strcat (buf, ", sh1"); break;
3290 case EF_SH2: strcat (buf, ", sh2"); break;
3291 case EF_SH3: strcat (buf, ", sh3"); break;
3292 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3293 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3294 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3295 case EF_SH3E: strcat (buf, ", sh3e"); break;
3296 case EF_SH4: strcat (buf, ", sh4"); break;
3297 case EF_SH5: strcat (buf, ", sh5"); break;
3298 case EF_SH2E: strcat (buf, ", sh2e"); break;
3299 case EF_SH4A: strcat (buf, ", sh4a"); break;
3300 case EF_SH2A: strcat (buf, ", sh2a"); break;
3301 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3302 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3303 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3304 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3305 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3306 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3307 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3308 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3309 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3310 default: strcat (buf, _(", unknown ISA")); break;
3311 }
3312
3313 if (e_flags & EF_SH_PIC)
3314 strcat (buf, ", pic");
3315
3316 if (e_flags & EF_SH_FDPIC)
3317 strcat (buf, ", fdpic");
3318 break;
3319
3320 case EM_OR1K:
3321 if (e_flags & EF_OR1K_NODELAY)
3322 strcat (buf, ", no delay");
3323 break;
3324
3325 case EM_SPARCV9:
3326 if (e_flags & EF_SPARC_32PLUS)
3327 strcat (buf, ", v8+");
3328
3329 if (e_flags & EF_SPARC_SUN_US1)
3330 strcat (buf, ", ultrasparcI");
3331
3332 if (e_flags & EF_SPARC_SUN_US3)
3333 strcat (buf, ", ultrasparcIII");
3334
3335 if (e_flags & EF_SPARC_HAL_R1)
3336 strcat (buf, ", halr1");
3337
3338 if (e_flags & EF_SPARC_LEDATA)
3339 strcat (buf, ", ledata");
3340
3341 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3342 strcat (buf, ", tso");
3343
3344 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3345 strcat (buf, ", pso");
3346
3347 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3348 strcat (buf, ", rmo");
3349 break;
3350
3351 case EM_PARISC:
3352 switch (e_flags & EF_PARISC_ARCH)
3353 {
3354 case EFA_PARISC_1_0:
3355 strcpy (buf, ", PA-RISC 1.0");
3356 break;
3357 case EFA_PARISC_1_1:
3358 strcpy (buf, ", PA-RISC 1.1");
3359 break;
3360 case EFA_PARISC_2_0:
3361 strcpy (buf, ", PA-RISC 2.0");
3362 break;
3363 default:
3364 break;
3365 }
3366 if (e_flags & EF_PARISC_TRAPNIL)
3367 strcat (buf, ", trapnil");
3368 if (e_flags & EF_PARISC_EXT)
3369 strcat (buf, ", ext");
3370 if (e_flags & EF_PARISC_LSB)
3371 strcat (buf, ", lsb");
3372 if (e_flags & EF_PARISC_WIDE)
3373 strcat (buf, ", wide");
3374 if (e_flags & EF_PARISC_NO_KABP)
3375 strcat (buf, ", no kabp");
3376 if (e_flags & EF_PARISC_LAZYSWAP)
3377 strcat (buf, ", lazyswap");
3378 break;
3379
3380 case EM_PJ:
3381 case EM_PJ_OLD:
3382 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3383 strcat (buf, ", new calling convention");
3384
3385 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3386 strcat (buf, ", gnu calling convention");
3387 break;
3388
3389 case EM_IA_64:
3390 if ((e_flags & EF_IA_64_ABI64))
3391 strcat (buf, ", 64-bit");
3392 else
3393 strcat (buf, ", 32-bit");
3394 if ((e_flags & EF_IA_64_REDUCEDFP))
3395 strcat (buf, ", reduced fp model");
3396 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3397 strcat (buf, ", no function descriptors, constant gp");
3398 else if ((e_flags & EF_IA_64_CONS_GP))
3399 strcat (buf, ", constant gp");
3400 if ((e_flags & EF_IA_64_ABSOLUTE))
3401 strcat (buf, ", absolute");
3402 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3403 {
3404 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3405 strcat (buf, ", vms_linkages");
3406 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3407 {
3408 case EF_IA_64_VMS_COMCOD_SUCCESS:
3409 break;
3410 case EF_IA_64_VMS_COMCOD_WARNING:
3411 strcat (buf, ", warning");
3412 break;
3413 case EF_IA_64_VMS_COMCOD_ERROR:
3414 strcat (buf, ", error");
3415 break;
3416 case EF_IA_64_VMS_COMCOD_ABORT:
3417 strcat (buf, ", abort");
3418 break;
3419 default:
3420 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3421 e_flags & EF_IA_64_VMS_COMCOD);
3422 strcat (buf, ", <unknown>");
3423 }
3424 }
3425 break;
3426
3427 case EM_VAX:
3428 if ((e_flags & EF_VAX_NONPIC))
3429 strcat (buf, ", non-PIC");
3430 if ((e_flags & EF_VAX_DFLOAT))
3431 strcat (buf, ", D-Float");
3432 if ((e_flags & EF_VAX_GFLOAT))
3433 strcat (buf, ", G-Float");
3434 break;
3435
3436 case EM_VISIUM:
3437 if (e_flags & EF_VISIUM_ARCH_MCM)
3438 strcat (buf, ", mcm");
3439 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3440 strcat (buf, ", mcm24");
3441 if (e_flags & EF_VISIUM_ARCH_GR6)
3442 strcat (buf, ", gr6");
3443 break;
3444
3445 case EM_RL78:
3446 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3447 {
3448 case E_FLAG_RL78_ANY_CPU: break;
3449 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3450 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3451 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3452 }
3453 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3454 strcat (buf, ", 64-bit doubles");
3455 break;
3456
3457 case EM_RX:
3458 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3459 strcat (buf, ", 64-bit doubles");
3460 if (e_flags & E_FLAG_RX_DSP)
3461 strcat (buf, ", dsp");
3462 if (e_flags & E_FLAG_RX_PID)
3463 strcat (buf, ", pid");
3464 if (e_flags & E_FLAG_RX_ABI)
3465 strcat (buf, ", RX ABI");
3466 if (e_flags & E_FLAG_RX_SINSNS_SET)
3467 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3468 ? ", uses String instructions" : ", bans String instructions");
3469 if (e_flags & E_FLAG_RX_V2)
3470 strcat (buf, ", V2");
3471 break;
3472
3473 case EM_S390:
3474 if (e_flags & EF_S390_HIGH_GPRS)
3475 strcat (buf, ", highgprs");
3476 break;
3477
3478 case EM_TI_C6000:
3479 if ((e_flags & EF_C6000_REL))
3480 strcat (buf, ", relocatable module");
3481 break;
3482
3483 case EM_MSP430:
3484 strcat (buf, _(": architecture variant: "));
3485 switch (e_flags & EF_MSP430_MACH)
3486 {
3487 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3488 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3489 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3490 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3491 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3492 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3493 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3494 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3495 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3496 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3497 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3498 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3499 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3500 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3501 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3502 default:
3503 strcat (buf, _(": unknown")); break;
3504 }
3505
3506 if (e_flags & ~ EF_MSP430_MACH)
3507 strcat (buf, _(": unknown extra flag bits also present"));
3508 }
3509 }
3510
3511 return buf;
3512 }
3513
3514 static const char *
3515 get_osabi_name (unsigned int osabi)
3516 {
3517 static char buff[32];
3518
3519 switch (osabi)
3520 {
3521 case ELFOSABI_NONE: return "UNIX - System V";
3522 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3523 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3524 case ELFOSABI_GNU: return "UNIX - GNU";
3525 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3526 case ELFOSABI_AIX: return "UNIX - AIX";
3527 case ELFOSABI_IRIX: return "UNIX - IRIX";
3528 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3529 case ELFOSABI_TRU64: return "UNIX - TRU64";
3530 case ELFOSABI_MODESTO: return "Novell - Modesto";
3531 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3532 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3533 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3534 case ELFOSABI_AROS: return "AROS";
3535 case ELFOSABI_FENIXOS: return "FenixOS";
3536 default:
3537 if (osabi >= 64)
3538 switch (elf_header.e_machine)
3539 {
3540 case EM_ARM:
3541 switch (osabi)
3542 {
3543 case ELFOSABI_ARM: return "ARM";
3544 default:
3545 break;
3546 }
3547 break;
3548
3549 case EM_MSP430:
3550 case EM_MSP430_OLD:
3551 case EM_VISIUM:
3552 switch (osabi)
3553 {
3554 case ELFOSABI_STANDALONE: return _("Standalone App");
3555 default:
3556 break;
3557 }
3558 break;
3559
3560 case EM_TI_C6000:
3561 switch (osabi)
3562 {
3563 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3564 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3565 default:
3566 break;
3567 }
3568 break;
3569
3570 default:
3571 break;
3572 }
3573 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3574 return buff;
3575 }
3576 }
3577
3578 static const char *
3579 get_aarch64_segment_type (unsigned long type)
3580 {
3581 switch (type)
3582 {
3583 case PT_AARCH64_ARCHEXT:
3584 return "AARCH64_ARCHEXT";
3585 default:
3586 break;
3587 }
3588
3589 return NULL;
3590 }
3591
3592 static const char *
3593 get_arm_segment_type (unsigned long type)
3594 {
3595 switch (type)
3596 {
3597 case PT_ARM_EXIDX:
3598 return "EXIDX";
3599 default:
3600 break;
3601 }
3602
3603 return NULL;
3604 }
3605
3606 static const char *
3607 get_mips_segment_type (unsigned long type)
3608 {
3609 switch (type)
3610 {
3611 case PT_MIPS_REGINFO:
3612 return "REGINFO";
3613 case PT_MIPS_RTPROC:
3614 return "RTPROC";
3615 case PT_MIPS_OPTIONS:
3616 return "OPTIONS";
3617 case PT_MIPS_ABIFLAGS:
3618 return "ABIFLAGS";
3619 default:
3620 break;
3621 }
3622
3623 return NULL;
3624 }
3625
3626 static const char *
3627 get_parisc_segment_type (unsigned long type)
3628 {
3629 switch (type)
3630 {
3631 case PT_HP_TLS: return "HP_TLS";
3632 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3633 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3634 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3635 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3636 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3637 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3638 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3639 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3640 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3641 case PT_HP_PARALLEL: return "HP_PARALLEL";
3642 case PT_HP_FASTBIND: return "HP_FASTBIND";
3643 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3644 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3645 case PT_HP_STACK: return "HP_STACK";
3646 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3647 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3648 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3649 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3650 default:
3651 break;
3652 }
3653
3654 return NULL;
3655 }
3656
3657 static const char *
3658 get_ia64_segment_type (unsigned long type)
3659 {
3660 switch (type)
3661 {
3662 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3663 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3664 case PT_HP_TLS: return "HP_TLS";
3665 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3666 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3667 case PT_IA_64_HP_STACK: return "HP_STACK";
3668 default:
3669 break;
3670 }
3671
3672 return NULL;
3673 }
3674
3675 static const char *
3676 get_tic6x_segment_type (unsigned long type)
3677 {
3678 switch (type)
3679 {
3680 case PT_C6000_PHATTR: return "C6000_PHATTR";
3681 default:
3682 break;
3683 }
3684
3685 return NULL;
3686 }
3687
3688 static const char *
3689 get_solaris_segment_type (unsigned long type)
3690 {
3691 switch (type)
3692 {
3693 case 0x6464e550: return "PT_SUNW_UNWIND";
3694 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3695 case 0x6ffffff7: return "PT_LOSUNW";
3696 case 0x6ffffffa: return "PT_SUNWBSS";
3697 case 0x6ffffffb: return "PT_SUNWSTACK";
3698 case 0x6ffffffc: return "PT_SUNWDTRACE";
3699 case 0x6ffffffd: return "PT_SUNWCAP";
3700 case 0x6fffffff: return "PT_HISUNW";
3701 default: return NULL;
3702 }
3703 }
3704
3705 static const char *
3706 get_segment_type (unsigned long p_type)
3707 {
3708 static char buff[32];
3709
3710 switch (p_type)
3711 {
3712 case PT_NULL: return "NULL";
3713 case PT_LOAD: return "LOAD";
3714 case PT_DYNAMIC: return "DYNAMIC";
3715 case PT_INTERP: return "INTERP";
3716 case PT_NOTE: return "NOTE";
3717 case PT_SHLIB: return "SHLIB";
3718 case PT_PHDR: return "PHDR";
3719 case PT_TLS: return "TLS";
3720
3721 case PT_GNU_EH_FRAME:
3722 return "GNU_EH_FRAME";
3723 case PT_GNU_STACK: return "GNU_STACK";
3724 case PT_GNU_RELRO: return "GNU_RELRO";
3725
3726 default:
3727 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3728 {
3729 const char * result;
3730
3731 switch (elf_header.e_machine)
3732 {
3733 case EM_AARCH64:
3734 result = get_aarch64_segment_type (p_type);
3735 break;
3736 case EM_ARM:
3737 result = get_arm_segment_type (p_type);
3738 break;
3739 case EM_MIPS:
3740 case EM_MIPS_RS3_LE:
3741 result = get_mips_segment_type (p_type);
3742 break;
3743 case EM_PARISC:
3744 result = get_parisc_segment_type (p_type);
3745 break;
3746 case EM_IA_64:
3747 result = get_ia64_segment_type (p_type);
3748 break;
3749 case EM_TI_C6000:
3750 result = get_tic6x_segment_type (p_type);
3751 break;
3752 default:
3753 result = NULL;
3754 break;
3755 }
3756
3757 if (result != NULL)
3758 return result;
3759
3760 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3761 }
3762 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3763 {
3764 const char * result;
3765
3766 switch (elf_header.e_machine)
3767 {
3768 case EM_PARISC:
3769 result = get_parisc_segment_type (p_type);
3770 break;
3771 case EM_IA_64:
3772 result = get_ia64_segment_type (p_type);
3773 break;
3774 default:
3775 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3776 result = get_solaris_segment_type (p_type);
3777 else
3778 result = NULL;
3779 break;
3780 }
3781
3782 if (result != NULL)
3783 return result;
3784
3785 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3786 }
3787 else
3788 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3789
3790 return buff;
3791 }
3792 }
3793
3794 static const char *
3795 get_mips_section_type_name (unsigned int sh_type)
3796 {
3797 switch (sh_type)
3798 {
3799 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3800 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3801 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3802 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3803 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3804 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3805 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3806 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3807 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3808 case SHT_MIPS_RELD: return "MIPS_RELD";
3809 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3810 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3811 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3812 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3813 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3814 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3815 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3816 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3817 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3818 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3819 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3820 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3821 case SHT_MIPS_LINE: return "MIPS_LINE";
3822 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3823 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3824 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3825 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3826 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3827 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3828 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3829 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3830 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3831 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3832 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3833 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3834 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3835 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3836 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3837 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3838 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3839 default:
3840 break;
3841 }
3842 return NULL;
3843 }
3844
3845 static const char *
3846 get_parisc_section_type_name (unsigned int sh_type)
3847 {
3848 switch (sh_type)
3849 {
3850 case SHT_PARISC_EXT: return "PARISC_EXT";
3851 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3852 case SHT_PARISC_DOC: return "PARISC_DOC";
3853 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3854 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3855 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3856 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3857 default:
3858 break;
3859 }
3860 return NULL;
3861 }
3862
3863 static const char *
3864 get_ia64_section_type_name (unsigned int sh_type)
3865 {
3866 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3867 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3868 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3869
3870 switch (sh_type)
3871 {
3872 case SHT_IA_64_EXT: return "IA_64_EXT";
3873 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3874 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3875 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3876 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3877 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3878 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3879 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3880 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3881 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3882 default:
3883 break;
3884 }
3885 return NULL;
3886 }
3887
3888 static const char *
3889 get_x86_64_section_type_name (unsigned int sh_type)
3890 {
3891 switch (sh_type)
3892 {
3893 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3894 default:
3895 break;
3896 }
3897 return NULL;
3898 }
3899
3900 static const char *
3901 get_aarch64_section_type_name (unsigned int sh_type)
3902 {
3903 switch (sh_type)
3904 {
3905 case SHT_AARCH64_ATTRIBUTES:
3906 return "AARCH64_ATTRIBUTES";
3907 default:
3908 break;
3909 }
3910 return NULL;
3911 }
3912
3913 static const char *
3914 get_arm_section_type_name (unsigned int sh_type)
3915 {
3916 switch (sh_type)
3917 {
3918 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3919 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3920 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3921 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3922 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3923 default:
3924 break;
3925 }
3926 return NULL;
3927 }
3928
3929 static const char *
3930 get_tic6x_section_type_name (unsigned int sh_type)
3931 {
3932 switch (sh_type)
3933 {
3934 case SHT_C6000_UNWIND:
3935 return "C6000_UNWIND";
3936 case SHT_C6000_PREEMPTMAP:
3937 return "C6000_PREEMPTMAP";
3938 case SHT_C6000_ATTRIBUTES:
3939 return "C6000_ATTRIBUTES";
3940 case SHT_TI_ICODE:
3941 return "TI_ICODE";
3942 case SHT_TI_XREF:
3943 return "TI_XREF";
3944 case SHT_TI_HANDLER:
3945 return "TI_HANDLER";
3946 case SHT_TI_INITINFO:
3947 return "TI_INITINFO";
3948 case SHT_TI_PHATTRS:
3949 return "TI_PHATTRS";
3950 default:
3951 break;
3952 }
3953 return NULL;
3954 }
3955
3956 static const char *
3957 get_msp430x_section_type_name (unsigned int sh_type)
3958 {
3959 switch (sh_type)
3960 {
3961 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3962 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3963 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3964 default: return NULL;
3965 }
3966 }
3967
3968 static const char *
3969 get_v850_section_type_name (unsigned int sh_type)
3970 {
3971 switch (sh_type)
3972 {
3973 case SHT_V850_SCOMMON: return "V850 Small Common";
3974 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3975 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3976 case SHT_RENESAS_IOP: return "RENESAS IOP";
3977 case SHT_RENESAS_INFO: return "RENESAS INFO";
3978 default: return NULL;
3979 }
3980 }
3981
3982 static const char *
3983 get_section_type_name (unsigned int sh_type)
3984 {
3985 static char buff[32];
3986 const char * result;
3987
3988 switch (sh_type)
3989 {
3990 case SHT_NULL: return "NULL";
3991 case SHT_PROGBITS: return "PROGBITS";
3992 case SHT_SYMTAB: return "SYMTAB";
3993 case SHT_STRTAB: return "STRTAB";
3994 case SHT_RELA: return "RELA";
3995 case SHT_HASH: return "HASH";
3996 case SHT_DYNAMIC: return "DYNAMIC";
3997 case SHT_NOTE: return "NOTE";
3998 case SHT_NOBITS: return "NOBITS";
3999 case SHT_REL: return "REL";
4000 case SHT_SHLIB: return "SHLIB";
4001 case SHT_DYNSYM: return "DYNSYM";
4002 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4003 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4004 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4005 case SHT_GNU_HASH: return "GNU_HASH";
4006 case SHT_GROUP: return "GROUP";
4007 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4008 case SHT_GNU_verdef: return "VERDEF";
4009 case SHT_GNU_verneed: return "VERNEED";
4010 case SHT_GNU_versym: return "VERSYM";
4011 case 0x6ffffff0: return "VERSYM";
4012 case 0x6ffffffc: return "VERDEF";
4013 case 0x7ffffffd: return "AUXILIARY";
4014 case 0x7fffffff: return "FILTER";
4015 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4016
4017 default:
4018 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4019 {
4020 switch (elf_header.e_machine)
4021 {
4022 case EM_MIPS:
4023 case EM_MIPS_RS3_LE:
4024 result = get_mips_section_type_name (sh_type);
4025 break;
4026 case EM_PARISC:
4027 result = get_parisc_section_type_name (sh_type);
4028 break;
4029 case EM_IA_64:
4030 result = get_ia64_section_type_name (sh_type);
4031 break;
4032 case EM_X86_64:
4033 case EM_L1OM:
4034 case EM_K1OM:
4035 result = get_x86_64_section_type_name (sh_type);
4036 break;
4037 case EM_AARCH64:
4038 result = get_aarch64_section_type_name (sh_type);
4039 break;
4040 case EM_ARM:
4041 result = get_arm_section_type_name (sh_type);
4042 break;
4043 case EM_TI_C6000:
4044 result = get_tic6x_section_type_name (sh_type);
4045 break;
4046 case EM_MSP430:
4047 result = get_msp430x_section_type_name (sh_type);
4048 break;
4049 case EM_V800:
4050 case EM_V850:
4051 case EM_CYGNUS_V850:
4052 result = get_v850_section_type_name (sh_type);
4053 break;
4054 default:
4055 result = NULL;
4056 break;
4057 }
4058
4059 if (result != NULL)
4060 return result;
4061
4062 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4063 }
4064 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4065 {
4066 switch (elf_header.e_machine)
4067 {
4068 case EM_IA_64:
4069 result = get_ia64_section_type_name (sh_type);
4070 break;
4071 default:
4072 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4073 result = get_solaris_section_type (sh_type);
4074 else
4075 result = NULL;
4076 break;
4077 }
4078
4079 if (result != NULL)
4080 return result;
4081
4082 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4083 }
4084 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4085 {
4086 switch (elf_header.e_machine)
4087 {
4088 case EM_V800:
4089 case EM_V850:
4090 case EM_CYGNUS_V850:
4091 result = get_v850_section_type_name (sh_type);
4092 break;
4093 default:
4094 result = NULL;
4095 break;
4096 }
4097
4098 if (result != NULL)
4099 return result;
4100
4101 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4102 }
4103 else
4104 /* This message is probably going to be displayed in a 15
4105 character wide field, so put the hex value first. */
4106 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4107
4108 return buff;
4109 }
4110 }
4111
4112 #define OPTION_DEBUG_DUMP 512
4113 #define OPTION_DYN_SYMS 513
4114 #define OPTION_DWARF_DEPTH 514
4115 #define OPTION_DWARF_START 515
4116 #define OPTION_DWARF_CHECK 516
4117
4118 static struct option options[] =
4119 {
4120 {"all", no_argument, 0, 'a'},
4121 {"file-header", no_argument, 0, 'h'},
4122 {"program-headers", no_argument, 0, 'l'},
4123 {"headers", no_argument, 0, 'e'},
4124 {"histogram", no_argument, 0, 'I'},
4125 {"segments", no_argument, 0, 'l'},
4126 {"sections", no_argument, 0, 'S'},
4127 {"section-headers", no_argument, 0, 'S'},
4128 {"section-groups", no_argument, 0, 'g'},
4129 {"section-details", no_argument, 0, 't'},
4130 {"full-section-name",no_argument, 0, 'N'},
4131 {"symbols", no_argument, 0, 's'},
4132 {"syms", no_argument, 0, 's'},
4133 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4134 {"relocs", no_argument, 0, 'r'},
4135 {"notes", no_argument, 0, 'n'},
4136 {"dynamic", no_argument, 0, 'd'},
4137 {"arch-specific", no_argument, 0, 'A'},
4138 {"version-info", no_argument, 0, 'V'},
4139 {"use-dynamic", no_argument, 0, 'D'},
4140 {"unwind", no_argument, 0, 'u'},
4141 {"archive-index", no_argument, 0, 'c'},
4142 {"hex-dump", required_argument, 0, 'x'},
4143 {"relocated-dump", required_argument, 0, 'R'},
4144 {"string-dump", required_argument, 0, 'p'},
4145 {"decompress", no_argument, 0, 'z'},
4146 #ifdef SUPPORT_DISASSEMBLY
4147 {"instruction-dump", required_argument, 0, 'i'},
4148 #endif
4149 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4150
4151 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4152 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4153 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4154
4155 {"version", no_argument, 0, 'v'},
4156 {"wide", no_argument, 0, 'W'},
4157 {"help", no_argument, 0, 'H'},
4158 {0, no_argument, 0, 0}
4159 };
4160
4161 static void
4162 usage (FILE * stream)
4163 {
4164 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4165 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4166 fprintf (stream, _(" Options are:\n\
4167 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4168 -h --file-header Display the ELF file header\n\
4169 -l --program-headers Display the program headers\n\
4170 --segments An alias for --program-headers\n\
4171 -S --section-headers Display the sections' header\n\
4172 --sections An alias for --section-headers\n\
4173 -g --section-groups Display the section groups\n\
4174 -t --section-details Display the section details\n\
4175 -e --headers Equivalent to: -h -l -S\n\
4176 -s --syms Display the symbol table\n\
4177 --symbols An alias for --syms\n\
4178 --dyn-syms Display the dynamic symbol table\n\
4179 -n --notes Display the core notes (if present)\n\
4180 -r --relocs Display the relocations (if present)\n\
4181 -u --unwind Display the unwind info (if present)\n\
4182 -d --dynamic Display the dynamic section (if present)\n\
4183 -V --version-info Display the version sections (if present)\n\
4184 -A --arch-specific Display architecture specific information (if any)\n\
4185 -c --archive-index Display the symbol/file index in an archive\n\
4186 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4187 -x --hex-dump=<number|name>\n\
4188 Dump the contents of section <number|name> as bytes\n\
4189 -p --string-dump=<number|name>\n\
4190 Dump the contents of section <number|name> as strings\n\
4191 -R --relocated-dump=<number|name>\n\
4192 Dump the contents of section <number|name> as relocated bytes\n\
4193 -z --decompress Decompress section before dumping it\n\
4194 -w[lLiaprmfFsoRt] or\n\
4195 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4196 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4197 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4198 =addr,=cu_index]\n\
4199 Display the contents of DWARF2 debug sections\n"));
4200 fprintf (stream, _("\
4201 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4202 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4203 or deeper\n"));
4204 #ifdef SUPPORT_DISASSEMBLY
4205 fprintf (stream, _("\
4206 -i --instruction-dump=<number|name>\n\
4207 Disassemble the contents of section <number|name>\n"));
4208 #endif
4209 fprintf (stream, _("\
4210 -I --histogram Display histogram of bucket list lengths\n\
4211 -W --wide Allow output width to exceed 80 characters\n\
4212 @<file> Read options from <file>\n\
4213 -H --help Display this information\n\
4214 -v --version Display the version number of readelf\n"));
4215
4216 if (REPORT_BUGS_TO[0] && stream == stdout)
4217 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4218
4219 exit (stream == stdout ? 0 : 1);
4220 }
4221
4222 /* Record the fact that the user wants the contents of section number
4223 SECTION to be displayed using the method(s) encoded as flags bits
4224 in TYPE. Note, TYPE can be zero if we are creating the array for
4225 the first time. */
4226
4227 static void
4228 request_dump_bynumber (unsigned int section, dump_type type)
4229 {
4230 if (section >= num_dump_sects)
4231 {
4232 dump_type * new_dump_sects;
4233
4234 new_dump_sects = (dump_type *) calloc (section + 1,
4235 sizeof (* dump_sects));
4236
4237 if (new_dump_sects == NULL)
4238 error (_("Out of memory allocating dump request table.\n"));
4239 else
4240 {
4241 /* Copy current flag settings. */
4242 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4243
4244 free (dump_sects);
4245
4246 dump_sects = new_dump_sects;
4247 num_dump_sects = section + 1;
4248 }
4249 }
4250
4251 if (dump_sects)
4252 dump_sects[section] |= type;
4253
4254 return;
4255 }
4256
4257 /* Request a dump by section name. */
4258
4259 static void
4260 request_dump_byname (const char * section, dump_type type)
4261 {
4262 struct dump_list_entry * new_request;
4263
4264 new_request = (struct dump_list_entry *)
4265 malloc (sizeof (struct dump_list_entry));
4266 if (!new_request)
4267 error (_("Out of memory allocating dump request table.\n"));
4268
4269 new_request->name = strdup (section);
4270 if (!new_request->name)
4271 error (_("Out of memory allocating dump request table.\n"));
4272
4273 new_request->type = type;
4274
4275 new_request->next = dump_sects_byname;
4276 dump_sects_byname = new_request;
4277 }
4278
4279 static inline void
4280 request_dump (dump_type type)
4281 {
4282 int section;
4283 char * cp;
4284
4285 do_dump++;
4286 section = strtoul (optarg, & cp, 0);
4287
4288 if (! *cp && section >= 0)
4289 request_dump_bynumber (section, type);
4290 else
4291 request_dump_byname (optarg, type);
4292 }
4293
4294
4295 static void
4296 parse_args (int argc, char ** argv)
4297 {
4298 int c;
4299
4300 if (argc < 2)
4301 usage (stderr);
4302
4303 while ((c = getopt_long
4304 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4305 {
4306 switch (c)
4307 {
4308 case 0:
4309 /* Long options. */
4310 break;
4311 case 'H':
4312 usage (stdout);
4313 break;
4314
4315 case 'a':
4316 do_syms++;
4317 do_reloc++;
4318 do_unwind++;
4319 do_dynamic++;
4320 do_header++;
4321 do_sections++;
4322 do_section_groups++;
4323 do_segments++;
4324 do_version++;
4325 do_histogram++;
4326 do_arch++;
4327 do_notes++;
4328 break;
4329 case 'g':
4330 do_section_groups++;
4331 break;
4332 case 't':
4333 case 'N':
4334 do_sections++;
4335 do_section_details++;
4336 break;
4337 case 'e':
4338 do_header++;
4339 do_sections++;
4340 do_segments++;
4341 break;
4342 case 'A':
4343 do_arch++;
4344 break;
4345 case 'D':
4346 do_using_dynamic++;
4347 break;
4348 case 'r':
4349 do_reloc++;
4350 break;
4351 case 'u':
4352 do_unwind++;
4353 break;
4354 case 'h':
4355 do_header++;
4356 break;
4357 case 'l':
4358 do_segments++;
4359 break;
4360 case 's':
4361 do_syms++;
4362 break;
4363 case 'S':
4364 do_sections++;
4365 break;
4366 case 'd':
4367 do_dynamic++;
4368 break;
4369 case 'I':
4370 do_histogram++;
4371 break;
4372 case 'n':
4373 do_notes++;
4374 break;
4375 case 'c':
4376 do_archive_index++;
4377 break;
4378 case 'x':
4379 request_dump (HEX_DUMP);
4380 break;
4381 case 'p':
4382 request_dump (STRING_DUMP);
4383 break;
4384 case 'R':
4385 request_dump (RELOC_DUMP);
4386 break;
4387 case 'z':
4388 decompress_dumps++;
4389 break;
4390 case 'w':
4391 do_dump++;
4392 if (optarg == 0)
4393 {
4394 do_debugging = 1;
4395 dwarf_select_sections_all ();
4396 }
4397 else
4398 {
4399 do_debugging = 0;
4400 dwarf_select_sections_by_letters (optarg);
4401 }
4402 break;
4403 case OPTION_DEBUG_DUMP:
4404 do_dump++;
4405 if (optarg == 0)
4406 do_debugging = 1;
4407 else
4408 {
4409 do_debugging = 0;
4410 dwarf_select_sections_by_names (optarg);
4411 }
4412 break;
4413 case OPTION_DWARF_DEPTH:
4414 {
4415 char *cp;
4416
4417 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4418 }
4419 break;
4420 case OPTION_DWARF_START:
4421 {
4422 char *cp;
4423
4424 dwarf_start_die = strtoul (optarg, & cp, 0);
4425 }
4426 break;
4427 case OPTION_DWARF_CHECK:
4428 dwarf_check = 1;
4429 break;
4430 case OPTION_DYN_SYMS:
4431 do_dyn_syms++;
4432 break;
4433 #ifdef SUPPORT_DISASSEMBLY
4434 case 'i':
4435 request_dump (DISASS_DUMP);
4436 break;
4437 #endif
4438 case 'v':
4439 print_version (program_name);
4440 break;
4441 case 'V':
4442 do_version++;
4443 break;
4444 case 'W':
4445 do_wide++;
4446 break;
4447 default:
4448 /* xgettext:c-format */
4449 error (_("Invalid option '-%c'\n"), c);
4450 /* Drop through. */
4451 case '?':
4452 usage (stderr);
4453 }
4454 }
4455
4456 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4457 && !do_segments && !do_header && !do_dump && !do_version
4458 && !do_histogram && !do_debugging && !do_arch && !do_notes
4459 && !do_section_groups && !do_archive_index
4460 && !do_dyn_syms)
4461 usage (stderr);
4462 }
4463
4464 static const char *
4465 get_elf_class (unsigned int elf_class)
4466 {
4467 static char buff[32];
4468
4469 switch (elf_class)
4470 {
4471 case ELFCLASSNONE: return _("none");
4472 case ELFCLASS32: return "ELF32";
4473 case ELFCLASS64: return "ELF64";
4474 default:
4475 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4476 return buff;
4477 }
4478 }
4479
4480 static const char *
4481 get_data_encoding (unsigned int encoding)
4482 {
4483 static char buff[32];
4484
4485 switch (encoding)
4486 {
4487 case ELFDATANONE: return _("none");
4488 case ELFDATA2LSB: return _("2's complement, little endian");
4489 case ELFDATA2MSB: return _("2's complement, big endian");
4490 default:
4491 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4492 return buff;
4493 }
4494 }
4495
4496 /* Decode the data held in 'elf_header'. */
4497
4498 static int
4499 process_file_header (void)
4500 {
4501 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4502 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4503 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4504 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4505 {
4506 error
4507 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4508 return 0;
4509 }
4510
4511 init_dwarf_regnames (elf_header.e_machine);
4512
4513 if (do_header)
4514 {
4515 int i;
4516
4517 printf (_("ELF Header:\n"));
4518 printf (_(" Magic: "));
4519 for (i = 0; i < EI_NIDENT; i++)
4520 printf ("%2.2x ", elf_header.e_ident[i]);
4521 printf ("\n");
4522 printf (_(" Class: %s\n"),
4523 get_elf_class (elf_header.e_ident[EI_CLASS]));
4524 printf (_(" Data: %s\n"),
4525 get_data_encoding (elf_header.e_ident[EI_DATA]));
4526 printf (_(" Version: %d %s\n"),
4527 elf_header.e_ident[EI_VERSION],
4528 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4529 ? "(current)"
4530 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4531 ? _("<unknown: %lx>")
4532 : "")));
4533 printf (_(" OS/ABI: %s\n"),
4534 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4535 printf (_(" ABI Version: %d\n"),
4536 elf_header.e_ident[EI_ABIVERSION]);
4537 printf (_(" Type: %s\n"),
4538 get_file_type (elf_header.e_type));
4539 printf (_(" Machine: %s\n"),
4540 get_machine_name (elf_header.e_machine));
4541 printf (_(" Version: 0x%lx\n"),
4542 (unsigned long) elf_header.e_version);
4543
4544 printf (_(" Entry point address: "));
4545 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4546 printf (_("\n Start of program headers: "));
4547 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4548 printf (_(" (bytes into file)\n Start of section headers: "));
4549 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4550 printf (_(" (bytes into file)\n"));
4551
4552 printf (_(" Flags: 0x%lx%s\n"),
4553 (unsigned long) elf_header.e_flags,
4554 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4555 printf (_(" Size of this header: %ld (bytes)\n"),
4556 (long) elf_header.e_ehsize);
4557 printf (_(" Size of program headers: %ld (bytes)\n"),
4558 (long) elf_header.e_phentsize);
4559 printf (_(" Number of program headers: %ld"),
4560 (long) elf_header.e_phnum);
4561 if (section_headers != NULL
4562 && elf_header.e_phnum == PN_XNUM
4563 && section_headers[0].sh_info != 0)
4564 printf (" (%ld)", (long) section_headers[0].sh_info);
4565 putc ('\n', stdout);
4566 printf (_(" Size of section headers: %ld (bytes)\n"),
4567 (long) elf_header.e_shentsize);
4568 printf (_(" Number of section headers: %ld"),
4569 (long) elf_header.e_shnum);
4570 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4571 printf (" (%ld)", (long) section_headers[0].sh_size);
4572 putc ('\n', stdout);
4573 printf (_(" Section header string table index: %ld"),
4574 (long) elf_header.e_shstrndx);
4575 if (section_headers != NULL
4576 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4577 printf (" (%u)", section_headers[0].sh_link);
4578 else if (elf_header.e_shstrndx != SHN_UNDEF
4579 && elf_header.e_shstrndx >= elf_header.e_shnum)
4580 printf (_(" <corrupt: out of range>"));
4581 putc ('\n', stdout);
4582 }
4583
4584 if (section_headers != NULL)
4585 {
4586 if (elf_header.e_phnum == PN_XNUM
4587 && section_headers[0].sh_info != 0)
4588 elf_header.e_phnum = section_headers[0].sh_info;
4589 if (elf_header.e_shnum == SHN_UNDEF)
4590 elf_header.e_shnum = section_headers[0].sh_size;
4591 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4592 elf_header.e_shstrndx = section_headers[0].sh_link;
4593 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4594 elf_header.e_shstrndx = SHN_UNDEF;
4595 free (section_headers);
4596 section_headers = NULL;
4597 }
4598
4599 return 1;
4600 }
4601
4602 static bfd_boolean
4603 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4604 {
4605 Elf32_External_Phdr * phdrs;
4606 Elf32_External_Phdr * external;
4607 Elf_Internal_Phdr * internal;
4608 unsigned int i;
4609 unsigned int size = elf_header.e_phentsize;
4610 unsigned int num = elf_header.e_phnum;
4611
4612 /* PR binutils/17531: Cope with unexpected section header sizes. */
4613 if (size == 0 || num == 0)
4614 return FALSE;
4615 if (size < sizeof * phdrs)
4616 {
4617 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4618 return FALSE;
4619 }
4620 if (size > sizeof * phdrs)
4621 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4622
4623 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4624 size, num, _("program headers"));
4625 if (phdrs == NULL)
4626 return FALSE;
4627
4628 for (i = 0, internal = pheaders, external = phdrs;
4629 i < elf_header.e_phnum;
4630 i++, internal++, external++)
4631 {
4632 internal->p_type = BYTE_GET (external->p_type);
4633 internal->p_offset = BYTE_GET (external->p_offset);
4634 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4635 internal->p_paddr = BYTE_GET (external->p_paddr);
4636 internal->p_filesz = BYTE_GET (external->p_filesz);
4637 internal->p_memsz = BYTE_GET (external->p_memsz);
4638 internal->p_flags = BYTE_GET (external->p_flags);
4639 internal->p_align = BYTE_GET (external->p_align);
4640 }
4641
4642 free (phdrs);
4643 return TRUE;
4644 }
4645
4646 static bfd_boolean
4647 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4648 {
4649 Elf64_External_Phdr * phdrs;
4650 Elf64_External_Phdr * external;
4651 Elf_Internal_Phdr * internal;
4652 unsigned int i;
4653 unsigned int size = elf_header.e_phentsize;
4654 unsigned int num = elf_header.e_phnum;
4655
4656 /* PR binutils/17531: Cope with unexpected section header sizes. */
4657 if (size == 0 || num == 0)
4658 return FALSE;
4659 if (size < sizeof * phdrs)
4660 {
4661 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4662 return FALSE;
4663 }
4664 if (size > sizeof * phdrs)
4665 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4666
4667 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4668 size, num, _("program headers"));
4669 if (!phdrs)
4670 return FALSE;
4671
4672 for (i = 0, internal = pheaders, external = phdrs;
4673 i < elf_header.e_phnum;
4674 i++, internal++, external++)
4675 {
4676 internal->p_type = BYTE_GET (external->p_type);
4677 internal->p_flags = BYTE_GET (external->p_flags);
4678 internal->p_offset = BYTE_GET (external->p_offset);
4679 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4680 internal->p_paddr = BYTE_GET (external->p_paddr);
4681 internal->p_filesz = BYTE_GET (external->p_filesz);
4682 internal->p_memsz = BYTE_GET (external->p_memsz);
4683 internal->p_align = BYTE_GET (external->p_align);
4684 }
4685
4686 free (phdrs);
4687 return TRUE;
4688 }
4689
4690 /* Returns 1 if the program headers were read into `program_headers'. */
4691
4692 static int
4693 get_program_headers (FILE * file)
4694 {
4695 Elf_Internal_Phdr * phdrs;
4696
4697 /* Check cache of prior read. */
4698 if (program_headers != NULL)
4699 return 1;
4700
4701 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4702 sizeof (Elf_Internal_Phdr));
4703
4704 if (phdrs == NULL)
4705 {
4706 error (_("Out of memory reading %u program headers\n"),
4707 elf_header.e_phnum);
4708 return 0;
4709 }
4710
4711 if (is_32bit_elf
4712 ? get_32bit_program_headers (file, phdrs)
4713 : get_64bit_program_headers (file, phdrs))
4714 {
4715 program_headers = phdrs;
4716 return 1;
4717 }
4718
4719 free (phdrs);
4720 return 0;
4721 }
4722
4723 /* Returns 1 if the program headers were loaded. */
4724
4725 static int
4726 process_program_headers (FILE * file)
4727 {
4728 Elf_Internal_Phdr * segment;
4729 unsigned int i;
4730
4731 if (elf_header.e_phnum == 0)
4732 {
4733 /* PR binutils/12467. */
4734 if (elf_header.e_phoff != 0)
4735 warn (_("possibly corrupt ELF header - it has a non-zero program"
4736 " header offset, but no program headers\n"));
4737 else if (do_segments)
4738 printf (_("\nThere are no program headers in this file.\n"));
4739 return 0;
4740 }
4741
4742 if (do_segments && !do_header)
4743 {
4744 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4745 printf (_("Entry point "));
4746 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4747 printf (_("\nThere are %d program headers, starting at offset "),
4748 elf_header.e_phnum);
4749 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4750 printf ("\n");
4751 }
4752
4753 if (! get_program_headers (file))
4754 return 0;
4755
4756 if (do_segments)
4757 {
4758 if (elf_header.e_phnum > 1)
4759 printf (_("\nProgram Headers:\n"));
4760 else
4761 printf (_("\nProgram Headers:\n"));
4762
4763 if (is_32bit_elf)
4764 printf
4765 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4766 else if (do_wide)
4767 printf
4768 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4769 else
4770 {
4771 printf
4772 (_(" Type Offset VirtAddr PhysAddr\n"));
4773 printf
4774 (_(" FileSiz MemSiz Flags Align\n"));
4775 }
4776 }
4777
4778 dynamic_addr = 0;
4779 dynamic_size = 0;
4780
4781 for (i = 0, segment = program_headers;
4782 i < elf_header.e_phnum;
4783 i++, segment++)
4784 {
4785 if (do_segments)
4786 {
4787 printf (" %-14.14s ", get_segment_type (segment->p_type));
4788
4789 if (is_32bit_elf)
4790 {
4791 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4792 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4793 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4794 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4795 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4796 printf ("%c%c%c ",
4797 (segment->p_flags & PF_R ? 'R' : ' '),
4798 (segment->p_flags & PF_W ? 'W' : ' '),
4799 (segment->p_flags & PF_X ? 'E' : ' '));
4800 printf ("%#lx", (unsigned long) segment->p_align);
4801 }
4802 else if (do_wide)
4803 {
4804 if ((unsigned long) segment->p_offset == segment->p_offset)
4805 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4806 else
4807 {
4808 print_vma (segment->p_offset, FULL_HEX);
4809 putchar (' ');
4810 }
4811
4812 print_vma (segment->p_vaddr, FULL_HEX);
4813 putchar (' ');
4814 print_vma (segment->p_paddr, FULL_HEX);
4815 putchar (' ');
4816
4817 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4818 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4819 else
4820 {
4821 print_vma (segment->p_filesz, FULL_HEX);
4822 putchar (' ');
4823 }
4824
4825 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4826 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4827 else
4828 {
4829 print_vma (segment->p_memsz, FULL_HEX);
4830 }
4831
4832 printf (" %c%c%c ",
4833 (segment->p_flags & PF_R ? 'R' : ' '),
4834 (segment->p_flags & PF_W ? 'W' : ' '),
4835 (segment->p_flags & PF_X ? 'E' : ' '));
4836
4837 if ((unsigned long) segment->p_align == segment->p_align)
4838 printf ("%#lx", (unsigned long) segment->p_align);
4839 else
4840 {
4841 print_vma (segment->p_align, PREFIX_HEX);
4842 }
4843 }
4844 else
4845 {
4846 print_vma (segment->p_offset, FULL_HEX);
4847 putchar (' ');
4848 print_vma (segment->p_vaddr, FULL_HEX);
4849 putchar (' ');
4850 print_vma (segment->p_paddr, FULL_HEX);
4851 printf ("\n ");
4852 print_vma (segment->p_filesz, FULL_HEX);
4853 putchar (' ');
4854 print_vma (segment->p_memsz, FULL_HEX);
4855 printf (" %c%c%c ",
4856 (segment->p_flags & PF_R ? 'R' : ' '),
4857 (segment->p_flags & PF_W ? 'W' : ' '),
4858 (segment->p_flags & PF_X ? 'E' : ' '));
4859 print_vma (segment->p_align, HEX);
4860 }
4861 }
4862
4863 if (do_segments)
4864 putc ('\n', stdout);
4865
4866 switch (segment->p_type)
4867 {
4868 case PT_DYNAMIC:
4869 if (dynamic_addr)
4870 error (_("more than one dynamic segment\n"));
4871
4872 /* By default, assume that the .dynamic section is the first
4873 section in the DYNAMIC segment. */
4874 dynamic_addr = segment->p_offset;
4875 dynamic_size = segment->p_filesz;
4876 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4877 if (dynamic_addr + dynamic_size >= current_file_size)
4878 {
4879 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4880 dynamic_addr = dynamic_size = 0;
4881 }
4882
4883 /* Try to locate the .dynamic section. If there is
4884 a section header table, we can easily locate it. */
4885 if (section_headers != NULL)
4886 {
4887 Elf_Internal_Shdr * sec;
4888
4889 sec = find_section (".dynamic");
4890 if (sec == NULL || sec->sh_size == 0)
4891 {
4892 /* A corresponding .dynamic section is expected, but on
4893 IA-64/OpenVMS it is OK for it to be missing. */
4894 if (!is_ia64_vms ())
4895 error (_("no .dynamic section in the dynamic segment\n"));
4896 break;
4897 }
4898
4899 if (sec->sh_type == SHT_NOBITS)
4900 {
4901 dynamic_size = 0;
4902 break;
4903 }
4904
4905 dynamic_addr = sec->sh_offset;
4906 dynamic_size = sec->sh_size;
4907
4908 if (dynamic_addr < segment->p_offset
4909 || dynamic_addr > segment->p_offset + segment->p_filesz)
4910 warn (_("the .dynamic section is not contained"
4911 " within the dynamic segment\n"));
4912 else if (dynamic_addr > segment->p_offset)
4913 warn (_("the .dynamic section is not the first section"
4914 " in the dynamic segment.\n"));
4915 }
4916 break;
4917
4918 case PT_INTERP:
4919 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4920 SEEK_SET))
4921 error (_("Unable to find program interpreter name\n"));
4922 else
4923 {
4924 char fmt [32];
4925 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4926
4927 if (ret >= (int) sizeof (fmt) || ret < 0)
4928 error (_("Internal error: failed to create format string to display program interpreter\n"));
4929
4930 program_interpreter[0] = 0;
4931 if (fscanf (file, fmt, program_interpreter) <= 0)
4932 error (_("Unable to read program interpreter name\n"));
4933
4934 if (do_segments)
4935 printf (_(" [Requesting program interpreter: %s]\n"),
4936 program_interpreter);
4937 }
4938 break;
4939 }
4940 }
4941
4942 if (do_segments && section_headers != NULL && string_table != NULL)
4943 {
4944 printf (_("\n Section to Segment mapping:\n"));
4945 printf (_(" Segment Sections...\n"));
4946
4947 for (i = 0; i < elf_header.e_phnum; i++)
4948 {
4949 unsigned int j;
4950 Elf_Internal_Shdr * section;
4951
4952 segment = program_headers + i;
4953 section = section_headers + 1;
4954
4955 printf (" %2.2d ", i);
4956
4957 for (j = 1; j < elf_header.e_shnum; j++, section++)
4958 {
4959 if (!ELF_TBSS_SPECIAL (section, segment)
4960 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4961 printf ("%s ", printable_section_name (section));
4962 }
4963
4964 putc ('\n',stdout);
4965 }
4966 }
4967
4968 return 1;
4969 }
4970
4971
4972 /* Find the file offset corresponding to VMA by using the program headers. */
4973
4974 static long
4975 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4976 {
4977 Elf_Internal_Phdr * seg;
4978
4979 if (! get_program_headers (file))
4980 {
4981 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4982 return (long) vma;
4983 }
4984
4985 for (seg = program_headers;
4986 seg < program_headers + elf_header.e_phnum;
4987 ++seg)
4988 {
4989 if (seg->p_type != PT_LOAD)
4990 continue;
4991
4992 if (vma >= (seg->p_vaddr & -seg->p_align)
4993 && vma + size <= seg->p_vaddr + seg->p_filesz)
4994 return vma - seg->p_vaddr + seg->p_offset;
4995 }
4996
4997 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4998 (unsigned long) vma);
4999 return (long) vma;
5000 }
5001
5002
5003 /* Allocate memory and load the sections headers into the global pointer
5004 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5005 generate any error messages if the load fails. */
5006
5007 static bfd_boolean
5008 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5009 {
5010 Elf32_External_Shdr * shdrs;
5011 Elf_Internal_Shdr * internal;
5012 unsigned int i;
5013 unsigned int size = elf_header.e_shentsize;
5014 unsigned int num = probe ? 1 : elf_header.e_shnum;
5015
5016 /* PR binutils/17531: Cope with unexpected section header sizes. */
5017 if (size == 0 || num == 0)
5018 return FALSE;
5019 if (size < sizeof * shdrs)
5020 {
5021 if (! probe)
5022 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5023 return FALSE;
5024 }
5025 if (!probe && size > sizeof * shdrs)
5026 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5027
5028 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5029 size, num,
5030 probe ? NULL : _("section headers"));
5031 if (shdrs == NULL)
5032 return FALSE;
5033
5034 if (section_headers != NULL)
5035 free (section_headers);
5036 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5037 sizeof (Elf_Internal_Shdr));
5038 if (section_headers == NULL)
5039 {
5040 if (!probe)
5041 error (_("Out of memory reading %u section headers\n"), num);
5042 return FALSE;
5043 }
5044
5045 for (i = 0, internal = section_headers;
5046 i < num;
5047 i++, internal++)
5048 {
5049 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5050 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5051 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5052 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5053 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5054 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5055 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5056 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5057 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5058 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5059 if (!probe && internal->sh_link > num)
5060 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5061 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5062 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5063 }
5064
5065 free (shdrs);
5066 return TRUE;
5067 }
5068
5069 static bfd_boolean
5070 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5071 {
5072 Elf64_External_Shdr * shdrs;
5073 Elf_Internal_Shdr * internal;
5074 unsigned int i;
5075 unsigned int size = elf_header.e_shentsize;
5076 unsigned int num = probe ? 1 : elf_header.e_shnum;
5077
5078 /* PR binutils/17531: Cope with unexpected section header sizes. */
5079 if (size == 0 || num == 0)
5080 return FALSE;
5081 if (size < sizeof * shdrs)
5082 {
5083 if (! probe)
5084 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5085 return FALSE;
5086 }
5087 if (! probe && size > sizeof * shdrs)
5088 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5089
5090 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5091 size, num,
5092 probe ? NULL : _("section headers"));
5093 if (shdrs == NULL)
5094 return FALSE;
5095
5096 if (section_headers != NULL)
5097 free (section_headers);
5098 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5099 sizeof (Elf_Internal_Shdr));
5100 if (section_headers == NULL)
5101 {
5102 if (! probe)
5103 error (_("Out of memory reading %u section headers\n"), num);
5104 return FALSE;
5105 }
5106
5107 for (i = 0, internal = section_headers;
5108 i < num;
5109 i++, internal++)
5110 {
5111 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5112 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5113 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5114 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5115 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5116 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5117 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5118 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5119 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5120 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5121 if (!probe && internal->sh_link > num)
5122 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5123 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5124 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5125 }
5126
5127 free (shdrs);
5128 return TRUE;
5129 }
5130
5131 static Elf_Internal_Sym *
5132 get_32bit_elf_symbols (FILE * file,
5133 Elf_Internal_Shdr * section,
5134 unsigned long * num_syms_return)
5135 {
5136 unsigned long number = 0;
5137 Elf32_External_Sym * esyms = NULL;
5138 Elf_External_Sym_Shndx * shndx = NULL;
5139 Elf_Internal_Sym * isyms = NULL;
5140 Elf_Internal_Sym * psym;
5141 unsigned int j;
5142
5143 if (section->sh_size == 0)
5144 {
5145 if (num_syms_return != NULL)
5146 * num_syms_return = 0;
5147 return NULL;
5148 }
5149
5150 /* Run some sanity checks first. */
5151 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5152 {
5153 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5154 printable_section_name (section), (unsigned long) section->sh_entsize);
5155 goto exit_point;
5156 }
5157
5158 if (section->sh_size > current_file_size)
5159 {
5160 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5161 printable_section_name (section), (unsigned long) section->sh_size);
5162 goto exit_point;
5163 }
5164
5165 number = section->sh_size / section->sh_entsize;
5166
5167 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5168 {
5169 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5170 (unsigned long) section->sh_size,
5171 printable_section_name (section),
5172 (unsigned long) section->sh_entsize);
5173 goto exit_point;
5174 }
5175
5176 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5177 section->sh_size, _("symbols"));
5178 if (esyms == NULL)
5179 goto exit_point;
5180
5181 {
5182 elf_section_list * entry;
5183
5184 shndx = NULL;
5185 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5186 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5187 {
5188 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5189 entry->hdr->sh_offset,
5190 1, entry->hdr->sh_size,
5191 _("symbol table section indicies"));
5192 if (shndx == NULL)
5193 goto exit_point;
5194 /* PR17531: file: heap-buffer-overflow */
5195 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5196 {
5197 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5198 printable_section_name (entry->hdr),
5199 (unsigned long) entry->hdr->sh_size,
5200 (unsigned long) section->sh_size);
5201 goto exit_point;
5202 }
5203 }
5204 }
5205
5206 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5207
5208 if (isyms == NULL)
5209 {
5210 error (_("Out of memory reading %lu symbols\n"),
5211 (unsigned long) number);
5212 goto exit_point;
5213 }
5214
5215 for (j = 0, psym = isyms; j < number; j++, psym++)
5216 {
5217 psym->st_name = BYTE_GET (esyms[j].st_name);
5218 psym->st_value = BYTE_GET (esyms[j].st_value);
5219 psym->st_size = BYTE_GET (esyms[j].st_size);
5220 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5221 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5222 psym->st_shndx
5223 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5224 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5225 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5226 psym->st_info = BYTE_GET (esyms[j].st_info);
5227 psym->st_other = BYTE_GET (esyms[j].st_other);
5228 }
5229
5230 exit_point:
5231 if (shndx != NULL)
5232 free (shndx);
5233 if (esyms != NULL)
5234 free (esyms);
5235
5236 if (num_syms_return != NULL)
5237 * num_syms_return = isyms == NULL ? 0 : number;
5238
5239 return isyms;
5240 }
5241
5242 static Elf_Internal_Sym *
5243 get_64bit_elf_symbols (FILE * file,
5244 Elf_Internal_Shdr * section,
5245 unsigned long * num_syms_return)
5246 {
5247 unsigned long number = 0;
5248 Elf64_External_Sym * esyms = NULL;
5249 Elf_External_Sym_Shndx * shndx = NULL;
5250 Elf_Internal_Sym * isyms = NULL;
5251 Elf_Internal_Sym * psym;
5252 unsigned int j;
5253
5254 if (section->sh_size == 0)
5255 {
5256 if (num_syms_return != NULL)
5257 * num_syms_return = 0;
5258 return NULL;
5259 }
5260
5261 /* Run some sanity checks first. */
5262 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5263 {
5264 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5265 printable_section_name (section),
5266 (unsigned long) section->sh_entsize);
5267 goto exit_point;
5268 }
5269
5270 if (section->sh_size > current_file_size)
5271 {
5272 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5273 printable_section_name (section),
5274 (unsigned long) section->sh_size);
5275 goto exit_point;
5276 }
5277
5278 number = section->sh_size / section->sh_entsize;
5279
5280 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5281 {
5282 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5283 (unsigned long) section->sh_size,
5284 printable_section_name (section),
5285 (unsigned long) section->sh_entsize);
5286 goto exit_point;
5287 }
5288
5289 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5290 section->sh_size, _("symbols"));
5291 if (!esyms)
5292 goto exit_point;
5293
5294 {
5295 elf_section_list * entry;
5296
5297 shndx = NULL;
5298 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5299 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5300 {
5301 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5302 entry->hdr->sh_offset,
5303 1, entry->hdr->sh_size,
5304 _("symbol table section indicies"));
5305 if (shndx == NULL)
5306 goto exit_point;
5307 /* PR17531: file: heap-buffer-overflow */
5308 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5309 {
5310 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5311 printable_section_name (entry->hdr),
5312 (unsigned long) entry->hdr->sh_size,
5313 (unsigned long) section->sh_size);
5314 goto exit_point;
5315 }
5316 }
5317 }
5318
5319 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5320
5321 if (isyms == NULL)
5322 {
5323 error (_("Out of memory reading %lu symbols\n"),
5324 (unsigned long) number);
5325 goto exit_point;
5326 }
5327
5328 for (j = 0, psym = isyms; j < number; j++, psym++)
5329 {
5330 psym->st_name = BYTE_GET (esyms[j].st_name);
5331 psym->st_info = BYTE_GET (esyms[j].st_info);
5332 psym->st_other = BYTE_GET (esyms[j].st_other);
5333 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5334
5335 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5336 psym->st_shndx
5337 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5338 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5339 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5340
5341 psym->st_value = BYTE_GET (esyms[j].st_value);
5342 psym->st_size = BYTE_GET (esyms[j].st_size);
5343 }
5344
5345 exit_point:
5346 if (shndx != NULL)
5347 free (shndx);
5348 if (esyms != NULL)
5349 free (esyms);
5350
5351 if (num_syms_return != NULL)
5352 * num_syms_return = isyms == NULL ? 0 : number;
5353
5354 return isyms;
5355 }
5356
5357 static const char *
5358 get_elf_section_flags (bfd_vma sh_flags)
5359 {
5360 static char buff[1024];
5361 char * p = buff;
5362 int field_size = is_32bit_elf ? 8 : 16;
5363 int sindex;
5364 int size = sizeof (buff) - (field_size + 4 + 1);
5365 bfd_vma os_flags = 0;
5366 bfd_vma proc_flags = 0;
5367 bfd_vma unknown_flags = 0;
5368 static const struct
5369 {
5370 const char * str;
5371 int len;
5372 }
5373 flags [] =
5374 {
5375 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5376 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5377 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5378 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5379 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5380 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5381 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5382 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5383 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5384 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5385 /* IA-64 specific. */
5386 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5387 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5388 /* IA-64 OpenVMS specific. */
5389 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5390 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5391 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5392 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5393 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5394 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5395 /* Generic. */
5396 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5397 /* SPARC specific. */
5398 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5399 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5400 /* ARM specific. */
5401 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5402 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5403 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5404 };
5405
5406 if (do_section_details)
5407 {
5408 sprintf (buff, "[%*.*lx]: ",
5409 field_size, field_size, (unsigned long) sh_flags);
5410 p += field_size + 4;
5411 }
5412
5413 while (sh_flags)
5414 {
5415 bfd_vma flag;
5416
5417 flag = sh_flags & - sh_flags;
5418 sh_flags &= ~ flag;
5419
5420 if (do_section_details)
5421 {
5422 switch (flag)
5423 {
5424 case SHF_WRITE: sindex = 0; break;
5425 case SHF_ALLOC: sindex = 1; break;
5426 case SHF_EXECINSTR: sindex = 2; break;
5427 case SHF_MERGE: sindex = 3; break;
5428 case SHF_STRINGS: sindex = 4; break;
5429 case SHF_INFO_LINK: sindex = 5; break;
5430 case SHF_LINK_ORDER: sindex = 6; break;
5431 case SHF_OS_NONCONFORMING: sindex = 7; break;
5432 case SHF_GROUP: sindex = 8; break;
5433 case SHF_TLS: sindex = 9; break;
5434 case SHF_EXCLUDE: sindex = 18; break;
5435 case SHF_COMPRESSED: sindex = 20; break;
5436
5437 default:
5438 sindex = -1;
5439 switch (elf_header.e_machine)
5440 {
5441 case EM_IA_64:
5442 if (flag == SHF_IA_64_SHORT)
5443 sindex = 10;
5444 else if (flag == SHF_IA_64_NORECOV)
5445 sindex = 11;
5446 #ifdef BFD64
5447 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5448 switch (flag)
5449 {
5450 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5451 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5452 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5453 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5454 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5455 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5456 default: break;
5457 }
5458 #endif
5459 break;
5460
5461 case EM_386:
5462 case EM_IAMCU:
5463 case EM_X86_64:
5464 case EM_L1OM:
5465 case EM_K1OM:
5466 case EM_OLD_SPARCV9:
5467 case EM_SPARC32PLUS:
5468 case EM_SPARCV9:
5469 case EM_SPARC:
5470 if (flag == SHF_ORDERED)
5471 sindex = 19;
5472 break;
5473
5474 case EM_ARM:
5475 switch (flag)
5476 {
5477 case SHF_ENTRYSECT: sindex = 21; break;
5478 case SHF_ARM_PURECODE: sindex = 22; break;
5479 case SHF_COMDEF: sindex = 23; break;
5480 default: break;
5481 }
5482 break;
5483
5484 default:
5485 break;
5486 }
5487 }
5488
5489 if (sindex != -1)
5490 {
5491 if (p != buff + field_size + 4)
5492 {
5493 if (size < (10 + 2))
5494 {
5495 warn (_("Internal error: not enough buffer room for section flag info"));
5496 return _("<unknown>");
5497 }
5498 size -= 2;
5499 *p++ = ',';
5500 *p++ = ' ';
5501 }
5502
5503 size -= flags [sindex].len;
5504 p = stpcpy (p, flags [sindex].str);
5505 }
5506 else if (flag & SHF_MASKOS)
5507 os_flags |= flag;
5508 else if (flag & SHF_MASKPROC)
5509 proc_flags |= flag;
5510 else
5511 unknown_flags |= flag;
5512 }
5513 else
5514 {
5515 switch (flag)
5516 {
5517 case SHF_WRITE: *p = 'W'; break;
5518 case SHF_ALLOC: *p = 'A'; break;
5519 case SHF_EXECINSTR: *p = 'X'; break;
5520 case SHF_MERGE: *p = 'M'; break;
5521 case SHF_STRINGS: *p = 'S'; break;
5522 case SHF_INFO_LINK: *p = 'I'; break;
5523 case SHF_LINK_ORDER: *p = 'L'; break;
5524 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5525 case SHF_GROUP: *p = 'G'; break;
5526 case SHF_TLS: *p = 'T'; break;
5527 case SHF_EXCLUDE: *p = 'E'; break;
5528 case SHF_COMPRESSED: *p = 'C'; break;
5529
5530 default:
5531 if ((elf_header.e_machine == EM_X86_64
5532 || elf_header.e_machine == EM_L1OM
5533 || elf_header.e_machine == EM_K1OM)
5534 && flag == SHF_X86_64_LARGE)
5535 *p = 'l';
5536 else if (elf_header.e_machine == EM_ARM
5537 && flag == SHF_ARM_PURECODE)
5538 *p = 'y';
5539 else if (flag & SHF_MASKOS)
5540 {
5541 *p = 'o';
5542 sh_flags &= ~ SHF_MASKOS;
5543 }
5544 else if (flag & SHF_MASKPROC)
5545 {
5546 *p = 'p';
5547 sh_flags &= ~ SHF_MASKPROC;
5548 }
5549 else
5550 *p = 'x';
5551 break;
5552 }
5553 p++;
5554 }
5555 }
5556
5557 if (do_section_details)
5558 {
5559 if (os_flags)
5560 {
5561 size -= 5 + field_size;
5562 if (p != buff + field_size + 4)
5563 {
5564 if (size < (2 + 1))
5565 {
5566 warn (_("Internal error: not enough buffer room for section flag info"));
5567 return _("<unknown>");
5568 }
5569 size -= 2;
5570 *p++ = ',';
5571 *p++ = ' ';
5572 }
5573 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5574 (unsigned long) os_flags);
5575 p += 5 + field_size;
5576 }
5577 if (proc_flags)
5578 {
5579 size -= 7 + field_size;
5580 if (p != buff + field_size + 4)
5581 {
5582 if (size < (2 + 1))
5583 {
5584 warn (_("Internal error: not enough buffer room for section flag info"));
5585 return _("<unknown>");
5586 }
5587 size -= 2;
5588 *p++ = ',';
5589 *p++ = ' ';
5590 }
5591 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5592 (unsigned long) proc_flags);
5593 p += 7 + field_size;
5594 }
5595 if (unknown_flags)
5596 {
5597 size -= 10 + field_size;
5598 if (p != buff + field_size + 4)
5599 {
5600 if (size < (2 + 1))
5601 {
5602 warn (_("Internal error: not enough buffer room for section flag info"));
5603 return _("<unknown>");
5604 }
5605 size -= 2;
5606 *p++ = ',';
5607 *p++ = ' ';
5608 }
5609 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5610 (unsigned long) unknown_flags);
5611 p += 10 + field_size;
5612 }
5613 }
5614
5615 *p = '\0';
5616 return buff;
5617 }
5618
5619 static unsigned int
5620 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5621 {
5622 if (is_32bit_elf)
5623 {
5624 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5625
5626 chdr->ch_type = BYTE_GET (echdr->ch_type);
5627 chdr->ch_size = BYTE_GET (echdr->ch_size);
5628 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5629 return sizeof (*echdr);
5630 }
5631 else
5632 {
5633 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5634
5635 chdr->ch_type = BYTE_GET (echdr->ch_type);
5636 chdr->ch_size = BYTE_GET (echdr->ch_size);
5637 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5638 return sizeof (*echdr);
5639 }
5640 }
5641
5642 static int
5643 process_section_headers (FILE * file)
5644 {
5645 Elf_Internal_Shdr * section;
5646 unsigned int i;
5647
5648 section_headers = NULL;
5649
5650 if (elf_header.e_shnum == 0)
5651 {
5652 /* PR binutils/12467. */
5653 if (elf_header.e_shoff != 0)
5654 warn (_("possibly corrupt ELF file header - it has a non-zero"
5655 " section header offset, but no section headers\n"));
5656 else if (do_sections)
5657 printf (_("\nThere are no sections in this file.\n"));
5658
5659 return 1;
5660 }
5661
5662 if (do_sections && !do_header)
5663 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5664 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5665
5666 if (is_32bit_elf)
5667 {
5668 if (! get_32bit_section_headers (file, FALSE))
5669 return 0;
5670 }
5671 else if (! get_64bit_section_headers (file, FALSE))
5672 return 0;
5673
5674 /* Read in the string table, so that we have names to display. */
5675 if (elf_header.e_shstrndx != SHN_UNDEF
5676 && elf_header.e_shstrndx < elf_header.e_shnum)
5677 {
5678 section = section_headers + elf_header.e_shstrndx;
5679
5680 if (section->sh_size != 0)
5681 {
5682 string_table = (char *) get_data (NULL, file, section->sh_offset,
5683 1, section->sh_size,
5684 _("string table"));
5685
5686 string_table_length = string_table != NULL ? section->sh_size : 0;
5687 }
5688 }
5689
5690 /* Scan the sections for the dynamic symbol table
5691 and dynamic string table and debug sections. */
5692 dynamic_symbols = NULL;
5693 dynamic_strings = NULL;
5694 dynamic_syminfo = NULL;
5695 symtab_shndx_list = NULL;
5696
5697 eh_addr_size = is_32bit_elf ? 4 : 8;
5698 switch (elf_header.e_machine)
5699 {
5700 case EM_MIPS:
5701 case EM_MIPS_RS3_LE:
5702 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5703 FDE addresses. However, the ABI also has a semi-official ILP32
5704 variant for which the normal FDE address size rules apply.
5705
5706 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5707 section, where XX is the size of longs in bits. Unfortunately,
5708 earlier compilers provided no way of distinguishing ILP32 objects
5709 from LP64 objects, so if there's any doubt, we should assume that
5710 the official LP64 form is being used. */
5711 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5712 && find_section (".gcc_compiled_long32") == NULL)
5713 eh_addr_size = 8;
5714 break;
5715
5716 case EM_H8_300:
5717 case EM_H8_300H:
5718 switch (elf_header.e_flags & EF_H8_MACH)
5719 {
5720 case E_H8_MACH_H8300:
5721 case E_H8_MACH_H8300HN:
5722 case E_H8_MACH_H8300SN:
5723 case E_H8_MACH_H8300SXN:
5724 eh_addr_size = 2;
5725 break;
5726 case E_H8_MACH_H8300H:
5727 case E_H8_MACH_H8300S:
5728 case E_H8_MACH_H8300SX:
5729 eh_addr_size = 4;
5730 break;
5731 }
5732 break;
5733
5734 case EM_M32C_OLD:
5735 case EM_M32C:
5736 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5737 {
5738 case EF_M32C_CPU_M16C:
5739 eh_addr_size = 2;
5740 break;
5741 }
5742 break;
5743 }
5744
5745 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5746 do \
5747 { \
5748 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5749 if (section->sh_entsize != expected_entsize) \
5750 { \
5751 char buf[40]; \
5752 sprintf_vma (buf, section->sh_entsize); \
5753 /* Note: coded this way so that there is a single string for \
5754 translation. */ \
5755 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5756 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5757 (unsigned) expected_entsize); \
5758 section->sh_entsize = expected_entsize; \
5759 } \
5760 } \
5761 while (0)
5762
5763 #define CHECK_ENTSIZE(section, i, type) \
5764 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5765 sizeof (Elf64_External_##type))
5766
5767 for (i = 0, section = section_headers;
5768 i < elf_header.e_shnum;
5769 i++, section++)
5770 {
5771 char * name = SECTION_NAME (section);
5772
5773 if (section->sh_type == SHT_DYNSYM)
5774 {
5775 if (dynamic_symbols != NULL)
5776 {
5777 error (_("File contains multiple dynamic symbol tables\n"));
5778 continue;
5779 }
5780
5781 CHECK_ENTSIZE (section, i, Sym);
5782 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5783 }
5784 else if (section->sh_type == SHT_STRTAB
5785 && streq (name, ".dynstr"))
5786 {
5787 if (dynamic_strings != NULL)
5788 {
5789 error (_("File contains multiple dynamic string tables\n"));
5790 continue;
5791 }
5792
5793 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5794 1, section->sh_size,
5795 _("dynamic strings"));
5796 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5797 }
5798 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5799 {
5800 elf_section_list * entry = xmalloc (sizeof * entry);
5801 entry->hdr = section;
5802 entry->next = symtab_shndx_list;
5803 symtab_shndx_list = entry;
5804 }
5805 else if (section->sh_type == SHT_SYMTAB)
5806 CHECK_ENTSIZE (section, i, Sym);
5807 else if (section->sh_type == SHT_GROUP)
5808 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5809 else if (section->sh_type == SHT_REL)
5810 CHECK_ENTSIZE (section, i, Rel);
5811 else if (section->sh_type == SHT_RELA)
5812 CHECK_ENTSIZE (section, i, Rela);
5813 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5814 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5815 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5816 || do_debug_str || do_debug_loc || do_debug_ranges
5817 || do_debug_addr || do_debug_cu_index)
5818 && (const_strneq (name, ".debug_")
5819 || const_strneq (name, ".zdebug_")))
5820 {
5821 if (name[1] == 'z')
5822 name += sizeof (".zdebug_") - 1;
5823 else
5824 name += sizeof (".debug_") - 1;
5825
5826 if (do_debugging
5827 || (do_debug_info && const_strneq (name, "info"))
5828 || (do_debug_info && const_strneq (name, "types"))
5829 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5830 || (do_debug_lines && strcmp (name, "line") == 0)
5831 || (do_debug_lines && const_strneq (name, "line."))
5832 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5833 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5834 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5835 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5836 || (do_debug_aranges && const_strneq (name, "aranges"))
5837 || (do_debug_ranges && const_strneq (name, "ranges"))
5838 || (do_debug_frames && const_strneq (name, "frame"))
5839 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5840 || (do_debug_macinfo && const_strneq (name, "macro"))
5841 || (do_debug_str && const_strneq (name, "str"))
5842 || (do_debug_loc && const_strneq (name, "loc"))
5843 || (do_debug_addr && const_strneq (name, "addr"))
5844 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5845 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5846 )
5847 request_dump_bynumber (i, DEBUG_DUMP);
5848 }
5849 /* Linkonce section to be combined with .debug_info at link time. */
5850 else if ((do_debugging || do_debug_info)
5851 && const_strneq (name, ".gnu.linkonce.wi."))
5852 request_dump_bynumber (i, DEBUG_DUMP);
5853 else if (do_debug_frames && streq (name, ".eh_frame"))
5854 request_dump_bynumber (i, DEBUG_DUMP);
5855 else if (do_gdb_index && streq (name, ".gdb_index"))
5856 request_dump_bynumber (i, DEBUG_DUMP);
5857 /* Trace sections for Itanium VMS. */
5858 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5859 || do_trace_aranges)
5860 && const_strneq (name, ".trace_"))
5861 {
5862 name += sizeof (".trace_") - 1;
5863
5864 if (do_debugging
5865 || (do_trace_info && streq (name, "info"))
5866 || (do_trace_abbrevs && streq (name, "abbrev"))
5867 || (do_trace_aranges && streq (name, "aranges"))
5868 )
5869 request_dump_bynumber (i, DEBUG_DUMP);
5870 }
5871 }
5872
5873 if (! do_sections)
5874 return 1;
5875
5876 if (elf_header.e_shnum > 1)
5877 printf (_("\nSection Headers:\n"));
5878 else
5879 printf (_("\nSection Header:\n"));
5880
5881 if (is_32bit_elf)
5882 {
5883 if (do_section_details)
5884 {
5885 printf (_(" [Nr] Name\n"));
5886 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5887 }
5888 else
5889 printf
5890 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5891 }
5892 else if (do_wide)
5893 {
5894 if (do_section_details)
5895 {
5896 printf (_(" [Nr] Name\n"));
5897 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5898 }
5899 else
5900 printf
5901 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5902 }
5903 else
5904 {
5905 if (do_section_details)
5906 {
5907 printf (_(" [Nr] Name\n"));
5908 printf (_(" Type Address Offset Link\n"));
5909 printf (_(" Size EntSize Info Align\n"));
5910 }
5911 else
5912 {
5913 printf (_(" [Nr] Name Type Address Offset\n"));
5914 printf (_(" Size EntSize Flags Link Info Align\n"));
5915 }
5916 }
5917
5918 if (do_section_details)
5919 printf (_(" Flags\n"));
5920
5921 for (i = 0, section = section_headers;
5922 i < elf_header.e_shnum;
5923 i++, section++)
5924 {
5925 /* Run some sanity checks on the section header. */
5926
5927 /* Check the sh_link field. */
5928 switch (section->sh_type)
5929 {
5930 case SHT_SYMTAB_SHNDX:
5931 case SHT_GROUP:
5932 case SHT_HASH:
5933 case SHT_GNU_HASH:
5934 case SHT_GNU_versym:
5935 case SHT_REL:
5936 case SHT_RELA:
5937 if (section->sh_link < 1
5938 || section->sh_link > elf_header.e_shnum
5939 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
5940 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
5941 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
5942 i, section->sh_link);
5943 break;
5944
5945 case SHT_DYNAMIC:
5946 case SHT_SYMTAB:
5947 case SHT_DYNSYM:
5948 case SHT_GNU_verneed:
5949 case SHT_GNU_verdef:
5950 case SHT_GNU_LIBLIST:
5951 if (section->sh_link < 1
5952 || section->sh_link > elf_header.e_shnum
5953 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
5954 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
5955 i, section->sh_link);
5956 break;
5957
5958 case SHT_INIT_ARRAY:
5959 case SHT_FINI_ARRAY:
5960 case SHT_PREINIT_ARRAY:
5961 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5962 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5963 i, section->sh_link);
5964 break;
5965
5966 default:
5967 /* FIXME: Add support for target specific section types. */
5968 #if 0 /* Currently we do not check other section types as there are too
5969 many special cases. Stab sections for example have a type
5970 of SHT_PROGBITS but an sh_link field that links to the .stabstr
5971 section. */
5972 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5973 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5974 i, section->sh_link);
5975 #endif
5976 break;
5977 }
5978
5979 /* Check the sh_info field. */
5980 switch (section->sh_type)
5981 {
5982 case SHT_REL:
5983 case SHT_RELA:
5984 if (section->sh_info < 1
5985 || section->sh_info > elf_header.e_shnum
5986 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
5987 && section_headers[section->sh_info].sh_type != SHT_NOBITS
5988 && section_headers[section->sh_info].sh_type != SHT_NOTE
5989 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
5990 /* FIXME: Are other section types valid ? */
5991 && section_headers[section->sh_info].sh_type < SHT_LOOS))
5992 {
5993 if (section->sh_info == 0
5994 && (streq (SECTION_NAME (section), ".rel.dyn")
5995 || streq (SECTION_NAME (section), ".rela.dyn")))
5996 /* The .rel.dyn and .rela.dyn sections have an sh_info field
5997 of zero. No idea why. I would have expected the index
5998 of the .plt section. */
5999 ;
6000 else
6001 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6002 i, section->sh_info);
6003 }
6004 break;
6005
6006 case SHT_DYNAMIC:
6007 case SHT_HASH:
6008 case SHT_SYMTAB_SHNDX:
6009 case SHT_INIT_ARRAY:
6010 case SHT_FINI_ARRAY:
6011 case SHT_PREINIT_ARRAY:
6012 if (section->sh_info != 0)
6013 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6014 i, section->sh_info);
6015 break;
6016
6017 case SHT_GROUP:
6018 case SHT_SYMTAB:
6019 case SHT_DYNSYM:
6020 /* A symbol index - we assume that it is valid. */
6021 break;
6022
6023 default:
6024 /* FIXME: Add support for target specific section types. */
6025 if (section->sh_type == SHT_NOBITS)
6026 /* NOBITS section headers with non-zero sh_info fields can be
6027 created when a binary is stripped of everything but its debug
6028 information. The stripped sections have their headers preserved but their types set to SHT_NOBITS. so do not check this type of section. */
6029 ;
6030 else if (section->sh_flags & SHF_INFO_LINK)
6031 {
6032 if (section->sh_info < 1 || section->sh_info > elf_header.e_shnum)
6033 warn (_("[%2u]: Expected link to another section in info field"), i);
6034 }
6035 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6036 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6037 i, section->sh_info);
6038 break;
6039 }
6040
6041 printf (" [%2u] ", i);
6042 if (do_section_details)
6043 printf ("%s\n ", printable_section_name (section));
6044 else
6045 print_symbol (-17, SECTION_NAME (section));
6046
6047 printf (do_wide ? " %-15s " : " %-15.15s ",
6048 get_section_type_name (section->sh_type));
6049
6050 if (is_32bit_elf)
6051 {
6052 const char * link_too_big = NULL;
6053
6054 print_vma (section->sh_addr, LONG_HEX);
6055
6056 printf ( " %6.6lx %6.6lx %2.2lx",
6057 (unsigned long) section->sh_offset,
6058 (unsigned long) section->sh_size,
6059 (unsigned long) section->sh_entsize);
6060
6061 if (do_section_details)
6062 fputs (" ", stdout);
6063 else
6064 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6065
6066 if (section->sh_link >= elf_header.e_shnum)
6067 {
6068 link_too_big = "";
6069 /* The sh_link value is out of range. Normally this indicates
6070 an error but it can have special values in Solaris binaries. */
6071 switch (elf_header.e_machine)
6072 {
6073 case EM_386:
6074 case EM_IAMCU:
6075 case EM_X86_64:
6076 case EM_L1OM:
6077 case EM_K1OM:
6078 case EM_OLD_SPARCV9:
6079 case EM_SPARC32PLUS:
6080 case EM_SPARCV9:
6081 case EM_SPARC:
6082 if (section->sh_link == (SHN_BEFORE & 0xffff))
6083 link_too_big = "BEFORE";
6084 else if (section->sh_link == (SHN_AFTER & 0xffff))
6085 link_too_big = "AFTER";
6086 break;
6087 default:
6088 break;
6089 }
6090 }
6091
6092 if (do_section_details)
6093 {
6094 if (link_too_big != NULL && * link_too_big)
6095 printf ("<%s> ", link_too_big);
6096 else
6097 printf ("%2u ", section->sh_link);
6098 printf ("%3u %2lu\n", section->sh_info,
6099 (unsigned long) section->sh_addralign);
6100 }
6101 else
6102 printf ("%2u %3u %2lu\n",
6103 section->sh_link,
6104 section->sh_info,
6105 (unsigned long) section->sh_addralign);
6106
6107 if (link_too_big && ! * link_too_big)
6108 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6109 i, section->sh_link);
6110 }
6111 else if (do_wide)
6112 {
6113 print_vma (section->sh_addr, LONG_HEX);
6114
6115 if ((long) section->sh_offset == section->sh_offset)
6116 printf (" %6.6lx", (unsigned long) section->sh_offset);
6117 else
6118 {
6119 putchar (' ');
6120 print_vma (section->sh_offset, LONG_HEX);
6121 }
6122
6123 if ((unsigned long) section->sh_size == section->sh_size)
6124 printf (" %6.6lx", (unsigned long) section->sh_size);
6125 else
6126 {
6127 putchar (' ');
6128 print_vma (section->sh_size, LONG_HEX);
6129 }
6130
6131 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6132 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6133 else
6134 {
6135 putchar (' ');
6136 print_vma (section->sh_entsize, LONG_HEX);
6137 }
6138
6139 if (do_section_details)
6140 fputs (" ", stdout);
6141 else
6142 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6143
6144 printf ("%2u %3u ", section->sh_link, section->sh_info);
6145
6146 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6147 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6148 else
6149 {
6150 print_vma (section->sh_addralign, DEC);
6151 putchar ('\n');
6152 }
6153 }
6154 else if (do_section_details)
6155 {
6156 printf (" %-15.15s ",
6157 get_section_type_name (section->sh_type));
6158 print_vma (section->sh_addr, LONG_HEX);
6159 if ((long) section->sh_offset == section->sh_offset)
6160 printf (" %16.16lx", (unsigned long) section->sh_offset);
6161 else
6162 {
6163 printf (" ");
6164 print_vma (section->sh_offset, LONG_HEX);
6165 }
6166 printf (" %u\n ", section->sh_link);
6167 print_vma (section->sh_size, LONG_HEX);
6168 putchar (' ');
6169 print_vma (section->sh_entsize, LONG_HEX);
6170
6171 printf (" %-16u %lu\n",
6172 section->sh_info,
6173 (unsigned long) section->sh_addralign);
6174 }
6175 else
6176 {
6177 putchar (' ');
6178 print_vma (section->sh_addr, LONG_HEX);
6179 if ((long) section->sh_offset == section->sh_offset)
6180 printf (" %8.8lx", (unsigned long) section->sh_offset);
6181 else
6182 {
6183 printf (" ");
6184 print_vma (section->sh_offset, LONG_HEX);
6185 }
6186 printf ("\n ");
6187 print_vma (section->sh_size, LONG_HEX);
6188 printf (" ");
6189 print_vma (section->sh_entsize, LONG_HEX);
6190
6191 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6192
6193 printf (" %2u %3u %lu\n",
6194 section->sh_link,
6195 section->sh_info,
6196 (unsigned long) section->sh_addralign);
6197 }
6198
6199 if (do_section_details)
6200 {
6201 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6202 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6203 {
6204 /* Minimum section size is 12 bytes for 32-bit compression
6205 header + 12 bytes for compressed data header. */
6206 unsigned char buf[24];
6207
6208 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6209 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6210 sizeof (buf), _("compression header")))
6211 {
6212 Elf_Internal_Chdr chdr;
6213
6214 (void) get_compression_header (&chdr, buf);
6215
6216 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6217 printf (" ZLIB, ");
6218 else
6219 printf (_(" [<unknown>: 0x%x], "),
6220 chdr.ch_type);
6221 print_vma (chdr.ch_size, LONG_HEX);
6222 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6223 }
6224 }
6225 }
6226 }
6227
6228 if (!do_section_details)
6229 {
6230 /* The ordering of the letters shown here matches the ordering of the
6231 corresponding SHF_xxx values, and hence the order in which these
6232 letters will be displayed to the user. */
6233 printf (_("Key to Flags:\n\
6234 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6235 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6236 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6237 if (elf_header.e_machine == EM_X86_64
6238 || elf_header.e_machine == EM_L1OM
6239 || elf_header.e_machine == EM_K1OM)
6240 printf (_("l (large), "));
6241 else if (elf_header.e_machine == EM_ARM)
6242 printf (_("y (purecode), "));
6243 printf ("p (processor specific)\n");
6244 }
6245
6246 return 1;
6247 }
6248
6249 static const char *
6250 get_group_flags (unsigned int flags)
6251 {
6252 static char buff[32];
6253 switch (flags)
6254 {
6255 case 0:
6256 return "";
6257
6258 case GRP_COMDAT:
6259 return "COMDAT ";
6260
6261 default:
6262 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6263 break;
6264 }
6265 return buff;
6266 }
6267
6268 static int
6269 process_section_groups (FILE * file)
6270 {
6271 Elf_Internal_Shdr * section;
6272 unsigned int i;
6273 struct group * group;
6274 Elf_Internal_Shdr * symtab_sec;
6275 Elf_Internal_Shdr * strtab_sec;
6276 Elf_Internal_Sym * symtab;
6277 unsigned long num_syms;
6278 char * strtab;
6279 size_t strtab_size;
6280
6281 /* Don't process section groups unless needed. */
6282 if (!do_unwind && !do_section_groups)
6283 return 1;
6284
6285 if (elf_header.e_shnum == 0)
6286 {
6287 if (do_section_groups)
6288 printf (_("\nThere are no sections to group in this file.\n"));
6289
6290 return 1;
6291 }
6292
6293 if (section_headers == NULL)
6294 {
6295 error (_("Section headers are not available!\n"));
6296 /* PR 13622: This can happen with a corrupt ELF header. */
6297 return 0;
6298 }
6299
6300 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6301 sizeof (struct group *));
6302
6303 if (section_headers_groups == NULL)
6304 {
6305 error (_("Out of memory reading %u section group headers\n"),
6306 elf_header.e_shnum);
6307 return 0;
6308 }
6309
6310 /* Scan the sections for the group section. */
6311 group_count = 0;
6312 for (i = 0, section = section_headers;
6313 i < elf_header.e_shnum;
6314 i++, section++)
6315 if (section->sh_type == SHT_GROUP)
6316 group_count++;
6317
6318 if (group_count == 0)
6319 {
6320 if (do_section_groups)
6321 printf (_("\nThere are no section groups in this file.\n"));
6322
6323 return 1;
6324 }
6325
6326 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6327
6328 if (section_groups == NULL)
6329 {
6330 error (_("Out of memory reading %lu groups\n"),
6331 (unsigned long) group_count);
6332 return 0;
6333 }
6334
6335 symtab_sec = NULL;
6336 strtab_sec = NULL;
6337 symtab = NULL;
6338 num_syms = 0;
6339 strtab = NULL;
6340 strtab_size = 0;
6341 for (i = 0, section = section_headers, group = section_groups;
6342 i < elf_header.e_shnum;
6343 i++, section++)
6344 {
6345 if (section->sh_type == SHT_GROUP)
6346 {
6347 const char * name = printable_section_name (section);
6348 const char * group_name;
6349 unsigned char * start;
6350 unsigned char * indices;
6351 unsigned int entry, j, size;
6352 Elf_Internal_Shdr * sec;
6353 Elf_Internal_Sym * sym;
6354
6355 /* Get the symbol table. */
6356 if (section->sh_link >= elf_header.e_shnum
6357 || ((sec = section_headers + section->sh_link)->sh_type
6358 != SHT_SYMTAB))
6359 {
6360 error (_("Bad sh_link in group section `%s'\n"), name);
6361 continue;
6362 }
6363
6364 if (symtab_sec != sec)
6365 {
6366 symtab_sec = sec;
6367 if (symtab)
6368 free (symtab);
6369 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6370 }
6371
6372 if (symtab == NULL)
6373 {
6374 error (_("Corrupt header in group section `%s'\n"), name);
6375 continue;
6376 }
6377
6378 if (section->sh_info >= num_syms)
6379 {
6380 error (_("Bad sh_info in group section `%s'\n"), name);
6381 continue;
6382 }
6383
6384 sym = symtab + section->sh_info;
6385
6386 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6387 {
6388 if (sym->st_shndx == 0
6389 || sym->st_shndx >= elf_header.e_shnum)
6390 {
6391 error (_("Bad sh_info in group section `%s'\n"), name);
6392 continue;
6393 }
6394
6395 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6396 strtab_sec = NULL;
6397 if (strtab)
6398 free (strtab);
6399 strtab = NULL;
6400 strtab_size = 0;
6401 }
6402 else
6403 {
6404 /* Get the string table. */
6405 if (symtab_sec->sh_link >= elf_header.e_shnum)
6406 {
6407 strtab_sec = NULL;
6408 if (strtab)
6409 free (strtab);
6410 strtab = NULL;
6411 strtab_size = 0;
6412 }
6413 else if (strtab_sec
6414 != (sec = section_headers + symtab_sec->sh_link))
6415 {
6416 strtab_sec = sec;
6417 if (strtab)
6418 free (strtab);
6419
6420 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6421 1, strtab_sec->sh_size,
6422 _("string table"));
6423 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6424 }
6425 group_name = sym->st_name < strtab_size
6426 ? strtab + sym->st_name : _("<corrupt>");
6427 }
6428
6429 /* PR 17531: file: loop. */
6430 if (section->sh_entsize > section->sh_size)
6431 {
6432 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6433 printable_section_name (section),
6434 (unsigned long) section->sh_entsize,
6435 (unsigned long) section->sh_size);
6436 break;
6437 }
6438
6439 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6440 1, section->sh_size,
6441 _("section data"));
6442 if (start == NULL)
6443 continue;
6444
6445 indices = start;
6446 size = (section->sh_size / section->sh_entsize) - 1;
6447 entry = byte_get (indices, 4);
6448 indices += 4;
6449
6450 if (do_section_groups)
6451 {
6452 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6453 get_group_flags (entry), i, name, group_name, size);
6454
6455 printf (_(" [Index] Name\n"));
6456 }
6457
6458 group->group_index = i;
6459
6460 for (j = 0; j < size; j++)
6461 {
6462 struct group_list * g;
6463
6464 entry = byte_get (indices, 4);
6465 indices += 4;
6466
6467 if (entry >= elf_header.e_shnum)
6468 {
6469 static unsigned num_group_errors = 0;
6470
6471 if (num_group_errors ++ < 10)
6472 {
6473 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6474 entry, i, elf_header.e_shnum - 1);
6475 if (num_group_errors == 10)
6476 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6477 }
6478 continue;
6479 }
6480
6481 if (section_headers_groups [entry] != NULL)
6482 {
6483 if (entry)
6484 {
6485 static unsigned num_errs = 0;
6486
6487 if (num_errs ++ < 10)
6488 {
6489 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6490 entry, i,
6491 section_headers_groups [entry]->group_index);
6492 if (num_errs == 10)
6493 warn (_("Further error messages about already contained group sections suppressed\n"));
6494 }
6495 continue;
6496 }
6497 else
6498 {
6499 /* Intel C/C++ compiler may put section 0 in a
6500 section group. We just warn it the first time
6501 and ignore it afterwards. */
6502 static int warned = 0;
6503 if (!warned)
6504 {
6505 error (_("section 0 in group section [%5u]\n"),
6506 section_headers_groups [entry]->group_index);
6507 warned++;
6508 }
6509 }
6510 }
6511
6512 section_headers_groups [entry] = group;
6513
6514 if (do_section_groups)
6515 {
6516 sec = section_headers + entry;
6517 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6518 }
6519
6520 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6521 g->section_index = entry;
6522 g->next = group->root;
6523 group->root = g;
6524 }
6525
6526 if (start)
6527 free (start);
6528
6529 group++;
6530 }
6531 }
6532
6533 if (symtab)
6534 free (symtab);
6535 if (strtab)
6536 free (strtab);
6537 return 1;
6538 }
6539
6540 /* Data used to display dynamic fixups. */
6541
6542 struct ia64_vms_dynfixup
6543 {
6544 bfd_vma needed_ident; /* Library ident number. */
6545 bfd_vma needed; /* Index in the dstrtab of the library name. */
6546 bfd_vma fixup_needed; /* Index of the library. */
6547 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6548 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6549 };
6550
6551 /* Data used to display dynamic relocations. */
6552
6553 struct ia64_vms_dynimgrela
6554 {
6555 bfd_vma img_rela_cnt; /* Number of relocations. */
6556 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6557 };
6558
6559 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6560 library). */
6561
6562 static void
6563 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6564 const char *strtab, unsigned int strtab_sz)
6565 {
6566 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6567 long i;
6568 const char *lib_name;
6569
6570 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6571 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6572 _("dynamic section image fixups"));
6573 if (!imfs)
6574 return;
6575
6576 if (fixup->needed < strtab_sz)
6577 lib_name = strtab + fixup->needed;
6578 else
6579 {
6580 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6581 (unsigned long) fixup->needed);
6582 lib_name = "???";
6583 }
6584 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6585 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6586 printf
6587 (_("Seg Offset Type SymVec DataType\n"));
6588
6589 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6590 {
6591 unsigned int type;
6592 const char *rtype;
6593
6594 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6595 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6596 type = BYTE_GET (imfs [i].type);
6597 rtype = elf_ia64_reloc_type (type);
6598 if (rtype == NULL)
6599 printf (" 0x%08x ", type);
6600 else
6601 printf (" %-32s ", rtype);
6602 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6603 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6604 }
6605
6606 free (imfs);
6607 }
6608
6609 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6610
6611 static void
6612 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6613 {
6614 Elf64_External_VMS_IMAGE_RELA *imrs;
6615 long i;
6616
6617 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6618 1, imgrela->img_rela_cnt * sizeof (*imrs),
6619 _("dynamic section image relocations"));
6620 if (!imrs)
6621 return;
6622
6623 printf (_("\nImage relocs\n"));
6624 printf
6625 (_("Seg Offset Type Addend Seg Sym Off\n"));
6626
6627 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6628 {
6629 unsigned int type;
6630 const char *rtype;
6631
6632 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6633 printf ("%08" BFD_VMA_FMT "x ",
6634 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6635 type = BYTE_GET (imrs [i].type);
6636 rtype = elf_ia64_reloc_type (type);
6637 if (rtype == NULL)
6638 printf ("0x%08x ", type);
6639 else
6640 printf ("%-31s ", rtype);
6641 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6642 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6643 printf ("%08" BFD_VMA_FMT "x\n",
6644 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6645 }
6646
6647 free (imrs);
6648 }
6649
6650 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6651
6652 static int
6653 process_ia64_vms_dynamic_relocs (FILE *file)
6654 {
6655 struct ia64_vms_dynfixup fixup;
6656 struct ia64_vms_dynimgrela imgrela;
6657 Elf_Internal_Dyn *entry;
6658 int res = 0;
6659 bfd_vma strtab_off = 0;
6660 bfd_vma strtab_sz = 0;
6661 char *strtab = NULL;
6662
6663 memset (&fixup, 0, sizeof (fixup));
6664 memset (&imgrela, 0, sizeof (imgrela));
6665
6666 /* Note: the order of the entries is specified by the OpenVMS specs. */
6667 for (entry = dynamic_section;
6668 entry < dynamic_section + dynamic_nent;
6669 entry++)
6670 {
6671 switch (entry->d_tag)
6672 {
6673 case DT_IA_64_VMS_STRTAB_OFFSET:
6674 strtab_off = entry->d_un.d_val;
6675 break;
6676 case DT_STRSZ:
6677 strtab_sz = entry->d_un.d_val;
6678 if (strtab == NULL)
6679 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6680 1, strtab_sz, _("dynamic string section"));
6681 break;
6682
6683 case DT_IA_64_VMS_NEEDED_IDENT:
6684 fixup.needed_ident = entry->d_un.d_val;
6685 break;
6686 case DT_NEEDED:
6687 fixup.needed = entry->d_un.d_val;
6688 break;
6689 case DT_IA_64_VMS_FIXUP_NEEDED:
6690 fixup.fixup_needed = entry->d_un.d_val;
6691 break;
6692 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6693 fixup.fixup_rela_cnt = entry->d_un.d_val;
6694 break;
6695 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6696 fixup.fixup_rela_off = entry->d_un.d_val;
6697 res++;
6698 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6699 break;
6700
6701 case DT_IA_64_VMS_IMG_RELA_CNT:
6702 imgrela.img_rela_cnt = entry->d_un.d_val;
6703 break;
6704 case DT_IA_64_VMS_IMG_RELA_OFF:
6705 imgrela.img_rela_off = entry->d_un.d_val;
6706 res++;
6707 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6708 break;
6709
6710 default:
6711 break;
6712 }
6713 }
6714
6715 if (strtab != NULL)
6716 free (strtab);
6717
6718 return res;
6719 }
6720
6721 static struct
6722 {
6723 const char * name;
6724 int reloc;
6725 int size;
6726 int rela;
6727 } dynamic_relocations [] =
6728 {
6729 { "REL", DT_REL, DT_RELSZ, FALSE },
6730 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6731 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6732 };
6733
6734 /* Process the reloc section. */
6735
6736 static int
6737 process_relocs (FILE * file)
6738 {
6739 unsigned long rel_size;
6740 unsigned long rel_offset;
6741
6742
6743 if (!do_reloc)
6744 return 1;
6745
6746 if (do_using_dynamic)
6747 {
6748 int is_rela;
6749 const char * name;
6750 int has_dynamic_reloc;
6751 unsigned int i;
6752
6753 has_dynamic_reloc = 0;
6754
6755 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6756 {
6757 is_rela = dynamic_relocations [i].rela;
6758 name = dynamic_relocations [i].name;
6759 rel_size = dynamic_info [dynamic_relocations [i].size];
6760 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6761
6762 has_dynamic_reloc |= rel_size;
6763
6764 if (is_rela == UNKNOWN)
6765 {
6766 if (dynamic_relocations [i].reloc == DT_JMPREL)
6767 switch (dynamic_info[DT_PLTREL])
6768 {
6769 case DT_REL:
6770 is_rela = FALSE;
6771 break;
6772 case DT_RELA:
6773 is_rela = TRUE;
6774 break;
6775 }
6776 }
6777
6778 if (rel_size)
6779 {
6780 printf
6781 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6782 name, rel_offset, rel_size);
6783
6784 dump_relocations (file,
6785 offset_from_vma (file, rel_offset, rel_size),
6786 rel_size,
6787 dynamic_symbols, num_dynamic_syms,
6788 dynamic_strings, dynamic_strings_length,
6789 is_rela, 1);
6790 }
6791 }
6792
6793 if (is_ia64_vms ())
6794 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6795
6796 if (! has_dynamic_reloc)
6797 printf (_("\nThere are no dynamic relocations in this file.\n"));
6798 }
6799 else
6800 {
6801 Elf_Internal_Shdr * section;
6802 unsigned long i;
6803 int found = 0;
6804
6805 for (i = 0, section = section_headers;
6806 i < elf_header.e_shnum;
6807 i++, section++)
6808 {
6809 if ( section->sh_type != SHT_RELA
6810 && section->sh_type != SHT_REL)
6811 continue;
6812
6813 rel_offset = section->sh_offset;
6814 rel_size = section->sh_size;
6815
6816 if (rel_size)
6817 {
6818 Elf_Internal_Shdr * strsec;
6819 int is_rela;
6820
6821 printf (_("\nRelocation section "));
6822
6823 if (string_table == NULL)
6824 printf ("%d", section->sh_name);
6825 else
6826 printf ("'%s'", printable_section_name (section));
6827
6828 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6829 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6830
6831 is_rela = section->sh_type == SHT_RELA;
6832
6833 if (section->sh_link != 0
6834 && section->sh_link < elf_header.e_shnum)
6835 {
6836 Elf_Internal_Shdr * symsec;
6837 Elf_Internal_Sym * symtab;
6838 unsigned long nsyms;
6839 unsigned long strtablen = 0;
6840 char * strtab = NULL;
6841
6842 symsec = section_headers + section->sh_link;
6843 if (symsec->sh_type != SHT_SYMTAB
6844 && symsec->sh_type != SHT_DYNSYM)
6845 continue;
6846
6847 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6848
6849 if (symtab == NULL)
6850 continue;
6851
6852 if (symsec->sh_link != 0
6853 && symsec->sh_link < elf_header.e_shnum)
6854 {
6855 strsec = section_headers + symsec->sh_link;
6856
6857 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6858 1, strsec->sh_size,
6859 _("string table"));
6860 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6861 }
6862
6863 dump_relocations (file, rel_offset, rel_size,
6864 symtab, nsyms, strtab, strtablen,
6865 is_rela,
6866 symsec->sh_type == SHT_DYNSYM);
6867 if (strtab)
6868 free (strtab);
6869 free (symtab);
6870 }
6871 else
6872 dump_relocations (file, rel_offset, rel_size,
6873 NULL, 0, NULL, 0, is_rela, 0);
6874
6875 found = 1;
6876 }
6877 }
6878
6879 if (! found)
6880 printf (_("\nThere are no relocations in this file.\n"));
6881 }
6882
6883 return 1;
6884 }
6885
6886 /* An absolute address consists of a section and an offset. If the
6887 section is NULL, the offset itself is the address, otherwise, the
6888 address equals to LOAD_ADDRESS(section) + offset. */
6889
6890 struct absaddr
6891 {
6892 unsigned short section;
6893 bfd_vma offset;
6894 };
6895
6896 #define ABSADDR(a) \
6897 ((a).section \
6898 ? section_headers [(a).section].sh_addr + (a).offset \
6899 : (a).offset)
6900
6901 /* Find the nearest symbol at or below ADDR. Returns the symbol
6902 name, if found, and the offset from the symbol to ADDR. */
6903
6904 static void
6905 find_symbol_for_address (Elf_Internal_Sym * symtab,
6906 unsigned long nsyms,
6907 const char * strtab,
6908 unsigned long strtab_size,
6909 struct absaddr addr,
6910 const char ** symname,
6911 bfd_vma * offset)
6912 {
6913 bfd_vma dist = 0x100000;
6914 Elf_Internal_Sym * sym;
6915 Elf_Internal_Sym * beg;
6916 Elf_Internal_Sym * end;
6917 Elf_Internal_Sym * best = NULL;
6918
6919 REMOVE_ARCH_BITS (addr.offset);
6920 beg = symtab;
6921 end = symtab + nsyms;
6922
6923 while (beg < end)
6924 {
6925 bfd_vma value;
6926
6927 sym = beg + (end - beg) / 2;
6928
6929 value = sym->st_value;
6930 REMOVE_ARCH_BITS (value);
6931
6932 if (sym->st_name != 0
6933 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6934 && addr.offset >= value
6935 && addr.offset - value < dist)
6936 {
6937 best = sym;
6938 dist = addr.offset - value;
6939 if (!dist)
6940 break;
6941 }
6942
6943 if (addr.offset < value)
6944 end = sym;
6945 else
6946 beg = sym + 1;
6947 }
6948
6949 if (best)
6950 {
6951 *symname = (best->st_name >= strtab_size
6952 ? _("<corrupt>") : strtab + best->st_name);
6953 *offset = dist;
6954 return;
6955 }
6956
6957 *symname = NULL;
6958 *offset = addr.offset;
6959 }
6960
6961 static int
6962 symcmp (const void *p, const void *q)
6963 {
6964 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6965 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6966
6967 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6968 }
6969
6970 /* Process the unwind section. */
6971
6972 #include "unwind-ia64.h"
6973
6974 struct ia64_unw_table_entry
6975 {
6976 struct absaddr start;
6977 struct absaddr end;
6978 struct absaddr info;
6979 };
6980
6981 struct ia64_unw_aux_info
6982 {
6983 struct ia64_unw_table_entry *table; /* Unwind table. */
6984 unsigned long table_len; /* Length of unwind table. */
6985 unsigned char * info; /* Unwind info. */
6986 unsigned long info_size; /* Size of unwind info. */
6987 bfd_vma info_addr; /* Starting address of unwind info. */
6988 bfd_vma seg_base; /* Starting address of segment. */
6989 Elf_Internal_Sym * symtab; /* The symbol table. */
6990 unsigned long nsyms; /* Number of symbols. */
6991 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6992 unsigned long nfuns; /* Number of entries in funtab. */
6993 char * strtab; /* The string table. */
6994 unsigned long strtab_size; /* Size of string table. */
6995 };
6996
6997 static void
6998 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6999 {
7000 struct ia64_unw_table_entry * tp;
7001 unsigned long j, nfuns;
7002 int in_body;
7003
7004 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7005 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7006 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7007 aux->funtab[nfuns++] = aux->symtab[j];
7008 aux->nfuns = nfuns;
7009 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7010
7011 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7012 {
7013 bfd_vma stamp;
7014 bfd_vma offset;
7015 const unsigned char * dp;
7016 const unsigned char * head;
7017 const unsigned char * end;
7018 const char * procname;
7019
7020 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7021 aux->strtab_size, tp->start, &procname, &offset);
7022
7023 fputs ("\n<", stdout);
7024
7025 if (procname)
7026 {
7027 fputs (procname, stdout);
7028
7029 if (offset)
7030 printf ("+%lx", (unsigned long) offset);
7031 }
7032
7033 fputs (">: [", stdout);
7034 print_vma (tp->start.offset, PREFIX_HEX);
7035 fputc ('-', stdout);
7036 print_vma (tp->end.offset, PREFIX_HEX);
7037 printf ("], info at +0x%lx\n",
7038 (unsigned long) (tp->info.offset - aux->seg_base));
7039
7040 /* PR 17531: file: 86232b32. */
7041 if (aux->info == NULL)
7042 continue;
7043
7044 /* PR 17531: file: 0997b4d1. */
7045 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7046 {
7047 warn (_("Invalid offset %lx in table entry %ld\n"),
7048 (long) tp->info.offset, (long) (tp - aux->table));
7049 continue;
7050 }
7051
7052 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7053 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7054
7055 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7056 (unsigned) UNW_VER (stamp),
7057 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7058 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7059 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7060 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7061
7062 if (UNW_VER (stamp) != 1)
7063 {
7064 printf (_("\tUnknown version.\n"));
7065 continue;
7066 }
7067
7068 in_body = 0;
7069 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7070 /* PR 17531: file: 16ceda89. */
7071 if (end > aux->info + aux->info_size)
7072 end = aux->info + aux->info_size;
7073 for (dp = head + 8; dp < end;)
7074 dp = unw_decode (dp, in_body, & in_body, end);
7075 }
7076
7077 free (aux->funtab);
7078 }
7079
7080 static bfd_boolean
7081 slurp_ia64_unwind_table (FILE * file,
7082 struct ia64_unw_aux_info * aux,
7083 Elf_Internal_Shdr * sec)
7084 {
7085 unsigned long size, nrelas, i;
7086 Elf_Internal_Phdr * seg;
7087 struct ia64_unw_table_entry * tep;
7088 Elf_Internal_Shdr * relsec;
7089 Elf_Internal_Rela * rela;
7090 Elf_Internal_Rela * rp;
7091 unsigned char * table;
7092 unsigned char * tp;
7093 Elf_Internal_Sym * sym;
7094 const char * relname;
7095
7096 aux->table_len = 0;
7097
7098 /* First, find the starting address of the segment that includes
7099 this section: */
7100
7101 if (elf_header.e_phnum)
7102 {
7103 if (! get_program_headers (file))
7104 return FALSE;
7105
7106 for (seg = program_headers;
7107 seg < program_headers + elf_header.e_phnum;
7108 ++seg)
7109 {
7110 if (seg->p_type != PT_LOAD)
7111 continue;
7112
7113 if (sec->sh_addr >= seg->p_vaddr
7114 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7115 {
7116 aux->seg_base = seg->p_vaddr;
7117 break;
7118 }
7119 }
7120 }
7121
7122 /* Second, build the unwind table from the contents of the unwind section: */
7123 size = sec->sh_size;
7124 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7125 _("unwind table"));
7126 if (!table)
7127 return FALSE;
7128
7129 aux->table_len = size / (3 * eh_addr_size);
7130 aux->table = (struct ia64_unw_table_entry *)
7131 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7132 tep = aux->table;
7133
7134 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7135 {
7136 tep->start.section = SHN_UNDEF;
7137 tep->end.section = SHN_UNDEF;
7138 tep->info.section = SHN_UNDEF;
7139 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7140 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7141 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7142 tep->start.offset += aux->seg_base;
7143 tep->end.offset += aux->seg_base;
7144 tep->info.offset += aux->seg_base;
7145 }
7146 free (table);
7147
7148 /* Third, apply any relocations to the unwind table: */
7149 for (relsec = section_headers;
7150 relsec < section_headers + elf_header.e_shnum;
7151 ++relsec)
7152 {
7153 if (relsec->sh_type != SHT_RELA
7154 || relsec->sh_info >= elf_header.e_shnum
7155 || section_headers + relsec->sh_info != sec)
7156 continue;
7157
7158 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7159 & rela, & nrelas))
7160 {
7161 free (aux->table);
7162 aux->table = NULL;
7163 aux->table_len = 0;
7164 return FALSE;
7165 }
7166
7167 for (rp = rela; rp < rela + nrelas; ++rp)
7168 {
7169 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7170 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7171
7172 /* PR 17531: file: 9fa67536. */
7173 if (relname == NULL)
7174 {
7175 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7176 continue;
7177 }
7178
7179 if (! const_strneq (relname, "R_IA64_SEGREL"))
7180 {
7181 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7182 continue;
7183 }
7184
7185 i = rp->r_offset / (3 * eh_addr_size);
7186
7187 /* PR 17531: file: 5bc8d9bf. */
7188 if (i >= aux->table_len)
7189 {
7190 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7191 continue;
7192 }
7193
7194 switch (rp->r_offset / eh_addr_size % 3)
7195 {
7196 case 0:
7197 aux->table[i].start.section = sym->st_shndx;
7198 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7199 break;
7200 case 1:
7201 aux->table[i].end.section = sym->st_shndx;
7202 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7203 break;
7204 case 2:
7205 aux->table[i].info.section = sym->st_shndx;
7206 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7207 break;
7208 default:
7209 break;
7210 }
7211 }
7212
7213 free (rela);
7214 }
7215
7216 return TRUE;
7217 }
7218
7219 static void
7220 ia64_process_unwind (FILE * file)
7221 {
7222 Elf_Internal_Shdr * sec;
7223 Elf_Internal_Shdr * unwsec = NULL;
7224 Elf_Internal_Shdr * strsec;
7225 unsigned long i, unwcount = 0, unwstart = 0;
7226 struct ia64_unw_aux_info aux;
7227
7228 memset (& aux, 0, sizeof (aux));
7229
7230 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7231 {
7232 if (sec->sh_type == SHT_SYMTAB
7233 && sec->sh_link < elf_header.e_shnum)
7234 {
7235 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7236
7237 strsec = section_headers + sec->sh_link;
7238 if (aux.strtab != NULL)
7239 {
7240 error (_("Multiple auxillary string tables encountered\n"));
7241 free (aux.strtab);
7242 }
7243 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7244 1, strsec->sh_size,
7245 _("string table"));
7246 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7247 }
7248 else if (sec->sh_type == SHT_IA_64_UNWIND)
7249 unwcount++;
7250 }
7251
7252 if (!unwcount)
7253 printf (_("\nThere are no unwind sections in this file.\n"));
7254
7255 while (unwcount-- > 0)
7256 {
7257 char * suffix;
7258 size_t len, len2;
7259
7260 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7261 i < elf_header.e_shnum; ++i, ++sec)
7262 if (sec->sh_type == SHT_IA_64_UNWIND)
7263 {
7264 unwsec = sec;
7265 break;
7266 }
7267 /* We have already counted the number of SHT_IA64_UNWIND
7268 sections so the loop above should never fail. */
7269 assert (unwsec != NULL);
7270
7271 unwstart = i + 1;
7272 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7273
7274 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7275 {
7276 /* We need to find which section group it is in. */
7277 struct group_list * g;
7278
7279 if (section_headers_groups == NULL
7280 || section_headers_groups [i] == NULL)
7281 i = elf_header.e_shnum;
7282 else
7283 {
7284 g = section_headers_groups [i]->root;
7285
7286 for (; g != NULL; g = g->next)
7287 {
7288 sec = section_headers + g->section_index;
7289
7290 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7291 break;
7292 }
7293
7294 if (g == NULL)
7295 i = elf_header.e_shnum;
7296 }
7297 }
7298 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7299 {
7300 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7301 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7302 suffix = SECTION_NAME (unwsec) + len;
7303 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7304 ++i, ++sec)
7305 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7306 && streq (SECTION_NAME (sec) + len2, suffix))
7307 break;
7308 }
7309 else
7310 {
7311 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7312 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7313 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7314 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7315 suffix = "";
7316 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7317 suffix = SECTION_NAME (unwsec) + len;
7318 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7319 ++i, ++sec)
7320 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7321 && streq (SECTION_NAME (sec) + len2, suffix))
7322 break;
7323 }
7324
7325 if (i == elf_header.e_shnum)
7326 {
7327 printf (_("\nCould not find unwind info section for "));
7328
7329 if (string_table == NULL)
7330 printf ("%d", unwsec->sh_name);
7331 else
7332 printf ("'%s'", printable_section_name (unwsec));
7333 }
7334 else
7335 {
7336 aux.info_addr = sec->sh_addr;
7337 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7338 sec->sh_size,
7339 _("unwind info"));
7340 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7341
7342 printf (_("\nUnwind section "));
7343
7344 if (string_table == NULL)
7345 printf ("%d", unwsec->sh_name);
7346 else
7347 printf ("'%s'", printable_section_name (unwsec));
7348
7349 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7350 (unsigned long) unwsec->sh_offset,
7351 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7352
7353 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7354 && aux.table_len > 0)
7355 dump_ia64_unwind (& aux);
7356
7357 if (aux.table)
7358 free ((char *) aux.table);
7359 if (aux.info)
7360 free ((char *) aux.info);
7361 aux.table = NULL;
7362 aux.info = NULL;
7363 }
7364 }
7365
7366 if (aux.symtab)
7367 free (aux.symtab);
7368 if (aux.strtab)
7369 free ((char *) aux.strtab);
7370 }
7371
7372 struct hppa_unw_table_entry
7373 {
7374 struct absaddr start;
7375 struct absaddr end;
7376 unsigned int Cannot_unwind:1; /* 0 */
7377 unsigned int Millicode:1; /* 1 */
7378 unsigned int Millicode_save_sr0:1; /* 2 */
7379 unsigned int Region_description:2; /* 3..4 */
7380 unsigned int reserved1:1; /* 5 */
7381 unsigned int Entry_SR:1; /* 6 */
7382 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7383 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7384 unsigned int Args_stored:1; /* 16 */
7385 unsigned int Variable_Frame:1; /* 17 */
7386 unsigned int Separate_Package_Body:1; /* 18 */
7387 unsigned int Frame_Extension_Millicode:1; /* 19 */
7388 unsigned int Stack_Overflow_Check:1; /* 20 */
7389 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7390 unsigned int Ada_Region:1; /* 22 */
7391 unsigned int cxx_info:1; /* 23 */
7392 unsigned int cxx_try_catch:1; /* 24 */
7393 unsigned int sched_entry_seq:1; /* 25 */
7394 unsigned int reserved2:1; /* 26 */
7395 unsigned int Save_SP:1; /* 27 */
7396 unsigned int Save_RP:1; /* 28 */
7397 unsigned int Save_MRP_in_frame:1; /* 29 */
7398 unsigned int extn_ptr_defined:1; /* 30 */
7399 unsigned int Cleanup_defined:1; /* 31 */
7400
7401 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7402 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7403 unsigned int Large_frame:1; /* 2 */
7404 unsigned int Pseudo_SP_Set:1; /* 3 */
7405 unsigned int reserved4:1; /* 4 */
7406 unsigned int Total_frame_size:27; /* 5..31 */
7407 };
7408
7409 struct hppa_unw_aux_info
7410 {
7411 struct hppa_unw_table_entry * table; /* Unwind table. */
7412 unsigned long table_len; /* Length of unwind table. */
7413 bfd_vma seg_base; /* Starting address of segment. */
7414 Elf_Internal_Sym * symtab; /* The symbol table. */
7415 unsigned long nsyms; /* Number of symbols. */
7416 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7417 unsigned long nfuns; /* Number of entries in funtab. */
7418 char * strtab; /* The string table. */
7419 unsigned long strtab_size; /* Size of string table. */
7420 };
7421
7422 static void
7423 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7424 {
7425 struct hppa_unw_table_entry * tp;
7426 unsigned long j, nfuns;
7427
7428 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7429 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7430 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7431 aux->funtab[nfuns++] = aux->symtab[j];
7432 aux->nfuns = nfuns;
7433 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7434
7435 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7436 {
7437 bfd_vma offset;
7438 const char * procname;
7439
7440 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7441 aux->strtab_size, tp->start, &procname,
7442 &offset);
7443
7444 fputs ("\n<", stdout);
7445
7446 if (procname)
7447 {
7448 fputs (procname, stdout);
7449
7450 if (offset)
7451 printf ("+%lx", (unsigned long) offset);
7452 }
7453
7454 fputs (">: [", stdout);
7455 print_vma (tp->start.offset, PREFIX_HEX);
7456 fputc ('-', stdout);
7457 print_vma (tp->end.offset, PREFIX_HEX);
7458 printf ("]\n\t");
7459
7460 #define PF(_m) if (tp->_m) printf (#_m " ");
7461 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7462 PF(Cannot_unwind);
7463 PF(Millicode);
7464 PF(Millicode_save_sr0);
7465 /* PV(Region_description); */
7466 PF(Entry_SR);
7467 PV(Entry_FR);
7468 PV(Entry_GR);
7469 PF(Args_stored);
7470 PF(Variable_Frame);
7471 PF(Separate_Package_Body);
7472 PF(Frame_Extension_Millicode);
7473 PF(Stack_Overflow_Check);
7474 PF(Two_Instruction_SP_Increment);
7475 PF(Ada_Region);
7476 PF(cxx_info);
7477 PF(cxx_try_catch);
7478 PF(sched_entry_seq);
7479 PF(Save_SP);
7480 PF(Save_RP);
7481 PF(Save_MRP_in_frame);
7482 PF(extn_ptr_defined);
7483 PF(Cleanup_defined);
7484 PF(MPE_XL_interrupt_marker);
7485 PF(HP_UX_interrupt_marker);
7486 PF(Large_frame);
7487 PF(Pseudo_SP_Set);
7488 PV(Total_frame_size);
7489 #undef PF
7490 #undef PV
7491 }
7492
7493 printf ("\n");
7494
7495 free (aux->funtab);
7496 }
7497
7498 static int
7499 slurp_hppa_unwind_table (FILE * file,
7500 struct hppa_unw_aux_info * aux,
7501 Elf_Internal_Shdr * sec)
7502 {
7503 unsigned long size, unw_ent_size, nentries, nrelas, i;
7504 Elf_Internal_Phdr * seg;
7505 struct hppa_unw_table_entry * tep;
7506 Elf_Internal_Shdr * relsec;
7507 Elf_Internal_Rela * rela;
7508 Elf_Internal_Rela * rp;
7509 unsigned char * table;
7510 unsigned char * tp;
7511 Elf_Internal_Sym * sym;
7512 const char * relname;
7513
7514 /* First, find the starting address of the segment that includes
7515 this section. */
7516
7517 if (elf_header.e_phnum)
7518 {
7519 if (! get_program_headers (file))
7520 return 0;
7521
7522 for (seg = program_headers;
7523 seg < program_headers + elf_header.e_phnum;
7524 ++seg)
7525 {
7526 if (seg->p_type != PT_LOAD)
7527 continue;
7528
7529 if (sec->sh_addr >= seg->p_vaddr
7530 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7531 {
7532 aux->seg_base = seg->p_vaddr;
7533 break;
7534 }
7535 }
7536 }
7537
7538 /* Second, build the unwind table from the contents of the unwind
7539 section. */
7540 size = sec->sh_size;
7541 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7542 _("unwind table"));
7543 if (!table)
7544 return 0;
7545
7546 unw_ent_size = 16;
7547 nentries = size / unw_ent_size;
7548 size = unw_ent_size * nentries;
7549
7550 tep = aux->table = (struct hppa_unw_table_entry *)
7551 xcmalloc (nentries, sizeof (aux->table[0]));
7552
7553 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7554 {
7555 unsigned int tmp1, tmp2;
7556
7557 tep->start.section = SHN_UNDEF;
7558 tep->end.section = SHN_UNDEF;
7559
7560 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7561 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7562 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7563 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7564
7565 tep->start.offset += aux->seg_base;
7566 tep->end.offset += aux->seg_base;
7567
7568 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7569 tep->Millicode = (tmp1 >> 30) & 0x1;
7570 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7571 tep->Region_description = (tmp1 >> 27) & 0x3;
7572 tep->reserved1 = (tmp1 >> 26) & 0x1;
7573 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7574 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7575 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7576 tep->Args_stored = (tmp1 >> 15) & 0x1;
7577 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7578 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7579 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7580 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7581 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7582 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7583 tep->cxx_info = (tmp1 >> 8) & 0x1;
7584 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7585 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7586 tep->reserved2 = (tmp1 >> 5) & 0x1;
7587 tep->Save_SP = (tmp1 >> 4) & 0x1;
7588 tep->Save_RP = (tmp1 >> 3) & 0x1;
7589 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7590 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7591 tep->Cleanup_defined = tmp1 & 0x1;
7592
7593 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7594 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7595 tep->Large_frame = (tmp2 >> 29) & 0x1;
7596 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7597 tep->reserved4 = (tmp2 >> 27) & 0x1;
7598 tep->Total_frame_size = tmp2 & 0x7ffffff;
7599 }
7600 free (table);
7601
7602 /* Third, apply any relocations to the unwind table. */
7603 for (relsec = section_headers;
7604 relsec < section_headers + elf_header.e_shnum;
7605 ++relsec)
7606 {
7607 if (relsec->sh_type != SHT_RELA
7608 || relsec->sh_info >= elf_header.e_shnum
7609 || section_headers + relsec->sh_info != sec)
7610 continue;
7611
7612 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7613 & rela, & nrelas))
7614 return 0;
7615
7616 for (rp = rela; rp < rela + nrelas; ++rp)
7617 {
7618 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7619 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7620
7621 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7622 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7623 {
7624 warn (_("Skipping unexpected relocation type %s\n"), relname);
7625 continue;
7626 }
7627
7628 i = rp->r_offset / unw_ent_size;
7629
7630 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7631 {
7632 case 0:
7633 aux->table[i].start.section = sym->st_shndx;
7634 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7635 break;
7636 case 1:
7637 aux->table[i].end.section = sym->st_shndx;
7638 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7639 break;
7640 default:
7641 break;
7642 }
7643 }
7644
7645 free (rela);
7646 }
7647
7648 aux->table_len = nentries;
7649
7650 return 1;
7651 }
7652
7653 static void
7654 hppa_process_unwind (FILE * file)
7655 {
7656 struct hppa_unw_aux_info aux;
7657 Elf_Internal_Shdr * unwsec = NULL;
7658 Elf_Internal_Shdr * strsec;
7659 Elf_Internal_Shdr * sec;
7660 unsigned long i;
7661
7662 if (string_table == NULL)
7663 return;
7664
7665 memset (& aux, 0, sizeof (aux));
7666
7667 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7668 {
7669 if (sec->sh_type == SHT_SYMTAB
7670 && sec->sh_link < elf_header.e_shnum)
7671 {
7672 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7673
7674 strsec = section_headers + sec->sh_link;
7675 if (aux.strtab != NULL)
7676 {
7677 error (_("Multiple auxillary string tables encountered\n"));
7678 free (aux.strtab);
7679 }
7680 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7681 1, strsec->sh_size,
7682 _("string table"));
7683 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7684 }
7685 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7686 unwsec = sec;
7687 }
7688
7689 if (!unwsec)
7690 printf (_("\nThere are no unwind sections in this file.\n"));
7691
7692 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7693 {
7694 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7695 {
7696 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7697 printable_section_name (sec),
7698 (unsigned long) sec->sh_offset,
7699 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7700
7701 slurp_hppa_unwind_table (file, &aux, sec);
7702 if (aux.table_len > 0)
7703 dump_hppa_unwind (&aux);
7704
7705 if (aux.table)
7706 free ((char *) aux.table);
7707 aux.table = NULL;
7708 }
7709 }
7710
7711 if (aux.symtab)
7712 free (aux.symtab);
7713 if (aux.strtab)
7714 free ((char *) aux.strtab);
7715 }
7716
7717 struct arm_section
7718 {
7719 unsigned char * data; /* The unwind data. */
7720 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7721 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7722 unsigned long nrelas; /* The number of relocations. */
7723 unsigned int rel_type; /* REL or RELA ? */
7724 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7725 };
7726
7727 struct arm_unw_aux_info
7728 {
7729 FILE * file; /* The file containing the unwind sections. */
7730 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7731 unsigned long nsyms; /* Number of symbols. */
7732 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7733 unsigned long nfuns; /* Number of these symbols. */
7734 char * strtab; /* The file's string table. */
7735 unsigned long strtab_size; /* Size of string table. */
7736 };
7737
7738 static const char *
7739 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7740 bfd_vma fn, struct absaddr addr)
7741 {
7742 const char *procname;
7743 bfd_vma sym_offset;
7744
7745 if (addr.section == SHN_UNDEF)
7746 addr.offset = fn;
7747
7748 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7749 aux->strtab_size, addr, &procname,
7750 &sym_offset);
7751
7752 print_vma (fn, PREFIX_HEX);
7753
7754 if (procname)
7755 {
7756 fputs (" <", stdout);
7757 fputs (procname, stdout);
7758
7759 if (sym_offset)
7760 printf ("+0x%lx", (unsigned long) sym_offset);
7761 fputc ('>', stdout);
7762 }
7763
7764 return procname;
7765 }
7766
7767 static void
7768 arm_free_section (struct arm_section *arm_sec)
7769 {
7770 if (arm_sec->data != NULL)
7771 free (arm_sec->data);
7772
7773 if (arm_sec->rela != NULL)
7774 free (arm_sec->rela);
7775 }
7776
7777 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7778 cached section and install SEC instead.
7779 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7780 and return its valued in * WORDP, relocating if necessary.
7781 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7782 relocation's offset in ADDR.
7783 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7784 into the string table of the symbol associated with the reloc. If no
7785 reloc was applied store -1 there.
7786 5) Return TRUE upon success, FALSE otherwise. */
7787
7788 static bfd_boolean
7789 get_unwind_section_word (struct arm_unw_aux_info * aux,
7790 struct arm_section * arm_sec,
7791 Elf_Internal_Shdr * sec,
7792 bfd_vma word_offset,
7793 unsigned int * wordp,
7794 struct absaddr * addr,
7795 bfd_vma * sym_name)
7796 {
7797 Elf_Internal_Rela *rp;
7798 Elf_Internal_Sym *sym;
7799 const char * relname;
7800 unsigned int word;
7801 bfd_boolean wrapped;
7802
7803 if (sec == NULL || arm_sec == NULL)
7804 return FALSE;
7805
7806 addr->section = SHN_UNDEF;
7807 addr->offset = 0;
7808
7809 if (sym_name != NULL)
7810 *sym_name = (bfd_vma) -1;
7811
7812 /* If necessary, update the section cache. */
7813 if (sec != arm_sec->sec)
7814 {
7815 Elf_Internal_Shdr *relsec;
7816
7817 arm_free_section (arm_sec);
7818
7819 arm_sec->sec = sec;
7820 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7821 sec->sh_size, _("unwind data"));
7822 arm_sec->rela = NULL;
7823 arm_sec->nrelas = 0;
7824
7825 for (relsec = section_headers;
7826 relsec < section_headers + elf_header.e_shnum;
7827 ++relsec)
7828 {
7829 if (relsec->sh_info >= elf_header.e_shnum
7830 || section_headers + relsec->sh_info != sec
7831 /* PR 15745: Check the section type as well. */
7832 || (relsec->sh_type != SHT_REL
7833 && relsec->sh_type != SHT_RELA))
7834 continue;
7835
7836 arm_sec->rel_type = relsec->sh_type;
7837 if (relsec->sh_type == SHT_REL)
7838 {
7839 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7840 relsec->sh_size,
7841 & arm_sec->rela, & arm_sec->nrelas))
7842 return FALSE;
7843 }
7844 else /* relsec->sh_type == SHT_RELA */
7845 {
7846 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7847 relsec->sh_size,
7848 & arm_sec->rela, & arm_sec->nrelas))
7849 return FALSE;
7850 }
7851 break;
7852 }
7853
7854 arm_sec->next_rela = arm_sec->rela;
7855 }
7856
7857 /* If there is no unwind data we can do nothing. */
7858 if (arm_sec->data == NULL)
7859 return FALSE;
7860
7861 /* If the offset is invalid then fail. */
7862 if (word_offset > (sec->sh_size - 4)
7863 /* PR 18879 */
7864 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7865 || ((bfd_signed_vma) word_offset) < 0)
7866 return FALSE;
7867
7868 /* Get the word at the required offset. */
7869 word = byte_get (arm_sec->data + word_offset, 4);
7870
7871 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7872 if (arm_sec->rela == NULL)
7873 {
7874 * wordp = word;
7875 return TRUE;
7876 }
7877
7878 /* Look through the relocs to find the one that applies to the provided offset. */
7879 wrapped = FALSE;
7880 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7881 {
7882 bfd_vma prelval, offset;
7883
7884 if (rp->r_offset > word_offset && !wrapped)
7885 {
7886 rp = arm_sec->rela;
7887 wrapped = TRUE;
7888 }
7889 if (rp->r_offset > word_offset)
7890 break;
7891
7892 if (rp->r_offset & 3)
7893 {
7894 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7895 (unsigned long) rp->r_offset);
7896 continue;
7897 }
7898
7899 if (rp->r_offset < word_offset)
7900 continue;
7901
7902 /* PR 17531: file: 027-161405-0.004 */
7903 if (aux->symtab == NULL)
7904 continue;
7905
7906 if (arm_sec->rel_type == SHT_REL)
7907 {
7908 offset = word & 0x7fffffff;
7909 if (offset & 0x40000000)
7910 offset |= ~ (bfd_vma) 0x7fffffff;
7911 }
7912 else if (arm_sec->rel_type == SHT_RELA)
7913 offset = rp->r_addend;
7914 else
7915 {
7916 error (_("Unknown section relocation type %d encountered\n"),
7917 arm_sec->rel_type);
7918 break;
7919 }
7920
7921 /* PR 17531 file: 027-1241568-0.004. */
7922 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7923 {
7924 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7925 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7926 break;
7927 }
7928
7929 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7930 offset += sym->st_value;
7931 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7932
7933 /* Check that we are processing the expected reloc type. */
7934 if (elf_header.e_machine == EM_ARM)
7935 {
7936 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7937 if (relname == NULL)
7938 {
7939 warn (_("Skipping unknown ARM relocation type: %d\n"),
7940 (int) ELF32_R_TYPE (rp->r_info));
7941 continue;
7942 }
7943
7944 if (streq (relname, "R_ARM_NONE"))
7945 continue;
7946
7947 if (! streq (relname, "R_ARM_PREL31"))
7948 {
7949 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7950 continue;
7951 }
7952 }
7953 else if (elf_header.e_machine == EM_TI_C6000)
7954 {
7955 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7956 if (relname == NULL)
7957 {
7958 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7959 (int) ELF32_R_TYPE (rp->r_info));
7960 continue;
7961 }
7962
7963 if (streq (relname, "R_C6000_NONE"))
7964 continue;
7965
7966 if (! streq (relname, "R_C6000_PREL31"))
7967 {
7968 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7969 continue;
7970 }
7971
7972 prelval >>= 1;
7973 }
7974 else
7975 {
7976 /* This function currently only supports ARM and TI unwinders. */
7977 warn (_("Only TI and ARM unwinders are currently supported\n"));
7978 break;
7979 }
7980
7981 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7982 addr->section = sym->st_shndx;
7983 addr->offset = offset;
7984
7985 if (sym_name)
7986 * sym_name = sym->st_name;
7987 break;
7988 }
7989
7990 *wordp = word;
7991 arm_sec->next_rela = rp;
7992
7993 return TRUE;
7994 }
7995
7996 static const char *tic6x_unwind_regnames[16] =
7997 {
7998 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7999 "A14", "A13", "A12", "A11", "A10",
8000 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8001 };
8002
8003 static void
8004 decode_tic6x_unwind_regmask (unsigned int mask)
8005 {
8006 int i;
8007
8008 for (i = 12; mask; mask >>= 1, i--)
8009 {
8010 if (mask & 1)
8011 {
8012 fputs (tic6x_unwind_regnames[i], stdout);
8013 if (mask > 1)
8014 fputs (", ", stdout);
8015 }
8016 }
8017 }
8018
8019 #define ADVANCE \
8020 if (remaining == 0 && more_words) \
8021 { \
8022 data_offset += 4; \
8023 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8024 data_offset, & word, & addr, NULL)) \
8025 return; \
8026 remaining = 4; \
8027 more_words--; \
8028 } \
8029
8030 #define GET_OP(OP) \
8031 ADVANCE; \
8032 if (remaining) \
8033 { \
8034 remaining--; \
8035 (OP) = word >> 24; \
8036 word <<= 8; \
8037 } \
8038 else \
8039 { \
8040 printf (_("[Truncated opcode]\n")); \
8041 return; \
8042 } \
8043 printf ("0x%02x ", OP)
8044
8045 static void
8046 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8047 unsigned int word,
8048 unsigned int remaining,
8049 unsigned int more_words,
8050 bfd_vma data_offset,
8051 Elf_Internal_Shdr * data_sec,
8052 struct arm_section * data_arm_sec)
8053 {
8054 struct absaddr addr;
8055
8056 /* Decode the unwinding instructions. */
8057 while (1)
8058 {
8059 unsigned int op, op2;
8060
8061 ADVANCE;
8062 if (remaining == 0)
8063 break;
8064 remaining--;
8065 op = word >> 24;
8066 word <<= 8;
8067
8068 printf (" 0x%02x ", op);
8069
8070 if ((op & 0xc0) == 0x00)
8071 {
8072 int offset = ((op & 0x3f) << 2) + 4;
8073
8074 printf (" vsp = vsp + %d", offset);
8075 }
8076 else if ((op & 0xc0) == 0x40)
8077 {
8078 int offset = ((op & 0x3f) << 2) + 4;
8079
8080 printf (" vsp = vsp - %d", offset);
8081 }
8082 else if ((op & 0xf0) == 0x80)
8083 {
8084 GET_OP (op2);
8085 if (op == 0x80 && op2 == 0)
8086 printf (_("Refuse to unwind"));
8087 else
8088 {
8089 unsigned int mask = ((op & 0x0f) << 8) | op2;
8090 int first = 1;
8091 int i;
8092
8093 printf ("pop {");
8094 for (i = 0; i < 12; i++)
8095 if (mask & (1 << i))
8096 {
8097 if (first)
8098 first = 0;
8099 else
8100 printf (", ");
8101 printf ("r%d", 4 + i);
8102 }
8103 printf ("}");
8104 }
8105 }
8106 else if ((op & 0xf0) == 0x90)
8107 {
8108 if (op == 0x9d || op == 0x9f)
8109 printf (_(" [Reserved]"));
8110 else
8111 printf (" vsp = r%d", op & 0x0f);
8112 }
8113 else if ((op & 0xf0) == 0xa0)
8114 {
8115 int end = 4 + (op & 0x07);
8116 int first = 1;
8117 int i;
8118
8119 printf (" pop {");
8120 for (i = 4; i <= end; i++)
8121 {
8122 if (first)
8123 first = 0;
8124 else
8125 printf (", ");
8126 printf ("r%d", i);
8127 }
8128 if (op & 0x08)
8129 {
8130 if (!first)
8131 printf (", ");
8132 printf ("r14");
8133 }
8134 printf ("}");
8135 }
8136 else if (op == 0xb0)
8137 printf (_(" finish"));
8138 else if (op == 0xb1)
8139 {
8140 GET_OP (op2);
8141 if (op2 == 0 || (op2 & 0xf0) != 0)
8142 printf (_("[Spare]"));
8143 else
8144 {
8145 unsigned int mask = op2 & 0x0f;
8146 int first = 1;
8147 int i;
8148
8149 printf ("pop {");
8150 for (i = 0; i < 12; i++)
8151 if (mask & (1 << i))
8152 {
8153 if (first)
8154 first = 0;
8155 else
8156 printf (", ");
8157 printf ("r%d", i);
8158 }
8159 printf ("}");
8160 }
8161 }
8162 else if (op == 0xb2)
8163 {
8164 unsigned char buf[9];
8165 unsigned int i, len;
8166 unsigned long offset;
8167
8168 for (i = 0; i < sizeof (buf); i++)
8169 {
8170 GET_OP (buf[i]);
8171 if ((buf[i] & 0x80) == 0)
8172 break;
8173 }
8174 if (i == sizeof (buf))
8175 printf (_("corrupt change to vsp"));
8176 else
8177 {
8178 offset = read_uleb128 (buf, &len, buf + i + 1);
8179 assert (len == i + 1);
8180 offset = offset * 4 + 0x204;
8181 printf ("vsp = vsp + %ld", offset);
8182 }
8183 }
8184 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8185 {
8186 unsigned int first, last;
8187
8188 GET_OP (op2);
8189 first = op2 >> 4;
8190 last = op2 & 0x0f;
8191 if (op == 0xc8)
8192 first = first + 16;
8193 printf ("pop {D%d", first);
8194 if (last)
8195 printf ("-D%d", first + last);
8196 printf ("}");
8197 }
8198 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8199 {
8200 unsigned int count = op & 0x07;
8201
8202 printf ("pop {D8");
8203 if (count)
8204 printf ("-D%d", 8 + count);
8205 printf ("}");
8206 }
8207 else if (op >= 0xc0 && op <= 0xc5)
8208 {
8209 unsigned int count = op & 0x07;
8210
8211 printf (" pop {wR10");
8212 if (count)
8213 printf ("-wR%d", 10 + count);
8214 printf ("}");
8215 }
8216 else if (op == 0xc6)
8217 {
8218 unsigned int first, last;
8219
8220 GET_OP (op2);
8221 first = op2 >> 4;
8222 last = op2 & 0x0f;
8223 printf ("pop {wR%d", first);
8224 if (last)
8225 printf ("-wR%d", first + last);
8226 printf ("}");
8227 }
8228 else if (op == 0xc7)
8229 {
8230 GET_OP (op2);
8231 if (op2 == 0 || (op2 & 0xf0) != 0)
8232 printf (_("[Spare]"));
8233 else
8234 {
8235 unsigned int mask = op2 & 0x0f;
8236 int first = 1;
8237 int i;
8238
8239 printf ("pop {");
8240 for (i = 0; i < 4; i++)
8241 if (mask & (1 << i))
8242 {
8243 if (first)
8244 first = 0;
8245 else
8246 printf (", ");
8247 printf ("wCGR%d", i);
8248 }
8249 printf ("}");
8250 }
8251 }
8252 else
8253 printf (_(" [unsupported opcode]"));
8254 printf ("\n");
8255 }
8256 }
8257
8258 static void
8259 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8260 unsigned int word,
8261 unsigned int remaining,
8262 unsigned int more_words,
8263 bfd_vma data_offset,
8264 Elf_Internal_Shdr * data_sec,
8265 struct arm_section * data_arm_sec)
8266 {
8267 struct absaddr addr;
8268
8269 /* Decode the unwinding instructions. */
8270 while (1)
8271 {
8272 unsigned int op, op2;
8273
8274 ADVANCE;
8275 if (remaining == 0)
8276 break;
8277 remaining--;
8278 op = word >> 24;
8279 word <<= 8;
8280
8281 printf (" 0x%02x ", op);
8282
8283 if ((op & 0xc0) == 0x00)
8284 {
8285 int offset = ((op & 0x3f) << 3) + 8;
8286 printf (" sp = sp + %d", offset);
8287 }
8288 else if ((op & 0xc0) == 0x80)
8289 {
8290 GET_OP (op2);
8291 if (op == 0x80 && op2 == 0)
8292 printf (_("Refuse to unwind"));
8293 else
8294 {
8295 unsigned int mask = ((op & 0x1f) << 8) | op2;
8296 if (op & 0x20)
8297 printf ("pop compact {");
8298 else
8299 printf ("pop {");
8300
8301 decode_tic6x_unwind_regmask (mask);
8302 printf("}");
8303 }
8304 }
8305 else if ((op & 0xf0) == 0xc0)
8306 {
8307 unsigned int reg;
8308 unsigned int nregs;
8309 unsigned int i;
8310 const char *name;
8311 struct
8312 {
8313 unsigned int offset;
8314 unsigned int reg;
8315 } regpos[16];
8316
8317 /* Scan entire instruction first so that GET_OP output is not
8318 interleaved with disassembly. */
8319 nregs = 0;
8320 for (i = 0; nregs < (op & 0xf); i++)
8321 {
8322 GET_OP (op2);
8323 reg = op2 >> 4;
8324 if (reg != 0xf)
8325 {
8326 regpos[nregs].offset = i * 2;
8327 regpos[nregs].reg = reg;
8328 nregs++;
8329 }
8330
8331 reg = op2 & 0xf;
8332 if (reg != 0xf)
8333 {
8334 regpos[nregs].offset = i * 2 + 1;
8335 regpos[nregs].reg = reg;
8336 nregs++;
8337 }
8338 }
8339
8340 printf (_("pop frame {"));
8341 reg = nregs - 1;
8342 for (i = i * 2; i > 0; i--)
8343 {
8344 if (regpos[reg].offset == i - 1)
8345 {
8346 name = tic6x_unwind_regnames[regpos[reg].reg];
8347 if (reg > 0)
8348 reg--;
8349 }
8350 else
8351 name = _("[pad]");
8352
8353 fputs (name, stdout);
8354 if (i > 1)
8355 printf (", ");
8356 }
8357
8358 printf ("}");
8359 }
8360 else if (op == 0xd0)
8361 printf (" MOV FP, SP");
8362 else if (op == 0xd1)
8363 printf (" __c6xabi_pop_rts");
8364 else if (op == 0xd2)
8365 {
8366 unsigned char buf[9];
8367 unsigned int i, len;
8368 unsigned long offset;
8369
8370 for (i = 0; i < sizeof (buf); i++)
8371 {
8372 GET_OP (buf[i]);
8373 if ((buf[i] & 0x80) == 0)
8374 break;
8375 }
8376 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8377 if (i == sizeof (buf))
8378 {
8379 printf ("<corrupt sp adjust>\n");
8380 warn (_("Corrupt stack pointer adjustment detected\n"));
8381 return;
8382 }
8383
8384 offset = read_uleb128 (buf, &len, buf + i + 1);
8385 assert (len == i + 1);
8386 offset = offset * 8 + 0x408;
8387 printf (_("sp = sp + %ld"), offset);
8388 }
8389 else if ((op & 0xf0) == 0xe0)
8390 {
8391 if ((op & 0x0f) == 7)
8392 printf (" RETURN");
8393 else
8394 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8395 }
8396 else
8397 {
8398 printf (_(" [unsupported opcode]"));
8399 }
8400 putchar ('\n');
8401 }
8402 }
8403
8404 static bfd_vma
8405 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8406 {
8407 bfd_vma offset;
8408
8409 offset = word & 0x7fffffff;
8410 if (offset & 0x40000000)
8411 offset |= ~ (bfd_vma) 0x7fffffff;
8412
8413 if (elf_header.e_machine == EM_TI_C6000)
8414 offset <<= 1;
8415
8416 return offset + where;
8417 }
8418
8419 static void
8420 decode_arm_unwind (struct arm_unw_aux_info * aux,
8421 unsigned int word,
8422 unsigned int remaining,
8423 bfd_vma data_offset,
8424 Elf_Internal_Shdr * data_sec,
8425 struct arm_section * data_arm_sec)
8426 {
8427 int per_index;
8428 unsigned int more_words = 0;
8429 struct absaddr addr;
8430 bfd_vma sym_name = (bfd_vma) -1;
8431
8432 if (remaining == 0)
8433 {
8434 /* Fetch the first word.
8435 Note - when decoding an object file the address extracted
8436 here will always be 0. So we also pass in the sym_name
8437 parameter so that we can find the symbol associated with
8438 the personality routine. */
8439 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8440 & word, & addr, & sym_name))
8441 return;
8442
8443 remaining = 4;
8444 }
8445
8446 if ((word & 0x80000000) == 0)
8447 {
8448 /* Expand prel31 for personality routine. */
8449 bfd_vma fn;
8450 const char *procname;
8451
8452 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8453 printf (_(" Personality routine: "));
8454 if (fn == 0
8455 && addr.section == SHN_UNDEF && addr.offset == 0
8456 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8457 {
8458 procname = aux->strtab + sym_name;
8459 print_vma (fn, PREFIX_HEX);
8460 if (procname)
8461 {
8462 fputs (" <", stdout);
8463 fputs (procname, stdout);
8464 fputc ('>', stdout);
8465 }
8466 }
8467 else
8468 procname = arm_print_vma_and_name (aux, fn, addr);
8469 fputc ('\n', stdout);
8470
8471 /* The GCC personality routines use the standard compact
8472 encoding, starting with one byte giving the number of
8473 words. */
8474 if (procname != NULL
8475 && (const_strneq (procname, "__gcc_personality_v0")
8476 || const_strneq (procname, "__gxx_personality_v0")
8477 || const_strneq (procname, "__gcj_personality_v0")
8478 || const_strneq (procname, "__gnu_objc_personality_v0")))
8479 {
8480 remaining = 0;
8481 more_words = 1;
8482 ADVANCE;
8483 if (!remaining)
8484 {
8485 printf (_(" [Truncated data]\n"));
8486 return;
8487 }
8488 more_words = word >> 24;
8489 word <<= 8;
8490 remaining--;
8491 per_index = -1;
8492 }
8493 else
8494 return;
8495 }
8496 else
8497 {
8498 /* ARM EHABI Section 6.3:
8499
8500 An exception-handling table entry for the compact model looks like:
8501
8502 31 30-28 27-24 23-0
8503 -- ----- ----- ----
8504 1 0 index Data for personalityRoutine[index] */
8505
8506 if (elf_header.e_machine == EM_ARM
8507 && (word & 0x70000000))
8508 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8509
8510 per_index = (word >> 24) & 0x7f;
8511 printf (_(" Compact model index: %d\n"), per_index);
8512 if (per_index == 0)
8513 {
8514 more_words = 0;
8515 word <<= 8;
8516 remaining--;
8517 }
8518 else if (per_index < 3)
8519 {
8520 more_words = (word >> 16) & 0xff;
8521 word <<= 16;
8522 remaining -= 2;
8523 }
8524 }
8525
8526 switch (elf_header.e_machine)
8527 {
8528 case EM_ARM:
8529 if (per_index < 3)
8530 {
8531 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8532 data_offset, data_sec, data_arm_sec);
8533 }
8534 else
8535 {
8536 warn (_("Unknown ARM compact model index encountered\n"));
8537 printf (_(" [reserved]\n"));
8538 }
8539 break;
8540
8541 case EM_TI_C6000:
8542 if (per_index < 3)
8543 {
8544 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8545 data_offset, data_sec, data_arm_sec);
8546 }
8547 else if (per_index < 5)
8548 {
8549 if (((word >> 17) & 0x7f) == 0x7f)
8550 printf (_(" Restore stack from frame pointer\n"));
8551 else
8552 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8553 printf (_(" Registers restored: "));
8554 if (per_index == 4)
8555 printf (" (compact) ");
8556 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8557 putchar ('\n');
8558 printf (_(" Return register: %s\n"),
8559 tic6x_unwind_regnames[word & 0xf]);
8560 }
8561 else
8562 printf (_(" [reserved (%d)]\n"), per_index);
8563 break;
8564
8565 default:
8566 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8567 elf_header.e_machine);
8568 }
8569
8570 /* Decode the descriptors. Not implemented. */
8571 }
8572
8573 static void
8574 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8575 {
8576 struct arm_section exidx_arm_sec, extab_arm_sec;
8577 unsigned int i, exidx_len;
8578 unsigned long j, nfuns;
8579
8580 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8581 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8582 exidx_len = exidx_sec->sh_size / 8;
8583
8584 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8585 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8586 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8587 aux->funtab[nfuns++] = aux->symtab[j];
8588 aux->nfuns = nfuns;
8589 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8590
8591 for (i = 0; i < exidx_len; i++)
8592 {
8593 unsigned int exidx_fn, exidx_entry;
8594 struct absaddr fn_addr, entry_addr;
8595 bfd_vma fn;
8596
8597 fputc ('\n', stdout);
8598
8599 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8600 8 * i, & exidx_fn, & fn_addr, NULL)
8601 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8602 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8603 {
8604 free (aux->funtab);
8605 arm_free_section (& exidx_arm_sec);
8606 arm_free_section (& extab_arm_sec);
8607 return;
8608 }
8609
8610 /* ARM EHABI, Section 5:
8611 An index table entry consists of 2 words.
8612 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8613 if (exidx_fn & 0x80000000)
8614 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8615
8616 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8617
8618 arm_print_vma_and_name (aux, fn, fn_addr);
8619 fputs (": ", stdout);
8620
8621 if (exidx_entry == 1)
8622 {
8623 print_vma (exidx_entry, PREFIX_HEX);
8624 fputs (" [cantunwind]\n", stdout);
8625 }
8626 else if (exidx_entry & 0x80000000)
8627 {
8628 print_vma (exidx_entry, PREFIX_HEX);
8629 fputc ('\n', stdout);
8630 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8631 }
8632 else
8633 {
8634 bfd_vma table, table_offset = 0;
8635 Elf_Internal_Shdr *table_sec;
8636
8637 fputs ("@", stdout);
8638 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8639 print_vma (table, PREFIX_HEX);
8640 printf ("\n");
8641
8642 /* Locate the matching .ARM.extab. */
8643 if (entry_addr.section != SHN_UNDEF
8644 && entry_addr.section < elf_header.e_shnum)
8645 {
8646 table_sec = section_headers + entry_addr.section;
8647 table_offset = entry_addr.offset;
8648 /* PR 18879 */
8649 if (table_offset > table_sec->sh_size
8650 || ((bfd_signed_vma) table_offset) < 0)
8651 {
8652 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8653 (unsigned long) table_offset,
8654 printable_section_name (table_sec));
8655 continue;
8656 }
8657 }
8658 else
8659 {
8660 table_sec = find_section_by_address (table);
8661 if (table_sec != NULL)
8662 table_offset = table - table_sec->sh_addr;
8663 }
8664 if (table_sec == NULL)
8665 {
8666 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8667 (unsigned long) table);
8668 continue;
8669 }
8670 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8671 &extab_arm_sec);
8672 }
8673 }
8674
8675 printf ("\n");
8676
8677 free (aux->funtab);
8678 arm_free_section (&exidx_arm_sec);
8679 arm_free_section (&extab_arm_sec);
8680 }
8681
8682 /* Used for both ARM and C6X unwinding tables. */
8683
8684 static void
8685 arm_process_unwind (FILE *file)
8686 {
8687 struct arm_unw_aux_info aux;
8688 Elf_Internal_Shdr *unwsec = NULL;
8689 Elf_Internal_Shdr *strsec;
8690 Elf_Internal_Shdr *sec;
8691 unsigned long i;
8692 unsigned int sec_type;
8693
8694 switch (elf_header.e_machine)
8695 {
8696 case EM_ARM:
8697 sec_type = SHT_ARM_EXIDX;
8698 break;
8699
8700 case EM_TI_C6000:
8701 sec_type = SHT_C6000_UNWIND;
8702 break;
8703
8704 default:
8705 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8706 elf_header.e_machine);
8707 return;
8708 }
8709
8710 if (string_table == NULL)
8711 return;
8712
8713 memset (& aux, 0, sizeof (aux));
8714 aux.file = file;
8715
8716 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8717 {
8718 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8719 {
8720 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8721
8722 strsec = section_headers + sec->sh_link;
8723
8724 /* PR binutils/17531 file: 011-12666-0.004. */
8725 if (aux.strtab != NULL)
8726 {
8727 error (_("Multiple string tables found in file.\n"));
8728 free (aux.strtab);
8729 }
8730 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8731 1, strsec->sh_size, _("string table"));
8732 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8733 }
8734 else if (sec->sh_type == sec_type)
8735 unwsec = sec;
8736 }
8737
8738 if (unwsec == NULL)
8739 printf (_("\nThere are no unwind sections in this file.\n"));
8740 else
8741 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8742 {
8743 if (sec->sh_type == sec_type)
8744 {
8745 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8746 printable_section_name (sec),
8747 (unsigned long) sec->sh_offset,
8748 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8749
8750 dump_arm_unwind (&aux, sec);
8751 }
8752 }
8753
8754 if (aux.symtab)
8755 free (aux.symtab);
8756 if (aux.strtab)
8757 free ((char *) aux.strtab);
8758 }
8759
8760 static void
8761 process_unwind (FILE * file)
8762 {
8763 struct unwind_handler
8764 {
8765 int machtype;
8766 void (* handler)(FILE *);
8767 } handlers[] =
8768 {
8769 { EM_ARM, arm_process_unwind },
8770 { EM_IA_64, ia64_process_unwind },
8771 { EM_PARISC, hppa_process_unwind },
8772 { EM_TI_C6000, arm_process_unwind },
8773 { 0, 0 }
8774 };
8775 int i;
8776
8777 if (!do_unwind)
8778 return;
8779
8780 for (i = 0; handlers[i].handler != NULL; i++)
8781 if (elf_header.e_machine == handlers[i].machtype)
8782 {
8783 handlers[i].handler (file);
8784 return;
8785 }
8786
8787 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8788 get_machine_name (elf_header.e_machine));
8789 }
8790
8791 static void
8792 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8793 {
8794 switch (entry->d_tag)
8795 {
8796 case DT_MIPS_FLAGS:
8797 if (entry->d_un.d_val == 0)
8798 printf (_("NONE"));
8799 else
8800 {
8801 static const char * opts[] =
8802 {
8803 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8804 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8805 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8806 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8807 "RLD_ORDER_SAFE"
8808 };
8809 unsigned int cnt;
8810 int first = 1;
8811
8812 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8813 if (entry->d_un.d_val & (1 << cnt))
8814 {
8815 printf ("%s%s", first ? "" : " ", opts[cnt]);
8816 first = 0;
8817 }
8818 }
8819 break;
8820
8821 case DT_MIPS_IVERSION:
8822 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8823 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8824 else
8825 {
8826 char buf[40];
8827 sprintf_vma (buf, entry->d_un.d_ptr);
8828 /* Note: coded this way so that there is a single string for translation. */
8829 printf (_("<corrupt: %s>"), buf);
8830 }
8831 break;
8832
8833 case DT_MIPS_TIME_STAMP:
8834 {
8835 char timebuf[128];
8836 struct tm * tmp;
8837 time_t atime = entry->d_un.d_val;
8838
8839 tmp = gmtime (&atime);
8840 /* PR 17531: file: 6accc532. */
8841 if (tmp == NULL)
8842 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8843 else
8844 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8845 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8846 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8847 printf (_("Time Stamp: %s"), timebuf);
8848 }
8849 break;
8850
8851 case DT_MIPS_RLD_VERSION:
8852 case DT_MIPS_LOCAL_GOTNO:
8853 case DT_MIPS_CONFLICTNO:
8854 case DT_MIPS_LIBLISTNO:
8855 case DT_MIPS_SYMTABNO:
8856 case DT_MIPS_UNREFEXTNO:
8857 case DT_MIPS_HIPAGENO:
8858 case DT_MIPS_DELTA_CLASS_NO:
8859 case DT_MIPS_DELTA_INSTANCE_NO:
8860 case DT_MIPS_DELTA_RELOC_NO:
8861 case DT_MIPS_DELTA_SYM_NO:
8862 case DT_MIPS_DELTA_CLASSSYM_NO:
8863 case DT_MIPS_COMPACT_SIZE:
8864 print_vma (entry->d_un.d_val, DEC);
8865 break;
8866
8867 default:
8868 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8869 }
8870 putchar ('\n');
8871 }
8872
8873 static void
8874 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8875 {
8876 switch (entry->d_tag)
8877 {
8878 case DT_HP_DLD_FLAGS:
8879 {
8880 static struct
8881 {
8882 long int bit;
8883 const char * str;
8884 }
8885 flags[] =
8886 {
8887 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8888 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8889 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8890 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8891 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8892 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8893 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8894 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8895 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8896 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8897 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8898 { DT_HP_GST, "HP_GST" },
8899 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8900 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8901 { DT_HP_NODELETE, "HP_NODELETE" },
8902 { DT_HP_GROUP, "HP_GROUP" },
8903 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8904 };
8905 int first = 1;
8906 size_t cnt;
8907 bfd_vma val = entry->d_un.d_val;
8908
8909 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8910 if (val & flags[cnt].bit)
8911 {
8912 if (! first)
8913 putchar (' ');
8914 fputs (flags[cnt].str, stdout);
8915 first = 0;
8916 val ^= flags[cnt].bit;
8917 }
8918
8919 if (val != 0 || first)
8920 {
8921 if (! first)
8922 putchar (' ');
8923 print_vma (val, HEX);
8924 }
8925 }
8926 break;
8927
8928 default:
8929 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8930 break;
8931 }
8932 putchar ('\n');
8933 }
8934
8935 #ifdef BFD64
8936
8937 /* VMS vs Unix time offset and factor. */
8938
8939 #define VMS_EPOCH_OFFSET 35067168000000000LL
8940 #define VMS_GRANULARITY_FACTOR 10000000
8941
8942 /* Display a VMS time in a human readable format. */
8943
8944 static void
8945 print_vms_time (bfd_int64_t vmstime)
8946 {
8947 struct tm *tm;
8948 time_t unxtime;
8949
8950 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8951 tm = gmtime (&unxtime);
8952 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8953 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8954 tm->tm_hour, tm->tm_min, tm->tm_sec);
8955 }
8956 #endif /* BFD64 */
8957
8958 static void
8959 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8960 {
8961 switch (entry->d_tag)
8962 {
8963 case DT_IA_64_PLT_RESERVE:
8964 /* First 3 slots reserved. */
8965 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8966 printf (" -- ");
8967 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8968 break;
8969
8970 case DT_IA_64_VMS_LINKTIME:
8971 #ifdef BFD64
8972 print_vms_time (entry->d_un.d_val);
8973 #endif
8974 break;
8975
8976 case DT_IA_64_VMS_LNKFLAGS:
8977 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8978 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8979 printf (" CALL_DEBUG");
8980 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8981 printf (" NOP0BUFS");
8982 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8983 printf (" P0IMAGE");
8984 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8985 printf (" MKTHREADS");
8986 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8987 printf (" UPCALLS");
8988 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8989 printf (" IMGSTA");
8990 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8991 printf (" INITIALIZE");
8992 if (entry->d_un.d_val & VMS_LF_MAIN)
8993 printf (" MAIN");
8994 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8995 printf (" EXE_INIT");
8996 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8997 printf (" TBK_IN_IMG");
8998 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8999 printf (" DBG_IN_IMG");
9000 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9001 printf (" TBK_IN_DSF");
9002 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9003 printf (" DBG_IN_DSF");
9004 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9005 printf (" SIGNATURES");
9006 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9007 printf (" REL_SEG_OFF");
9008 break;
9009
9010 default:
9011 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9012 break;
9013 }
9014 putchar ('\n');
9015 }
9016
9017 static int
9018 get_32bit_dynamic_section (FILE * file)
9019 {
9020 Elf32_External_Dyn * edyn;
9021 Elf32_External_Dyn * ext;
9022 Elf_Internal_Dyn * entry;
9023
9024 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9025 dynamic_size, _("dynamic section"));
9026 if (!edyn)
9027 return 0;
9028
9029 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9030 might not have the luxury of section headers. Look for the DT_NULL
9031 terminator to determine the number of entries. */
9032 for (ext = edyn, dynamic_nent = 0;
9033 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9034 ext++)
9035 {
9036 dynamic_nent++;
9037 if (BYTE_GET (ext->d_tag) == DT_NULL)
9038 break;
9039 }
9040
9041 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9042 sizeof (* entry));
9043 if (dynamic_section == NULL)
9044 {
9045 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9046 (unsigned long) dynamic_nent);
9047 free (edyn);
9048 return 0;
9049 }
9050
9051 for (ext = edyn, entry = dynamic_section;
9052 entry < dynamic_section + dynamic_nent;
9053 ext++, entry++)
9054 {
9055 entry->d_tag = BYTE_GET (ext->d_tag);
9056 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9057 }
9058
9059 free (edyn);
9060
9061 return 1;
9062 }
9063
9064 static int
9065 get_64bit_dynamic_section (FILE * file)
9066 {
9067 Elf64_External_Dyn * edyn;
9068 Elf64_External_Dyn * ext;
9069 Elf_Internal_Dyn * entry;
9070
9071 /* Read in the data. */
9072 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9073 dynamic_size, _("dynamic section"));
9074 if (!edyn)
9075 return 0;
9076
9077 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9078 might not have the luxury of section headers. Look for the DT_NULL
9079 terminator to determine the number of entries. */
9080 for (ext = edyn, dynamic_nent = 0;
9081 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9082 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9083 ext++)
9084 {
9085 dynamic_nent++;
9086 if (BYTE_GET (ext->d_tag) == DT_NULL)
9087 break;
9088 }
9089
9090 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9091 sizeof (* entry));
9092 if (dynamic_section == NULL)
9093 {
9094 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9095 (unsigned long) dynamic_nent);
9096 free (edyn);
9097 return 0;
9098 }
9099
9100 /* Convert from external to internal formats. */
9101 for (ext = edyn, entry = dynamic_section;
9102 entry < dynamic_section + dynamic_nent;
9103 ext++, entry++)
9104 {
9105 entry->d_tag = BYTE_GET (ext->d_tag);
9106 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9107 }
9108
9109 free (edyn);
9110
9111 return 1;
9112 }
9113
9114 static void
9115 print_dynamic_flags (bfd_vma flags)
9116 {
9117 int first = 1;
9118
9119 while (flags)
9120 {
9121 bfd_vma flag;
9122
9123 flag = flags & - flags;
9124 flags &= ~ flag;
9125
9126 if (first)
9127 first = 0;
9128 else
9129 putc (' ', stdout);
9130
9131 switch (flag)
9132 {
9133 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9134 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9135 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9136 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9137 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9138 default: fputs (_("unknown"), stdout); break;
9139 }
9140 }
9141 puts ("");
9142 }
9143
9144 /* Parse and display the contents of the dynamic section. */
9145
9146 static int
9147 process_dynamic_section (FILE * file)
9148 {
9149 Elf_Internal_Dyn * entry;
9150
9151 if (dynamic_size == 0)
9152 {
9153 if (do_dynamic)
9154 printf (_("\nThere is no dynamic section in this file.\n"));
9155
9156 return 1;
9157 }
9158
9159 if (is_32bit_elf)
9160 {
9161 if (! get_32bit_dynamic_section (file))
9162 return 0;
9163 }
9164 else if (! get_64bit_dynamic_section (file))
9165 return 0;
9166
9167 /* Find the appropriate symbol table. */
9168 if (dynamic_symbols == NULL)
9169 {
9170 for (entry = dynamic_section;
9171 entry < dynamic_section + dynamic_nent;
9172 ++entry)
9173 {
9174 Elf_Internal_Shdr section;
9175
9176 if (entry->d_tag != DT_SYMTAB)
9177 continue;
9178
9179 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9180
9181 /* Since we do not know how big the symbol table is,
9182 we default to reading in the entire file (!) and
9183 processing that. This is overkill, I know, but it
9184 should work. */
9185 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9186
9187 if (archive_file_offset != 0)
9188 section.sh_size = archive_file_size - section.sh_offset;
9189 else
9190 {
9191 if (fseek (file, 0, SEEK_END))
9192 error (_("Unable to seek to end of file!\n"));
9193
9194 section.sh_size = ftell (file) - section.sh_offset;
9195 }
9196
9197 if (is_32bit_elf)
9198 section.sh_entsize = sizeof (Elf32_External_Sym);
9199 else
9200 section.sh_entsize = sizeof (Elf64_External_Sym);
9201 section.sh_name = string_table_length;
9202
9203 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9204 if (num_dynamic_syms < 1)
9205 {
9206 error (_("Unable to determine the number of symbols to load\n"));
9207 continue;
9208 }
9209 }
9210 }
9211
9212 /* Similarly find a string table. */
9213 if (dynamic_strings == NULL)
9214 {
9215 for (entry = dynamic_section;
9216 entry < dynamic_section + dynamic_nent;
9217 ++entry)
9218 {
9219 unsigned long offset;
9220 long str_tab_len;
9221
9222 if (entry->d_tag != DT_STRTAB)
9223 continue;
9224
9225 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9226
9227 /* Since we do not know how big the string table is,
9228 we default to reading in the entire file (!) and
9229 processing that. This is overkill, I know, but it
9230 should work. */
9231
9232 offset = offset_from_vma (file, entry->d_un.d_val, 0);
9233
9234 if (archive_file_offset != 0)
9235 str_tab_len = archive_file_size - offset;
9236 else
9237 {
9238 if (fseek (file, 0, SEEK_END))
9239 error (_("Unable to seek to end of file\n"));
9240 str_tab_len = ftell (file) - offset;
9241 }
9242
9243 if (str_tab_len < 1)
9244 {
9245 error
9246 (_("Unable to determine the length of the dynamic string table\n"));
9247 continue;
9248 }
9249
9250 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9251 str_tab_len,
9252 _("dynamic string table"));
9253 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9254 break;
9255 }
9256 }
9257
9258 /* And find the syminfo section if available. */
9259 if (dynamic_syminfo == NULL)
9260 {
9261 unsigned long syminsz = 0;
9262
9263 for (entry = dynamic_section;
9264 entry < dynamic_section + dynamic_nent;
9265 ++entry)
9266 {
9267 if (entry->d_tag == DT_SYMINENT)
9268 {
9269 /* Note: these braces are necessary to avoid a syntax
9270 error from the SunOS4 C compiler. */
9271 /* PR binutils/17531: A corrupt file can trigger this test.
9272 So do not use an assert, instead generate an error message. */
9273 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9274 error (_("Bad value (%d) for SYMINENT entry\n"),
9275 (int) entry->d_un.d_val);
9276 }
9277 else if (entry->d_tag == DT_SYMINSZ)
9278 syminsz = entry->d_un.d_val;
9279 else if (entry->d_tag == DT_SYMINFO)
9280 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9281 syminsz);
9282 }
9283
9284 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9285 {
9286 Elf_External_Syminfo * extsyminfo;
9287 Elf_External_Syminfo * extsym;
9288 Elf_Internal_Syminfo * syminfo;
9289
9290 /* There is a syminfo section. Read the data. */
9291 extsyminfo = (Elf_External_Syminfo *)
9292 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9293 _("symbol information"));
9294 if (!extsyminfo)
9295 return 0;
9296
9297 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9298 if (dynamic_syminfo == NULL)
9299 {
9300 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9301 (unsigned long) syminsz);
9302 return 0;
9303 }
9304
9305 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9306 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9307 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9308 ++syminfo, ++extsym)
9309 {
9310 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9311 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9312 }
9313
9314 free (extsyminfo);
9315 }
9316 }
9317
9318 if (do_dynamic && dynamic_addr)
9319 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9320 dynamic_addr, (unsigned long) dynamic_nent);
9321 if (do_dynamic)
9322 printf (_(" Tag Type Name/Value\n"));
9323
9324 for (entry = dynamic_section;
9325 entry < dynamic_section + dynamic_nent;
9326 entry++)
9327 {
9328 if (do_dynamic)
9329 {
9330 const char * dtype;
9331
9332 putchar (' ');
9333 print_vma (entry->d_tag, FULL_HEX);
9334 dtype = get_dynamic_type (entry->d_tag);
9335 printf (" (%s)%*s", dtype,
9336 ((is_32bit_elf ? 27 : 19)
9337 - (int) strlen (dtype)),
9338 " ");
9339 }
9340
9341 switch (entry->d_tag)
9342 {
9343 case DT_FLAGS:
9344 if (do_dynamic)
9345 print_dynamic_flags (entry->d_un.d_val);
9346 break;
9347
9348 case DT_AUXILIARY:
9349 case DT_FILTER:
9350 case DT_CONFIG:
9351 case DT_DEPAUDIT:
9352 case DT_AUDIT:
9353 if (do_dynamic)
9354 {
9355 switch (entry->d_tag)
9356 {
9357 case DT_AUXILIARY:
9358 printf (_("Auxiliary library"));
9359 break;
9360
9361 case DT_FILTER:
9362 printf (_("Filter library"));
9363 break;
9364
9365 case DT_CONFIG:
9366 printf (_("Configuration file"));
9367 break;
9368
9369 case DT_DEPAUDIT:
9370 printf (_("Dependency audit library"));
9371 break;
9372
9373 case DT_AUDIT:
9374 printf (_("Audit library"));
9375 break;
9376 }
9377
9378 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9379 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9380 else
9381 {
9382 printf (": ");
9383 print_vma (entry->d_un.d_val, PREFIX_HEX);
9384 putchar ('\n');
9385 }
9386 }
9387 break;
9388
9389 case DT_FEATURE:
9390 if (do_dynamic)
9391 {
9392 printf (_("Flags:"));
9393
9394 if (entry->d_un.d_val == 0)
9395 printf (_(" None\n"));
9396 else
9397 {
9398 unsigned long int val = entry->d_un.d_val;
9399
9400 if (val & DTF_1_PARINIT)
9401 {
9402 printf (" PARINIT");
9403 val ^= DTF_1_PARINIT;
9404 }
9405 if (val & DTF_1_CONFEXP)
9406 {
9407 printf (" CONFEXP");
9408 val ^= DTF_1_CONFEXP;
9409 }
9410 if (val != 0)
9411 printf (" %lx", val);
9412 puts ("");
9413 }
9414 }
9415 break;
9416
9417 case DT_POSFLAG_1:
9418 if (do_dynamic)
9419 {
9420 printf (_("Flags:"));
9421
9422 if (entry->d_un.d_val == 0)
9423 printf (_(" None\n"));
9424 else
9425 {
9426 unsigned long int val = entry->d_un.d_val;
9427
9428 if (val & DF_P1_LAZYLOAD)
9429 {
9430 printf (" LAZYLOAD");
9431 val ^= DF_P1_LAZYLOAD;
9432 }
9433 if (val & DF_P1_GROUPPERM)
9434 {
9435 printf (" GROUPPERM");
9436 val ^= DF_P1_GROUPPERM;
9437 }
9438 if (val != 0)
9439 printf (" %lx", val);
9440 puts ("");
9441 }
9442 }
9443 break;
9444
9445 case DT_FLAGS_1:
9446 if (do_dynamic)
9447 {
9448 printf (_("Flags:"));
9449 if (entry->d_un.d_val == 0)
9450 printf (_(" None\n"));
9451 else
9452 {
9453 unsigned long int val = entry->d_un.d_val;
9454
9455 if (val & DF_1_NOW)
9456 {
9457 printf (" NOW");
9458 val ^= DF_1_NOW;
9459 }
9460 if (val & DF_1_GLOBAL)
9461 {
9462 printf (" GLOBAL");
9463 val ^= DF_1_GLOBAL;
9464 }
9465 if (val & DF_1_GROUP)
9466 {
9467 printf (" GROUP");
9468 val ^= DF_1_GROUP;
9469 }
9470 if (val & DF_1_NODELETE)
9471 {
9472 printf (" NODELETE");
9473 val ^= DF_1_NODELETE;
9474 }
9475 if (val & DF_1_LOADFLTR)
9476 {
9477 printf (" LOADFLTR");
9478 val ^= DF_1_LOADFLTR;
9479 }
9480 if (val & DF_1_INITFIRST)
9481 {
9482 printf (" INITFIRST");
9483 val ^= DF_1_INITFIRST;
9484 }
9485 if (val & DF_1_NOOPEN)
9486 {
9487 printf (" NOOPEN");
9488 val ^= DF_1_NOOPEN;
9489 }
9490 if (val & DF_1_ORIGIN)
9491 {
9492 printf (" ORIGIN");
9493 val ^= DF_1_ORIGIN;
9494 }
9495 if (val & DF_1_DIRECT)
9496 {
9497 printf (" DIRECT");
9498 val ^= DF_1_DIRECT;
9499 }
9500 if (val & DF_1_TRANS)
9501 {
9502 printf (" TRANS");
9503 val ^= DF_1_TRANS;
9504 }
9505 if (val & DF_1_INTERPOSE)
9506 {
9507 printf (" INTERPOSE");
9508 val ^= DF_1_INTERPOSE;
9509 }
9510 if (val & DF_1_NODEFLIB)
9511 {
9512 printf (" NODEFLIB");
9513 val ^= DF_1_NODEFLIB;
9514 }
9515 if (val & DF_1_NODUMP)
9516 {
9517 printf (" NODUMP");
9518 val ^= DF_1_NODUMP;
9519 }
9520 if (val & DF_1_CONFALT)
9521 {
9522 printf (" CONFALT");
9523 val ^= DF_1_CONFALT;
9524 }
9525 if (val & DF_1_ENDFILTEE)
9526 {
9527 printf (" ENDFILTEE");
9528 val ^= DF_1_ENDFILTEE;
9529 }
9530 if (val & DF_1_DISPRELDNE)
9531 {
9532 printf (" DISPRELDNE");
9533 val ^= DF_1_DISPRELDNE;
9534 }
9535 if (val & DF_1_DISPRELPND)
9536 {
9537 printf (" DISPRELPND");
9538 val ^= DF_1_DISPRELPND;
9539 }
9540 if (val & DF_1_NODIRECT)
9541 {
9542 printf (" NODIRECT");
9543 val ^= DF_1_NODIRECT;
9544 }
9545 if (val & DF_1_IGNMULDEF)
9546 {
9547 printf (" IGNMULDEF");
9548 val ^= DF_1_IGNMULDEF;
9549 }
9550 if (val & DF_1_NOKSYMS)
9551 {
9552 printf (" NOKSYMS");
9553 val ^= DF_1_NOKSYMS;
9554 }
9555 if (val & DF_1_NOHDR)
9556 {
9557 printf (" NOHDR");
9558 val ^= DF_1_NOHDR;
9559 }
9560 if (val & DF_1_EDITED)
9561 {
9562 printf (" EDITED");
9563 val ^= DF_1_EDITED;
9564 }
9565 if (val & DF_1_NORELOC)
9566 {
9567 printf (" NORELOC");
9568 val ^= DF_1_NORELOC;
9569 }
9570 if (val & DF_1_SYMINTPOSE)
9571 {
9572 printf (" SYMINTPOSE");
9573 val ^= DF_1_SYMINTPOSE;
9574 }
9575 if (val & DF_1_GLOBAUDIT)
9576 {
9577 printf (" GLOBAUDIT");
9578 val ^= DF_1_GLOBAUDIT;
9579 }
9580 if (val & DF_1_SINGLETON)
9581 {
9582 printf (" SINGLETON");
9583 val ^= DF_1_SINGLETON;
9584 }
9585 if (val & DF_1_STUB)
9586 {
9587 printf (" STUB");
9588 val ^= DF_1_STUB;
9589 }
9590 if (val & DF_1_PIE)
9591 {
9592 printf (" PIE");
9593 val ^= DF_1_PIE;
9594 }
9595 if (val != 0)
9596 printf (" %lx", val);
9597 puts ("");
9598 }
9599 }
9600 break;
9601
9602 case DT_PLTREL:
9603 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9604 if (do_dynamic)
9605 puts (get_dynamic_type (entry->d_un.d_val));
9606 break;
9607
9608 case DT_NULL :
9609 case DT_NEEDED :
9610 case DT_PLTGOT :
9611 case DT_HASH :
9612 case DT_STRTAB :
9613 case DT_SYMTAB :
9614 case DT_RELA :
9615 case DT_INIT :
9616 case DT_FINI :
9617 case DT_SONAME :
9618 case DT_RPATH :
9619 case DT_SYMBOLIC:
9620 case DT_REL :
9621 case DT_DEBUG :
9622 case DT_TEXTREL :
9623 case DT_JMPREL :
9624 case DT_RUNPATH :
9625 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9626
9627 if (do_dynamic)
9628 {
9629 char * name;
9630
9631 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9632 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9633 else
9634 name = NULL;
9635
9636 if (name)
9637 {
9638 switch (entry->d_tag)
9639 {
9640 case DT_NEEDED:
9641 printf (_("Shared library: [%s]"), name);
9642
9643 if (streq (name, program_interpreter))
9644 printf (_(" program interpreter"));
9645 break;
9646
9647 case DT_SONAME:
9648 printf (_("Library soname: [%s]"), name);
9649 break;
9650
9651 case DT_RPATH:
9652 printf (_("Library rpath: [%s]"), name);
9653 break;
9654
9655 case DT_RUNPATH:
9656 printf (_("Library runpath: [%s]"), name);
9657 break;
9658
9659 default:
9660 print_vma (entry->d_un.d_val, PREFIX_HEX);
9661 break;
9662 }
9663 }
9664 else
9665 print_vma (entry->d_un.d_val, PREFIX_HEX);
9666
9667 putchar ('\n');
9668 }
9669 break;
9670
9671 case DT_PLTRELSZ:
9672 case DT_RELASZ :
9673 case DT_STRSZ :
9674 case DT_RELSZ :
9675 case DT_RELAENT :
9676 case DT_SYMENT :
9677 case DT_RELENT :
9678 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9679 case DT_PLTPADSZ:
9680 case DT_MOVEENT :
9681 case DT_MOVESZ :
9682 case DT_INIT_ARRAYSZ:
9683 case DT_FINI_ARRAYSZ:
9684 case DT_GNU_CONFLICTSZ:
9685 case DT_GNU_LIBLISTSZ:
9686 if (do_dynamic)
9687 {
9688 print_vma (entry->d_un.d_val, UNSIGNED);
9689 printf (_(" (bytes)\n"));
9690 }
9691 break;
9692
9693 case DT_VERDEFNUM:
9694 case DT_VERNEEDNUM:
9695 case DT_RELACOUNT:
9696 case DT_RELCOUNT:
9697 if (do_dynamic)
9698 {
9699 print_vma (entry->d_un.d_val, UNSIGNED);
9700 putchar ('\n');
9701 }
9702 break;
9703
9704 case DT_SYMINSZ:
9705 case DT_SYMINENT:
9706 case DT_SYMINFO:
9707 case DT_USED:
9708 case DT_INIT_ARRAY:
9709 case DT_FINI_ARRAY:
9710 if (do_dynamic)
9711 {
9712 if (entry->d_tag == DT_USED
9713 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9714 {
9715 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9716
9717 if (*name)
9718 {
9719 printf (_("Not needed object: [%s]\n"), name);
9720 break;
9721 }
9722 }
9723
9724 print_vma (entry->d_un.d_val, PREFIX_HEX);
9725 putchar ('\n');
9726 }
9727 break;
9728
9729 case DT_BIND_NOW:
9730 /* The value of this entry is ignored. */
9731 if (do_dynamic)
9732 putchar ('\n');
9733 break;
9734
9735 case DT_GNU_PRELINKED:
9736 if (do_dynamic)
9737 {
9738 struct tm * tmp;
9739 time_t atime = entry->d_un.d_val;
9740
9741 tmp = gmtime (&atime);
9742 /* PR 17533 file: 041-1244816-0.004. */
9743 if (tmp == NULL)
9744 printf (_("<corrupt time val: %lx"),
9745 (unsigned long) atime);
9746 else
9747 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9748 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9749 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9750
9751 }
9752 break;
9753
9754 case DT_GNU_HASH:
9755 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9756 if (do_dynamic)
9757 {
9758 print_vma (entry->d_un.d_val, PREFIX_HEX);
9759 putchar ('\n');
9760 }
9761 break;
9762
9763 default:
9764 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9765 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9766 entry->d_un.d_val;
9767
9768 if (do_dynamic)
9769 {
9770 switch (elf_header.e_machine)
9771 {
9772 case EM_MIPS:
9773 case EM_MIPS_RS3_LE:
9774 dynamic_section_mips_val (entry);
9775 break;
9776 case EM_PARISC:
9777 dynamic_section_parisc_val (entry);
9778 break;
9779 case EM_IA_64:
9780 dynamic_section_ia64_val (entry);
9781 break;
9782 default:
9783 print_vma (entry->d_un.d_val, PREFIX_HEX);
9784 putchar ('\n');
9785 }
9786 }
9787 break;
9788 }
9789 }
9790
9791 return 1;
9792 }
9793
9794 static char *
9795 get_ver_flags (unsigned int flags)
9796 {
9797 static char buff[32];
9798
9799 buff[0] = 0;
9800
9801 if (flags == 0)
9802 return _("none");
9803
9804 if (flags & VER_FLG_BASE)
9805 strcat (buff, "BASE ");
9806
9807 if (flags & VER_FLG_WEAK)
9808 {
9809 if (flags & VER_FLG_BASE)
9810 strcat (buff, "| ");
9811
9812 strcat (buff, "WEAK ");
9813 }
9814
9815 if (flags & VER_FLG_INFO)
9816 {
9817 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9818 strcat (buff, "| ");
9819
9820 strcat (buff, "INFO ");
9821 }
9822
9823 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9824 strcat (buff, _("| <unknown>"));
9825
9826 return buff;
9827 }
9828
9829 /* Display the contents of the version sections. */
9830
9831 static int
9832 process_version_sections (FILE * file)
9833 {
9834 Elf_Internal_Shdr * section;
9835 unsigned i;
9836 int found = 0;
9837
9838 if (! do_version)
9839 return 1;
9840
9841 for (i = 0, section = section_headers;
9842 i < elf_header.e_shnum;
9843 i++, section++)
9844 {
9845 switch (section->sh_type)
9846 {
9847 case SHT_GNU_verdef:
9848 {
9849 Elf_External_Verdef * edefs;
9850 unsigned int idx;
9851 unsigned int cnt;
9852 char * endbuf;
9853
9854 found = 1;
9855
9856 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9857 printable_section_name (section),
9858 section->sh_info);
9859
9860 printf (_(" Addr: 0x"));
9861 printf_vma (section->sh_addr);
9862 printf (_(" Offset: %#08lx Link: %u (%s)"),
9863 (unsigned long) section->sh_offset, section->sh_link,
9864 printable_section_name_from_index (section->sh_link));
9865
9866 edefs = (Elf_External_Verdef *)
9867 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9868 _("version definition section"));
9869 if (!edefs)
9870 break;
9871 endbuf = (char *) edefs + section->sh_size;
9872
9873 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9874 {
9875 char * vstart;
9876 Elf_External_Verdef * edef;
9877 Elf_Internal_Verdef ent;
9878 Elf_External_Verdaux * eaux;
9879 Elf_Internal_Verdaux aux;
9880 int j;
9881 int isum;
9882
9883 /* Check for very large indicies. */
9884 if (idx > (size_t) (endbuf - (char *) edefs))
9885 break;
9886
9887 vstart = ((char *) edefs) + idx;
9888 if (vstart + sizeof (*edef) > endbuf)
9889 break;
9890
9891 edef = (Elf_External_Verdef *) vstart;
9892
9893 ent.vd_version = BYTE_GET (edef->vd_version);
9894 ent.vd_flags = BYTE_GET (edef->vd_flags);
9895 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9896 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9897 ent.vd_hash = BYTE_GET (edef->vd_hash);
9898 ent.vd_aux = BYTE_GET (edef->vd_aux);
9899 ent.vd_next = BYTE_GET (edef->vd_next);
9900
9901 printf (_(" %#06x: Rev: %d Flags: %s"),
9902 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9903
9904 printf (_(" Index: %d Cnt: %d "),
9905 ent.vd_ndx, ent.vd_cnt);
9906
9907 /* Check for overflow. */
9908 if (ent.vd_aux > (size_t) (endbuf - vstart))
9909 break;
9910
9911 vstart += ent.vd_aux;
9912
9913 eaux = (Elf_External_Verdaux *) vstart;
9914
9915 aux.vda_name = BYTE_GET (eaux->vda_name);
9916 aux.vda_next = BYTE_GET (eaux->vda_next);
9917
9918 if (VALID_DYNAMIC_NAME (aux.vda_name))
9919 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9920 else
9921 printf (_("Name index: %ld\n"), aux.vda_name);
9922
9923 isum = idx + ent.vd_aux;
9924
9925 for (j = 1; j < ent.vd_cnt; j++)
9926 {
9927 /* Check for overflow. */
9928 if (aux.vda_next > (size_t) (endbuf - vstart))
9929 break;
9930
9931 isum += aux.vda_next;
9932 vstart += aux.vda_next;
9933
9934 eaux = (Elf_External_Verdaux *) vstart;
9935 if (vstart + sizeof (*eaux) > endbuf)
9936 break;
9937
9938 aux.vda_name = BYTE_GET (eaux->vda_name);
9939 aux.vda_next = BYTE_GET (eaux->vda_next);
9940
9941 if (VALID_DYNAMIC_NAME (aux.vda_name))
9942 printf (_(" %#06x: Parent %d: %s\n"),
9943 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9944 else
9945 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9946 isum, j, aux.vda_name);
9947 }
9948
9949 if (j < ent.vd_cnt)
9950 printf (_(" Version def aux past end of section\n"));
9951
9952 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9953 if (idx + ent.vd_next <= idx)
9954 break;
9955
9956 idx += ent.vd_next;
9957 }
9958
9959 if (cnt < section->sh_info)
9960 printf (_(" Version definition past end of section\n"));
9961
9962 free (edefs);
9963 }
9964 break;
9965
9966 case SHT_GNU_verneed:
9967 {
9968 Elf_External_Verneed * eneed;
9969 unsigned int idx;
9970 unsigned int cnt;
9971 char * endbuf;
9972
9973 found = 1;
9974
9975 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9976 printable_section_name (section), section->sh_info);
9977
9978 printf (_(" Addr: 0x"));
9979 printf_vma (section->sh_addr);
9980 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9981 (unsigned long) section->sh_offset, section->sh_link,
9982 printable_section_name_from_index (section->sh_link));
9983
9984 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9985 section->sh_offset, 1,
9986 section->sh_size,
9987 _("Version Needs section"));
9988 if (!eneed)
9989 break;
9990 endbuf = (char *) eneed + section->sh_size;
9991
9992 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9993 {
9994 Elf_External_Verneed * entry;
9995 Elf_Internal_Verneed ent;
9996 int j;
9997 int isum;
9998 char * vstart;
9999
10000 if (idx > (size_t) (endbuf - (char *) eneed))
10001 break;
10002
10003 vstart = ((char *) eneed) + idx;
10004 if (vstart + sizeof (*entry) > endbuf)
10005 break;
10006
10007 entry = (Elf_External_Verneed *) vstart;
10008
10009 ent.vn_version = BYTE_GET (entry->vn_version);
10010 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10011 ent.vn_file = BYTE_GET (entry->vn_file);
10012 ent.vn_aux = BYTE_GET (entry->vn_aux);
10013 ent.vn_next = BYTE_GET (entry->vn_next);
10014
10015 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10016
10017 if (VALID_DYNAMIC_NAME (ent.vn_file))
10018 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10019 else
10020 printf (_(" File: %lx"), ent.vn_file);
10021
10022 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10023
10024 /* Check for overflow. */
10025 if (ent.vn_aux > (size_t) (endbuf - vstart))
10026 break;
10027 vstart += ent.vn_aux;
10028
10029 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10030 {
10031 Elf_External_Vernaux * eaux;
10032 Elf_Internal_Vernaux aux;
10033
10034 if (vstart + sizeof (*eaux) > endbuf)
10035 break;
10036 eaux = (Elf_External_Vernaux *) vstart;
10037
10038 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10039 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10040 aux.vna_other = BYTE_GET (eaux->vna_other);
10041 aux.vna_name = BYTE_GET (eaux->vna_name);
10042 aux.vna_next = BYTE_GET (eaux->vna_next);
10043
10044 if (VALID_DYNAMIC_NAME (aux.vna_name))
10045 printf (_(" %#06x: Name: %s"),
10046 isum, GET_DYNAMIC_NAME (aux.vna_name));
10047 else
10048 printf (_(" %#06x: Name index: %lx"),
10049 isum, aux.vna_name);
10050
10051 printf (_(" Flags: %s Version: %d\n"),
10052 get_ver_flags (aux.vna_flags), aux.vna_other);
10053
10054 /* Check for overflow. */
10055 if (aux.vna_next > (size_t) (endbuf - vstart)
10056 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10057 {
10058 warn (_("Invalid vna_next field of %lx\n"),
10059 aux.vna_next);
10060 j = ent.vn_cnt;
10061 break;
10062 }
10063 isum += aux.vna_next;
10064 vstart += aux.vna_next;
10065 }
10066
10067 if (j < ent.vn_cnt)
10068 warn (_("Missing Version Needs auxillary information\n"));
10069
10070 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10071 {
10072 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10073 cnt = section->sh_info;
10074 break;
10075 }
10076 idx += ent.vn_next;
10077 }
10078
10079 if (cnt < section->sh_info)
10080 warn (_("Missing Version Needs information\n"));
10081
10082 free (eneed);
10083 }
10084 break;
10085
10086 case SHT_GNU_versym:
10087 {
10088 Elf_Internal_Shdr * link_section;
10089 size_t total;
10090 unsigned int cnt;
10091 unsigned char * edata;
10092 unsigned short * data;
10093 char * strtab;
10094 Elf_Internal_Sym * symbols;
10095 Elf_Internal_Shdr * string_sec;
10096 unsigned long num_syms;
10097 long off;
10098
10099 if (section->sh_link >= elf_header.e_shnum)
10100 break;
10101
10102 link_section = section_headers + section->sh_link;
10103 total = section->sh_size / sizeof (Elf_External_Versym);
10104
10105 if (link_section->sh_link >= elf_header.e_shnum)
10106 break;
10107
10108 found = 1;
10109
10110 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10111 if (symbols == NULL)
10112 break;
10113
10114 string_sec = section_headers + link_section->sh_link;
10115
10116 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10117 string_sec->sh_size,
10118 _("version string table"));
10119 if (!strtab)
10120 {
10121 free (symbols);
10122 break;
10123 }
10124
10125 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10126 printable_section_name (section), (unsigned long) total);
10127
10128 printf (_(" Addr: "));
10129 printf_vma (section->sh_addr);
10130 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10131 (unsigned long) section->sh_offset, section->sh_link,
10132 printable_section_name (link_section));
10133
10134 off = offset_from_vma (file,
10135 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10136 total * sizeof (short));
10137 edata = (unsigned char *) get_data (NULL, file, off, total,
10138 sizeof (short),
10139 _("version symbol data"));
10140 if (!edata)
10141 {
10142 free (strtab);
10143 free (symbols);
10144 break;
10145 }
10146
10147 data = (short unsigned int *) cmalloc (total, sizeof (short));
10148
10149 for (cnt = total; cnt --;)
10150 data[cnt] = byte_get (edata + cnt * sizeof (short),
10151 sizeof (short));
10152
10153 free (edata);
10154
10155 for (cnt = 0; cnt < total; cnt += 4)
10156 {
10157 int j, nn;
10158 char *name;
10159 char *invalid = _("*invalid*");
10160
10161 printf (" %03x:", cnt);
10162
10163 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10164 switch (data[cnt + j])
10165 {
10166 case 0:
10167 fputs (_(" 0 (*local*) "), stdout);
10168 break;
10169
10170 case 1:
10171 fputs (_(" 1 (*global*) "), stdout);
10172 break;
10173
10174 default:
10175 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10176 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10177
10178 /* If this index value is greater than the size of the symbols
10179 array, break to avoid an out-of-bounds read. */
10180 if ((unsigned long)(cnt + j) >= num_syms)
10181 {
10182 warn (_("invalid index into symbol array\n"));
10183 break;
10184 }
10185
10186 name = NULL;
10187 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10188 {
10189 Elf_Internal_Verneed ivn;
10190 unsigned long offset;
10191
10192 offset = offset_from_vma
10193 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10194 sizeof (Elf_External_Verneed));
10195
10196 do
10197 {
10198 Elf_Internal_Vernaux ivna;
10199 Elf_External_Verneed evn;
10200 Elf_External_Vernaux evna;
10201 unsigned long a_off;
10202
10203 if (get_data (&evn, file, offset, sizeof (evn), 1,
10204 _("version need")) == NULL)
10205 break;
10206
10207 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10208 ivn.vn_next = BYTE_GET (evn.vn_next);
10209
10210 a_off = offset + ivn.vn_aux;
10211
10212 do
10213 {
10214 if (get_data (&evna, file, a_off, sizeof (evna),
10215 1, _("version need aux (2)")) == NULL)
10216 {
10217 ivna.vna_next = 0;
10218 ivna.vna_other = 0;
10219 }
10220 else
10221 {
10222 ivna.vna_next = BYTE_GET (evna.vna_next);
10223 ivna.vna_other = BYTE_GET (evna.vna_other);
10224 }
10225
10226 a_off += ivna.vna_next;
10227 }
10228 while (ivna.vna_other != data[cnt + j]
10229 && ivna.vna_next != 0);
10230
10231 if (ivna.vna_other == data[cnt + j])
10232 {
10233 ivna.vna_name = BYTE_GET (evna.vna_name);
10234
10235 if (ivna.vna_name >= string_sec->sh_size)
10236 name = invalid;
10237 else
10238 name = strtab + ivna.vna_name;
10239 break;
10240 }
10241
10242 offset += ivn.vn_next;
10243 }
10244 while (ivn.vn_next);
10245 }
10246
10247 if (data[cnt + j] != 0x8001
10248 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10249 {
10250 Elf_Internal_Verdef ivd;
10251 Elf_External_Verdef evd;
10252 unsigned long offset;
10253
10254 offset = offset_from_vma
10255 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10256 sizeof evd);
10257
10258 do
10259 {
10260 if (get_data (&evd, file, offset, sizeof (evd), 1,
10261 _("version def")) == NULL)
10262 {
10263 ivd.vd_next = 0;
10264 /* PR 17531: file: 046-1082287-0.004. */
10265 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10266 break;
10267 }
10268 else
10269 {
10270 ivd.vd_next = BYTE_GET (evd.vd_next);
10271 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10272 }
10273
10274 offset += ivd.vd_next;
10275 }
10276 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10277 && ivd.vd_next != 0);
10278
10279 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10280 {
10281 Elf_External_Verdaux evda;
10282 Elf_Internal_Verdaux ivda;
10283
10284 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10285
10286 if (get_data (&evda, file,
10287 offset - ivd.vd_next + ivd.vd_aux,
10288 sizeof (evda), 1,
10289 _("version def aux")) == NULL)
10290 break;
10291
10292 ivda.vda_name = BYTE_GET (evda.vda_name);
10293
10294 if (ivda.vda_name >= string_sec->sh_size)
10295 name = invalid;
10296 else if (name != NULL && name != invalid)
10297 name = _("*both*");
10298 else
10299 name = strtab + ivda.vda_name;
10300 }
10301 }
10302 if (name != NULL)
10303 nn += printf ("(%s%-*s",
10304 name,
10305 12 - (int) strlen (name),
10306 ")");
10307
10308 if (nn < 18)
10309 printf ("%*c", 18 - nn, ' ');
10310 }
10311
10312 putchar ('\n');
10313 }
10314
10315 free (data);
10316 free (strtab);
10317 free (symbols);
10318 }
10319 break;
10320
10321 default:
10322 break;
10323 }
10324 }
10325
10326 if (! found)
10327 printf (_("\nNo version information found in this file.\n"));
10328
10329 return 1;
10330 }
10331
10332 static const char *
10333 get_symbol_binding (unsigned int binding)
10334 {
10335 static char buff[32];
10336
10337 switch (binding)
10338 {
10339 case STB_LOCAL: return "LOCAL";
10340 case STB_GLOBAL: return "GLOBAL";
10341 case STB_WEAK: return "WEAK";
10342 default:
10343 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10344 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10345 binding);
10346 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10347 {
10348 if (binding == STB_GNU_UNIQUE
10349 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10350 /* GNU is still using the default value 0. */
10351 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10352 return "UNIQUE";
10353 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10354 }
10355 else
10356 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10357 return buff;
10358 }
10359 }
10360
10361 static const char *
10362 get_symbol_type (unsigned int type)
10363 {
10364 static char buff[32];
10365
10366 switch (type)
10367 {
10368 case STT_NOTYPE: return "NOTYPE";
10369 case STT_OBJECT: return "OBJECT";
10370 case STT_FUNC: return "FUNC";
10371 case STT_SECTION: return "SECTION";
10372 case STT_FILE: return "FILE";
10373 case STT_COMMON: return "COMMON";
10374 case STT_TLS: return "TLS";
10375 case STT_RELC: return "RELC";
10376 case STT_SRELC: return "SRELC";
10377 default:
10378 if (type >= STT_LOPROC && type <= STT_HIPROC)
10379 {
10380 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10381 return "THUMB_FUNC";
10382
10383 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10384 return "REGISTER";
10385
10386 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10387 return "PARISC_MILLI";
10388
10389 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10390 }
10391 else if (type >= STT_LOOS && type <= STT_HIOS)
10392 {
10393 if (elf_header.e_machine == EM_PARISC)
10394 {
10395 if (type == STT_HP_OPAQUE)
10396 return "HP_OPAQUE";
10397 if (type == STT_HP_STUB)
10398 return "HP_STUB";
10399 }
10400
10401 if (type == STT_GNU_IFUNC
10402 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10403 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10404 /* GNU is still using the default value 0. */
10405 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10406 return "IFUNC";
10407
10408 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10409 }
10410 else
10411 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10412 return buff;
10413 }
10414 }
10415
10416 static const char *
10417 get_symbol_visibility (unsigned int visibility)
10418 {
10419 switch (visibility)
10420 {
10421 case STV_DEFAULT: return "DEFAULT";
10422 case STV_INTERNAL: return "INTERNAL";
10423 case STV_HIDDEN: return "HIDDEN";
10424 case STV_PROTECTED: return "PROTECTED";
10425 default:
10426 error (_("Unrecognized visibility value: %u"), visibility);
10427 return _("<unknown>");
10428 }
10429 }
10430
10431 static const char *
10432 get_solaris_symbol_visibility (unsigned int visibility)
10433 {
10434 switch (visibility)
10435 {
10436 case 4: return "EXPORTED";
10437 case 5: return "SINGLETON";
10438 case 6: return "ELIMINATE";
10439 default: return get_symbol_visibility (visibility);
10440 }
10441 }
10442
10443 static const char *
10444 get_mips_symbol_other (unsigned int other)
10445 {
10446 switch (other)
10447 {
10448 case STO_OPTIONAL:
10449 return "OPTIONAL";
10450 case STO_MIPS_PLT:
10451 return "MIPS PLT";
10452 case STO_MIPS_PIC:
10453 return "MIPS PIC";
10454 case STO_MICROMIPS:
10455 return "MICROMIPS";
10456 case STO_MICROMIPS | STO_MIPS_PIC:
10457 return "MICROMIPS, MIPS PIC";
10458 case STO_MIPS16:
10459 return "MIPS16";
10460 default:
10461 return NULL;
10462 }
10463 }
10464
10465 static const char *
10466 get_ia64_symbol_other (unsigned int other)
10467 {
10468 if (is_ia64_vms ())
10469 {
10470 static char res[32];
10471
10472 res[0] = 0;
10473
10474 /* Function types is for images and .STB files only. */
10475 switch (elf_header.e_type)
10476 {
10477 case ET_DYN:
10478 case ET_EXEC:
10479 switch (VMS_ST_FUNC_TYPE (other))
10480 {
10481 case VMS_SFT_CODE_ADDR:
10482 strcat (res, " CA");
10483 break;
10484 case VMS_SFT_SYMV_IDX:
10485 strcat (res, " VEC");
10486 break;
10487 case VMS_SFT_FD:
10488 strcat (res, " FD");
10489 break;
10490 case VMS_SFT_RESERVE:
10491 strcat (res, " RSV");
10492 break;
10493 default:
10494 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10495 VMS_ST_FUNC_TYPE (other));
10496 strcat (res, " <unknown>");
10497 break;
10498 }
10499 break;
10500 default:
10501 break;
10502 }
10503 switch (VMS_ST_LINKAGE (other))
10504 {
10505 case VMS_STL_IGNORE:
10506 strcat (res, " IGN");
10507 break;
10508 case VMS_STL_RESERVE:
10509 strcat (res, " RSV");
10510 break;
10511 case VMS_STL_STD:
10512 strcat (res, " STD");
10513 break;
10514 case VMS_STL_LNK:
10515 strcat (res, " LNK");
10516 break;
10517 default:
10518 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10519 VMS_ST_LINKAGE (other));
10520 strcat (res, " <unknown>");
10521 break;
10522 }
10523
10524 if (res[0] != 0)
10525 return res + 1;
10526 else
10527 return res;
10528 }
10529 return NULL;
10530 }
10531
10532 static const char *
10533 get_ppc64_symbol_other (unsigned int other)
10534 {
10535 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10536 {
10537 static char buf[32];
10538 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10539 PPC64_LOCAL_ENTRY_OFFSET (other));
10540 return buf;
10541 }
10542 return NULL;
10543 }
10544
10545 static const char *
10546 get_symbol_other (unsigned int other)
10547 {
10548 const char * result = NULL;
10549 static char buff [32];
10550
10551 if (other == 0)
10552 return "";
10553
10554 switch (elf_header.e_machine)
10555 {
10556 case EM_MIPS:
10557 result = get_mips_symbol_other (other);
10558 break;
10559 case EM_IA_64:
10560 result = get_ia64_symbol_other (other);
10561 break;
10562 case EM_PPC64:
10563 result = get_ppc64_symbol_other (other);
10564 break;
10565 default:
10566 result = NULL;
10567 break;
10568 }
10569
10570 if (result)
10571 return result;
10572
10573 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10574 return buff;
10575 }
10576
10577 static const char *
10578 get_symbol_index_type (unsigned int type)
10579 {
10580 static char buff[32];
10581
10582 switch (type)
10583 {
10584 case SHN_UNDEF: return "UND";
10585 case SHN_ABS: return "ABS";
10586 case SHN_COMMON: return "COM";
10587 default:
10588 if (type == SHN_IA_64_ANSI_COMMON
10589 && elf_header.e_machine == EM_IA_64
10590 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10591 return "ANSI_COM";
10592 else if ((elf_header.e_machine == EM_X86_64
10593 || elf_header.e_machine == EM_L1OM
10594 || elf_header.e_machine == EM_K1OM)
10595 && type == SHN_X86_64_LCOMMON)
10596 return "LARGE_COM";
10597 else if ((type == SHN_MIPS_SCOMMON
10598 && elf_header.e_machine == EM_MIPS)
10599 || (type == SHN_TIC6X_SCOMMON
10600 && elf_header.e_machine == EM_TI_C6000))
10601 return "SCOM";
10602 else if (type == SHN_MIPS_SUNDEFINED
10603 && elf_header.e_machine == EM_MIPS)
10604 return "SUND";
10605 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10606 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10607 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10608 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10609 else if (type >= SHN_LORESERVE)
10610 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10611 else if (type >= elf_header.e_shnum)
10612 sprintf (buff, _("bad section index[%3d]"), type);
10613 else
10614 sprintf (buff, "%3d", type);
10615 break;
10616 }
10617
10618 return buff;
10619 }
10620
10621 static bfd_vma *
10622 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10623 {
10624 unsigned char * e_data;
10625 bfd_vma * i_data;
10626
10627 /* If the size_t type is smaller than the bfd_size_type, eg because
10628 you are building a 32-bit tool on a 64-bit host, then make sure
10629 that when (number) is cast to (size_t) no information is lost. */
10630 if (sizeof (size_t) < sizeof (bfd_size_type)
10631 && (bfd_size_type) ((size_t) number) != number)
10632 {
10633 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10634 " elements of size %u\n"),
10635 number, ent_size);
10636 return NULL;
10637 }
10638
10639 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10640 attempting to allocate memory when the read is bound to fail. */
10641 if (ent_size * number > current_file_size)
10642 {
10643 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10644 number);
10645 return NULL;
10646 }
10647
10648 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10649 if (e_data == NULL)
10650 {
10651 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10652 number);
10653 return NULL;
10654 }
10655
10656 if (fread (e_data, ent_size, (size_t) number, file) != number)
10657 {
10658 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10659 number * ent_size);
10660 free (e_data);
10661 return NULL;
10662 }
10663
10664 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10665 if (i_data == NULL)
10666 {
10667 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10668 " dynamic entries\n"),
10669 number);
10670 free (e_data);
10671 return NULL;
10672 }
10673
10674 while (number--)
10675 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10676
10677 free (e_data);
10678
10679 return i_data;
10680 }
10681
10682 static void
10683 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10684 {
10685 Elf_Internal_Sym * psym;
10686 int n;
10687
10688 n = print_vma (si, DEC_5);
10689 if (n < 5)
10690 fputs (&" "[n], stdout);
10691 printf (" %3lu: ", hn);
10692
10693 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10694 {
10695 printf (_("<No info available for dynamic symbol number %lu>\n"),
10696 (unsigned long) si);
10697 return;
10698 }
10699
10700 psym = dynamic_symbols + si;
10701 print_vma (psym->st_value, LONG_HEX);
10702 putchar (' ');
10703 print_vma (psym->st_size, DEC_5);
10704
10705 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10706 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10707
10708 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10709 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10710 else
10711 {
10712 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10713
10714 printf (" %-7s", get_symbol_visibility (vis));
10715 /* Check to see if any other bits in the st_other field are set.
10716 Note - displaying this information disrupts the layout of the
10717 table being generated, but for the moment this case is very
10718 rare. */
10719 if (psym->st_other ^ vis)
10720 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10721 }
10722
10723 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10724 if (VALID_DYNAMIC_NAME (psym->st_name))
10725 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10726 else
10727 printf (_(" <corrupt: %14ld>"), psym->st_name);
10728 putchar ('\n');
10729 }
10730
10731 static const char *
10732 get_symbol_version_string (FILE *file, int is_dynsym,
10733 const char *strtab,
10734 unsigned long int strtab_size,
10735 unsigned int si, Elf_Internal_Sym *psym,
10736 enum versioned_symbol_info *sym_info,
10737 unsigned short *vna_other)
10738 {
10739 unsigned char data[2];
10740 unsigned short vers_data;
10741 unsigned long offset;
10742
10743 if (!is_dynsym
10744 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10745 return NULL;
10746
10747 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10748 sizeof data + si * sizeof (vers_data));
10749
10750 if (get_data (&data, file, offset + si * sizeof (vers_data),
10751 sizeof (data), 1, _("version data")) == NULL)
10752 return NULL;
10753
10754 vers_data = byte_get (data, 2);
10755
10756 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10757 return NULL;
10758
10759 /* Usually we'd only see verdef for defined symbols, and verneed for
10760 undefined symbols. However, symbols defined by the linker in
10761 .dynbss for variables copied from a shared library in order to
10762 avoid text relocations are defined yet have verneed. We could
10763 use a heuristic to detect the special case, for example, check
10764 for verneed first on symbols defined in SHT_NOBITS sections, but
10765 it is simpler and more reliable to just look for both verdef and
10766 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10767
10768 if (psym->st_shndx != SHN_UNDEF
10769 && vers_data != 0x8001
10770 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10771 {
10772 Elf_Internal_Verdef ivd;
10773 Elf_Internal_Verdaux ivda;
10774 Elf_External_Verdaux evda;
10775 unsigned long off;
10776
10777 off = offset_from_vma (file,
10778 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10779 sizeof (Elf_External_Verdef));
10780
10781 do
10782 {
10783 Elf_External_Verdef evd;
10784
10785 if (get_data (&evd, file, off, sizeof (evd), 1,
10786 _("version def")) == NULL)
10787 {
10788 ivd.vd_ndx = 0;
10789 ivd.vd_aux = 0;
10790 ivd.vd_next = 0;
10791 }
10792 else
10793 {
10794 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10795 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10796 ivd.vd_next = BYTE_GET (evd.vd_next);
10797 }
10798
10799 off += ivd.vd_next;
10800 }
10801 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10802
10803 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10804 {
10805 off -= ivd.vd_next;
10806 off += ivd.vd_aux;
10807
10808 if (get_data (&evda, file, off, sizeof (evda), 1,
10809 _("version def aux")) != NULL)
10810 {
10811 ivda.vda_name = BYTE_GET (evda.vda_name);
10812
10813 if (psym->st_name != ivda.vda_name)
10814 {
10815 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10816 ? symbol_hidden : symbol_public);
10817 return (ivda.vda_name < strtab_size
10818 ? strtab + ivda.vda_name : _("<corrupt>"));
10819 }
10820 }
10821 }
10822 }
10823
10824 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10825 {
10826 Elf_External_Verneed evn;
10827 Elf_Internal_Verneed ivn;
10828 Elf_Internal_Vernaux ivna;
10829
10830 offset = offset_from_vma (file,
10831 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10832 sizeof evn);
10833 do
10834 {
10835 unsigned long vna_off;
10836
10837 if (get_data (&evn, file, offset, sizeof (evn), 1,
10838 _("version need")) == NULL)
10839 {
10840 ivna.vna_next = 0;
10841 ivna.vna_other = 0;
10842 ivna.vna_name = 0;
10843 break;
10844 }
10845
10846 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10847 ivn.vn_next = BYTE_GET (evn.vn_next);
10848
10849 vna_off = offset + ivn.vn_aux;
10850
10851 do
10852 {
10853 Elf_External_Vernaux evna;
10854
10855 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10856 _("version need aux (3)")) == NULL)
10857 {
10858 ivna.vna_next = 0;
10859 ivna.vna_other = 0;
10860 ivna.vna_name = 0;
10861 }
10862 else
10863 {
10864 ivna.vna_other = BYTE_GET (evna.vna_other);
10865 ivna.vna_next = BYTE_GET (evna.vna_next);
10866 ivna.vna_name = BYTE_GET (evna.vna_name);
10867 }
10868
10869 vna_off += ivna.vna_next;
10870 }
10871 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10872
10873 if (ivna.vna_other == vers_data)
10874 break;
10875
10876 offset += ivn.vn_next;
10877 }
10878 while (ivn.vn_next != 0);
10879
10880 if (ivna.vna_other == vers_data)
10881 {
10882 *sym_info = symbol_undefined;
10883 *vna_other = ivna.vna_other;
10884 return (ivna.vna_name < strtab_size
10885 ? strtab + ivna.vna_name : _("<corrupt>"));
10886 }
10887 }
10888 return NULL;
10889 }
10890
10891 /* Dump the symbol table. */
10892 static int
10893 process_symbol_table (FILE * file)
10894 {
10895 Elf_Internal_Shdr * section;
10896 bfd_size_type nbuckets = 0;
10897 bfd_size_type nchains = 0;
10898 bfd_vma * buckets = NULL;
10899 bfd_vma * chains = NULL;
10900 bfd_vma ngnubuckets = 0;
10901 bfd_vma * gnubuckets = NULL;
10902 bfd_vma * gnuchains = NULL;
10903 bfd_vma gnusymidx = 0;
10904 bfd_size_type ngnuchains = 0;
10905
10906 if (!do_syms && !do_dyn_syms && !do_histogram)
10907 return 1;
10908
10909 if (dynamic_info[DT_HASH]
10910 && (do_histogram
10911 || (do_using_dynamic
10912 && !do_dyn_syms
10913 && dynamic_strings != NULL)))
10914 {
10915 unsigned char nb[8];
10916 unsigned char nc[8];
10917 unsigned int hash_ent_size = 4;
10918
10919 if ((elf_header.e_machine == EM_ALPHA
10920 || elf_header.e_machine == EM_S390
10921 || elf_header.e_machine == EM_S390_OLD)
10922 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10923 hash_ent_size = 8;
10924
10925 if (fseek (file,
10926 (archive_file_offset
10927 + offset_from_vma (file, dynamic_info[DT_HASH],
10928 sizeof nb + sizeof nc)),
10929 SEEK_SET))
10930 {
10931 error (_("Unable to seek to start of dynamic information\n"));
10932 goto no_hash;
10933 }
10934
10935 if (fread (nb, hash_ent_size, 1, file) != 1)
10936 {
10937 error (_("Failed to read in number of buckets\n"));
10938 goto no_hash;
10939 }
10940
10941 if (fread (nc, hash_ent_size, 1, file) != 1)
10942 {
10943 error (_("Failed to read in number of chains\n"));
10944 goto no_hash;
10945 }
10946
10947 nbuckets = byte_get (nb, hash_ent_size);
10948 nchains = byte_get (nc, hash_ent_size);
10949
10950 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10951 chains = get_dynamic_data (file, nchains, hash_ent_size);
10952
10953 no_hash:
10954 if (buckets == NULL || chains == NULL)
10955 {
10956 if (do_using_dynamic)
10957 return 0;
10958 free (buckets);
10959 free (chains);
10960 buckets = NULL;
10961 chains = NULL;
10962 nbuckets = 0;
10963 nchains = 0;
10964 }
10965 }
10966
10967 if (dynamic_info_DT_GNU_HASH
10968 && (do_histogram
10969 || (do_using_dynamic
10970 && !do_dyn_syms
10971 && dynamic_strings != NULL)))
10972 {
10973 unsigned char nb[16];
10974 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10975 bfd_vma buckets_vma;
10976
10977 if (fseek (file,
10978 (archive_file_offset
10979 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10980 sizeof nb)),
10981 SEEK_SET))
10982 {
10983 error (_("Unable to seek to start of dynamic information\n"));
10984 goto no_gnu_hash;
10985 }
10986
10987 if (fread (nb, 16, 1, file) != 1)
10988 {
10989 error (_("Failed to read in number of buckets\n"));
10990 goto no_gnu_hash;
10991 }
10992
10993 ngnubuckets = byte_get (nb, 4);
10994 gnusymidx = byte_get (nb + 4, 4);
10995 bitmaskwords = byte_get (nb + 8, 4);
10996 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10997 if (is_32bit_elf)
10998 buckets_vma += bitmaskwords * 4;
10999 else
11000 buckets_vma += bitmaskwords * 8;
11001
11002 if (fseek (file,
11003 (archive_file_offset
11004 + offset_from_vma (file, buckets_vma, 4)),
11005 SEEK_SET))
11006 {
11007 error (_("Unable to seek to start of dynamic information\n"));
11008 goto no_gnu_hash;
11009 }
11010
11011 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11012
11013 if (gnubuckets == NULL)
11014 goto no_gnu_hash;
11015
11016 for (i = 0; i < ngnubuckets; i++)
11017 if (gnubuckets[i] != 0)
11018 {
11019 if (gnubuckets[i] < gnusymidx)
11020 return 0;
11021
11022 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11023 maxchain = gnubuckets[i];
11024 }
11025
11026 if (maxchain == 0xffffffff)
11027 goto no_gnu_hash;
11028
11029 maxchain -= gnusymidx;
11030
11031 if (fseek (file,
11032 (archive_file_offset
11033 + offset_from_vma (file, buckets_vma
11034 + 4 * (ngnubuckets + maxchain), 4)),
11035 SEEK_SET))
11036 {
11037 error (_("Unable to seek to start of dynamic information\n"));
11038 goto no_gnu_hash;
11039 }
11040
11041 do
11042 {
11043 if (fread (nb, 4, 1, file) != 1)
11044 {
11045 error (_("Failed to determine last chain length\n"));
11046 goto no_gnu_hash;
11047 }
11048
11049 if (maxchain + 1 == 0)
11050 goto no_gnu_hash;
11051
11052 ++maxchain;
11053 }
11054 while ((byte_get (nb, 4) & 1) == 0);
11055
11056 if (fseek (file,
11057 (archive_file_offset
11058 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11059 SEEK_SET))
11060 {
11061 error (_("Unable to seek to start of dynamic information\n"));
11062 goto no_gnu_hash;
11063 }
11064
11065 gnuchains = get_dynamic_data (file, maxchain, 4);
11066 ngnuchains = maxchain;
11067
11068 no_gnu_hash:
11069 if (gnuchains == NULL)
11070 {
11071 free (gnubuckets);
11072 gnubuckets = NULL;
11073 ngnubuckets = 0;
11074 if (do_using_dynamic)
11075 return 0;
11076 }
11077 }
11078
11079 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11080 && do_syms
11081 && do_using_dynamic
11082 && dynamic_strings != NULL
11083 && dynamic_symbols != NULL)
11084 {
11085 unsigned long hn;
11086
11087 if (dynamic_info[DT_HASH])
11088 {
11089 bfd_vma si;
11090
11091 printf (_("\nSymbol table for image:\n"));
11092 if (is_32bit_elf)
11093 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11094 else
11095 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11096
11097 for (hn = 0; hn < nbuckets; hn++)
11098 {
11099 if (! buckets[hn])
11100 continue;
11101
11102 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11103 print_dynamic_symbol (si, hn);
11104 }
11105 }
11106
11107 if (dynamic_info_DT_GNU_HASH)
11108 {
11109 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11110 if (is_32bit_elf)
11111 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11112 else
11113 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11114
11115 for (hn = 0; hn < ngnubuckets; ++hn)
11116 if (gnubuckets[hn] != 0)
11117 {
11118 bfd_vma si = gnubuckets[hn];
11119 bfd_vma off = si - gnusymidx;
11120
11121 do
11122 {
11123 print_dynamic_symbol (si, hn);
11124 si++;
11125 }
11126 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11127 }
11128 }
11129 }
11130 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11131 && section_headers != NULL)
11132 {
11133 unsigned int i;
11134
11135 for (i = 0, section = section_headers;
11136 i < elf_header.e_shnum;
11137 i++, section++)
11138 {
11139 unsigned int si;
11140 char * strtab = NULL;
11141 unsigned long int strtab_size = 0;
11142 Elf_Internal_Sym * symtab;
11143 Elf_Internal_Sym * psym;
11144 unsigned long num_syms;
11145
11146 if ((section->sh_type != SHT_SYMTAB
11147 && section->sh_type != SHT_DYNSYM)
11148 || (!do_syms
11149 && section->sh_type == SHT_SYMTAB))
11150 continue;
11151
11152 if (section->sh_entsize == 0)
11153 {
11154 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11155 printable_section_name (section));
11156 continue;
11157 }
11158
11159 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11160 printable_section_name (section),
11161 (unsigned long) (section->sh_size / section->sh_entsize));
11162
11163 if (is_32bit_elf)
11164 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11165 else
11166 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11167
11168 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11169 if (symtab == NULL)
11170 continue;
11171
11172 if (section->sh_link == elf_header.e_shstrndx)
11173 {
11174 strtab = string_table;
11175 strtab_size = string_table_length;
11176 }
11177 else if (section->sh_link < elf_header.e_shnum)
11178 {
11179 Elf_Internal_Shdr * string_sec;
11180
11181 string_sec = section_headers + section->sh_link;
11182
11183 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11184 1, string_sec->sh_size,
11185 _("string table"));
11186 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11187 }
11188
11189 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11190 {
11191 const char *version_string;
11192 enum versioned_symbol_info sym_info;
11193 unsigned short vna_other;
11194
11195 printf ("%6d: ", si);
11196 print_vma (psym->st_value, LONG_HEX);
11197 putchar (' ');
11198 print_vma (psym->st_size, DEC_5);
11199 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11200 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11201 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11202 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11203 else
11204 {
11205 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11206
11207 printf (" %-7s", get_symbol_visibility (vis));
11208 /* Check to see if any other bits in the st_other field are set.
11209 Note - displaying this information disrupts the layout of the
11210 table being generated, but for the moment this case is very rare. */
11211 if (psym->st_other ^ vis)
11212 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11213 }
11214 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11215 print_symbol (25, psym->st_name < strtab_size
11216 ? strtab + psym->st_name : _("<corrupt>"));
11217
11218 version_string
11219 = get_symbol_version_string (file,
11220 section->sh_type == SHT_DYNSYM,
11221 strtab, strtab_size, si,
11222 psym, &sym_info, &vna_other);
11223 if (version_string)
11224 {
11225 if (sym_info == symbol_undefined)
11226 printf ("@%s (%d)", version_string, vna_other);
11227 else
11228 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11229 version_string);
11230 }
11231
11232 putchar ('\n');
11233
11234 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11235 && si >= section->sh_info
11236 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11237 && elf_header.e_machine != EM_MIPS
11238 /* Solaris binaries have been found to violate this requirement as
11239 well. Not sure if this is a bug or an ABI requirement. */
11240 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11241 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11242 si, printable_section_name (section), section->sh_info);
11243 }
11244
11245 free (symtab);
11246 if (strtab != string_table)
11247 free (strtab);
11248 }
11249 }
11250 else if (do_syms)
11251 printf
11252 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11253
11254 if (do_histogram && buckets != NULL)
11255 {
11256 unsigned long * lengths;
11257 unsigned long * counts;
11258 unsigned long hn;
11259 bfd_vma si;
11260 unsigned long maxlength = 0;
11261 unsigned long nzero_counts = 0;
11262 unsigned long nsyms = 0;
11263 unsigned long chained;
11264
11265 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11266 (unsigned long) nbuckets);
11267
11268 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11269 if (lengths == NULL)
11270 {
11271 error (_("Out of memory allocating space for histogram buckets\n"));
11272 return 0;
11273 }
11274
11275 printf (_(" Length Number %% of total Coverage\n"));
11276 for (hn = 0; hn < nbuckets; ++hn)
11277 {
11278 for (si = buckets[hn], chained = 0;
11279 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11280 si = chains[si], ++chained)
11281 {
11282 ++nsyms;
11283 if (maxlength < ++lengths[hn])
11284 ++maxlength;
11285 }
11286
11287 /* PR binutils/17531: A corrupt binary could contain broken
11288 histogram data. Do not go into an infinite loop trying
11289 to process it. */
11290 if (chained > nchains)
11291 {
11292 error (_("histogram chain is corrupt\n"));
11293 break;
11294 }
11295 }
11296
11297 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11298 if (counts == NULL)
11299 {
11300 free (lengths);
11301 error (_("Out of memory allocating space for histogram counts\n"));
11302 return 0;
11303 }
11304
11305 for (hn = 0; hn < nbuckets; ++hn)
11306 ++counts[lengths[hn]];
11307
11308 if (nbuckets > 0)
11309 {
11310 unsigned long i;
11311 printf (" 0 %-10lu (%5.1f%%)\n",
11312 counts[0], (counts[0] * 100.0) / nbuckets);
11313 for (i = 1; i <= maxlength; ++i)
11314 {
11315 nzero_counts += counts[i] * i;
11316 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11317 i, counts[i], (counts[i] * 100.0) / nbuckets,
11318 (nzero_counts * 100.0) / nsyms);
11319 }
11320 }
11321
11322 free (counts);
11323 free (lengths);
11324 }
11325
11326 if (buckets != NULL)
11327 {
11328 free (buckets);
11329 free (chains);
11330 }
11331
11332 if (do_histogram && gnubuckets != NULL)
11333 {
11334 unsigned long * lengths;
11335 unsigned long * counts;
11336 unsigned long hn;
11337 unsigned long maxlength = 0;
11338 unsigned long nzero_counts = 0;
11339 unsigned long nsyms = 0;
11340
11341 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11342 (unsigned long) ngnubuckets);
11343
11344 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11345 if (lengths == NULL)
11346 {
11347 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11348 return 0;
11349 }
11350
11351 printf (_(" Length Number %% of total Coverage\n"));
11352
11353 for (hn = 0; hn < ngnubuckets; ++hn)
11354 if (gnubuckets[hn] != 0)
11355 {
11356 bfd_vma off, length = 1;
11357
11358 for (off = gnubuckets[hn] - gnusymidx;
11359 /* PR 17531 file: 010-77222-0.004. */
11360 off < ngnuchains && (gnuchains[off] & 1) == 0;
11361 ++off)
11362 ++length;
11363 lengths[hn] = length;
11364 if (length > maxlength)
11365 maxlength = length;
11366 nsyms += length;
11367 }
11368
11369 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11370 if (counts == NULL)
11371 {
11372 free (lengths);
11373 error (_("Out of memory allocating space for gnu histogram counts\n"));
11374 return 0;
11375 }
11376
11377 for (hn = 0; hn < ngnubuckets; ++hn)
11378 ++counts[lengths[hn]];
11379
11380 if (ngnubuckets > 0)
11381 {
11382 unsigned long j;
11383 printf (" 0 %-10lu (%5.1f%%)\n",
11384 counts[0], (counts[0] * 100.0) / ngnubuckets);
11385 for (j = 1; j <= maxlength; ++j)
11386 {
11387 nzero_counts += counts[j] * j;
11388 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11389 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11390 (nzero_counts * 100.0) / nsyms);
11391 }
11392 }
11393
11394 free (counts);
11395 free (lengths);
11396 free (gnubuckets);
11397 free (gnuchains);
11398 }
11399
11400 return 1;
11401 }
11402
11403 static int
11404 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11405 {
11406 unsigned int i;
11407
11408 if (dynamic_syminfo == NULL
11409 || !do_dynamic)
11410 /* No syminfo, this is ok. */
11411 return 1;
11412
11413 /* There better should be a dynamic symbol section. */
11414 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11415 return 0;
11416
11417 if (dynamic_addr)
11418 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11419 dynamic_syminfo_offset, dynamic_syminfo_nent);
11420
11421 printf (_(" Num: Name BoundTo Flags\n"));
11422 for (i = 0; i < dynamic_syminfo_nent; ++i)
11423 {
11424 unsigned short int flags = dynamic_syminfo[i].si_flags;
11425
11426 printf ("%4d: ", i);
11427 if (i >= num_dynamic_syms)
11428 printf (_("<corrupt index>"));
11429 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11430 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11431 else
11432 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11433 putchar (' ');
11434
11435 switch (dynamic_syminfo[i].si_boundto)
11436 {
11437 case SYMINFO_BT_SELF:
11438 fputs ("SELF ", stdout);
11439 break;
11440 case SYMINFO_BT_PARENT:
11441 fputs ("PARENT ", stdout);
11442 break;
11443 default:
11444 if (dynamic_syminfo[i].si_boundto > 0
11445 && dynamic_syminfo[i].si_boundto < dynamic_nent
11446 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11447 {
11448 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11449 putchar (' ' );
11450 }
11451 else
11452 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11453 break;
11454 }
11455
11456 if (flags & SYMINFO_FLG_DIRECT)
11457 printf (" DIRECT");
11458 if (flags & SYMINFO_FLG_PASSTHRU)
11459 printf (" PASSTHRU");
11460 if (flags & SYMINFO_FLG_COPY)
11461 printf (" COPY");
11462 if (flags & SYMINFO_FLG_LAZYLOAD)
11463 printf (" LAZYLOAD");
11464
11465 puts ("");
11466 }
11467
11468 return 1;
11469 }
11470
11471 /* Check to see if the given reloc needs to be handled in a target specific
11472 manner. If so then process the reloc and return TRUE otherwise return
11473 FALSE. */
11474
11475 static bfd_boolean
11476 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11477 unsigned char * start,
11478 Elf_Internal_Sym * symtab)
11479 {
11480 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11481
11482 switch (elf_header.e_machine)
11483 {
11484 case EM_MSP430:
11485 case EM_MSP430_OLD:
11486 {
11487 static Elf_Internal_Sym * saved_sym = NULL;
11488
11489 switch (reloc_type)
11490 {
11491 case 10: /* R_MSP430_SYM_DIFF */
11492 if (uses_msp430x_relocs ())
11493 break;
11494 case 21: /* R_MSP430X_SYM_DIFF */
11495 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11496 return TRUE;
11497
11498 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11499 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11500 goto handle_sym_diff;
11501
11502 case 5: /* R_MSP430_16_BYTE */
11503 case 9: /* R_MSP430_8 */
11504 if (uses_msp430x_relocs ())
11505 break;
11506 goto handle_sym_diff;
11507
11508 case 2: /* R_MSP430_ABS16 */
11509 case 15: /* R_MSP430X_ABS16 */
11510 if (! uses_msp430x_relocs ())
11511 break;
11512 goto handle_sym_diff;
11513
11514 handle_sym_diff:
11515 if (saved_sym != NULL)
11516 {
11517 bfd_vma value;
11518
11519 value = reloc->r_addend
11520 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11521 - saved_sym->st_value);
11522
11523 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11524
11525 saved_sym = NULL;
11526 return TRUE;
11527 }
11528 break;
11529
11530 default:
11531 if (saved_sym != NULL)
11532 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11533 break;
11534 }
11535 break;
11536 }
11537
11538 case EM_MN10300:
11539 case EM_CYGNUS_MN10300:
11540 {
11541 static Elf_Internal_Sym * saved_sym = NULL;
11542
11543 switch (reloc_type)
11544 {
11545 case 34: /* R_MN10300_ALIGN */
11546 return TRUE;
11547 case 33: /* R_MN10300_SYM_DIFF */
11548 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11549 return TRUE;
11550 case 1: /* R_MN10300_32 */
11551 case 2: /* R_MN10300_16 */
11552 if (saved_sym != NULL)
11553 {
11554 bfd_vma value;
11555
11556 value = reloc->r_addend
11557 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11558 - saved_sym->st_value);
11559
11560 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11561
11562 saved_sym = NULL;
11563 return TRUE;
11564 }
11565 break;
11566 default:
11567 if (saved_sym != NULL)
11568 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11569 break;
11570 }
11571 break;
11572 }
11573
11574 case EM_RL78:
11575 {
11576 static bfd_vma saved_sym1 = 0;
11577 static bfd_vma saved_sym2 = 0;
11578 static bfd_vma value;
11579
11580 switch (reloc_type)
11581 {
11582 case 0x80: /* R_RL78_SYM. */
11583 saved_sym1 = saved_sym2;
11584 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11585 saved_sym2 += reloc->r_addend;
11586 return TRUE;
11587
11588 case 0x83: /* R_RL78_OPsub. */
11589 value = saved_sym1 - saved_sym2;
11590 saved_sym2 = saved_sym1 = 0;
11591 return TRUE;
11592 break;
11593
11594 case 0x41: /* R_RL78_ABS32. */
11595 byte_put (start + reloc->r_offset, value, 4);
11596 value = 0;
11597 return TRUE;
11598
11599 case 0x43: /* R_RL78_ABS16. */
11600 byte_put (start + reloc->r_offset, value, 2);
11601 value = 0;
11602 return TRUE;
11603
11604 default:
11605 break;
11606 }
11607 break;
11608 }
11609 }
11610
11611 return FALSE;
11612 }
11613
11614 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11615 DWARF debug sections. This is a target specific test. Note - we do not
11616 go through the whole including-target-headers-multiple-times route, (as
11617 we have already done with <elf/h8.h>) because this would become very
11618 messy and even then this function would have to contain target specific
11619 information (the names of the relocs instead of their numeric values).
11620 FIXME: This is not the correct way to solve this problem. The proper way
11621 is to have target specific reloc sizing and typing functions created by
11622 the reloc-macros.h header, in the same way that it already creates the
11623 reloc naming functions. */
11624
11625 static bfd_boolean
11626 is_32bit_abs_reloc (unsigned int reloc_type)
11627 {
11628 /* Please keep this table alpha-sorted for ease of visual lookup. */
11629 switch (elf_header.e_machine)
11630 {
11631 case EM_386:
11632 case EM_IAMCU:
11633 return reloc_type == 1; /* R_386_32. */
11634 case EM_68K:
11635 return reloc_type == 1; /* R_68K_32. */
11636 case EM_860:
11637 return reloc_type == 1; /* R_860_32. */
11638 case EM_960:
11639 return reloc_type == 2; /* R_960_32. */
11640 case EM_AARCH64:
11641 return reloc_type == 258; /* R_AARCH64_ABS32 */
11642 case EM_ADAPTEVA_EPIPHANY:
11643 return reloc_type == 3;
11644 case EM_ALPHA:
11645 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11646 case EM_ARC:
11647 return reloc_type == 1; /* R_ARC_32. */
11648 case EM_ARC_COMPACT:
11649 case EM_ARC_COMPACT2:
11650 return reloc_type == 4; /* R_ARC_32. */
11651 case EM_ARM:
11652 return reloc_type == 2; /* R_ARM_ABS32 */
11653 case EM_AVR_OLD:
11654 case EM_AVR:
11655 return reloc_type == 1;
11656 case EM_BLACKFIN:
11657 return reloc_type == 0x12; /* R_byte4_data. */
11658 case EM_CRIS:
11659 return reloc_type == 3; /* R_CRIS_32. */
11660 case EM_CR16:
11661 return reloc_type == 3; /* R_CR16_NUM32. */
11662 case EM_CRX:
11663 return reloc_type == 15; /* R_CRX_NUM32. */
11664 case EM_CYGNUS_FRV:
11665 return reloc_type == 1;
11666 case EM_CYGNUS_D10V:
11667 case EM_D10V:
11668 return reloc_type == 6; /* R_D10V_32. */
11669 case EM_CYGNUS_D30V:
11670 case EM_D30V:
11671 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11672 case EM_DLX:
11673 return reloc_type == 3; /* R_DLX_RELOC_32. */
11674 case EM_CYGNUS_FR30:
11675 case EM_FR30:
11676 return reloc_type == 3; /* R_FR30_32. */
11677 case EM_FT32:
11678 return reloc_type == 1; /* R_FT32_32. */
11679 case EM_H8S:
11680 case EM_H8_300:
11681 case EM_H8_300H:
11682 return reloc_type == 1; /* R_H8_DIR32. */
11683 case EM_IA_64:
11684 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11685 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11686 case EM_IP2K_OLD:
11687 case EM_IP2K:
11688 return reloc_type == 2; /* R_IP2K_32. */
11689 case EM_IQ2000:
11690 return reloc_type == 2; /* R_IQ2000_32. */
11691 case EM_LATTICEMICO32:
11692 return reloc_type == 3; /* R_LM32_32. */
11693 case EM_M32C_OLD:
11694 case EM_M32C:
11695 return reloc_type == 3; /* R_M32C_32. */
11696 case EM_M32R:
11697 return reloc_type == 34; /* R_M32R_32_RELA. */
11698 case EM_68HC11:
11699 case EM_68HC12:
11700 return reloc_type == 6; /* R_M68HC11_32. */
11701 case EM_MCORE:
11702 return reloc_type == 1; /* R_MCORE_ADDR32. */
11703 case EM_CYGNUS_MEP:
11704 return reloc_type == 4; /* R_MEP_32. */
11705 case EM_METAG:
11706 return reloc_type == 2; /* R_METAG_ADDR32. */
11707 case EM_MICROBLAZE:
11708 return reloc_type == 1; /* R_MICROBLAZE_32. */
11709 case EM_MIPS:
11710 return reloc_type == 2; /* R_MIPS_32. */
11711 case EM_MMIX:
11712 return reloc_type == 4; /* R_MMIX_32. */
11713 case EM_CYGNUS_MN10200:
11714 case EM_MN10200:
11715 return reloc_type == 1; /* R_MN10200_32. */
11716 case EM_CYGNUS_MN10300:
11717 case EM_MN10300:
11718 return reloc_type == 1; /* R_MN10300_32. */
11719 case EM_MOXIE:
11720 return reloc_type == 1; /* R_MOXIE_32. */
11721 case EM_MSP430_OLD:
11722 case EM_MSP430:
11723 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11724 case EM_MT:
11725 return reloc_type == 2; /* R_MT_32. */
11726 case EM_NDS32:
11727 return reloc_type == 20; /* R_NDS32_RELA. */
11728 case EM_ALTERA_NIOS2:
11729 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11730 case EM_NIOS32:
11731 return reloc_type == 1; /* R_NIOS_32. */
11732 case EM_OR1K:
11733 return reloc_type == 1; /* R_OR1K_32. */
11734 case EM_PARISC:
11735 return (reloc_type == 1 /* R_PARISC_DIR32. */
11736 || reloc_type == 41); /* R_PARISC_SECREL32. */
11737 case EM_PJ:
11738 case EM_PJ_OLD:
11739 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11740 case EM_PPC64:
11741 return reloc_type == 1; /* R_PPC64_ADDR32. */
11742 case EM_PPC:
11743 return reloc_type == 1; /* R_PPC_ADDR32. */
11744 case EM_RL78:
11745 return reloc_type == 1; /* R_RL78_DIR32. */
11746 case EM_RX:
11747 return reloc_type == 1; /* R_RX_DIR32. */
11748 case EM_S370:
11749 return reloc_type == 1; /* R_I370_ADDR31. */
11750 case EM_S390_OLD:
11751 case EM_S390:
11752 return reloc_type == 4; /* R_S390_32. */
11753 case EM_SCORE:
11754 return reloc_type == 8; /* R_SCORE_ABS32. */
11755 case EM_SH:
11756 return reloc_type == 1; /* R_SH_DIR32. */
11757 case EM_SPARC32PLUS:
11758 case EM_SPARCV9:
11759 case EM_SPARC:
11760 return reloc_type == 3 /* R_SPARC_32. */
11761 || reloc_type == 23; /* R_SPARC_UA32. */
11762 case EM_SPU:
11763 return reloc_type == 6; /* R_SPU_ADDR32 */
11764 case EM_TI_C6000:
11765 return reloc_type == 1; /* R_C6000_ABS32. */
11766 case EM_TILEGX:
11767 return reloc_type == 2; /* R_TILEGX_32. */
11768 case EM_TILEPRO:
11769 return reloc_type == 1; /* R_TILEPRO_32. */
11770 case EM_CYGNUS_V850:
11771 case EM_V850:
11772 return reloc_type == 6; /* R_V850_ABS32. */
11773 case EM_V800:
11774 return reloc_type == 0x33; /* R_V810_WORD. */
11775 case EM_VAX:
11776 return reloc_type == 1; /* R_VAX_32. */
11777 case EM_VISIUM:
11778 return reloc_type == 3; /* R_VISIUM_32. */
11779 case EM_X86_64:
11780 case EM_L1OM:
11781 case EM_K1OM:
11782 return reloc_type == 10; /* R_X86_64_32. */
11783 case EM_XC16X:
11784 case EM_C166:
11785 return reloc_type == 3; /* R_XC16C_ABS_32. */
11786 case EM_XGATE:
11787 return reloc_type == 4; /* R_XGATE_32. */
11788 case EM_XSTORMY16:
11789 return reloc_type == 1; /* R_XSTROMY16_32. */
11790 case EM_XTENSA_OLD:
11791 case EM_XTENSA:
11792 return reloc_type == 1; /* R_XTENSA_32. */
11793 default:
11794 {
11795 static unsigned int prev_warn = 0;
11796
11797 /* Avoid repeating the same warning multiple times. */
11798 if (prev_warn != elf_header.e_machine)
11799 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11800 elf_header.e_machine);
11801 prev_warn = elf_header.e_machine;
11802 return FALSE;
11803 }
11804 }
11805 }
11806
11807 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11808 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11809
11810 static bfd_boolean
11811 is_32bit_pcrel_reloc (unsigned int reloc_type)
11812 {
11813 switch (elf_header.e_machine)
11814 /* Please keep this table alpha-sorted for ease of visual lookup. */
11815 {
11816 case EM_386:
11817 case EM_IAMCU:
11818 return reloc_type == 2; /* R_386_PC32. */
11819 case EM_68K:
11820 return reloc_type == 4; /* R_68K_PC32. */
11821 case EM_AARCH64:
11822 return reloc_type == 261; /* R_AARCH64_PREL32 */
11823 case EM_ADAPTEVA_EPIPHANY:
11824 return reloc_type == 6;
11825 case EM_ALPHA:
11826 return reloc_type == 10; /* R_ALPHA_SREL32. */
11827 case EM_ARC_COMPACT:
11828 case EM_ARC_COMPACT2:
11829 return reloc_type == 49; /* R_ARC_32_PCREL. */
11830 case EM_ARM:
11831 return reloc_type == 3; /* R_ARM_REL32 */
11832 case EM_AVR_OLD:
11833 case EM_AVR:
11834 return reloc_type == 36; /* R_AVR_32_PCREL. */
11835 case EM_MICROBLAZE:
11836 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11837 case EM_OR1K:
11838 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11839 case EM_PARISC:
11840 return reloc_type == 9; /* R_PARISC_PCREL32. */
11841 case EM_PPC:
11842 return reloc_type == 26; /* R_PPC_REL32. */
11843 case EM_PPC64:
11844 return reloc_type == 26; /* R_PPC64_REL32. */
11845 case EM_S390_OLD:
11846 case EM_S390:
11847 return reloc_type == 5; /* R_390_PC32. */
11848 case EM_SH:
11849 return reloc_type == 2; /* R_SH_REL32. */
11850 case EM_SPARC32PLUS:
11851 case EM_SPARCV9:
11852 case EM_SPARC:
11853 return reloc_type == 6; /* R_SPARC_DISP32. */
11854 case EM_SPU:
11855 return reloc_type == 13; /* R_SPU_REL32. */
11856 case EM_TILEGX:
11857 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11858 case EM_TILEPRO:
11859 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11860 case EM_VISIUM:
11861 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11862 case EM_X86_64:
11863 case EM_L1OM:
11864 case EM_K1OM:
11865 return reloc_type == 2; /* R_X86_64_PC32. */
11866 case EM_XTENSA_OLD:
11867 case EM_XTENSA:
11868 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11869 default:
11870 /* Do not abort or issue an error message here. Not all targets use
11871 pc-relative 32-bit relocs in their DWARF debug information and we
11872 have already tested for target coverage in is_32bit_abs_reloc. A
11873 more helpful warning message will be generated by apply_relocations
11874 anyway, so just return. */
11875 return FALSE;
11876 }
11877 }
11878
11879 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11880 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11881
11882 static bfd_boolean
11883 is_64bit_abs_reloc (unsigned int reloc_type)
11884 {
11885 switch (elf_header.e_machine)
11886 {
11887 case EM_AARCH64:
11888 return reloc_type == 257; /* R_AARCH64_ABS64. */
11889 case EM_ALPHA:
11890 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11891 case EM_IA_64:
11892 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11893 case EM_PARISC:
11894 return reloc_type == 80; /* R_PARISC_DIR64. */
11895 case EM_PPC64:
11896 return reloc_type == 38; /* R_PPC64_ADDR64. */
11897 case EM_SPARC32PLUS:
11898 case EM_SPARCV9:
11899 case EM_SPARC:
11900 return reloc_type == 54; /* R_SPARC_UA64. */
11901 case EM_X86_64:
11902 case EM_L1OM:
11903 case EM_K1OM:
11904 return reloc_type == 1; /* R_X86_64_64. */
11905 case EM_S390_OLD:
11906 case EM_S390:
11907 return reloc_type == 22; /* R_S390_64. */
11908 case EM_TILEGX:
11909 return reloc_type == 1; /* R_TILEGX_64. */
11910 case EM_MIPS:
11911 return reloc_type == 18; /* R_MIPS_64. */
11912 default:
11913 return FALSE;
11914 }
11915 }
11916
11917 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11918 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11919
11920 static bfd_boolean
11921 is_64bit_pcrel_reloc (unsigned int reloc_type)
11922 {
11923 switch (elf_header.e_machine)
11924 {
11925 case EM_AARCH64:
11926 return reloc_type == 260; /* R_AARCH64_PREL64. */
11927 case EM_ALPHA:
11928 return reloc_type == 11; /* R_ALPHA_SREL64. */
11929 case EM_IA_64:
11930 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11931 case EM_PARISC:
11932 return reloc_type == 72; /* R_PARISC_PCREL64. */
11933 case EM_PPC64:
11934 return reloc_type == 44; /* R_PPC64_REL64. */
11935 case EM_SPARC32PLUS:
11936 case EM_SPARCV9:
11937 case EM_SPARC:
11938 return reloc_type == 46; /* R_SPARC_DISP64. */
11939 case EM_X86_64:
11940 case EM_L1OM:
11941 case EM_K1OM:
11942 return reloc_type == 24; /* R_X86_64_PC64. */
11943 case EM_S390_OLD:
11944 case EM_S390:
11945 return reloc_type == 23; /* R_S390_PC64. */
11946 case EM_TILEGX:
11947 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11948 default:
11949 return FALSE;
11950 }
11951 }
11952
11953 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11954 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11955
11956 static bfd_boolean
11957 is_24bit_abs_reloc (unsigned int reloc_type)
11958 {
11959 switch (elf_header.e_machine)
11960 {
11961 case EM_CYGNUS_MN10200:
11962 case EM_MN10200:
11963 return reloc_type == 4; /* R_MN10200_24. */
11964 case EM_FT32:
11965 return reloc_type == 5; /* R_FT32_20. */
11966 default:
11967 return FALSE;
11968 }
11969 }
11970
11971 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11972 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11973
11974 static bfd_boolean
11975 is_16bit_abs_reloc (unsigned int reloc_type)
11976 {
11977 /* Please keep this table alpha-sorted for ease of visual lookup. */
11978 switch (elf_header.e_machine)
11979 {
11980 case EM_ARC:
11981 case EM_ARC_COMPACT:
11982 case EM_ARC_COMPACT2:
11983 return reloc_type == 2; /* R_ARC_16. */
11984 case EM_ADAPTEVA_EPIPHANY:
11985 return reloc_type == 5;
11986 case EM_AVR_OLD:
11987 case EM_AVR:
11988 return reloc_type == 4; /* R_AVR_16. */
11989 case EM_CYGNUS_D10V:
11990 case EM_D10V:
11991 return reloc_type == 3; /* R_D10V_16. */
11992 case EM_H8S:
11993 case EM_H8_300:
11994 case EM_H8_300H:
11995 return reloc_type == R_H8_DIR16;
11996 case EM_IP2K_OLD:
11997 case EM_IP2K:
11998 return reloc_type == 1; /* R_IP2K_16. */
11999 case EM_M32C_OLD:
12000 case EM_M32C:
12001 return reloc_type == 1; /* R_M32C_16 */
12002 case EM_CYGNUS_MN10200:
12003 case EM_MN10200:
12004 return reloc_type == 2; /* R_MN10200_16. */
12005 case EM_CYGNUS_MN10300:
12006 case EM_MN10300:
12007 return reloc_type == 2; /* R_MN10300_16. */
12008 case EM_MSP430:
12009 if (uses_msp430x_relocs ())
12010 return reloc_type == 2; /* R_MSP430_ABS16. */
12011 case EM_MSP430_OLD:
12012 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12013 case EM_NDS32:
12014 return reloc_type == 19; /* R_NDS32_RELA. */
12015 case EM_ALTERA_NIOS2:
12016 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12017 case EM_NIOS32:
12018 return reloc_type == 9; /* R_NIOS_16. */
12019 case EM_OR1K:
12020 return reloc_type == 2; /* R_OR1K_16. */
12021 case EM_TI_C6000:
12022 return reloc_type == 2; /* R_C6000_ABS16. */
12023 case EM_VISIUM:
12024 return reloc_type == 2; /* R_VISIUM_16. */
12025 case EM_XC16X:
12026 case EM_C166:
12027 return reloc_type == 2; /* R_XC16C_ABS_16. */
12028 case EM_XGATE:
12029 return reloc_type == 3; /* R_XGATE_16. */
12030 default:
12031 return FALSE;
12032 }
12033 }
12034
12035 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12036 relocation entries (possibly formerly used for SHT_GROUP sections). */
12037
12038 static bfd_boolean
12039 is_none_reloc (unsigned int reloc_type)
12040 {
12041 switch (elf_header.e_machine)
12042 {
12043 case EM_386: /* R_386_NONE. */
12044 case EM_68K: /* R_68K_NONE. */
12045 case EM_ADAPTEVA_EPIPHANY:
12046 case EM_ALPHA: /* R_ALPHA_NONE. */
12047 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12048 case EM_ARC: /* R_ARC_NONE. */
12049 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12050 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12051 case EM_ARM: /* R_ARM_NONE. */
12052 case EM_C166: /* R_XC16X_NONE. */
12053 case EM_CRIS: /* R_CRIS_NONE. */
12054 case EM_FT32: /* R_FT32_NONE. */
12055 case EM_IA_64: /* R_IA64_NONE. */
12056 case EM_K1OM: /* R_X86_64_NONE. */
12057 case EM_L1OM: /* R_X86_64_NONE. */
12058 case EM_M32R: /* R_M32R_NONE. */
12059 case EM_MIPS: /* R_MIPS_NONE. */
12060 case EM_MN10300: /* R_MN10300_NONE. */
12061 case EM_MOXIE: /* R_MOXIE_NONE. */
12062 case EM_NIOS32: /* R_NIOS_NONE. */
12063 case EM_OR1K: /* R_OR1K_NONE. */
12064 case EM_PARISC: /* R_PARISC_NONE. */
12065 case EM_PPC64: /* R_PPC64_NONE. */
12066 case EM_PPC: /* R_PPC_NONE. */
12067 case EM_S390: /* R_390_NONE. */
12068 case EM_S390_OLD:
12069 case EM_SH: /* R_SH_NONE. */
12070 case EM_SPARC32PLUS:
12071 case EM_SPARC: /* R_SPARC_NONE. */
12072 case EM_SPARCV9:
12073 case EM_TILEGX: /* R_TILEGX_NONE. */
12074 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12075 case EM_TI_C6000:/* R_C6000_NONE. */
12076 case EM_X86_64: /* R_X86_64_NONE. */
12077 case EM_XC16X:
12078 return reloc_type == 0;
12079
12080 case EM_AARCH64:
12081 return reloc_type == 0 || reloc_type == 256;
12082 case EM_AVR_OLD:
12083 case EM_AVR:
12084 return (reloc_type == 0 /* R_AVR_NONE. */
12085 || reloc_type == 30 /* R_AVR_DIFF8. */
12086 || reloc_type == 31 /* R_AVR_DIFF16. */
12087 || reloc_type == 32 /* R_AVR_DIFF32. */);
12088 case EM_METAG:
12089 return reloc_type == 3; /* R_METAG_NONE. */
12090 case EM_NDS32:
12091 return (reloc_type == 0 /* R_XTENSA_NONE. */
12092 || reloc_type == 204 /* R_NDS32_DIFF8. */
12093 || reloc_type == 205 /* R_NDS32_DIFF16. */
12094 || reloc_type == 206 /* R_NDS32_DIFF32. */
12095 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12096 case EM_XTENSA_OLD:
12097 case EM_XTENSA:
12098 return (reloc_type == 0 /* R_XTENSA_NONE. */
12099 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12100 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12101 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12102 }
12103 return FALSE;
12104 }
12105
12106 /* Returns TRUE if there is a relocation against
12107 section NAME at OFFSET bytes. */
12108
12109 bfd_boolean
12110 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12111 {
12112 Elf_Internal_Rela * relocs;
12113 Elf_Internal_Rela * rp;
12114
12115 if (dsec == NULL || dsec->reloc_info == NULL)
12116 return FALSE;
12117
12118 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12119
12120 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12121 if (rp->r_offset == offset)
12122 return TRUE;
12123
12124 return FALSE;
12125 }
12126
12127 /* Apply relocations to a section.
12128 Note: So far support has been added only for those relocations
12129 which can be found in debug sections.
12130 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12131 loaded relocs. It is then the caller's responsibility to free them.
12132 FIXME: Add support for more relocations ? */
12133
12134 static void
12135 apply_relocations (void * file,
12136 const Elf_Internal_Shdr * section,
12137 unsigned char * start,
12138 bfd_size_type size,
12139 void ** relocs_return,
12140 unsigned long * num_relocs_return)
12141 {
12142 Elf_Internal_Shdr * relsec;
12143 unsigned char * end = start + size;
12144
12145 if (relocs_return != NULL)
12146 {
12147 * (Elf_Internal_Rela **) relocs_return = NULL;
12148 * num_relocs_return = 0;
12149 }
12150
12151 if (elf_header.e_type != ET_REL)
12152 return;
12153
12154 /* Find the reloc section associated with the section. */
12155 for (relsec = section_headers;
12156 relsec < section_headers + elf_header.e_shnum;
12157 ++relsec)
12158 {
12159 bfd_boolean is_rela;
12160 unsigned long num_relocs;
12161 Elf_Internal_Rela * relocs;
12162 Elf_Internal_Rela * rp;
12163 Elf_Internal_Shdr * symsec;
12164 Elf_Internal_Sym * symtab;
12165 unsigned long num_syms;
12166 Elf_Internal_Sym * sym;
12167
12168 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12169 || relsec->sh_info >= elf_header.e_shnum
12170 || section_headers + relsec->sh_info != section
12171 || relsec->sh_size == 0
12172 || relsec->sh_link >= elf_header.e_shnum)
12173 continue;
12174
12175 is_rela = relsec->sh_type == SHT_RELA;
12176
12177 if (is_rela)
12178 {
12179 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12180 relsec->sh_size, & relocs, & num_relocs))
12181 return;
12182 }
12183 else
12184 {
12185 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12186 relsec->sh_size, & relocs, & num_relocs))
12187 return;
12188 }
12189
12190 /* SH uses RELA but uses in place value instead of the addend field. */
12191 if (elf_header.e_machine == EM_SH)
12192 is_rela = FALSE;
12193
12194 symsec = section_headers + relsec->sh_link;
12195 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12196
12197 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12198 {
12199 bfd_vma addend;
12200 unsigned int reloc_type;
12201 unsigned int reloc_size;
12202 unsigned char * rloc;
12203 unsigned long sym_index;
12204
12205 reloc_type = get_reloc_type (rp->r_info);
12206
12207 if (target_specific_reloc_handling (rp, start, symtab))
12208 continue;
12209 else if (is_none_reloc (reloc_type))
12210 continue;
12211 else if (is_32bit_abs_reloc (reloc_type)
12212 || is_32bit_pcrel_reloc (reloc_type))
12213 reloc_size = 4;
12214 else if (is_64bit_abs_reloc (reloc_type)
12215 || is_64bit_pcrel_reloc (reloc_type))
12216 reloc_size = 8;
12217 else if (is_24bit_abs_reloc (reloc_type))
12218 reloc_size = 3;
12219 else if (is_16bit_abs_reloc (reloc_type))
12220 reloc_size = 2;
12221 else
12222 {
12223 static unsigned int prev_reloc = 0;
12224 if (reloc_type != prev_reloc)
12225 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12226 reloc_type, printable_section_name (section));
12227 prev_reloc = reloc_type;
12228 continue;
12229 }
12230
12231 rloc = start + rp->r_offset;
12232 if ((rloc + reloc_size) > end || (rloc < start))
12233 {
12234 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12235 (unsigned long) rp->r_offset,
12236 printable_section_name (section));
12237 continue;
12238 }
12239
12240 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12241 if (sym_index >= num_syms)
12242 {
12243 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12244 sym_index, printable_section_name (section));
12245 continue;
12246 }
12247 sym = symtab + sym_index;
12248
12249 /* If the reloc has a symbol associated with it,
12250 make sure that it is of an appropriate type.
12251
12252 Relocations against symbols without type can happen.
12253 Gcc -feliminate-dwarf2-dups may generate symbols
12254 without type for debug info.
12255
12256 Icc generates relocations against function symbols
12257 instead of local labels.
12258
12259 Relocations against object symbols can happen, eg when
12260 referencing a global array. For an example of this see
12261 the _clz.o binary in libgcc.a. */
12262 if (sym != symtab
12263 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12264 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12265 {
12266 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12267 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12268 (long int)(rp - relocs),
12269 printable_section_name (relsec));
12270 continue;
12271 }
12272
12273 addend = 0;
12274 if (is_rela)
12275 addend += rp->r_addend;
12276 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12277 partial_inplace. */
12278 if (!is_rela
12279 || (elf_header.e_machine == EM_XTENSA
12280 && reloc_type == 1)
12281 || ((elf_header.e_machine == EM_PJ
12282 || elf_header.e_machine == EM_PJ_OLD)
12283 && reloc_type == 1)
12284 || ((elf_header.e_machine == EM_D30V
12285 || elf_header.e_machine == EM_CYGNUS_D30V)
12286 && reloc_type == 12))
12287 addend += byte_get (rloc, reloc_size);
12288
12289 if (is_32bit_pcrel_reloc (reloc_type)
12290 || is_64bit_pcrel_reloc (reloc_type))
12291 {
12292 /* On HPPA, all pc-relative relocations are biased by 8. */
12293 if (elf_header.e_machine == EM_PARISC)
12294 addend -= 8;
12295 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12296 reloc_size);
12297 }
12298 else
12299 byte_put (rloc, addend + sym->st_value, reloc_size);
12300 }
12301
12302 free (symtab);
12303
12304 if (relocs_return)
12305 {
12306 * (Elf_Internal_Rela **) relocs_return = relocs;
12307 * num_relocs_return = num_relocs;
12308 }
12309 else
12310 free (relocs);
12311
12312 break;
12313 }
12314 }
12315
12316 #ifdef SUPPORT_DISASSEMBLY
12317 static int
12318 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12319 {
12320 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12321
12322 /* FIXME: XXX -- to be done --- XXX */
12323
12324 return 1;
12325 }
12326 #endif
12327
12328 /* Reads in the contents of SECTION from FILE, returning a pointer
12329 to a malloc'ed buffer or NULL if something went wrong. */
12330
12331 static char *
12332 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12333 {
12334 bfd_size_type num_bytes;
12335
12336 num_bytes = section->sh_size;
12337
12338 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12339 {
12340 printf (_("\nSection '%s' has no data to dump.\n"),
12341 printable_section_name (section));
12342 return NULL;
12343 }
12344
12345 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12346 _("section contents"));
12347 }
12348
12349 /* Uncompresses a section that was compressed using zlib, in place. */
12350
12351 static bfd_boolean
12352 uncompress_section_contents (unsigned char **buffer,
12353 dwarf_size_type uncompressed_size,
12354 dwarf_size_type *size)
12355 {
12356 dwarf_size_type compressed_size = *size;
12357 unsigned char * compressed_buffer = *buffer;
12358 unsigned char * uncompressed_buffer;
12359 z_stream strm;
12360 int rc;
12361
12362 /* It is possible the section consists of several compressed
12363 buffers concatenated together, so we uncompress in a loop. */
12364 /* PR 18313: The state field in the z_stream structure is supposed
12365 to be invisible to the user (ie us), but some compilers will
12366 still complain about it being used without initialisation. So
12367 we first zero the entire z_stream structure and then set the fields
12368 that we need. */
12369 memset (& strm, 0, sizeof strm);
12370 strm.avail_in = compressed_size;
12371 strm.next_in = (Bytef *) compressed_buffer;
12372 strm.avail_out = uncompressed_size;
12373 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12374
12375 rc = inflateInit (& strm);
12376 while (strm.avail_in > 0)
12377 {
12378 if (rc != Z_OK)
12379 goto fail;
12380 strm.next_out = ((Bytef *) uncompressed_buffer
12381 + (uncompressed_size - strm.avail_out));
12382 rc = inflate (&strm, Z_FINISH);
12383 if (rc != Z_STREAM_END)
12384 goto fail;
12385 rc = inflateReset (& strm);
12386 }
12387 rc = inflateEnd (& strm);
12388 if (rc != Z_OK
12389 || strm.avail_out != 0)
12390 goto fail;
12391
12392 *buffer = uncompressed_buffer;
12393 *size = uncompressed_size;
12394 return TRUE;
12395
12396 fail:
12397 free (uncompressed_buffer);
12398 /* Indicate decompression failure. */
12399 *buffer = NULL;
12400 return FALSE;
12401 }
12402
12403 static void
12404 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12405 {
12406 Elf_Internal_Shdr * relsec;
12407 bfd_size_type num_bytes;
12408 unsigned char * data;
12409 unsigned char * end;
12410 unsigned char * real_start;
12411 unsigned char * start;
12412 bfd_boolean some_strings_shown;
12413
12414 real_start = start = (unsigned char *) get_section_contents (section,
12415 file);
12416 if (start == NULL)
12417 return;
12418 num_bytes = section->sh_size;
12419
12420 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12421
12422 if (decompress_dumps)
12423 {
12424 dwarf_size_type new_size = num_bytes;
12425 dwarf_size_type uncompressed_size = 0;
12426
12427 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12428 {
12429 Elf_Internal_Chdr chdr;
12430 unsigned int compression_header_size
12431 = get_compression_header (& chdr, (unsigned char *) start);
12432
12433 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12434 {
12435 warn (_("section '%s' has unsupported compress type: %d\n"),
12436 printable_section_name (section), chdr.ch_type);
12437 return;
12438 }
12439 else if (chdr.ch_addralign != section->sh_addralign)
12440 {
12441 warn (_("compressed section '%s' is corrupted\n"),
12442 printable_section_name (section));
12443 return;
12444 }
12445 uncompressed_size = chdr.ch_size;
12446 start += compression_header_size;
12447 new_size -= compression_header_size;
12448 }
12449 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12450 {
12451 /* Read the zlib header. In this case, it should be "ZLIB"
12452 followed by the uncompressed section size, 8 bytes in
12453 big-endian order. */
12454 uncompressed_size = start[4]; uncompressed_size <<= 8;
12455 uncompressed_size += start[5]; uncompressed_size <<= 8;
12456 uncompressed_size += start[6]; uncompressed_size <<= 8;
12457 uncompressed_size += start[7]; uncompressed_size <<= 8;
12458 uncompressed_size += start[8]; uncompressed_size <<= 8;
12459 uncompressed_size += start[9]; uncompressed_size <<= 8;
12460 uncompressed_size += start[10]; uncompressed_size <<= 8;
12461 uncompressed_size += start[11];
12462 start += 12;
12463 new_size -= 12;
12464 }
12465
12466 if (uncompressed_size
12467 && uncompress_section_contents (& start,
12468 uncompressed_size, & new_size))
12469 num_bytes = new_size;
12470 }
12471
12472 /* If the section being dumped has relocations against it the user might
12473 be expecting these relocations to have been applied. Check for this
12474 case and issue a warning message in order to avoid confusion.
12475 FIXME: Maybe we ought to have an option that dumps a section with
12476 relocs applied ? */
12477 for (relsec = section_headers;
12478 relsec < section_headers + elf_header.e_shnum;
12479 ++relsec)
12480 {
12481 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12482 || relsec->sh_info >= elf_header.e_shnum
12483 || section_headers + relsec->sh_info != section
12484 || relsec->sh_size == 0
12485 || relsec->sh_link >= elf_header.e_shnum)
12486 continue;
12487
12488 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12489 break;
12490 }
12491
12492 data = start;
12493 end = start + num_bytes;
12494 some_strings_shown = FALSE;
12495
12496 while (data < end)
12497 {
12498 while (!ISPRINT (* data))
12499 if (++ data >= end)
12500 break;
12501
12502 if (data < end)
12503 {
12504 size_t maxlen = end - data;
12505
12506 #ifndef __MSVCRT__
12507 /* PR 11128: Use two separate invocations in order to work
12508 around bugs in the Solaris 8 implementation of printf. */
12509 printf (" [%6tx] ", data - start);
12510 #else
12511 printf (" [%6Ix] ", (size_t) (data - start));
12512 #endif
12513 if (maxlen > 0)
12514 {
12515 print_symbol ((int) maxlen, (const char *) data);
12516 putchar ('\n');
12517 data += strnlen ((const char *) data, maxlen);
12518 }
12519 else
12520 {
12521 printf (_("<corrupt>\n"));
12522 data = end;
12523 }
12524 some_strings_shown = TRUE;
12525 }
12526 }
12527
12528 if (! some_strings_shown)
12529 printf (_(" No strings found in this section."));
12530
12531 free (real_start);
12532
12533 putchar ('\n');
12534 }
12535
12536 static void
12537 dump_section_as_bytes (Elf_Internal_Shdr * section,
12538 FILE * file,
12539 bfd_boolean relocate)
12540 {
12541 Elf_Internal_Shdr * relsec;
12542 bfd_size_type bytes;
12543 bfd_size_type section_size;
12544 bfd_vma addr;
12545 unsigned char * data;
12546 unsigned char * real_start;
12547 unsigned char * start;
12548
12549 real_start = start = (unsigned char *) get_section_contents (section, file);
12550 if (start == NULL)
12551 return;
12552 section_size = section->sh_size;
12553
12554 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12555
12556 if (decompress_dumps)
12557 {
12558 dwarf_size_type new_size = section_size;
12559 dwarf_size_type uncompressed_size = 0;
12560
12561 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12562 {
12563 Elf_Internal_Chdr chdr;
12564 unsigned int compression_header_size
12565 = get_compression_header (& chdr, start);
12566
12567 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12568 {
12569 warn (_("section '%s' has unsupported compress type: %d\n"),
12570 printable_section_name (section), chdr.ch_type);
12571 return;
12572 }
12573 else if (chdr.ch_addralign != section->sh_addralign)
12574 {
12575 warn (_("compressed section '%s' is corrupted\n"),
12576 printable_section_name (section));
12577 return;
12578 }
12579 uncompressed_size = chdr.ch_size;
12580 start += compression_header_size;
12581 new_size -= compression_header_size;
12582 }
12583 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12584 {
12585 /* Read the zlib header. In this case, it should be "ZLIB"
12586 followed by the uncompressed section size, 8 bytes in
12587 big-endian order. */
12588 uncompressed_size = start[4]; uncompressed_size <<= 8;
12589 uncompressed_size += start[5]; uncompressed_size <<= 8;
12590 uncompressed_size += start[6]; uncompressed_size <<= 8;
12591 uncompressed_size += start[7]; uncompressed_size <<= 8;
12592 uncompressed_size += start[8]; uncompressed_size <<= 8;
12593 uncompressed_size += start[9]; uncompressed_size <<= 8;
12594 uncompressed_size += start[10]; uncompressed_size <<= 8;
12595 uncompressed_size += start[11];
12596 start += 12;
12597 new_size -= 12;
12598 }
12599
12600 if (uncompressed_size
12601 && uncompress_section_contents (& start, uncompressed_size,
12602 & new_size))
12603 section_size = new_size;
12604 }
12605
12606 if (relocate)
12607 {
12608 apply_relocations (file, section, start, section_size, NULL, NULL);
12609 }
12610 else
12611 {
12612 /* If the section being dumped has relocations against it the user might
12613 be expecting these relocations to have been applied. Check for this
12614 case and issue a warning message in order to avoid confusion.
12615 FIXME: Maybe we ought to have an option that dumps a section with
12616 relocs applied ? */
12617 for (relsec = section_headers;
12618 relsec < section_headers + elf_header.e_shnum;
12619 ++relsec)
12620 {
12621 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12622 || relsec->sh_info >= elf_header.e_shnum
12623 || section_headers + relsec->sh_info != section
12624 || relsec->sh_size == 0
12625 || relsec->sh_link >= elf_header.e_shnum)
12626 continue;
12627
12628 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12629 break;
12630 }
12631 }
12632
12633 addr = section->sh_addr;
12634 bytes = section_size;
12635 data = start;
12636
12637 while (bytes)
12638 {
12639 int j;
12640 int k;
12641 int lbytes;
12642
12643 lbytes = (bytes > 16 ? 16 : bytes);
12644
12645 printf (" 0x%8.8lx ", (unsigned long) addr);
12646
12647 for (j = 0; j < 16; j++)
12648 {
12649 if (j < lbytes)
12650 printf ("%2.2x", data[j]);
12651 else
12652 printf (" ");
12653
12654 if ((j & 3) == 3)
12655 printf (" ");
12656 }
12657
12658 for (j = 0; j < lbytes; j++)
12659 {
12660 k = data[j];
12661 if (k >= ' ' && k < 0x7f)
12662 printf ("%c", k);
12663 else
12664 printf (".");
12665 }
12666
12667 putchar ('\n');
12668
12669 data += lbytes;
12670 addr += lbytes;
12671 bytes -= lbytes;
12672 }
12673
12674 free (real_start);
12675
12676 putchar ('\n');
12677 }
12678
12679 static int
12680 load_specific_debug_section (enum dwarf_section_display_enum debug,
12681 const Elf_Internal_Shdr * sec, void * file)
12682 {
12683 struct dwarf_section * section = &debug_displays [debug].section;
12684 char buf [64];
12685
12686 /* If it is already loaded, do nothing. */
12687 if (section->start != NULL)
12688 return 1;
12689
12690 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12691 section->address = sec->sh_addr;
12692 section->user_data = NULL;
12693 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12694 sec->sh_offset, 1,
12695 sec->sh_size, buf);
12696 if (section->start == NULL)
12697 section->size = 0;
12698 else
12699 {
12700 unsigned char *start = section->start;
12701 dwarf_size_type size = sec->sh_size;
12702 dwarf_size_type uncompressed_size = 0;
12703
12704 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12705 {
12706 Elf_Internal_Chdr chdr;
12707 unsigned int compression_header_size;
12708
12709 if (size < sizeof chdr)
12710 {
12711 warn (_("compressed section %s is too small to contain a compression header"),
12712 section->name);
12713 return 0;
12714 }
12715
12716 compression_header_size = get_compression_header (&chdr, start);
12717
12718 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12719 {
12720 warn (_("section '%s' has unsupported compress type: %d\n"),
12721 section->name, chdr.ch_type);
12722 return 0;
12723 }
12724 else if (chdr.ch_addralign != sec->sh_addralign)
12725 {
12726 warn (_("compressed section '%s' is corrupted\n"),
12727 section->name);
12728 return 0;
12729 }
12730 uncompressed_size = chdr.ch_size;
12731 start += compression_header_size;
12732 size -= compression_header_size;
12733 }
12734 else if (size > 12 && streq ((char *) start, "ZLIB"))
12735 {
12736 /* Read the zlib header. In this case, it should be "ZLIB"
12737 followed by the uncompressed section size, 8 bytes in
12738 big-endian order. */
12739 uncompressed_size = start[4]; uncompressed_size <<= 8;
12740 uncompressed_size += start[5]; uncompressed_size <<= 8;
12741 uncompressed_size += start[6]; uncompressed_size <<= 8;
12742 uncompressed_size += start[7]; uncompressed_size <<= 8;
12743 uncompressed_size += start[8]; uncompressed_size <<= 8;
12744 uncompressed_size += start[9]; uncompressed_size <<= 8;
12745 uncompressed_size += start[10]; uncompressed_size <<= 8;
12746 uncompressed_size += start[11];
12747 start += 12;
12748 size -= 12;
12749 }
12750
12751 if (uncompressed_size
12752 && uncompress_section_contents (&start, uncompressed_size,
12753 &size))
12754 {
12755 /* Free the compressed buffer, update the section buffer
12756 and the section size if uncompress is successful. */
12757 free (section->start);
12758 section->start = start;
12759 }
12760 section->size = size;
12761 }
12762
12763 if (section->start == NULL)
12764 return 0;
12765
12766 if (debug_displays [debug].relocate)
12767 apply_relocations ((FILE *) file, sec, section->start, section->size,
12768 & section->reloc_info, & section->num_relocs);
12769 else
12770 {
12771 section->reloc_info = NULL;
12772 section->num_relocs = 0;
12773 }
12774
12775 return 1;
12776 }
12777
12778 /* If this is not NULL, load_debug_section will only look for sections
12779 within the list of sections given here. */
12780 unsigned int *section_subset = NULL;
12781
12782 int
12783 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12784 {
12785 struct dwarf_section * section = &debug_displays [debug].section;
12786 Elf_Internal_Shdr * sec;
12787
12788 /* Locate the debug section. */
12789 sec = find_section_in_set (section->uncompressed_name, section_subset);
12790 if (sec != NULL)
12791 section->name = section->uncompressed_name;
12792 else
12793 {
12794 sec = find_section_in_set (section->compressed_name, section_subset);
12795 if (sec != NULL)
12796 section->name = section->compressed_name;
12797 }
12798 if (sec == NULL)
12799 return 0;
12800
12801 /* If we're loading from a subset of sections, and we've loaded
12802 a section matching this name before, it's likely that it's a
12803 different one. */
12804 if (section_subset != NULL)
12805 free_debug_section (debug);
12806
12807 return load_specific_debug_section (debug, sec, (FILE *) file);
12808 }
12809
12810 void
12811 free_debug_section (enum dwarf_section_display_enum debug)
12812 {
12813 struct dwarf_section * section = &debug_displays [debug].section;
12814
12815 if (section->start == NULL)
12816 return;
12817
12818 free ((char *) section->start);
12819 section->start = NULL;
12820 section->address = 0;
12821 section->size = 0;
12822 }
12823
12824 static int
12825 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12826 {
12827 char * name = SECTION_NAME (section);
12828 const char * print_name = printable_section_name (section);
12829 bfd_size_type length;
12830 int result = 1;
12831 int i;
12832
12833 length = section->sh_size;
12834 if (length == 0)
12835 {
12836 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12837 return 0;
12838 }
12839 if (section->sh_type == SHT_NOBITS)
12840 {
12841 /* There is no point in dumping the contents of a debugging section
12842 which has the NOBITS type - the bits in the file will be random.
12843 This can happen when a file containing a .eh_frame section is
12844 stripped with the --only-keep-debug command line option. */
12845 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12846 print_name);
12847 return 0;
12848 }
12849
12850 if (const_strneq (name, ".gnu.linkonce.wi."))
12851 name = ".debug_info";
12852
12853 /* See if we know how to display the contents of this section. */
12854 for (i = 0; i < max; i++)
12855 if (streq (debug_displays[i].section.uncompressed_name, name)
12856 || (i == line && const_strneq (name, ".debug_line."))
12857 || streq (debug_displays[i].section.compressed_name, name))
12858 {
12859 struct dwarf_section * sec = &debug_displays [i].section;
12860 int secondary = (section != find_section (name));
12861
12862 if (secondary)
12863 free_debug_section ((enum dwarf_section_display_enum) i);
12864
12865 if (i == line && const_strneq (name, ".debug_line."))
12866 sec->name = name;
12867 else if (streq (sec->uncompressed_name, name))
12868 sec->name = sec->uncompressed_name;
12869 else
12870 sec->name = sec->compressed_name;
12871 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12872 section, file))
12873 {
12874 /* If this debug section is part of a CU/TU set in a .dwp file,
12875 restrict load_debug_section to the sections in that set. */
12876 section_subset = find_cu_tu_set (file, shndx);
12877
12878 result &= debug_displays[i].display (sec, file);
12879
12880 section_subset = NULL;
12881
12882 if (secondary || (i != info && i != abbrev))
12883 free_debug_section ((enum dwarf_section_display_enum) i);
12884 }
12885
12886 break;
12887 }
12888
12889 if (i == max)
12890 {
12891 printf (_("Unrecognized debug section: %s\n"), print_name);
12892 result = 0;
12893 }
12894
12895 return result;
12896 }
12897
12898 /* Set DUMP_SECTS for all sections where dumps were requested
12899 based on section name. */
12900
12901 static void
12902 initialise_dumps_byname (void)
12903 {
12904 struct dump_list_entry * cur;
12905
12906 for (cur = dump_sects_byname; cur; cur = cur->next)
12907 {
12908 unsigned int i;
12909 int any;
12910
12911 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12912 if (streq (SECTION_NAME (section_headers + i), cur->name))
12913 {
12914 request_dump_bynumber (i, cur->type);
12915 any = 1;
12916 }
12917
12918 if (!any)
12919 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12920 cur->name);
12921 }
12922 }
12923
12924 static void
12925 process_section_contents (FILE * file)
12926 {
12927 Elf_Internal_Shdr * section;
12928 unsigned int i;
12929
12930 if (! do_dump)
12931 return;
12932
12933 initialise_dumps_byname ();
12934
12935 for (i = 0, section = section_headers;
12936 i < elf_header.e_shnum && i < num_dump_sects;
12937 i++, section++)
12938 {
12939 #ifdef SUPPORT_DISASSEMBLY
12940 if (dump_sects[i] & DISASS_DUMP)
12941 disassemble_section (section, file);
12942 #endif
12943 if (dump_sects[i] & HEX_DUMP)
12944 dump_section_as_bytes (section, file, FALSE);
12945
12946 if (dump_sects[i] & RELOC_DUMP)
12947 dump_section_as_bytes (section, file, TRUE);
12948
12949 if (dump_sects[i] & STRING_DUMP)
12950 dump_section_as_strings (section, file);
12951
12952 if (dump_sects[i] & DEBUG_DUMP)
12953 display_debug_section (i, section, file);
12954 }
12955
12956 /* Check to see if the user requested a
12957 dump of a section that does not exist. */
12958 while (i++ < num_dump_sects)
12959 if (dump_sects[i])
12960 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12961 }
12962
12963 static void
12964 process_mips_fpe_exception (int mask)
12965 {
12966 if (mask)
12967 {
12968 int first = 1;
12969 if (mask & OEX_FPU_INEX)
12970 fputs ("INEX", stdout), first = 0;
12971 if (mask & OEX_FPU_UFLO)
12972 printf ("%sUFLO", first ? "" : "|"), first = 0;
12973 if (mask & OEX_FPU_OFLO)
12974 printf ("%sOFLO", first ? "" : "|"), first = 0;
12975 if (mask & OEX_FPU_DIV0)
12976 printf ("%sDIV0", first ? "" : "|"), first = 0;
12977 if (mask & OEX_FPU_INVAL)
12978 printf ("%sINVAL", first ? "" : "|");
12979 }
12980 else
12981 fputs ("0", stdout);
12982 }
12983
12984 /* Display's the value of TAG at location P. If TAG is
12985 greater than 0 it is assumed to be an unknown tag, and
12986 a message is printed to this effect. Otherwise it is
12987 assumed that a message has already been printed.
12988
12989 If the bottom bit of TAG is set it assumed to have a
12990 string value, otherwise it is assumed to have an integer
12991 value.
12992
12993 Returns an updated P pointing to the first unread byte
12994 beyond the end of TAG's value.
12995
12996 Reads at or beyond END will not be made. */
12997
12998 static unsigned char *
12999 display_tag_value (int tag,
13000 unsigned char * p,
13001 const unsigned char * const end)
13002 {
13003 unsigned long val;
13004
13005 if (tag > 0)
13006 printf (" Tag_unknown_%d: ", tag);
13007
13008 if (p >= end)
13009 {
13010 warn (_("<corrupt tag>\n"));
13011 }
13012 else if (tag & 1)
13013 {
13014 /* PR 17531 file: 027-19978-0.004. */
13015 size_t maxlen = (end - p) - 1;
13016
13017 putchar ('"');
13018 if (maxlen > 0)
13019 {
13020 print_symbol ((int) maxlen, (const char *) p);
13021 p += strnlen ((char *) p, maxlen) + 1;
13022 }
13023 else
13024 {
13025 printf (_("<corrupt string tag>"));
13026 p = (unsigned char *) end;
13027 }
13028 printf ("\"\n");
13029 }
13030 else
13031 {
13032 unsigned int len;
13033
13034 val = read_uleb128 (p, &len, end);
13035 p += len;
13036 printf ("%ld (0x%lx)\n", val, val);
13037 }
13038
13039 assert (p <= end);
13040 return p;
13041 }
13042
13043 /* ARM EABI attributes section. */
13044 typedef struct
13045 {
13046 unsigned int tag;
13047 const char * name;
13048 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
13049 unsigned int type;
13050 const char ** table;
13051 } arm_attr_public_tag;
13052
13053 static const char * arm_attr_tag_CPU_arch[] =
13054 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13055 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13056 "v8-M.mainline"};
13057 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13058 static const char * arm_attr_tag_THUMB_ISA_use[] =
13059 {"No", "Thumb-1", "Thumb-2", "Yes"};
13060 static const char * arm_attr_tag_FP_arch[] =
13061 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13062 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13063 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13064 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13065 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13066 "NEON for ARMv8.1"};
13067 static const char * arm_attr_tag_PCS_config[] =
13068 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13069 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13070 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13071 {"V6", "SB", "TLS", "Unused"};
13072 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13073 {"Absolute", "PC-relative", "SB-relative", "None"};
13074 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13075 {"Absolute", "PC-relative", "None"};
13076 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13077 {"None", "direct", "GOT-indirect"};
13078 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13079 {"None", "??? 1", "2", "??? 3", "4"};
13080 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13081 static const char * arm_attr_tag_ABI_FP_denormal[] =
13082 {"Unused", "Needed", "Sign only"};
13083 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13084 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13085 static const char * arm_attr_tag_ABI_FP_number_model[] =
13086 {"Unused", "Finite", "RTABI", "IEEE 754"};
13087 static const char * arm_attr_tag_ABI_enum_size[] =
13088 {"Unused", "small", "int", "forced to int"};
13089 static const char * arm_attr_tag_ABI_HardFP_use[] =
13090 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13091 static const char * arm_attr_tag_ABI_VFP_args[] =
13092 {"AAPCS", "VFP registers", "custom", "compatible"};
13093 static const char * arm_attr_tag_ABI_WMMX_args[] =
13094 {"AAPCS", "WMMX registers", "custom"};
13095 static const char * arm_attr_tag_ABI_optimization_goals[] =
13096 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13097 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13098 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13099 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13100 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13101 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13102 static const char * arm_attr_tag_FP_HP_extension[] =
13103 {"Not Allowed", "Allowed"};
13104 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13105 {"None", "IEEE 754", "Alternative Format"};
13106 static const char * arm_attr_tag_DSP_extension[] =
13107 {"Follow architecture", "Allowed"};
13108 static const char * arm_attr_tag_MPextension_use[] =
13109 {"Not Allowed", "Allowed"};
13110 static const char * arm_attr_tag_DIV_use[] =
13111 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13112 "Allowed in v7-A with integer division extension"};
13113 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13114 static const char * arm_attr_tag_Virtualization_use[] =
13115 {"Not Allowed", "TrustZone", "Virtualization Extensions",
13116 "TrustZone and Virtualization Extensions"};
13117 static const char * arm_attr_tag_MPextension_use_legacy[] =
13118 {"Not Allowed", "Allowed"};
13119
13120 #define LOOKUP(id, name) \
13121 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13122 static arm_attr_public_tag arm_attr_public_tags[] =
13123 {
13124 {4, "CPU_raw_name", 1, NULL},
13125 {5, "CPU_name", 1, NULL},
13126 LOOKUP(6, CPU_arch),
13127 {7, "CPU_arch_profile", 0, NULL},
13128 LOOKUP(8, ARM_ISA_use),
13129 LOOKUP(9, THUMB_ISA_use),
13130 LOOKUP(10, FP_arch),
13131 LOOKUP(11, WMMX_arch),
13132 LOOKUP(12, Advanced_SIMD_arch),
13133 LOOKUP(13, PCS_config),
13134 LOOKUP(14, ABI_PCS_R9_use),
13135 LOOKUP(15, ABI_PCS_RW_data),
13136 LOOKUP(16, ABI_PCS_RO_data),
13137 LOOKUP(17, ABI_PCS_GOT_use),
13138 LOOKUP(18, ABI_PCS_wchar_t),
13139 LOOKUP(19, ABI_FP_rounding),
13140 LOOKUP(20, ABI_FP_denormal),
13141 LOOKUP(21, ABI_FP_exceptions),
13142 LOOKUP(22, ABI_FP_user_exceptions),
13143 LOOKUP(23, ABI_FP_number_model),
13144 {24, "ABI_align_needed", 0, NULL},
13145 {25, "ABI_align_preserved", 0, NULL},
13146 LOOKUP(26, ABI_enum_size),
13147 LOOKUP(27, ABI_HardFP_use),
13148 LOOKUP(28, ABI_VFP_args),
13149 LOOKUP(29, ABI_WMMX_args),
13150 LOOKUP(30, ABI_optimization_goals),
13151 LOOKUP(31, ABI_FP_optimization_goals),
13152 {32, "compatibility", 0, NULL},
13153 LOOKUP(34, CPU_unaligned_access),
13154 LOOKUP(36, FP_HP_extension),
13155 LOOKUP(38, ABI_FP_16bit_format),
13156 LOOKUP(42, MPextension_use),
13157 LOOKUP(44, DIV_use),
13158 LOOKUP(46, DSP_extension),
13159 {64, "nodefaults", 0, NULL},
13160 {65, "also_compatible_with", 0, NULL},
13161 LOOKUP(66, T2EE_use),
13162 {67, "conformance", 1, NULL},
13163 LOOKUP(68, Virtualization_use),
13164 LOOKUP(70, MPextension_use_legacy)
13165 };
13166 #undef LOOKUP
13167
13168 static unsigned char *
13169 display_arm_attribute (unsigned char * p,
13170 const unsigned char * const end)
13171 {
13172 unsigned int tag;
13173 unsigned int len;
13174 unsigned int val;
13175 arm_attr_public_tag * attr;
13176 unsigned i;
13177 unsigned int type;
13178
13179 tag = read_uleb128 (p, &len, end);
13180 p += len;
13181 attr = NULL;
13182 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13183 {
13184 if (arm_attr_public_tags[i].tag == tag)
13185 {
13186 attr = &arm_attr_public_tags[i];
13187 break;
13188 }
13189 }
13190
13191 if (attr)
13192 {
13193 printf (" Tag_%s: ", attr->name);
13194 switch (attr->type)
13195 {
13196 case 0:
13197 switch (tag)
13198 {
13199 case 7: /* Tag_CPU_arch_profile. */
13200 val = read_uleb128 (p, &len, end);
13201 p += len;
13202 switch (val)
13203 {
13204 case 0: printf (_("None\n")); break;
13205 case 'A': printf (_("Application\n")); break;
13206 case 'R': printf (_("Realtime\n")); break;
13207 case 'M': printf (_("Microcontroller\n")); break;
13208 case 'S': printf (_("Application or Realtime\n")); break;
13209 default: printf ("??? (%d)\n", val); break;
13210 }
13211 break;
13212
13213 case 24: /* Tag_align_needed. */
13214 val = read_uleb128 (p, &len, end);
13215 p += len;
13216 switch (val)
13217 {
13218 case 0: printf (_("None\n")); break;
13219 case 1: printf (_("8-byte\n")); break;
13220 case 2: printf (_("4-byte\n")); break;
13221 case 3: printf ("??? 3\n"); break;
13222 default:
13223 if (val <= 12)
13224 printf (_("8-byte and up to %d-byte extended\n"),
13225 1 << val);
13226 else
13227 printf ("??? (%d)\n", val);
13228 break;
13229 }
13230 break;
13231
13232 case 25: /* Tag_align_preserved. */
13233 val = read_uleb128 (p, &len, end);
13234 p += len;
13235 switch (val)
13236 {
13237 case 0: printf (_("None\n")); break;
13238 case 1: printf (_("8-byte, except leaf SP\n")); break;
13239 case 2: printf (_("8-byte\n")); break;
13240 case 3: printf ("??? 3\n"); break;
13241 default:
13242 if (val <= 12)
13243 printf (_("8-byte and up to %d-byte extended\n"),
13244 1 << val);
13245 else
13246 printf ("??? (%d)\n", val);
13247 break;
13248 }
13249 break;
13250
13251 case 32: /* Tag_compatibility. */
13252 {
13253 val = read_uleb128 (p, &len, end);
13254 p += len;
13255 printf (_("flag = %d, vendor = "), val);
13256 if (p < end - 1)
13257 {
13258 size_t maxlen = (end - p) - 1;
13259
13260 print_symbol ((int) maxlen, (const char *) p);
13261 p += strnlen ((char *) p, maxlen) + 1;
13262 }
13263 else
13264 {
13265 printf (_("<corrupt>"));
13266 p = (unsigned char *) end;
13267 }
13268 putchar ('\n');
13269 }
13270 break;
13271
13272 case 64: /* Tag_nodefaults. */
13273 /* PR 17531: file: 001-505008-0.01. */
13274 if (p < end)
13275 p++;
13276 printf (_("True\n"));
13277 break;
13278
13279 case 65: /* Tag_also_compatible_with. */
13280 val = read_uleb128 (p, &len, end);
13281 p += len;
13282 if (val == 6 /* Tag_CPU_arch. */)
13283 {
13284 val = read_uleb128 (p, &len, end);
13285 p += len;
13286 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13287 printf ("??? (%d)\n", val);
13288 else
13289 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13290 }
13291 else
13292 printf ("???\n");
13293 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13294 ;
13295 break;
13296
13297 default:
13298 printf (_("<unknown: %d>\n"), tag);
13299 break;
13300 }
13301 return p;
13302
13303 case 1:
13304 return display_tag_value (-1, p, end);
13305 case 2:
13306 return display_tag_value (0, p, end);
13307
13308 default:
13309 assert (attr->type & 0x80);
13310 val = read_uleb128 (p, &len, end);
13311 p += len;
13312 type = attr->type & 0x7f;
13313 if (val >= type)
13314 printf ("??? (%d)\n", val);
13315 else
13316 printf ("%s\n", attr->table[val]);
13317 return p;
13318 }
13319 }
13320
13321 return display_tag_value (tag, p, end);
13322 }
13323
13324 static unsigned char *
13325 display_gnu_attribute (unsigned char * p,
13326 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13327 const unsigned char * const end)
13328 {
13329 int tag;
13330 unsigned int len;
13331 int val;
13332
13333 tag = read_uleb128 (p, &len, end);
13334 p += len;
13335
13336 /* Tag_compatibility is the only generic GNU attribute defined at
13337 present. */
13338 if (tag == 32)
13339 {
13340 val = read_uleb128 (p, &len, end);
13341 p += len;
13342
13343 printf (_("flag = %d, vendor = "), val);
13344 if (p == end)
13345 {
13346 printf (_("<corrupt>\n"));
13347 warn (_("corrupt vendor attribute\n"));
13348 }
13349 else
13350 {
13351 if (p < end - 1)
13352 {
13353 size_t maxlen = (end - p) - 1;
13354
13355 print_symbol ((int) maxlen, (const char *) p);
13356 p += strnlen ((char *) p, maxlen) + 1;
13357 }
13358 else
13359 {
13360 printf (_("<corrupt>"));
13361 p = (unsigned char *) end;
13362 }
13363 putchar ('\n');
13364 }
13365 return p;
13366 }
13367
13368 if ((tag & 2) == 0 && display_proc_gnu_attribute)
13369 return display_proc_gnu_attribute (p, tag, end);
13370
13371 return display_tag_value (tag, p, end);
13372 }
13373
13374 static unsigned char *
13375 display_power_gnu_attribute (unsigned char * p,
13376 int tag,
13377 const unsigned char * const end)
13378 {
13379 unsigned int len;
13380 int val;
13381
13382 if (tag == Tag_GNU_Power_ABI_FP)
13383 {
13384 val = read_uleb128 (p, &len, end);
13385 p += len;
13386 printf (" Tag_GNU_Power_ABI_FP: ");
13387
13388 switch (val)
13389 {
13390 case 0:
13391 printf (_("Hard or soft float\n"));
13392 break;
13393 case 1:
13394 printf (_("Hard float\n"));
13395 break;
13396 case 2:
13397 printf (_("Soft float\n"));
13398 break;
13399 case 3:
13400 printf (_("Single-precision hard float\n"));
13401 break;
13402 default:
13403 printf ("??? (%d)\n", val);
13404 break;
13405 }
13406 return p;
13407 }
13408
13409 if (tag == Tag_GNU_Power_ABI_Vector)
13410 {
13411 val = read_uleb128 (p, &len, end);
13412 p += len;
13413 printf (" Tag_GNU_Power_ABI_Vector: ");
13414 switch (val)
13415 {
13416 case 0:
13417 printf (_("Any\n"));
13418 break;
13419 case 1:
13420 printf (_("Generic\n"));
13421 break;
13422 case 2:
13423 printf ("AltiVec\n");
13424 break;
13425 case 3:
13426 printf ("SPE\n");
13427 break;
13428 default:
13429 printf ("??? (%d)\n", val);
13430 break;
13431 }
13432 return p;
13433 }
13434
13435 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13436 {
13437 if (p == end)
13438 {
13439 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13440 return p;
13441 }
13442
13443 val = read_uleb128 (p, &len, end);
13444 p += len;
13445 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13446 switch (val)
13447 {
13448 case 0:
13449 printf (_("Any\n"));
13450 break;
13451 case 1:
13452 printf ("r3/r4\n");
13453 break;
13454 case 2:
13455 printf (_("Memory\n"));
13456 break;
13457 default:
13458 printf ("??? (%d)\n", val);
13459 break;
13460 }
13461 return p;
13462 }
13463
13464 return display_tag_value (tag & 1, p, end);
13465 }
13466
13467 static unsigned char *
13468 display_s390_gnu_attribute (unsigned char * p,
13469 int tag,
13470 const unsigned char * const end)
13471 {
13472 unsigned int len;
13473 int val;
13474
13475 if (tag == Tag_GNU_S390_ABI_Vector)
13476 {
13477 val = read_uleb128 (p, &len, end);
13478 p += len;
13479 printf (" Tag_GNU_S390_ABI_Vector: ");
13480
13481 switch (val)
13482 {
13483 case 0:
13484 printf (_("any\n"));
13485 break;
13486 case 1:
13487 printf (_("software\n"));
13488 break;
13489 case 2:
13490 printf (_("hardware\n"));
13491 break;
13492 default:
13493 printf ("??? (%d)\n", val);
13494 break;
13495 }
13496 return p;
13497 }
13498
13499 return display_tag_value (tag & 1, p, end);
13500 }
13501
13502 static void
13503 display_sparc_hwcaps (int mask)
13504 {
13505 if (mask)
13506 {
13507 int first = 1;
13508
13509 if (mask & ELF_SPARC_HWCAP_MUL32)
13510 fputs ("mul32", stdout), first = 0;
13511 if (mask & ELF_SPARC_HWCAP_DIV32)
13512 printf ("%sdiv32", first ? "" : "|"), first = 0;
13513 if (mask & ELF_SPARC_HWCAP_FSMULD)
13514 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13515 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13516 printf ("%sv8plus", first ? "" : "|"), first = 0;
13517 if (mask & ELF_SPARC_HWCAP_POPC)
13518 printf ("%spopc", first ? "" : "|"), first = 0;
13519 if (mask & ELF_SPARC_HWCAP_VIS)
13520 printf ("%svis", first ? "" : "|"), first = 0;
13521 if (mask & ELF_SPARC_HWCAP_VIS2)
13522 printf ("%svis2", first ? "" : "|"), first = 0;
13523 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13524 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13525 if (mask & ELF_SPARC_HWCAP_FMAF)
13526 printf ("%sfmaf", first ? "" : "|"), first = 0;
13527 if (mask & ELF_SPARC_HWCAP_VIS3)
13528 printf ("%svis3", first ? "" : "|"), first = 0;
13529 if (mask & ELF_SPARC_HWCAP_HPC)
13530 printf ("%shpc", first ? "" : "|"), first = 0;
13531 if (mask & ELF_SPARC_HWCAP_RANDOM)
13532 printf ("%srandom", first ? "" : "|"), first = 0;
13533 if (mask & ELF_SPARC_HWCAP_TRANS)
13534 printf ("%strans", first ? "" : "|"), first = 0;
13535 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13536 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13537 if (mask & ELF_SPARC_HWCAP_IMA)
13538 printf ("%sima", first ? "" : "|"), first = 0;
13539 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13540 printf ("%scspare", first ? "" : "|"), first = 0;
13541 }
13542 else
13543 fputc ('0', stdout);
13544 fputc ('\n', stdout);
13545 }
13546
13547 static void
13548 display_sparc_hwcaps2 (int mask)
13549 {
13550 if (mask)
13551 {
13552 int first = 1;
13553
13554 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13555 fputs ("fjathplus", stdout), first = 0;
13556 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13557 printf ("%svis3b", first ? "" : "|"), first = 0;
13558 if (mask & ELF_SPARC_HWCAP2_ADP)
13559 printf ("%sadp", first ? "" : "|"), first = 0;
13560 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13561 printf ("%ssparc5", first ? "" : "|"), first = 0;
13562 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13563 printf ("%smwait", first ? "" : "|"), first = 0;
13564 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13565 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13566 if (mask & ELF_SPARC_HWCAP2_XMONT)
13567 printf ("%sxmont2", first ? "" : "|"), first = 0;
13568 if (mask & ELF_SPARC_HWCAP2_NSEC)
13569 printf ("%snsec", first ? "" : "|"), first = 0;
13570 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13571 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13572 if (mask & ELF_SPARC_HWCAP2_FJDES)
13573 printf ("%sfjdes", first ? "" : "|"), first = 0;
13574 if (mask & ELF_SPARC_HWCAP2_FJAES)
13575 printf ("%sfjaes", first ? "" : "|"), first = 0;
13576 }
13577 else
13578 fputc ('0', stdout);
13579 fputc ('\n', stdout);
13580 }
13581
13582 static unsigned char *
13583 display_sparc_gnu_attribute (unsigned char * p,
13584 int tag,
13585 const unsigned char * const end)
13586 {
13587 unsigned int len;
13588 int val;
13589
13590 if (tag == Tag_GNU_Sparc_HWCAPS)
13591 {
13592 val = read_uleb128 (p, &len, end);
13593 p += len;
13594 printf (" Tag_GNU_Sparc_HWCAPS: ");
13595 display_sparc_hwcaps (val);
13596 return p;
13597 }
13598 if (tag == Tag_GNU_Sparc_HWCAPS2)
13599 {
13600 val = read_uleb128 (p, &len, end);
13601 p += len;
13602 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13603 display_sparc_hwcaps2 (val);
13604 return p;
13605 }
13606
13607 return display_tag_value (tag, p, end);
13608 }
13609
13610 static void
13611 print_mips_fp_abi_value (int val)
13612 {
13613 switch (val)
13614 {
13615 case Val_GNU_MIPS_ABI_FP_ANY:
13616 printf (_("Hard or soft float\n"));
13617 break;
13618 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13619 printf (_("Hard float (double precision)\n"));
13620 break;
13621 case Val_GNU_MIPS_ABI_FP_SINGLE:
13622 printf (_("Hard float (single precision)\n"));
13623 break;
13624 case Val_GNU_MIPS_ABI_FP_SOFT:
13625 printf (_("Soft float\n"));
13626 break;
13627 case Val_GNU_MIPS_ABI_FP_OLD_64:
13628 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13629 break;
13630 case Val_GNU_MIPS_ABI_FP_XX:
13631 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13632 break;
13633 case Val_GNU_MIPS_ABI_FP_64:
13634 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13635 break;
13636 case Val_GNU_MIPS_ABI_FP_64A:
13637 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13638 break;
13639 case Val_GNU_MIPS_ABI_FP_NAN2008:
13640 printf (_("NaN 2008 compatibility\n"));
13641 break;
13642 default:
13643 printf ("??? (%d)\n", val);
13644 break;
13645 }
13646 }
13647
13648 static unsigned char *
13649 display_mips_gnu_attribute (unsigned char * p,
13650 int tag,
13651 const unsigned char * const end)
13652 {
13653 if (tag == Tag_GNU_MIPS_ABI_FP)
13654 {
13655 unsigned int len;
13656 int val;
13657
13658 val = read_uleb128 (p, &len, end);
13659 p += len;
13660 printf (" Tag_GNU_MIPS_ABI_FP: ");
13661
13662 print_mips_fp_abi_value (val);
13663
13664 return p;
13665 }
13666
13667 if (tag == Tag_GNU_MIPS_ABI_MSA)
13668 {
13669 unsigned int len;
13670 int val;
13671
13672 val = read_uleb128 (p, &len, end);
13673 p += len;
13674 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13675
13676 switch (val)
13677 {
13678 case Val_GNU_MIPS_ABI_MSA_ANY:
13679 printf (_("Any MSA or not\n"));
13680 break;
13681 case Val_GNU_MIPS_ABI_MSA_128:
13682 printf (_("128-bit MSA\n"));
13683 break;
13684 default:
13685 printf ("??? (%d)\n", val);
13686 break;
13687 }
13688 return p;
13689 }
13690
13691 return display_tag_value (tag & 1, p, end);
13692 }
13693
13694 static unsigned char *
13695 display_tic6x_attribute (unsigned char * p,
13696 const unsigned char * const end)
13697 {
13698 int tag;
13699 unsigned int len;
13700 int val;
13701
13702 tag = read_uleb128 (p, &len, end);
13703 p += len;
13704
13705 switch (tag)
13706 {
13707 case Tag_ISA:
13708 val = read_uleb128 (p, &len, end);
13709 p += len;
13710 printf (" Tag_ISA: ");
13711
13712 switch (val)
13713 {
13714 case C6XABI_Tag_ISA_none:
13715 printf (_("None\n"));
13716 break;
13717 case C6XABI_Tag_ISA_C62X:
13718 printf ("C62x\n");
13719 break;
13720 case C6XABI_Tag_ISA_C67X:
13721 printf ("C67x\n");
13722 break;
13723 case C6XABI_Tag_ISA_C67XP:
13724 printf ("C67x+\n");
13725 break;
13726 case C6XABI_Tag_ISA_C64X:
13727 printf ("C64x\n");
13728 break;
13729 case C6XABI_Tag_ISA_C64XP:
13730 printf ("C64x+\n");
13731 break;
13732 case C6XABI_Tag_ISA_C674X:
13733 printf ("C674x\n");
13734 break;
13735 default:
13736 printf ("??? (%d)\n", val);
13737 break;
13738 }
13739 return p;
13740
13741 case Tag_ABI_wchar_t:
13742 val = read_uleb128 (p, &len, end);
13743 p += len;
13744 printf (" Tag_ABI_wchar_t: ");
13745 switch (val)
13746 {
13747 case 0:
13748 printf (_("Not used\n"));
13749 break;
13750 case 1:
13751 printf (_("2 bytes\n"));
13752 break;
13753 case 2:
13754 printf (_("4 bytes\n"));
13755 break;
13756 default:
13757 printf ("??? (%d)\n", val);
13758 break;
13759 }
13760 return p;
13761
13762 case Tag_ABI_stack_align_needed:
13763 val = read_uleb128 (p, &len, end);
13764 p += len;
13765 printf (" Tag_ABI_stack_align_needed: ");
13766 switch (val)
13767 {
13768 case 0:
13769 printf (_("8-byte\n"));
13770 break;
13771 case 1:
13772 printf (_("16-byte\n"));
13773 break;
13774 default:
13775 printf ("??? (%d)\n", val);
13776 break;
13777 }
13778 return p;
13779
13780 case Tag_ABI_stack_align_preserved:
13781 val = read_uleb128 (p, &len, end);
13782 p += len;
13783 printf (" Tag_ABI_stack_align_preserved: ");
13784 switch (val)
13785 {
13786 case 0:
13787 printf (_("8-byte\n"));
13788 break;
13789 case 1:
13790 printf (_("16-byte\n"));
13791 break;
13792 default:
13793 printf ("??? (%d)\n", val);
13794 break;
13795 }
13796 return p;
13797
13798 case Tag_ABI_DSBT:
13799 val = read_uleb128 (p, &len, end);
13800 p += len;
13801 printf (" Tag_ABI_DSBT: ");
13802 switch (val)
13803 {
13804 case 0:
13805 printf (_("DSBT addressing not used\n"));
13806 break;
13807 case 1:
13808 printf (_("DSBT addressing used\n"));
13809 break;
13810 default:
13811 printf ("??? (%d)\n", val);
13812 break;
13813 }
13814 return p;
13815
13816 case Tag_ABI_PID:
13817 val = read_uleb128 (p, &len, end);
13818 p += len;
13819 printf (" Tag_ABI_PID: ");
13820 switch (val)
13821 {
13822 case 0:
13823 printf (_("Data addressing position-dependent\n"));
13824 break;
13825 case 1:
13826 printf (_("Data addressing position-independent, GOT near DP\n"));
13827 break;
13828 case 2:
13829 printf (_("Data addressing position-independent, GOT far from DP\n"));
13830 break;
13831 default:
13832 printf ("??? (%d)\n", val);
13833 break;
13834 }
13835 return p;
13836
13837 case Tag_ABI_PIC:
13838 val = read_uleb128 (p, &len, end);
13839 p += len;
13840 printf (" Tag_ABI_PIC: ");
13841 switch (val)
13842 {
13843 case 0:
13844 printf (_("Code addressing position-dependent\n"));
13845 break;
13846 case 1:
13847 printf (_("Code addressing position-independent\n"));
13848 break;
13849 default:
13850 printf ("??? (%d)\n", val);
13851 break;
13852 }
13853 return p;
13854
13855 case Tag_ABI_array_object_alignment:
13856 val = read_uleb128 (p, &len, end);
13857 p += len;
13858 printf (" Tag_ABI_array_object_alignment: ");
13859 switch (val)
13860 {
13861 case 0:
13862 printf (_("8-byte\n"));
13863 break;
13864 case 1:
13865 printf (_("4-byte\n"));
13866 break;
13867 case 2:
13868 printf (_("16-byte\n"));
13869 break;
13870 default:
13871 printf ("??? (%d)\n", val);
13872 break;
13873 }
13874 return p;
13875
13876 case Tag_ABI_array_object_align_expected:
13877 val = read_uleb128 (p, &len, end);
13878 p += len;
13879 printf (" Tag_ABI_array_object_align_expected: ");
13880 switch (val)
13881 {
13882 case 0:
13883 printf (_("8-byte\n"));
13884 break;
13885 case 1:
13886 printf (_("4-byte\n"));
13887 break;
13888 case 2:
13889 printf (_("16-byte\n"));
13890 break;
13891 default:
13892 printf ("??? (%d)\n", val);
13893 break;
13894 }
13895 return p;
13896
13897 case Tag_ABI_compatibility:
13898 {
13899 val = read_uleb128 (p, &len, end);
13900 p += len;
13901 printf (" Tag_ABI_compatibility: ");
13902 printf (_("flag = %d, vendor = "), val);
13903 if (p < end - 1)
13904 {
13905 size_t maxlen = (end - p) - 1;
13906
13907 print_symbol ((int) maxlen, (const char *) p);
13908 p += strnlen ((char *) p, maxlen) + 1;
13909 }
13910 else
13911 {
13912 printf (_("<corrupt>"));
13913 p = (unsigned char *) end;
13914 }
13915 putchar ('\n');
13916 return p;
13917 }
13918
13919 case Tag_ABI_conformance:
13920 {
13921 printf (" Tag_ABI_conformance: \"");
13922 if (p < end - 1)
13923 {
13924 size_t maxlen = (end - p) - 1;
13925
13926 print_symbol ((int) maxlen, (const char *) p);
13927 p += strnlen ((char *) p, maxlen) + 1;
13928 }
13929 else
13930 {
13931 printf (_("<corrupt>"));
13932 p = (unsigned char *) end;
13933 }
13934 printf ("\"\n");
13935 return p;
13936 }
13937 }
13938
13939 return display_tag_value (tag, p, end);
13940 }
13941
13942 static void
13943 display_raw_attribute (unsigned char * p, unsigned char * end)
13944 {
13945 unsigned long addr = 0;
13946 size_t bytes = end - p;
13947
13948 assert (end > p);
13949 while (bytes)
13950 {
13951 int j;
13952 int k;
13953 int lbytes = (bytes > 16 ? 16 : bytes);
13954
13955 printf (" 0x%8.8lx ", addr);
13956
13957 for (j = 0; j < 16; j++)
13958 {
13959 if (j < lbytes)
13960 printf ("%2.2x", p[j]);
13961 else
13962 printf (" ");
13963
13964 if ((j & 3) == 3)
13965 printf (" ");
13966 }
13967
13968 for (j = 0; j < lbytes; j++)
13969 {
13970 k = p[j];
13971 if (k >= ' ' && k < 0x7f)
13972 printf ("%c", k);
13973 else
13974 printf (".");
13975 }
13976
13977 putchar ('\n');
13978
13979 p += lbytes;
13980 bytes -= lbytes;
13981 addr += lbytes;
13982 }
13983
13984 putchar ('\n');
13985 }
13986
13987 static unsigned char *
13988 display_msp430x_attribute (unsigned char * p,
13989 const unsigned char * const end)
13990 {
13991 unsigned int len;
13992 int val;
13993 int tag;
13994
13995 tag = read_uleb128 (p, & len, end);
13996 p += len;
13997
13998 switch (tag)
13999 {
14000 case OFBA_MSPABI_Tag_ISA:
14001 val = read_uleb128 (p, &len, end);
14002 p += len;
14003 printf (" Tag_ISA: ");
14004 switch (val)
14005 {
14006 case 0: printf (_("None\n")); break;
14007 case 1: printf (_("MSP430\n")); break;
14008 case 2: printf (_("MSP430X\n")); break;
14009 default: printf ("??? (%d)\n", val); break;
14010 }
14011 break;
14012
14013 case OFBA_MSPABI_Tag_Code_Model:
14014 val = read_uleb128 (p, &len, end);
14015 p += len;
14016 printf (" Tag_Code_Model: ");
14017 switch (val)
14018 {
14019 case 0: printf (_("None\n")); break;
14020 case 1: printf (_("Small\n")); break;
14021 case 2: printf (_("Large\n")); break;
14022 default: printf ("??? (%d)\n", val); break;
14023 }
14024 break;
14025
14026 case OFBA_MSPABI_Tag_Data_Model:
14027 val = read_uleb128 (p, &len, end);
14028 p += len;
14029 printf (" Tag_Data_Model: ");
14030 switch (val)
14031 {
14032 case 0: printf (_("None\n")); break;
14033 case 1: printf (_("Small\n")); break;
14034 case 2: printf (_("Large\n")); break;
14035 case 3: printf (_("Restricted Large\n")); break;
14036 default: printf ("??? (%d)\n", val); break;
14037 }
14038 break;
14039
14040 default:
14041 printf (_(" <unknown tag %d>: "), tag);
14042
14043 if (tag & 1)
14044 {
14045 putchar ('"');
14046 if (p < end - 1)
14047 {
14048 size_t maxlen = (end - p) - 1;
14049
14050 print_symbol ((int) maxlen, (const char *) p);
14051 p += strnlen ((char *) p, maxlen) + 1;
14052 }
14053 else
14054 {
14055 printf (_("<corrupt>"));
14056 p = (unsigned char *) end;
14057 }
14058 printf ("\"\n");
14059 }
14060 else
14061 {
14062 val = read_uleb128 (p, &len, end);
14063 p += len;
14064 printf ("%d (0x%x)\n", val, val);
14065 }
14066 break;
14067 }
14068
14069 assert (p <= end);
14070 return p;
14071 }
14072
14073 static int
14074 process_attributes (FILE * file,
14075 const char * public_name,
14076 unsigned int proc_type,
14077 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14078 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14079 {
14080 Elf_Internal_Shdr * sect;
14081 unsigned i;
14082
14083 /* Find the section header so that we get the size. */
14084 for (i = 0, sect = section_headers;
14085 i < elf_header.e_shnum;
14086 i++, sect++)
14087 {
14088 unsigned char * contents;
14089 unsigned char * p;
14090
14091 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14092 continue;
14093
14094 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14095 sect->sh_size, _("attributes"));
14096 if (contents == NULL)
14097 continue;
14098
14099 p = contents;
14100 if (*p == 'A')
14101 {
14102 bfd_vma section_len;
14103
14104 section_len = sect->sh_size - 1;
14105 p++;
14106
14107 while (section_len > 0)
14108 {
14109 bfd_vma attr_len;
14110 unsigned int namelen;
14111 bfd_boolean public_section;
14112 bfd_boolean gnu_section;
14113
14114 if (section_len <= 4)
14115 {
14116 error (_("Tag section ends prematurely\n"));
14117 break;
14118 }
14119 attr_len = byte_get (p, 4);
14120 p += 4;
14121
14122 if (attr_len > section_len)
14123 {
14124 error (_("Bad attribute length (%u > %u)\n"),
14125 (unsigned) attr_len, (unsigned) section_len);
14126 attr_len = section_len;
14127 }
14128 /* PR 17531: file: 001-101425-0.004 */
14129 else if (attr_len < 5)
14130 {
14131 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14132 break;
14133 }
14134
14135 section_len -= attr_len;
14136 attr_len -= 4;
14137
14138 namelen = strnlen ((char *) p, attr_len) + 1;
14139 if (namelen == 0 || namelen >= attr_len)
14140 {
14141 error (_("Corrupt attribute section name\n"));
14142 break;
14143 }
14144
14145 printf (_("Attribute Section: "));
14146 print_symbol (INT_MAX, (const char *) p);
14147 putchar ('\n');
14148
14149 if (public_name && streq ((char *) p, public_name))
14150 public_section = TRUE;
14151 else
14152 public_section = FALSE;
14153
14154 if (streq ((char *) p, "gnu"))
14155 gnu_section = TRUE;
14156 else
14157 gnu_section = FALSE;
14158
14159 p += namelen;
14160 attr_len -= namelen;
14161
14162 while (attr_len > 0 && p < contents + sect->sh_size)
14163 {
14164 int tag;
14165 int val;
14166 bfd_vma size;
14167 unsigned char * end;
14168
14169 /* PR binutils/17531: Safe handling of corrupt files. */
14170 if (attr_len < 6)
14171 {
14172 error (_("Unused bytes at end of section\n"));
14173 section_len = 0;
14174 break;
14175 }
14176
14177 tag = *(p++);
14178 size = byte_get (p, 4);
14179 if (size > attr_len)
14180 {
14181 error (_("Bad subsection length (%u > %u)\n"),
14182 (unsigned) size, (unsigned) attr_len);
14183 size = attr_len;
14184 }
14185 /* PR binutils/17531: Safe handling of corrupt files. */
14186 if (size < 6)
14187 {
14188 error (_("Bad subsection length (%u < 6)\n"),
14189 (unsigned) size);
14190 section_len = 0;
14191 break;
14192 }
14193
14194 attr_len -= size;
14195 end = p + size - 1;
14196 assert (end <= contents + sect->sh_size);
14197 p += 4;
14198
14199 switch (tag)
14200 {
14201 case 1:
14202 printf (_("File Attributes\n"));
14203 break;
14204 case 2:
14205 printf (_("Section Attributes:"));
14206 goto do_numlist;
14207 case 3:
14208 printf (_("Symbol Attributes:"));
14209 do_numlist:
14210 for (;;)
14211 {
14212 unsigned int j;
14213
14214 val = read_uleb128 (p, &j, end);
14215 p += j;
14216 if (val == 0)
14217 break;
14218 printf (" %d", val);
14219 }
14220 printf ("\n");
14221 break;
14222 default:
14223 printf (_("Unknown tag: %d\n"), tag);
14224 public_section = FALSE;
14225 break;
14226 }
14227
14228 if (public_section && display_pub_attribute != NULL)
14229 {
14230 while (p < end)
14231 p = display_pub_attribute (p, end);
14232 assert (p <= end);
14233 }
14234 else if (gnu_section && display_proc_gnu_attribute != NULL)
14235 {
14236 while (p < end)
14237 p = display_gnu_attribute (p,
14238 display_proc_gnu_attribute,
14239 end);
14240 assert (p <= end);
14241 }
14242 else if (p < end)
14243 {
14244 printf (_(" Unknown attribute:\n"));
14245 display_raw_attribute (p, end);
14246 p = end;
14247 }
14248 else
14249 attr_len = 0;
14250 }
14251 }
14252 }
14253 else
14254 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14255
14256 free (contents);
14257 }
14258 return 1;
14259 }
14260
14261 static int
14262 process_arm_specific (FILE * file)
14263 {
14264 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14265 display_arm_attribute, NULL);
14266 }
14267
14268 static int
14269 process_power_specific (FILE * file)
14270 {
14271 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14272 display_power_gnu_attribute);
14273 }
14274
14275 static int
14276 process_s390_specific (FILE * file)
14277 {
14278 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14279 display_s390_gnu_attribute);
14280 }
14281
14282 static int
14283 process_sparc_specific (FILE * file)
14284 {
14285 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14286 display_sparc_gnu_attribute);
14287 }
14288
14289 static int
14290 process_tic6x_specific (FILE * file)
14291 {
14292 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14293 display_tic6x_attribute, NULL);
14294 }
14295
14296 static int
14297 process_msp430x_specific (FILE * file)
14298 {
14299 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14300 display_msp430x_attribute, NULL);
14301 }
14302
14303 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14304 Print the Address, Access and Initial fields of an entry at VMA ADDR
14305 and return the VMA of the next entry, or -1 if there was a problem.
14306 Does not read from DATA_END or beyond. */
14307
14308 static bfd_vma
14309 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14310 unsigned char * data_end)
14311 {
14312 printf (" ");
14313 print_vma (addr, LONG_HEX);
14314 printf (" ");
14315 if (addr < pltgot + 0xfff0)
14316 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14317 else
14318 printf ("%10s", "");
14319 printf (" ");
14320 if (data == NULL)
14321 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14322 else
14323 {
14324 bfd_vma entry;
14325 unsigned char * from = data + addr - pltgot;
14326
14327 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14328 {
14329 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14330 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14331 return (bfd_vma) -1;
14332 }
14333 else
14334 {
14335 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14336 print_vma (entry, LONG_HEX);
14337 }
14338 }
14339 return addr + (is_32bit_elf ? 4 : 8);
14340 }
14341
14342 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14343 PLTGOT. Print the Address and Initial fields of an entry at VMA
14344 ADDR and return the VMA of the next entry. */
14345
14346 static bfd_vma
14347 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14348 {
14349 printf (" ");
14350 print_vma (addr, LONG_HEX);
14351 printf (" ");
14352 if (data == NULL)
14353 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14354 else
14355 {
14356 bfd_vma entry;
14357
14358 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14359 print_vma (entry, LONG_HEX);
14360 }
14361 return addr + (is_32bit_elf ? 4 : 8);
14362 }
14363
14364 static void
14365 print_mips_ases (unsigned int mask)
14366 {
14367 if (mask & AFL_ASE_DSP)
14368 fputs ("\n\tDSP ASE", stdout);
14369 if (mask & AFL_ASE_DSPR2)
14370 fputs ("\n\tDSP R2 ASE", stdout);
14371 if (mask & AFL_ASE_DSPR3)
14372 fputs ("\n\tDSP R3 ASE", stdout);
14373 if (mask & AFL_ASE_EVA)
14374 fputs ("\n\tEnhanced VA Scheme", stdout);
14375 if (mask & AFL_ASE_MCU)
14376 fputs ("\n\tMCU (MicroController) ASE", stdout);
14377 if (mask & AFL_ASE_MDMX)
14378 fputs ("\n\tMDMX ASE", stdout);
14379 if (mask & AFL_ASE_MIPS3D)
14380 fputs ("\n\tMIPS-3D ASE", stdout);
14381 if (mask & AFL_ASE_MT)
14382 fputs ("\n\tMT ASE", stdout);
14383 if (mask & AFL_ASE_SMARTMIPS)
14384 fputs ("\n\tSmartMIPS ASE", stdout);
14385 if (mask & AFL_ASE_VIRT)
14386 fputs ("\n\tVZ ASE", stdout);
14387 if (mask & AFL_ASE_MSA)
14388 fputs ("\n\tMSA ASE", stdout);
14389 if (mask & AFL_ASE_MIPS16)
14390 fputs ("\n\tMIPS16 ASE", stdout);
14391 if (mask & AFL_ASE_MICROMIPS)
14392 fputs ("\n\tMICROMIPS ASE", stdout);
14393 if (mask & AFL_ASE_XPA)
14394 fputs ("\n\tXPA ASE", stdout);
14395 if (mask == 0)
14396 fprintf (stdout, "\n\t%s", _("None"));
14397 else if ((mask & ~AFL_ASE_MASK) != 0)
14398 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14399 }
14400
14401 static void
14402 print_mips_isa_ext (unsigned int isa_ext)
14403 {
14404 switch (isa_ext)
14405 {
14406 case 0:
14407 fputs (_("None"), stdout);
14408 break;
14409 case AFL_EXT_XLR:
14410 fputs ("RMI XLR", stdout);
14411 break;
14412 case AFL_EXT_OCTEON3:
14413 fputs ("Cavium Networks Octeon3", stdout);
14414 break;
14415 case AFL_EXT_OCTEON2:
14416 fputs ("Cavium Networks Octeon2", stdout);
14417 break;
14418 case AFL_EXT_OCTEONP:
14419 fputs ("Cavium Networks OcteonP", stdout);
14420 break;
14421 case AFL_EXT_LOONGSON_3A:
14422 fputs ("Loongson 3A", stdout);
14423 break;
14424 case AFL_EXT_OCTEON:
14425 fputs ("Cavium Networks Octeon", stdout);
14426 break;
14427 case AFL_EXT_5900:
14428 fputs ("Toshiba R5900", stdout);
14429 break;
14430 case AFL_EXT_4650:
14431 fputs ("MIPS R4650", stdout);
14432 break;
14433 case AFL_EXT_4010:
14434 fputs ("LSI R4010", stdout);
14435 break;
14436 case AFL_EXT_4100:
14437 fputs ("NEC VR4100", stdout);
14438 break;
14439 case AFL_EXT_3900:
14440 fputs ("Toshiba R3900", stdout);
14441 break;
14442 case AFL_EXT_10000:
14443 fputs ("MIPS R10000", stdout);
14444 break;
14445 case AFL_EXT_SB1:
14446 fputs ("Broadcom SB-1", stdout);
14447 break;
14448 case AFL_EXT_4111:
14449 fputs ("NEC VR4111/VR4181", stdout);
14450 break;
14451 case AFL_EXT_4120:
14452 fputs ("NEC VR4120", stdout);
14453 break;
14454 case AFL_EXT_5400:
14455 fputs ("NEC VR5400", stdout);
14456 break;
14457 case AFL_EXT_5500:
14458 fputs ("NEC VR5500", stdout);
14459 break;
14460 case AFL_EXT_LOONGSON_2E:
14461 fputs ("ST Microelectronics Loongson 2E", stdout);
14462 break;
14463 case AFL_EXT_LOONGSON_2F:
14464 fputs ("ST Microelectronics Loongson 2F", stdout);
14465 break;
14466 default:
14467 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14468 }
14469 }
14470
14471 static int
14472 get_mips_reg_size (int reg_size)
14473 {
14474 return (reg_size == AFL_REG_NONE) ? 0
14475 : (reg_size == AFL_REG_32) ? 32
14476 : (reg_size == AFL_REG_64) ? 64
14477 : (reg_size == AFL_REG_128) ? 128
14478 : -1;
14479 }
14480
14481 static int
14482 process_mips_specific (FILE * file)
14483 {
14484 Elf_Internal_Dyn * entry;
14485 Elf_Internal_Shdr *sect = NULL;
14486 size_t liblist_offset = 0;
14487 size_t liblistno = 0;
14488 size_t conflictsno = 0;
14489 size_t options_offset = 0;
14490 size_t conflicts_offset = 0;
14491 size_t pltrelsz = 0;
14492 size_t pltrel = 0;
14493 bfd_vma pltgot = 0;
14494 bfd_vma mips_pltgot = 0;
14495 bfd_vma jmprel = 0;
14496 bfd_vma local_gotno = 0;
14497 bfd_vma gotsym = 0;
14498 bfd_vma symtabno = 0;
14499
14500 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14501 display_mips_gnu_attribute);
14502
14503 sect = find_section (".MIPS.abiflags");
14504
14505 if (sect != NULL)
14506 {
14507 Elf_External_ABIFlags_v0 *abiflags_ext;
14508 Elf_Internal_ABIFlags_v0 abiflags_in;
14509
14510 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14511 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14512 else
14513 {
14514 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14515 sect->sh_size, _("MIPS ABI Flags section"));
14516 if (abiflags_ext)
14517 {
14518 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14519 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14520 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14521 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14522 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14523 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14524 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14525 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14526 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14527 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14528 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14529
14530 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14531 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14532 if (abiflags_in.isa_rev > 1)
14533 printf ("r%d", abiflags_in.isa_rev);
14534 printf ("\nGPR size: %d",
14535 get_mips_reg_size (abiflags_in.gpr_size));
14536 printf ("\nCPR1 size: %d",
14537 get_mips_reg_size (abiflags_in.cpr1_size));
14538 printf ("\nCPR2 size: %d",
14539 get_mips_reg_size (abiflags_in.cpr2_size));
14540 fputs ("\nFP ABI: ", stdout);
14541 print_mips_fp_abi_value (abiflags_in.fp_abi);
14542 fputs ("ISA Extension: ", stdout);
14543 print_mips_isa_ext (abiflags_in.isa_ext);
14544 fputs ("\nASEs:", stdout);
14545 print_mips_ases (abiflags_in.ases);
14546 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14547 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14548 fputc ('\n', stdout);
14549 free (abiflags_ext);
14550 }
14551 }
14552 }
14553
14554 /* We have a lot of special sections. Thanks SGI! */
14555 if (dynamic_section == NULL)
14556 /* No information available. */
14557 return 0;
14558
14559 for (entry = dynamic_section;
14560 /* PR 17531 file: 012-50589-0.004. */
14561 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14562 ++entry)
14563 switch (entry->d_tag)
14564 {
14565 case DT_MIPS_LIBLIST:
14566 liblist_offset
14567 = offset_from_vma (file, entry->d_un.d_val,
14568 liblistno * sizeof (Elf32_External_Lib));
14569 break;
14570 case DT_MIPS_LIBLISTNO:
14571 liblistno = entry->d_un.d_val;
14572 break;
14573 case DT_MIPS_OPTIONS:
14574 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14575 break;
14576 case DT_MIPS_CONFLICT:
14577 conflicts_offset
14578 = offset_from_vma (file, entry->d_un.d_val,
14579 conflictsno * sizeof (Elf32_External_Conflict));
14580 break;
14581 case DT_MIPS_CONFLICTNO:
14582 conflictsno = entry->d_un.d_val;
14583 break;
14584 case DT_PLTGOT:
14585 pltgot = entry->d_un.d_ptr;
14586 break;
14587 case DT_MIPS_LOCAL_GOTNO:
14588 local_gotno = entry->d_un.d_val;
14589 break;
14590 case DT_MIPS_GOTSYM:
14591 gotsym = entry->d_un.d_val;
14592 break;
14593 case DT_MIPS_SYMTABNO:
14594 symtabno = entry->d_un.d_val;
14595 break;
14596 case DT_MIPS_PLTGOT:
14597 mips_pltgot = entry->d_un.d_ptr;
14598 break;
14599 case DT_PLTREL:
14600 pltrel = entry->d_un.d_val;
14601 break;
14602 case DT_PLTRELSZ:
14603 pltrelsz = entry->d_un.d_val;
14604 break;
14605 case DT_JMPREL:
14606 jmprel = entry->d_un.d_ptr;
14607 break;
14608 default:
14609 break;
14610 }
14611
14612 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14613 {
14614 Elf32_External_Lib * elib;
14615 size_t cnt;
14616
14617 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14618 liblistno,
14619 sizeof (Elf32_External_Lib),
14620 _("liblist section data"));
14621 if (elib)
14622 {
14623 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14624 (unsigned long) liblistno);
14625 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14626 stdout);
14627
14628 for (cnt = 0; cnt < liblistno; ++cnt)
14629 {
14630 Elf32_Lib liblist;
14631 time_t atime;
14632 char timebuf[128];
14633 struct tm * tmp;
14634
14635 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14636 atime = BYTE_GET (elib[cnt].l_time_stamp);
14637 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14638 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14639 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14640
14641 tmp = gmtime (&atime);
14642 snprintf (timebuf, sizeof (timebuf),
14643 "%04u-%02u-%02uT%02u:%02u:%02u",
14644 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14645 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14646
14647 printf ("%3lu: ", (unsigned long) cnt);
14648 if (VALID_DYNAMIC_NAME (liblist.l_name))
14649 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14650 else
14651 printf (_("<corrupt: %9ld>"), liblist.l_name);
14652 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14653 liblist.l_version);
14654
14655 if (liblist.l_flags == 0)
14656 puts (_(" NONE"));
14657 else
14658 {
14659 static const struct
14660 {
14661 const char * name;
14662 int bit;
14663 }
14664 l_flags_vals[] =
14665 {
14666 { " EXACT_MATCH", LL_EXACT_MATCH },
14667 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14668 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14669 { " EXPORTS", LL_EXPORTS },
14670 { " DELAY_LOAD", LL_DELAY_LOAD },
14671 { " DELTA", LL_DELTA }
14672 };
14673 int flags = liblist.l_flags;
14674 size_t fcnt;
14675
14676 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14677 if ((flags & l_flags_vals[fcnt].bit) != 0)
14678 {
14679 fputs (l_flags_vals[fcnt].name, stdout);
14680 flags ^= l_flags_vals[fcnt].bit;
14681 }
14682 if (flags != 0)
14683 printf (" %#x", (unsigned int) flags);
14684
14685 puts ("");
14686 }
14687 }
14688
14689 free (elib);
14690 }
14691 }
14692
14693 if (options_offset != 0)
14694 {
14695 Elf_External_Options * eopt;
14696 Elf_Internal_Options * iopt;
14697 Elf_Internal_Options * option;
14698 size_t offset;
14699 int cnt;
14700 sect = section_headers;
14701
14702 /* Find the section header so that we get the size. */
14703 sect = find_section_by_type (SHT_MIPS_OPTIONS);
14704 /* PR 17533 file: 012-277276-0.004. */
14705 if (sect == NULL)
14706 {
14707 error (_("No MIPS_OPTIONS header found\n"));
14708 return 0;
14709 }
14710
14711 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14712 sect->sh_size, _("options"));
14713 if (eopt)
14714 {
14715 iopt = (Elf_Internal_Options *)
14716 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14717 if (iopt == NULL)
14718 {
14719 error (_("Out of memory allocatinf space for MIPS options\n"));
14720 return 0;
14721 }
14722
14723 offset = cnt = 0;
14724 option = iopt;
14725
14726 while (offset <= sect->sh_size - sizeof (* eopt))
14727 {
14728 Elf_External_Options * eoption;
14729
14730 eoption = (Elf_External_Options *) ((char *) eopt + offset);
14731
14732 option->kind = BYTE_GET (eoption->kind);
14733 option->size = BYTE_GET (eoption->size);
14734 option->section = BYTE_GET (eoption->section);
14735 option->info = BYTE_GET (eoption->info);
14736
14737 /* PR 17531: file: ffa0fa3b. */
14738 if (option->size < sizeof (* eopt)
14739 || offset + option->size > sect->sh_size)
14740 {
14741 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14742 return 0;
14743 }
14744 offset += option->size;
14745
14746 ++option;
14747 ++cnt;
14748 }
14749
14750 printf (_("\nSection '%s' contains %d entries:\n"),
14751 printable_section_name (sect), cnt);
14752
14753 option = iopt;
14754 offset = 0;
14755
14756 while (cnt-- > 0)
14757 {
14758 size_t len;
14759
14760 switch (option->kind)
14761 {
14762 case ODK_NULL:
14763 /* This shouldn't happen. */
14764 printf (" NULL %d %lx", option->section, option->info);
14765 break;
14766 case ODK_REGINFO:
14767 printf (" REGINFO ");
14768 if (elf_header.e_machine == EM_MIPS)
14769 {
14770 /* 32bit form. */
14771 Elf32_External_RegInfo * ereg;
14772 Elf32_RegInfo reginfo;
14773
14774 ereg = (Elf32_External_RegInfo *) (option + 1);
14775 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14776 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14777 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14778 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14779 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14780 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14781
14782 printf ("GPR %08lx GP 0x%lx\n",
14783 reginfo.ri_gprmask,
14784 (unsigned long) reginfo.ri_gp_value);
14785 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14786 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14787 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14788 }
14789 else
14790 {
14791 /* 64 bit form. */
14792 Elf64_External_RegInfo * ereg;
14793 Elf64_Internal_RegInfo reginfo;
14794
14795 ereg = (Elf64_External_RegInfo *) (option + 1);
14796 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14797 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14798 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14799 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14800 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14801 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14802
14803 printf ("GPR %08lx GP 0x",
14804 reginfo.ri_gprmask);
14805 printf_vma (reginfo.ri_gp_value);
14806 printf ("\n");
14807
14808 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14809 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14810 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14811 }
14812 ++option;
14813 continue;
14814 case ODK_EXCEPTIONS:
14815 fputs (" EXCEPTIONS fpe_min(", stdout);
14816 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14817 fputs (") fpe_max(", stdout);
14818 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14819 fputs (")", stdout);
14820
14821 if (option->info & OEX_PAGE0)
14822 fputs (" PAGE0", stdout);
14823 if (option->info & OEX_SMM)
14824 fputs (" SMM", stdout);
14825 if (option->info & OEX_FPDBUG)
14826 fputs (" FPDBUG", stdout);
14827 if (option->info & OEX_DISMISS)
14828 fputs (" DISMISS", stdout);
14829 break;
14830 case ODK_PAD:
14831 fputs (" PAD ", stdout);
14832 if (option->info & OPAD_PREFIX)
14833 fputs (" PREFIX", stdout);
14834 if (option->info & OPAD_POSTFIX)
14835 fputs (" POSTFIX", stdout);
14836 if (option->info & OPAD_SYMBOL)
14837 fputs (" SYMBOL", stdout);
14838 break;
14839 case ODK_HWPATCH:
14840 fputs (" HWPATCH ", stdout);
14841 if (option->info & OHW_R4KEOP)
14842 fputs (" R4KEOP", stdout);
14843 if (option->info & OHW_R8KPFETCH)
14844 fputs (" R8KPFETCH", stdout);
14845 if (option->info & OHW_R5KEOP)
14846 fputs (" R5KEOP", stdout);
14847 if (option->info & OHW_R5KCVTL)
14848 fputs (" R5KCVTL", stdout);
14849 break;
14850 case ODK_FILL:
14851 fputs (" FILL ", stdout);
14852 /* XXX Print content of info word? */
14853 break;
14854 case ODK_TAGS:
14855 fputs (" TAGS ", stdout);
14856 /* XXX Print content of info word? */
14857 break;
14858 case ODK_HWAND:
14859 fputs (" HWAND ", stdout);
14860 if (option->info & OHWA0_R4KEOP_CHECKED)
14861 fputs (" R4KEOP_CHECKED", stdout);
14862 if (option->info & OHWA0_R4KEOP_CLEAN)
14863 fputs (" R4KEOP_CLEAN", stdout);
14864 break;
14865 case ODK_HWOR:
14866 fputs (" HWOR ", stdout);
14867 if (option->info & OHWA0_R4KEOP_CHECKED)
14868 fputs (" R4KEOP_CHECKED", stdout);
14869 if (option->info & OHWA0_R4KEOP_CLEAN)
14870 fputs (" R4KEOP_CLEAN", stdout);
14871 break;
14872 case ODK_GP_GROUP:
14873 printf (" GP_GROUP %#06lx self-contained %#06lx",
14874 option->info & OGP_GROUP,
14875 (option->info & OGP_SELF) >> 16);
14876 break;
14877 case ODK_IDENT:
14878 printf (" IDENT %#06lx self-contained %#06lx",
14879 option->info & OGP_GROUP,
14880 (option->info & OGP_SELF) >> 16);
14881 break;
14882 default:
14883 /* This shouldn't happen. */
14884 printf (" %3d ??? %d %lx",
14885 option->kind, option->section, option->info);
14886 break;
14887 }
14888
14889 len = sizeof (* eopt);
14890 while (len < option->size)
14891 {
14892 unsigned char datum = * ((unsigned char *) eopt + offset + len);
14893
14894 if (ISPRINT (datum))
14895 printf ("%c", datum);
14896 else
14897 printf ("\\%03o", datum);
14898 len ++;
14899 }
14900 fputs ("\n", stdout);
14901
14902 offset += option->size;
14903 ++option;
14904 }
14905
14906 free (eopt);
14907 }
14908 }
14909
14910 if (conflicts_offset != 0 && conflictsno != 0)
14911 {
14912 Elf32_Conflict * iconf;
14913 size_t cnt;
14914
14915 if (dynamic_symbols == NULL)
14916 {
14917 error (_("conflict list found without a dynamic symbol table\n"));
14918 return 0;
14919 }
14920
14921 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14922 if (iconf == NULL)
14923 {
14924 error (_("Out of memory allocating space for dynamic conflicts\n"));
14925 return 0;
14926 }
14927
14928 if (is_32bit_elf)
14929 {
14930 Elf32_External_Conflict * econf32;
14931
14932 econf32 = (Elf32_External_Conflict *)
14933 get_data (NULL, file, conflicts_offset, conflictsno,
14934 sizeof (* econf32), _("conflict"));
14935 if (!econf32)
14936 return 0;
14937
14938 for (cnt = 0; cnt < conflictsno; ++cnt)
14939 iconf[cnt] = BYTE_GET (econf32[cnt]);
14940
14941 free (econf32);
14942 }
14943 else
14944 {
14945 Elf64_External_Conflict * econf64;
14946
14947 econf64 = (Elf64_External_Conflict *)
14948 get_data (NULL, file, conflicts_offset, conflictsno,
14949 sizeof (* econf64), _("conflict"));
14950 if (!econf64)
14951 return 0;
14952
14953 for (cnt = 0; cnt < conflictsno; ++cnt)
14954 iconf[cnt] = BYTE_GET (econf64[cnt]);
14955
14956 free (econf64);
14957 }
14958
14959 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14960 (unsigned long) conflictsno);
14961 puts (_(" Num: Index Value Name"));
14962
14963 for (cnt = 0; cnt < conflictsno; ++cnt)
14964 {
14965 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14966
14967 if (iconf[cnt] >= num_dynamic_syms)
14968 printf (_("<corrupt symbol index>"));
14969 else
14970 {
14971 Elf_Internal_Sym * psym;
14972
14973 psym = & dynamic_symbols[iconf[cnt]];
14974 print_vma (psym->st_value, FULL_HEX);
14975 putchar (' ');
14976 if (VALID_DYNAMIC_NAME (psym->st_name))
14977 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14978 else
14979 printf (_("<corrupt: %14ld>"), psym->st_name);
14980 }
14981 putchar ('\n');
14982 }
14983
14984 free (iconf);
14985 }
14986
14987 if (pltgot != 0 && local_gotno != 0)
14988 {
14989 bfd_vma ent, local_end, global_end;
14990 size_t i, offset;
14991 unsigned char * data;
14992 unsigned char * data_end;
14993 int addr_size;
14994
14995 ent = pltgot;
14996 addr_size = (is_32bit_elf ? 4 : 8);
14997 local_end = pltgot + local_gotno * addr_size;
14998
14999 /* PR binutils/17533 file: 012-111227-0.004 */
15000 if (symtabno < gotsym)
15001 {
15002 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15003 (unsigned long) gotsym, (unsigned long) symtabno);
15004 return 0;
15005 }
15006
15007 global_end = local_end + (symtabno - gotsym) * addr_size;
15008 /* PR 17531: file: 54c91a34. */
15009 if (global_end < local_end)
15010 {
15011 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15012 return 0;
15013 }
15014
15015 offset = offset_from_vma (file, pltgot, global_end - pltgot);
15016 data = (unsigned char *) get_data (NULL, file, offset,
15017 global_end - pltgot, 1,
15018 _("Global Offset Table data"));
15019 if (data == NULL)
15020 return 0;
15021 data_end = data + (global_end - pltgot);
15022
15023 printf (_("\nPrimary GOT:\n"));
15024 printf (_(" Canonical gp value: "));
15025 print_vma (pltgot + 0x7ff0, LONG_HEX);
15026 printf ("\n\n");
15027
15028 printf (_(" Reserved entries:\n"));
15029 printf (_(" %*s %10s %*s Purpose\n"),
15030 addr_size * 2, _("Address"), _("Access"),
15031 addr_size * 2, _("Initial"));
15032 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15033 printf (_(" Lazy resolver\n"));
15034 if (ent == (bfd_vma) -1)
15035 goto got_print_fail;
15036 if (data
15037 && (byte_get (data + ent - pltgot, addr_size)
15038 >> (addr_size * 8 - 1)) != 0)
15039 {
15040 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15041 printf (_(" Module pointer (GNU extension)\n"));
15042 if (ent == (bfd_vma) -1)
15043 goto got_print_fail;
15044 }
15045 printf ("\n");
15046
15047 if (ent < local_end)
15048 {
15049 printf (_(" Local entries:\n"));
15050 printf (" %*s %10s %*s\n",
15051 addr_size * 2, _("Address"), _("Access"),
15052 addr_size * 2, _("Initial"));
15053 while (ent < local_end)
15054 {
15055 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15056 printf ("\n");
15057 if (ent == (bfd_vma) -1)
15058 goto got_print_fail;
15059 }
15060 printf ("\n");
15061 }
15062
15063 if (gotsym < symtabno)
15064 {
15065 int sym_width;
15066
15067 printf (_(" Global entries:\n"));
15068 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
15069 addr_size * 2, _("Address"),
15070 _("Access"),
15071 addr_size * 2, _("Initial"),
15072 addr_size * 2, _("Sym.Val."),
15073 _("Type"),
15074 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15075 _("Ndx"), _("Name"));
15076
15077 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15078
15079 for (i = gotsym; i < symtabno; i++)
15080 {
15081 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15082 printf (" ");
15083
15084 if (dynamic_symbols == NULL)
15085 printf (_("<no dynamic symbols>"));
15086 else if (i < num_dynamic_syms)
15087 {
15088 Elf_Internal_Sym * psym = dynamic_symbols + i;
15089
15090 print_vma (psym->st_value, LONG_HEX);
15091 printf (" %-7s %3s ",
15092 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15093 get_symbol_index_type (psym->st_shndx));
15094
15095 if (VALID_DYNAMIC_NAME (psym->st_name))
15096 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15097 else
15098 printf (_("<corrupt: %14ld>"), psym->st_name);
15099 }
15100 else
15101 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15102 (unsigned long) i);
15103
15104 printf ("\n");
15105 if (ent == (bfd_vma) -1)
15106 break;
15107 }
15108 printf ("\n");
15109 }
15110
15111 got_print_fail:
15112 if (data)
15113 free (data);
15114 }
15115
15116 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15117 {
15118 bfd_vma ent, end;
15119 size_t offset, rel_offset;
15120 unsigned long count, i;
15121 unsigned char * data;
15122 int addr_size, sym_width;
15123 Elf_Internal_Rela * rels;
15124
15125 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15126 if (pltrel == DT_RELA)
15127 {
15128 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15129 return 0;
15130 }
15131 else
15132 {
15133 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15134 return 0;
15135 }
15136
15137 ent = mips_pltgot;
15138 addr_size = (is_32bit_elf ? 4 : 8);
15139 end = mips_pltgot + (2 + count) * addr_size;
15140
15141 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15142 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15143 1, _("Procedure Linkage Table data"));
15144 if (data == NULL)
15145 return 0;
15146
15147 printf ("\nPLT GOT:\n\n");
15148 printf (_(" Reserved entries:\n"));
15149 printf (_(" %*s %*s Purpose\n"),
15150 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15151 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15152 printf (_(" PLT lazy resolver\n"));
15153 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15154 printf (_(" Module pointer\n"));
15155 printf ("\n");
15156
15157 printf (_(" Entries:\n"));
15158 printf (" %*s %*s %*s %-7s %3s %s\n",
15159 addr_size * 2, _("Address"),
15160 addr_size * 2, _("Initial"),
15161 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15162 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15163 for (i = 0; i < count; i++)
15164 {
15165 unsigned long idx = get_reloc_symindex (rels[i].r_info);
15166
15167 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15168 printf (" ");
15169
15170 if (idx >= num_dynamic_syms)
15171 printf (_("<corrupt symbol index: %lu>"), idx);
15172 else
15173 {
15174 Elf_Internal_Sym * psym = dynamic_symbols + idx;
15175
15176 print_vma (psym->st_value, LONG_HEX);
15177 printf (" %-7s %3s ",
15178 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15179 get_symbol_index_type (psym->st_shndx));
15180 if (VALID_DYNAMIC_NAME (psym->st_name))
15181 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15182 else
15183 printf (_("<corrupt: %14ld>"), psym->st_name);
15184 }
15185 printf ("\n");
15186 }
15187 printf ("\n");
15188
15189 if (data)
15190 free (data);
15191 free (rels);
15192 }
15193
15194 return 1;
15195 }
15196
15197 static int
15198 process_nds32_specific (FILE * file)
15199 {
15200 Elf_Internal_Shdr *sect = NULL;
15201
15202 sect = find_section (".nds32_e_flags");
15203 if (sect != NULL)
15204 {
15205 unsigned int *flag;
15206
15207 printf ("\nNDS32 elf flags section:\n");
15208 flag = get_data (NULL, file, sect->sh_offset, 1,
15209 sect->sh_size, _("NDS32 elf flags section"));
15210
15211 switch ((*flag) & 0x3)
15212 {
15213 case 0:
15214 printf ("(VEC_SIZE):\tNo entry.\n");
15215 break;
15216 case 1:
15217 printf ("(VEC_SIZE):\t4 bytes\n");
15218 break;
15219 case 2:
15220 printf ("(VEC_SIZE):\t16 bytes\n");
15221 break;
15222 case 3:
15223 printf ("(VEC_SIZE):\treserved\n");
15224 break;
15225 }
15226 }
15227
15228 return TRUE;
15229 }
15230
15231 static int
15232 process_gnu_liblist (FILE * file)
15233 {
15234 Elf_Internal_Shdr * section;
15235 Elf_Internal_Shdr * string_sec;
15236 Elf32_External_Lib * elib;
15237 char * strtab;
15238 size_t strtab_size;
15239 size_t cnt;
15240 unsigned i;
15241
15242 if (! do_arch)
15243 return 0;
15244
15245 for (i = 0, section = section_headers;
15246 i < elf_header.e_shnum;
15247 i++, section++)
15248 {
15249 switch (section->sh_type)
15250 {
15251 case SHT_GNU_LIBLIST:
15252 if (section->sh_link >= elf_header.e_shnum)
15253 break;
15254
15255 elib = (Elf32_External_Lib *)
15256 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15257 _("liblist section data"));
15258
15259 if (elib == NULL)
15260 break;
15261 string_sec = section_headers + section->sh_link;
15262
15263 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15264 string_sec->sh_size,
15265 _("liblist string table"));
15266 if (strtab == NULL
15267 || section->sh_entsize != sizeof (Elf32_External_Lib))
15268 {
15269 free (elib);
15270 free (strtab);
15271 break;
15272 }
15273 strtab_size = string_sec->sh_size;
15274
15275 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15276 printable_section_name (section),
15277 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15278
15279 puts (_(" Library Time Stamp Checksum Version Flags"));
15280
15281 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15282 ++cnt)
15283 {
15284 Elf32_Lib liblist;
15285 time_t atime;
15286 char timebuf[128];
15287 struct tm * tmp;
15288
15289 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15290 atime = BYTE_GET (elib[cnt].l_time_stamp);
15291 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15292 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15293 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15294
15295 tmp = gmtime (&atime);
15296 snprintf (timebuf, sizeof (timebuf),
15297 "%04u-%02u-%02uT%02u:%02u:%02u",
15298 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15299 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15300
15301 printf ("%3lu: ", (unsigned long) cnt);
15302 if (do_wide)
15303 printf ("%-20s", liblist.l_name < strtab_size
15304 ? strtab + liblist.l_name : _("<corrupt>"));
15305 else
15306 printf ("%-20.20s", liblist.l_name < strtab_size
15307 ? strtab + liblist.l_name : _("<corrupt>"));
15308 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15309 liblist.l_version, liblist.l_flags);
15310 }
15311
15312 free (elib);
15313 free (strtab);
15314 }
15315 }
15316
15317 return 1;
15318 }
15319
15320 static const char *
15321 get_note_type (unsigned e_type)
15322 {
15323 static char buff[64];
15324
15325 if (elf_header.e_type == ET_CORE)
15326 switch (e_type)
15327 {
15328 case NT_AUXV:
15329 return _("NT_AUXV (auxiliary vector)");
15330 case NT_PRSTATUS:
15331 return _("NT_PRSTATUS (prstatus structure)");
15332 case NT_FPREGSET:
15333 return _("NT_FPREGSET (floating point registers)");
15334 case NT_PRPSINFO:
15335 return _("NT_PRPSINFO (prpsinfo structure)");
15336 case NT_TASKSTRUCT:
15337 return _("NT_TASKSTRUCT (task structure)");
15338 case NT_PRXFPREG:
15339 return _("NT_PRXFPREG (user_xfpregs structure)");
15340 case NT_PPC_VMX:
15341 return _("NT_PPC_VMX (ppc Altivec registers)");
15342 case NT_PPC_VSX:
15343 return _("NT_PPC_VSX (ppc VSX registers)");
15344 case NT_386_TLS:
15345 return _("NT_386_TLS (x86 TLS information)");
15346 case NT_386_IOPERM:
15347 return _("NT_386_IOPERM (x86 I/O permissions)");
15348 case NT_X86_XSTATE:
15349 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15350 case NT_S390_HIGH_GPRS:
15351 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15352 case NT_S390_TIMER:
15353 return _("NT_S390_TIMER (s390 timer register)");
15354 case NT_S390_TODCMP:
15355 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15356 case NT_S390_TODPREG:
15357 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15358 case NT_S390_CTRS:
15359 return _("NT_S390_CTRS (s390 control registers)");
15360 case NT_S390_PREFIX:
15361 return _("NT_S390_PREFIX (s390 prefix register)");
15362 case NT_S390_LAST_BREAK:
15363 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15364 case NT_S390_SYSTEM_CALL:
15365 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15366 case NT_S390_TDB:
15367 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15368 case NT_S390_VXRS_LOW:
15369 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15370 case NT_S390_VXRS_HIGH:
15371 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15372 case NT_ARM_VFP:
15373 return _("NT_ARM_VFP (arm VFP registers)");
15374 case NT_ARM_TLS:
15375 return _("NT_ARM_TLS (AArch TLS registers)");
15376 case NT_ARM_HW_BREAK:
15377 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15378 case NT_ARM_HW_WATCH:
15379 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15380 case NT_PSTATUS:
15381 return _("NT_PSTATUS (pstatus structure)");
15382 case NT_FPREGS:
15383 return _("NT_FPREGS (floating point registers)");
15384 case NT_PSINFO:
15385 return _("NT_PSINFO (psinfo structure)");
15386 case NT_LWPSTATUS:
15387 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15388 case NT_LWPSINFO:
15389 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15390 case NT_WIN32PSTATUS:
15391 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15392 case NT_SIGINFO:
15393 return _("NT_SIGINFO (siginfo_t data)");
15394 case NT_FILE:
15395 return _("NT_FILE (mapped files)");
15396 default:
15397 break;
15398 }
15399 else
15400 switch (e_type)
15401 {
15402 case NT_VERSION:
15403 return _("NT_VERSION (version)");
15404 case NT_ARCH:
15405 return _("NT_ARCH (architecture)");
15406 default:
15407 break;
15408 }
15409
15410 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15411 return buff;
15412 }
15413
15414 static int
15415 print_core_note (Elf_Internal_Note *pnote)
15416 {
15417 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15418 bfd_vma count, page_size;
15419 unsigned char *descdata, *filenames, *descend;
15420
15421 if (pnote->type != NT_FILE)
15422 return 1;
15423
15424 #ifndef BFD64
15425 if (!is_32bit_elf)
15426 {
15427 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15428 /* Still "successful". */
15429 return 1;
15430 }
15431 #endif
15432
15433 if (pnote->descsz < 2 * addr_size)
15434 {
15435 printf (_(" Malformed note - too short for header\n"));
15436 return 0;
15437 }
15438
15439 descdata = (unsigned char *) pnote->descdata;
15440 descend = descdata + pnote->descsz;
15441
15442 if (descdata[pnote->descsz - 1] != '\0')
15443 {
15444 printf (_(" Malformed note - does not end with \\0\n"));
15445 return 0;
15446 }
15447
15448 count = byte_get (descdata, addr_size);
15449 descdata += addr_size;
15450
15451 page_size = byte_get (descdata, addr_size);
15452 descdata += addr_size;
15453
15454 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15455 {
15456 printf (_(" Malformed note - too short for supplied file count\n"));
15457 return 0;
15458 }
15459
15460 printf (_(" Page size: "));
15461 print_vma (page_size, DEC);
15462 printf ("\n");
15463
15464 printf (_(" %*s%*s%*s\n"),
15465 (int) (2 + 2 * addr_size), _("Start"),
15466 (int) (4 + 2 * addr_size), _("End"),
15467 (int) (4 + 2 * addr_size), _("Page Offset"));
15468 filenames = descdata + count * 3 * addr_size;
15469 while (count-- > 0)
15470 {
15471 bfd_vma start, end, file_ofs;
15472
15473 if (filenames == descend)
15474 {
15475 printf (_(" Malformed note - filenames end too early\n"));
15476 return 0;
15477 }
15478
15479 start = byte_get (descdata, addr_size);
15480 descdata += addr_size;
15481 end = byte_get (descdata, addr_size);
15482 descdata += addr_size;
15483 file_ofs = byte_get (descdata, addr_size);
15484 descdata += addr_size;
15485
15486 printf (" ");
15487 print_vma (start, FULL_HEX);
15488 printf (" ");
15489 print_vma (end, FULL_HEX);
15490 printf (" ");
15491 print_vma (file_ofs, FULL_HEX);
15492 printf ("\n %s\n", filenames);
15493
15494 filenames += 1 + strlen ((char *) filenames);
15495 }
15496
15497 return 1;
15498 }
15499
15500 static const char *
15501 get_gnu_elf_note_type (unsigned e_type)
15502 {
15503 static char buff[64];
15504
15505 switch (e_type)
15506 {
15507 case NT_GNU_ABI_TAG:
15508 return _("NT_GNU_ABI_TAG (ABI version tag)");
15509 case NT_GNU_HWCAP:
15510 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15511 case NT_GNU_BUILD_ID:
15512 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15513 case NT_GNU_GOLD_VERSION:
15514 return _("NT_GNU_GOLD_VERSION (gold version)");
15515 default:
15516 break;
15517 }
15518
15519 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15520 return buff;
15521 }
15522
15523 static int
15524 print_gnu_note (Elf_Internal_Note *pnote)
15525 {
15526 switch (pnote->type)
15527 {
15528 case NT_GNU_BUILD_ID:
15529 {
15530 unsigned long i;
15531
15532 printf (_(" Build ID: "));
15533 for (i = 0; i < pnote->descsz; ++i)
15534 printf ("%02x", pnote->descdata[i] & 0xff);
15535 printf ("\n");
15536 }
15537 break;
15538
15539 case NT_GNU_ABI_TAG:
15540 {
15541 unsigned long os, major, minor, subminor;
15542 const char *osname;
15543
15544 /* PR 17531: file: 030-599401-0.004. */
15545 if (pnote->descsz < 16)
15546 {
15547 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15548 break;
15549 }
15550
15551 os = byte_get ((unsigned char *) pnote->descdata, 4);
15552 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15553 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15554 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15555
15556 switch (os)
15557 {
15558 case GNU_ABI_TAG_LINUX:
15559 osname = "Linux";
15560 break;
15561 case GNU_ABI_TAG_HURD:
15562 osname = "Hurd";
15563 break;
15564 case GNU_ABI_TAG_SOLARIS:
15565 osname = "Solaris";
15566 break;
15567 case GNU_ABI_TAG_FREEBSD:
15568 osname = "FreeBSD";
15569 break;
15570 case GNU_ABI_TAG_NETBSD:
15571 osname = "NetBSD";
15572 break;
15573 case GNU_ABI_TAG_SYLLABLE:
15574 osname = "Syllable";
15575 break;
15576 case GNU_ABI_TAG_NACL:
15577 osname = "NaCl";
15578 break;
15579 default:
15580 osname = "Unknown";
15581 break;
15582 }
15583
15584 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15585 major, minor, subminor);
15586 }
15587 break;
15588
15589 case NT_GNU_GOLD_VERSION:
15590 {
15591 unsigned long i;
15592
15593 printf (_(" Version: "));
15594 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15595 printf ("%c", pnote->descdata[i]);
15596 printf ("\n");
15597 }
15598 break;
15599 }
15600
15601 return 1;
15602 }
15603
15604 static const char *
15605 get_v850_elf_note_type (enum v850_notes n_type)
15606 {
15607 static char buff[64];
15608
15609 switch (n_type)
15610 {
15611 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15612 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15613 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15614 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15615 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15616 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15617 default:
15618 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15619 return buff;
15620 }
15621 }
15622
15623 static int
15624 print_v850_note (Elf_Internal_Note * pnote)
15625 {
15626 unsigned int val;
15627
15628 if (pnote->descsz != 4)
15629 return 0;
15630 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15631
15632 if (val == 0)
15633 {
15634 printf (_("not set\n"));
15635 return 1;
15636 }
15637
15638 switch (pnote->type)
15639 {
15640 case V850_NOTE_ALIGNMENT:
15641 switch (val)
15642 {
15643 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15644 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15645 }
15646 break;
15647
15648 case V850_NOTE_DATA_SIZE:
15649 switch (val)
15650 {
15651 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15652 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15653 }
15654 break;
15655
15656 case V850_NOTE_FPU_INFO:
15657 switch (val)
15658 {
15659 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15660 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15661 }
15662 break;
15663
15664 case V850_NOTE_MMU_INFO:
15665 case V850_NOTE_CACHE_INFO:
15666 case V850_NOTE_SIMD_INFO:
15667 if (val == EF_RH850_SIMD)
15668 {
15669 printf (_("yes\n"));
15670 return 1;
15671 }
15672 break;
15673
15674 default:
15675 /* An 'unknown note type' message will already have been displayed. */
15676 break;
15677 }
15678
15679 printf (_("unknown value: %x\n"), val);
15680 return 0;
15681 }
15682
15683 static int
15684 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15685 {
15686 unsigned int version;
15687
15688 switch (pnote->type)
15689 {
15690 case NT_NETBSD_IDENT:
15691 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15692 if ((version / 10000) % 100)
15693 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15694 version, version / 100000000, (version / 1000000) % 100,
15695 (version / 10000) % 100 > 26 ? "Z" : "",
15696 'A' + (version / 10000) % 26);
15697 else
15698 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15699 version, version / 100000000, (version / 1000000) % 100,
15700 (version / 100) % 100);
15701 return 1;
15702
15703 case NT_NETBSD_MARCH:
15704 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15705 pnote->descdata);
15706 return 1;
15707
15708 default:
15709 break;
15710 }
15711
15712 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15713 pnote->type);
15714 return 1;
15715 }
15716
15717 static const char *
15718 get_freebsd_elfcore_note_type (unsigned e_type)
15719 {
15720 switch (e_type)
15721 {
15722 case NT_FREEBSD_THRMISC:
15723 return _("NT_THRMISC (thrmisc structure)");
15724 case NT_FREEBSD_PROCSTAT_PROC:
15725 return _("NT_PROCSTAT_PROC (proc data)");
15726 case NT_FREEBSD_PROCSTAT_FILES:
15727 return _("NT_PROCSTAT_FILES (files data)");
15728 case NT_FREEBSD_PROCSTAT_VMMAP:
15729 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15730 case NT_FREEBSD_PROCSTAT_GROUPS:
15731 return _("NT_PROCSTAT_GROUPS (groups data)");
15732 case NT_FREEBSD_PROCSTAT_UMASK:
15733 return _("NT_PROCSTAT_UMASK (umask data)");
15734 case NT_FREEBSD_PROCSTAT_RLIMIT:
15735 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15736 case NT_FREEBSD_PROCSTAT_OSREL:
15737 return _("NT_PROCSTAT_OSREL (osreldate data)");
15738 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15739 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15740 case NT_FREEBSD_PROCSTAT_AUXV:
15741 return _("NT_PROCSTAT_AUXV (auxv data)");
15742 }
15743 return get_note_type (e_type);
15744 }
15745
15746 static const char *
15747 get_netbsd_elfcore_note_type (unsigned e_type)
15748 {
15749 static char buff[64];
15750
15751 if (e_type == NT_NETBSDCORE_PROCINFO)
15752 {
15753 /* NetBSD core "procinfo" structure. */
15754 return _("NetBSD procinfo structure");
15755 }
15756
15757 /* As of Jan 2002 there are no other machine-independent notes
15758 defined for NetBSD core files. If the note type is less
15759 than the start of the machine-dependent note types, we don't
15760 understand it. */
15761
15762 if (e_type < NT_NETBSDCORE_FIRSTMACH)
15763 {
15764 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15765 return buff;
15766 }
15767
15768 switch (elf_header.e_machine)
15769 {
15770 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15771 and PT_GETFPREGS == mach+2. */
15772
15773 case EM_OLD_ALPHA:
15774 case EM_ALPHA:
15775 case EM_SPARC:
15776 case EM_SPARC32PLUS:
15777 case EM_SPARCV9:
15778 switch (e_type)
15779 {
15780 case NT_NETBSDCORE_FIRSTMACH + 0:
15781 return _("PT_GETREGS (reg structure)");
15782 case NT_NETBSDCORE_FIRSTMACH + 2:
15783 return _("PT_GETFPREGS (fpreg structure)");
15784 default:
15785 break;
15786 }
15787 break;
15788
15789 /* On all other arch's, PT_GETREGS == mach+1 and
15790 PT_GETFPREGS == mach+3. */
15791 default:
15792 switch (e_type)
15793 {
15794 case NT_NETBSDCORE_FIRSTMACH + 1:
15795 return _("PT_GETREGS (reg structure)");
15796 case NT_NETBSDCORE_FIRSTMACH + 3:
15797 return _("PT_GETFPREGS (fpreg structure)");
15798 default:
15799 break;
15800 }
15801 }
15802
15803 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15804 e_type - NT_NETBSDCORE_FIRSTMACH);
15805 return buff;
15806 }
15807
15808 static const char *
15809 get_stapsdt_note_type (unsigned e_type)
15810 {
15811 static char buff[64];
15812
15813 switch (e_type)
15814 {
15815 case NT_STAPSDT:
15816 return _("NT_STAPSDT (SystemTap probe descriptors)");
15817
15818 default:
15819 break;
15820 }
15821
15822 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15823 return buff;
15824 }
15825
15826 static int
15827 print_stapsdt_note (Elf_Internal_Note *pnote)
15828 {
15829 int addr_size = is_32bit_elf ? 4 : 8;
15830 char *data = pnote->descdata;
15831 char *data_end = pnote->descdata + pnote->descsz;
15832 bfd_vma pc, base_addr, semaphore;
15833 char *provider, *probe, *arg_fmt;
15834
15835 pc = byte_get ((unsigned char *) data, addr_size);
15836 data += addr_size;
15837 base_addr = byte_get ((unsigned char *) data, addr_size);
15838 data += addr_size;
15839 semaphore = byte_get ((unsigned char *) data, addr_size);
15840 data += addr_size;
15841
15842 provider = data;
15843 data += strlen (data) + 1;
15844 probe = data;
15845 data += strlen (data) + 1;
15846 arg_fmt = data;
15847 data += strlen (data) + 1;
15848
15849 printf (_(" Provider: %s\n"), provider);
15850 printf (_(" Name: %s\n"), probe);
15851 printf (_(" Location: "));
15852 print_vma (pc, FULL_HEX);
15853 printf (_(", Base: "));
15854 print_vma (base_addr, FULL_HEX);
15855 printf (_(", Semaphore: "));
15856 print_vma (semaphore, FULL_HEX);
15857 printf ("\n");
15858 printf (_(" Arguments: %s\n"), arg_fmt);
15859
15860 return data == data_end;
15861 }
15862
15863 static const char *
15864 get_ia64_vms_note_type (unsigned e_type)
15865 {
15866 static char buff[64];
15867
15868 switch (e_type)
15869 {
15870 case NT_VMS_MHD:
15871 return _("NT_VMS_MHD (module header)");
15872 case NT_VMS_LNM:
15873 return _("NT_VMS_LNM (language name)");
15874 case NT_VMS_SRC:
15875 return _("NT_VMS_SRC (source files)");
15876 case NT_VMS_TITLE:
15877 return "NT_VMS_TITLE";
15878 case NT_VMS_EIDC:
15879 return _("NT_VMS_EIDC (consistency check)");
15880 case NT_VMS_FPMODE:
15881 return _("NT_VMS_FPMODE (FP mode)");
15882 case NT_VMS_LINKTIME:
15883 return "NT_VMS_LINKTIME";
15884 case NT_VMS_IMGNAM:
15885 return _("NT_VMS_IMGNAM (image name)");
15886 case NT_VMS_IMGID:
15887 return _("NT_VMS_IMGID (image id)");
15888 case NT_VMS_LINKID:
15889 return _("NT_VMS_LINKID (link id)");
15890 case NT_VMS_IMGBID:
15891 return _("NT_VMS_IMGBID (build id)");
15892 case NT_VMS_GSTNAM:
15893 return _("NT_VMS_GSTNAM (sym table name)");
15894 case NT_VMS_ORIG_DYN:
15895 return "NT_VMS_ORIG_DYN";
15896 case NT_VMS_PATCHTIME:
15897 return "NT_VMS_PATCHTIME";
15898 default:
15899 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15900 return buff;
15901 }
15902 }
15903
15904 static int
15905 print_ia64_vms_note (Elf_Internal_Note * pnote)
15906 {
15907 switch (pnote->type)
15908 {
15909 case NT_VMS_MHD:
15910 if (pnote->descsz > 36)
15911 {
15912 size_t l = strlen (pnote->descdata + 34);
15913 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15914 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15915 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15916 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15917 }
15918 else
15919 printf (_(" Invalid size\n"));
15920 break;
15921 case NT_VMS_LNM:
15922 printf (_(" Language: %s\n"), pnote->descdata);
15923 break;
15924 #ifdef BFD64
15925 case NT_VMS_FPMODE:
15926 printf (_(" Floating Point mode: "));
15927 printf ("0x%016" BFD_VMA_FMT "x\n",
15928 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15929 break;
15930 case NT_VMS_LINKTIME:
15931 printf (_(" Link time: "));
15932 print_vms_time
15933 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15934 printf ("\n");
15935 break;
15936 case NT_VMS_PATCHTIME:
15937 printf (_(" Patch time: "));
15938 print_vms_time
15939 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15940 printf ("\n");
15941 break;
15942 case NT_VMS_ORIG_DYN:
15943 printf (_(" Major id: %u, minor id: %u\n"),
15944 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15945 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15946 printf (_(" Last modified : "));
15947 print_vms_time
15948 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15949 printf (_("\n Link flags : "));
15950 printf ("0x%016" BFD_VMA_FMT "x\n",
15951 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15952 printf (_(" Header flags: 0x%08x\n"),
15953 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15954 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15955 break;
15956 #endif
15957 case NT_VMS_IMGNAM:
15958 printf (_(" Image name: %s\n"), pnote->descdata);
15959 break;
15960 case NT_VMS_GSTNAM:
15961 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15962 break;
15963 case NT_VMS_IMGID:
15964 printf (_(" Image id: %s\n"), pnote->descdata);
15965 break;
15966 case NT_VMS_LINKID:
15967 printf (_(" Linker id: %s\n"), pnote->descdata);
15968 break;
15969 default:
15970 break;
15971 }
15972 return 1;
15973 }
15974
15975 /* Note that by the ELF standard, the name field is already null byte
15976 terminated, and namesz includes the terminating null byte.
15977 I.E. the value of namesz for the name "FSF" is 4.
15978
15979 If the value of namesz is zero, there is no name present. */
15980 static int
15981 process_note (Elf_Internal_Note * pnote)
15982 {
15983 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15984 const char * nt;
15985
15986 if (pnote->namesz == 0)
15987 /* If there is no note name, then use the default set of
15988 note type strings. */
15989 nt = get_note_type (pnote->type);
15990
15991 else if (const_strneq (pnote->namedata, "GNU"))
15992 /* GNU-specific object file notes. */
15993 nt = get_gnu_elf_note_type (pnote->type);
15994
15995 else if (const_strneq (pnote->namedata, "FreeBSD"))
15996 /* FreeBSD-specific core file notes. */
15997 nt = get_freebsd_elfcore_note_type (pnote->type);
15998
15999 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16000 /* NetBSD-specific core file notes. */
16001 nt = get_netbsd_elfcore_note_type (pnote->type);
16002
16003 else if (const_strneq (pnote->namedata, "NetBSD"))
16004 /* NetBSD-specific core file notes. */
16005 return process_netbsd_elf_note (pnote);
16006
16007 else if (strneq (pnote->namedata, "SPU/", 4))
16008 {
16009 /* SPU-specific core file notes. */
16010 nt = pnote->namedata + 4;
16011 name = "SPU";
16012 }
16013
16014 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16015 /* VMS/ia64-specific file notes. */
16016 nt = get_ia64_vms_note_type (pnote->type);
16017
16018 else if (const_strneq (pnote->namedata, "stapsdt"))
16019 nt = get_stapsdt_note_type (pnote->type);
16020
16021 else
16022 /* Don't recognize this note name; just use the default set of
16023 note type strings. */
16024 nt = get_note_type (pnote->type);
16025
16026 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
16027
16028 if (const_strneq (pnote->namedata, "IPF/VMS"))
16029 return print_ia64_vms_note (pnote);
16030 else if (const_strneq (pnote->namedata, "GNU"))
16031 return print_gnu_note (pnote);
16032 else if (const_strneq (pnote->namedata, "stapsdt"))
16033 return print_stapsdt_note (pnote);
16034 else if (const_strneq (pnote->namedata, "CORE"))
16035 return print_core_note (pnote);
16036 else
16037 return 1;
16038 }
16039
16040
16041 static int
16042 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
16043 {
16044 Elf_External_Note * pnotes;
16045 Elf_External_Note * external;
16046 char * end;
16047 int res = 1;
16048
16049 if (length <= 0)
16050 return 0;
16051
16052 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16053 _("notes"));
16054 if (pnotes == NULL)
16055 return 0;
16056
16057 external = pnotes;
16058
16059 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16060 (unsigned long) offset, (unsigned long) length);
16061 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16062
16063 end = (char *) pnotes + length;
16064 while ((char *) external < end)
16065 {
16066 Elf_Internal_Note inote;
16067 size_t min_notesz;
16068 char *next;
16069 char * temp = NULL;
16070 size_t data_remaining = end - (char *) external;
16071
16072 if (!is_ia64_vms ())
16073 {
16074 /* PR binutils/15191
16075 Make sure that there is enough data to read. */
16076 min_notesz = offsetof (Elf_External_Note, name);
16077 if (data_remaining < min_notesz)
16078 {
16079 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16080 (int) data_remaining);
16081 break;
16082 }
16083 inote.type = BYTE_GET (external->type);
16084 inote.namesz = BYTE_GET (external->namesz);
16085 inote.namedata = external->name;
16086 inote.descsz = BYTE_GET (external->descsz);
16087 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16088 /* PR 17531: file: 3443835e. */
16089 if (inote.descdata < (char *) pnotes || inote.descdata > end)
16090 {
16091 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16092 inote.descdata = inote.namedata;
16093 inote.namesz = 0;
16094 }
16095
16096 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16097 next = inote.descdata + align_power (inote.descsz, 2);
16098 }
16099 else
16100 {
16101 Elf64_External_VMS_Note *vms_external;
16102
16103 /* PR binutils/15191
16104 Make sure that there is enough data to read. */
16105 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16106 if (data_remaining < min_notesz)
16107 {
16108 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16109 (int) data_remaining);
16110 break;
16111 }
16112
16113 vms_external = (Elf64_External_VMS_Note *) external;
16114 inote.type = BYTE_GET (vms_external->type);
16115 inote.namesz = BYTE_GET (vms_external->namesz);
16116 inote.namedata = vms_external->name;
16117 inote.descsz = BYTE_GET (vms_external->descsz);
16118 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16119 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16120 next = inote.descdata + align_power (inote.descsz, 3);
16121 }
16122
16123 if (inote.descdata < (char *) external + min_notesz
16124 || next < (char *) external + min_notesz
16125 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16126 || inote.namedata + inote.namesz < inote.namedata
16127 || inote.descdata + inote.descsz < inote.descdata
16128 || data_remaining < (size_t)(next - (char *) external))
16129 {
16130 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16131 (unsigned long) ((char *) external - (char *) pnotes));
16132 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16133 inote.type, inote.namesz, inote.descsz);
16134 break;
16135 }
16136
16137 external = (Elf_External_Note *) next;
16138
16139 /* Verify that name is null terminated. It appears that at least
16140 one version of Linux (RedHat 6.0) generates corefiles that don't
16141 comply with the ELF spec by failing to include the null byte in
16142 namesz. */
16143 if (inote.namedata[inote.namesz - 1] != '\0')
16144 {
16145 temp = (char *) malloc (inote.namesz + 1);
16146 if (temp == NULL)
16147 {
16148 error (_("Out of memory allocating space for inote name\n"));
16149 res = 0;
16150 break;
16151 }
16152
16153 strncpy (temp, inote.namedata, inote.namesz);
16154 temp[inote.namesz] = 0;
16155
16156 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16157 inote.namedata = temp;
16158 }
16159
16160 res &= process_note (& inote);
16161
16162 if (temp != NULL)
16163 {
16164 free (temp);
16165 temp = NULL;
16166 }
16167 }
16168
16169 free (pnotes);
16170
16171 return res;
16172 }
16173
16174 static int
16175 process_corefile_note_segments (FILE * file)
16176 {
16177 Elf_Internal_Phdr * segment;
16178 unsigned int i;
16179 int res = 1;
16180
16181 if (! get_program_headers (file))
16182 return 0;
16183
16184 for (i = 0, segment = program_headers;
16185 i < elf_header.e_phnum;
16186 i++, segment++)
16187 {
16188 if (segment->p_type == PT_NOTE)
16189 res &= process_corefile_note_segment (file,
16190 (bfd_vma) segment->p_offset,
16191 (bfd_vma) segment->p_filesz);
16192 }
16193
16194 return res;
16195 }
16196
16197 static int
16198 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16199 {
16200 Elf_External_Note * pnotes;
16201 Elf_External_Note * external;
16202 char * end;
16203 int res = 1;
16204
16205 if (length <= 0)
16206 return 0;
16207
16208 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16209 _("v850 notes"));
16210 if (pnotes == NULL)
16211 return 0;
16212
16213 external = pnotes;
16214 end = (char*) pnotes + length;
16215
16216 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16217 (unsigned long) offset, (unsigned long) length);
16218
16219 while ((char *) external + sizeof (Elf_External_Note) < end)
16220 {
16221 Elf_External_Note * next;
16222 Elf_Internal_Note inote;
16223
16224 inote.type = BYTE_GET (external->type);
16225 inote.namesz = BYTE_GET (external->namesz);
16226 inote.namedata = external->name;
16227 inote.descsz = BYTE_GET (external->descsz);
16228 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16229 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16230
16231 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16232 {
16233 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16234 inote.descdata = inote.namedata;
16235 inote.namesz = 0;
16236 }
16237
16238 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16239
16240 if ( ((char *) next > end)
16241 || ((char *) next < (char *) pnotes))
16242 {
16243 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16244 (unsigned long) ((char *) external - (char *) pnotes));
16245 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16246 inote.type, inote.namesz, inote.descsz);
16247 break;
16248 }
16249
16250 external = next;
16251
16252 /* Prevent out-of-bounds indexing. */
16253 if ( inote.namedata + inote.namesz > end
16254 || inote.namedata + inote.namesz < inote.namedata)
16255 {
16256 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16257 (unsigned long) ((char *) external - (char *) pnotes));
16258 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16259 inote.type, inote.namesz, inote.descsz);
16260 break;
16261 }
16262
16263 printf (" %s: ", get_v850_elf_note_type (inote.type));
16264
16265 if (! print_v850_note (& inote))
16266 {
16267 res = 0;
16268 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16269 inote.namesz, inote.descsz);
16270 }
16271 }
16272
16273 free (pnotes);
16274
16275 return res;
16276 }
16277
16278 static int
16279 process_note_sections (FILE * file)
16280 {
16281 Elf_Internal_Shdr * section;
16282 unsigned long i;
16283 int n = 0;
16284 int res = 1;
16285
16286 for (i = 0, section = section_headers;
16287 i < elf_header.e_shnum && section != NULL;
16288 i++, section++)
16289 {
16290 if (section->sh_type == SHT_NOTE)
16291 {
16292 res &= process_corefile_note_segment (file,
16293 (bfd_vma) section->sh_offset,
16294 (bfd_vma) section->sh_size);
16295 n++;
16296 }
16297
16298 if (( elf_header.e_machine == EM_V800
16299 || elf_header.e_machine == EM_V850
16300 || elf_header.e_machine == EM_CYGNUS_V850)
16301 && section->sh_type == SHT_RENESAS_INFO)
16302 {
16303 res &= process_v850_notes (file,
16304 (bfd_vma) section->sh_offset,
16305 (bfd_vma) section->sh_size);
16306 n++;
16307 }
16308 }
16309
16310 if (n == 0)
16311 /* Try processing NOTE segments instead. */
16312 return process_corefile_note_segments (file);
16313
16314 return res;
16315 }
16316
16317 static int
16318 process_notes (FILE * file)
16319 {
16320 /* If we have not been asked to display the notes then do nothing. */
16321 if (! do_notes)
16322 return 1;
16323
16324 if (elf_header.e_type != ET_CORE)
16325 return process_note_sections (file);
16326
16327 /* No program headers means no NOTE segment. */
16328 if (elf_header.e_phnum > 0)
16329 return process_corefile_note_segments (file);
16330
16331 printf (_("No note segments present in the core file.\n"));
16332 return 1;
16333 }
16334
16335 static int
16336 process_arch_specific (FILE * file)
16337 {
16338 if (! do_arch)
16339 return 1;
16340
16341 switch (elf_header.e_machine)
16342 {
16343 case EM_ARM:
16344 return process_arm_specific (file);
16345 case EM_MIPS:
16346 case EM_MIPS_RS3_LE:
16347 return process_mips_specific (file);
16348 break;
16349 case EM_NDS32:
16350 return process_nds32_specific (file);
16351 break;
16352 case EM_PPC:
16353 return process_power_specific (file);
16354 break;
16355 case EM_S390:
16356 case EM_S390_OLD:
16357 return process_s390_specific (file);
16358 break;
16359 case EM_SPARC:
16360 case EM_SPARC32PLUS:
16361 case EM_SPARCV9:
16362 return process_sparc_specific (file);
16363 break;
16364 case EM_TI_C6000:
16365 return process_tic6x_specific (file);
16366 break;
16367 case EM_MSP430:
16368 return process_msp430x_specific (file);
16369 default:
16370 break;
16371 }
16372 return 1;
16373 }
16374
16375 static int
16376 get_file_header (FILE * file)
16377 {
16378 /* Read in the identity array. */
16379 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16380 return 0;
16381
16382 /* Determine how to read the rest of the header. */
16383 switch (elf_header.e_ident[EI_DATA])
16384 {
16385 default: /* fall through */
16386 case ELFDATANONE: /* fall through */
16387 case ELFDATA2LSB:
16388 byte_get = byte_get_little_endian;
16389 byte_put = byte_put_little_endian;
16390 break;
16391 case ELFDATA2MSB:
16392 byte_get = byte_get_big_endian;
16393 byte_put = byte_put_big_endian;
16394 break;
16395 }
16396
16397 /* For now we only support 32 bit and 64 bit ELF files. */
16398 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16399
16400 /* Read in the rest of the header. */
16401 if (is_32bit_elf)
16402 {
16403 Elf32_External_Ehdr ehdr32;
16404
16405 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16406 return 0;
16407
16408 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16409 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16410 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16411 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16412 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16413 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16414 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16415 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16416 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16417 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16418 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16419 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16420 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16421 }
16422 else
16423 {
16424 Elf64_External_Ehdr ehdr64;
16425
16426 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16427 we will not be able to cope with the 64bit data found in
16428 64 ELF files. Detect this now and abort before we start
16429 overwriting things. */
16430 if (sizeof (bfd_vma) < 8)
16431 {
16432 error (_("This instance of readelf has been built without support for a\n\
16433 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16434 return 0;
16435 }
16436
16437 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16438 return 0;
16439
16440 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16441 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16442 elf_header.e_version = BYTE_GET (ehdr64.e_version);
16443 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16444 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16445 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
16446 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16447 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16448 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16449 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16450 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16451 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16452 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16453 }
16454
16455 if (elf_header.e_shoff)
16456 {
16457 /* There may be some extensions in the first section header. Don't
16458 bomb if we can't read it. */
16459 if (is_32bit_elf)
16460 get_32bit_section_headers (file, TRUE);
16461 else
16462 get_64bit_section_headers (file, TRUE);
16463 }
16464
16465 return 1;
16466 }
16467
16468 /* Process one ELF object file according to the command line options.
16469 This file may actually be stored in an archive. The file is
16470 positioned at the start of the ELF object. */
16471
16472 static int
16473 process_object (char * file_name, FILE * file)
16474 {
16475 unsigned int i;
16476
16477 if (! get_file_header (file))
16478 {
16479 error (_("%s: Failed to read file header\n"), file_name);
16480 return 1;
16481 }
16482
16483 /* Initialise per file variables. */
16484 for (i = ARRAY_SIZE (version_info); i--;)
16485 version_info[i] = 0;
16486
16487 for (i = ARRAY_SIZE (dynamic_info); i--;)
16488 dynamic_info[i] = 0;
16489 dynamic_info_DT_GNU_HASH = 0;
16490
16491 /* Process the file. */
16492 if (show_name)
16493 printf (_("\nFile: %s\n"), file_name);
16494
16495 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16496 Note we do this even if cmdline_dump_sects is empty because we
16497 must make sure that the dump_sets array is zeroed out before each
16498 object file is processed. */
16499 if (num_dump_sects > num_cmdline_dump_sects)
16500 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16501
16502 if (num_cmdline_dump_sects > 0)
16503 {
16504 if (num_dump_sects == 0)
16505 /* A sneaky way of allocating the dump_sects array. */
16506 request_dump_bynumber (num_cmdline_dump_sects, 0);
16507
16508 assert (num_dump_sects >= num_cmdline_dump_sects);
16509 memcpy (dump_sects, cmdline_dump_sects,
16510 num_cmdline_dump_sects * sizeof (* dump_sects));
16511 }
16512
16513 if (! process_file_header ())
16514 return 1;
16515
16516 if (! process_section_headers (file))
16517 {
16518 /* Without loaded section headers we cannot process lots of
16519 things. */
16520 do_unwind = do_version = do_dump = do_arch = 0;
16521
16522 if (! do_using_dynamic)
16523 do_syms = do_dyn_syms = do_reloc = 0;
16524 }
16525
16526 if (! process_section_groups (file))
16527 {
16528 /* Without loaded section groups we cannot process unwind. */
16529 do_unwind = 0;
16530 }
16531
16532 if (process_program_headers (file))
16533 process_dynamic_section (file);
16534
16535 process_relocs (file);
16536
16537 process_unwind (file);
16538
16539 process_symbol_table (file);
16540
16541 process_syminfo (file);
16542
16543 process_version_sections (file);
16544
16545 process_section_contents (file);
16546
16547 process_notes (file);
16548
16549 process_gnu_liblist (file);
16550
16551 process_arch_specific (file);
16552
16553 if (program_headers)
16554 {
16555 free (program_headers);
16556 program_headers = NULL;
16557 }
16558
16559 if (section_headers)
16560 {
16561 free (section_headers);
16562 section_headers = NULL;
16563 }
16564
16565 if (string_table)
16566 {
16567 free (string_table);
16568 string_table = NULL;
16569 string_table_length = 0;
16570 }
16571
16572 if (dynamic_strings)
16573 {
16574 free (dynamic_strings);
16575 dynamic_strings = NULL;
16576 dynamic_strings_length = 0;
16577 }
16578
16579 if (dynamic_symbols)
16580 {
16581 free (dynamic_symbols);
16582 dynamic_symbols = NULL;
16583 num_dynamic_syms = 0;
16584 }
16585
16586 if (dynamic_syminfo)
16587 {
16588 free (dynamic_syminfo);
16589 dynamic_syminfo = NULL;
16590 }
16591
16592 if (dynamic_section)
16593 {
16594 free (dynamic_section);
16595 dynamic_section = NULL;
16596 }
16597
16598 if (section_headers_groups)
16599 {
16600 free (section_headers_groups);
16601 section_headers_groups = NULL;
16602 }
16603
16604 if (section_groups)
16605 {
16606 struct group_list * g;
16607 struct group_list * next;
16608
16609 for (i = 0; i < group_count; i++)
16610 {
16611 for (g = section_groups [i].root; g != NULL; g = next)
16612 {
16613 next = g->next;
16614 free (g);
16615 }
16616 }
16617
16618 free (section_groups);
16619 section_groups = NULL;
16620 }
16621
16622 free_debug_memory ();
16623
16624 return 0;
16625 }
16626
16627 /* Process an ELF archive.
16628 On entry the file is positioned just after the ARMAG string. */
16629
16630 static int
16631 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16632 {
16633 struct archive_info arch;
16634 struct archive_info nested_arch;
16635 size_t got;
16636 int ret;
16637
16638 show_name = 1;
16639
16640 /* The ARCH structure is used to hold information about this archive. */
16641 arch.file_name = NULL;
16642 arch.file = NULL;
16643 arch.index_array = NULL;
16644 arch.sym_table = NULL;
16645 arch.longnames = NULL;
16646
16647 /* The NESTED_ARCH structure is used as a single-item cache of information
16648 about a nested archive (when members of a thin archive reside within
16649 another regular archive file). */
16650 nested_arch.file_name = NULL;
16651 nested_arch.file = NULL;
16652 nested_arch.index_array = NULL;
16653 nested_arch.sym_table = NULL;
16654 nested_arch.longnames = NULL;
16655
16656 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16657 {
16658 ret = 1;
16659 goto out;
16660 }
16661
16662 if (do_archive_index)
16663 {
16664 if (arch.sym_table == NULL)
16665 error (_("%s: unable to dump the index as none was found\n"), file_name);
16666 else
16667 {
16668 unsigned long i, l;
16669 unsigned long current_pos;
16670
16671 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16672 file_name, (unsigned long) arch.index_num, arch.sym_size);
16673 current_pos = ftell (file);
16674
16675 for (i = l = 0; i < arch.index_num; i++)
16676 {
16677 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16678 {
16679 char * member_name;
16680
16681 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16682
16683 if (member_name != NULL)
16684 {
16685 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16686
16687 if (qualified_name != NULL)
16688 {
16689 printf (_("Contents of binary %s at offset "), qualified_name);
16690 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16691 putchar ('\n');
16692 free (qualified_name);
16693 }
16694 }
16695 }
16696
16697 if (l >= arch.sym_size)
16698 {
16699 error (_("%s: end of the symbol table reached before the end of the index\n"),
16700 file_name);
16701 break;
16702 }
16703 /* PR 17531: file: 0b6630b2. */
16704 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16705 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16706 }
16707
16708 if (arch.uses_64bit_indicies)
16709 l = (l + 7) & ~ 7;
16710 else
16711 l += l & 1;
16712
16713 if (l < arch.sym_size)
16714 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16715 file_name, arch.sym_size - l);
16716
16717 if (fseek (file, current_pos, SEEK_SET) != 0)
16718 {
16719 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16720 ret = 1;
16721 goto out;
16722 }
16723 }
16724
16725 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16726 && !do_segments && !do_header && !do_dump && !do_version
16727 && !do_histogram && !do_debugging && !do_arch && !do_notes
16728 && !do_section_groups && !do_dyn_syms)
16729 {
16730 ret = 0; /* Archive index only. */
16731 goto out;
16732 }
16733 }
16734
16735 ret = 0;
16736
16737 while (1)
16738 {
16739 char * name;
16740 size_t namelen;
16741 char * qualified_name;
16742
16743 /* Read the next archive header. */
16744 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16745 {
16746 error (_("%s: failed to seek to next archive header\n"), file_name);
16747 return 1;
16748 }
16749 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16750 if (got != sizeof arch.arhdr)
16751 {
16752 if (got == 0)
16753 break;
16754 error (_("%s: failed to read archive header\n"), file_name);
16755 ret = 1;
16756 break;
16757 }
16758 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16759 {
16760 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16761 ret = 1;
16762 break;
16763 }
16764
16765 arch.next_arhdr_offset += sizeof arch.arhdr;
16766
16767 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16768 if (archive_file_size & 01)
16769 ++archive_file_size;
16770
16771 name = get_archive_member_name (&arch, &nested_arch);
16772 if (name == NULL)
16773 {
16774 error (_("%s: bad archive file name\n"), file_name);
16775 ret = 1;
16776 break;
16777 }
16778 namelen = strlen (name);
16779
16780 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16781 if (qualified_name == NULL)
16782 {
16783 error (_("%s: bad archive file name\n"), file_name);
16784 ret = 1;
16785 break;
16786 }
16787
16788 if (is_thin_archive && arch.nested_member_origin == 0)
16789 {
16790 /* This is a proxy for an external member of a thin archive. */
16791 FILE * member_file;
16792 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16793 if (member_file_name == NULL)
16794 {
16795 ret = 1;
16796 break;
16797 }
16798
16799 member_file = fopen (member_file_name, "rb");
16800 if (member_file == NULL)
16801 {
16802 error (_("Input file '%s' is not readable.\n"), member_file_name);
16803 free (member_file_name);
16804 ret = 1;
16805 break;
16806 }
16807
16808 archive_file_offset = arch.nested_member_origin;
16809
16810 ret |= process_object (qualified_name, member_file);
16811
16812 fclose (member_file);
16813 free (member_file_name);
16814 }
16815 else if (is_thin_archive)
16816 {
16817 /* PR 15140: Allow for corrupt thin archives. */
16818 if (nested_arch.file == NULL)
16819 {
16820 error (_("%s: contains corrupt thin archive: %s\n"),
16821 file_name, name);
16822 ret = 1;
16823 break;
16824 }
16825
16826 /* This is a proxy for a member of a nested archive. */
16827 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16828
16829 /* The nested archive file will have been opened and setup by
16830 get_archive_member_name. */
16831 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16832 {
16833 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16834 ret = 1;
16835 break;
16836 }
16837
16838 ret |= process_object (qualified_name, nested_arch.file);
16839 }
16840 else
16841 {
16842 archive_file_offset = arch.next_arhdr_offset;
16843 arch.next_arhdr_offset += archive_file_size;
16844
16845 ret |= process_object (qualified_name, file);
16846 }
16847
16848 if (dump_sects != NULL)
16849 {
16850 free (dump_sects);
16851 dump_sects = NULL;
16852 num_dump_sects = 0;
16853 }
16854
16855 free (qualified_name);
16856 }
16857
16858 out:
16859 if (nested_arch.file != NULL)
16860 fclose (nested_arch.file);
16861 release_archive (&nested_arch);
16862 release_archive (&arch);
16863
16864 return ret;
16865 }
16866
16867 static int
16868 process_file (char * file_name)
16869 {
16870 FILE * file;
16871 struct stat statbuf;
16872 char armag[SARMAG];
16873 int ret;
16874
16875 if (stat (file_name, &statbuf) < 0)
16876 {
16877 if (errno == ENOENT)
16878 error (_("'%s': No such file\n"), file_name);
16879 else
16880 error (_("Could not locate '%s'. System error message: %s\n"),
16881 file_name, strerror (errno));
16882 return 1;
16883 }
16884
16885 if (! S_ISREG (statbuf.st_mode))
16886 {
16887 error (_("'%s' is not an ordinary file\n"), file_name);
16888 return 1;
16889 }
16890
16891 file = fopen (file_name, "rb");
16892 if (file == NULL)
16893 {
16894 error (_("Input file '%s' is not readable.\n"), file_name);
16895 return 1;
16896 }
16897
16898 if (fread (armag, SARMAG, 1, file) != 1)
16899 {
16900 error (_("%s: Failed to read file's magic number\n"), file_name);
16901 fclose (file);
16902 return 1;
16903 }
16904
16905 current_file_size = (bfd_size_type) statbuf.st_size;
16906
16907 if (memcmp (armag, ARMAG, SARMAG) == 0)
16908 ret = process_archive (file_name, file, FALSE);
16909 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16910 ret = process_archive (file_name, file, TRUE);
16911 else
16912 {
16913 if (do_archive_index)
16914 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16915 file_name);
16916
16917 rewind (file);
16918 archive_file_size = archive_file_offset = 0;
16919 ret = process_object (file_name, file);
16920 }
16921
16922 fclose (file);
16923
16924 current_file_size = 0;
16925 return ret;
16926 }
16927
16928 #ifdef SUPPORT_DISASSEMBLY
16929 /* Needed by the i386 disassembler. For extra credit, someone could
16930 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16931 symbols. */
16932
16933 void
16934 print_address (unsigned int addr, FILE * outfile)
16935 {
16936 fprintf (outfile,"0x%8.8x", addr);
16937 }
16938
16939 /* Needed by the i386 disassembler. */
16940 void
16941 db_task_printsym (unsigned int addr)
16942 {
16943 print_address (addr, stderr);
16944 }
16945 #endif
16946
16947 int
16948 main (int argc, char ** argv)
16949 {
16950 int err;
16951
16952 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16953 setlocale (LC_MESSAGES, "");
16954 #endif
16955 #if defined (HAVE_SETLOCALE)
16956 setlocale (LC_CTYPE, "");
16957 #endif
16958 bindtextdomain (PACKAGE, LOCALEDIR);
16959 textdomain (PACKAGE);
16960
16961 expandargv (&argc, &argv);
16962
16963 parse_args (argc, argv);
16964
16965 if (num_dump_sects > 0)
16966 {
16967 /* Make a copy of the dump_sects array. */
16968 cmdline_dump_sects = (dump_type *)
16969 malloc (num_dump_sects * sizeof (* dump_sects));
16970 if (cmdline_dump_sects == NULL)
16971 error (_("Out of memory allocating dump request table.\n"));
16972 else
16973 {
16974 memcpy (cmdline_dump_sects, dump_sects,
16975 num_dump_sects * sizeof (* dump_sects));
16976 num_cmdline_dump_sects = num_dump_sects;
16977 }
16978 }
16979
16980 if (optind < (argc - 1))
16981 show_name = 1;
16982 else if (optind >= argc)
16983 {
16984 warn (_("Nothing to do.\n"));
16985 usage (stderr);
16986 }
16987
16988 err = 0;
16989 while (optind < argc)
16990 err |= process_file (argv[optind++]);
16991
16992 if (dump_sects != NULL)
16993 free (dump_sects);
16994 if (cmdline_dump_sects != NULL)
16995 free (cmdline_dump_sects);
16996
16997 return err;
16998 }